Bestehen Formulardaten Über Mehrere Schritte in Laravel
Wenn ich gemacht habe, multistep-Formulare in der Vergangenheit würde ich in der Regel speichern Sie die Formulardaten in der session, bevor es an die Auffassung, dass der Weg der Daten anhält, wenn der Benutzer die Seite aktualisiert oder klickt auf den browser-nativen zurück-buttons.
Übertragen meiner Vergangenheit Logik zu Laravel baute ich die folgende form, bestehend aus drei Phasen:
[Input -> Confirm -> Success]
Routes.php
Route::group(array('prefix' => 'account'), function(){
Route::get('register', array(
'before' => 'guest',
'as' => 'account-create',
'uses' => 'AccountController@getCreate'
));
Route::post('register', array(
'before' => 'guest|csrf',
'as' => 'account-create-post',
'uses' => 'AccountController@postCreate'
));
Route::get('register/confirm', array(
'before' => 'guest',
'as' => 'account-create-confirm',
'uses' => 'AccountController@getCreateConfirm'
));
Route::post('register/confirm', array(
'before' => 'guest|csrf',
'as' => 'account-create-confirm-post',
'uses' => 'AccountController@postCreateConfirm'
));
Route::get('register/complete', array(
'before' => 'guest',
'as' => 'account-create-complete',
'uses' => 'AccountController@getCreateComplete'
));
});
AccountController.php
<?php
class AccountController extends BaseController {
private $form_session = 'register_form';
public function getCreate()
{
if(Session::has($this->form_session))
{
//get forms session data
$data = Session::get($this->form_session);
//clear forms session data
Session::forget($this->form_session);
//load the form view /w the session data as input
return View::make('account.create')->with('input',$data);
}
return View::make('account.create');
}
public function postCreate()
{
//set the form input to the session
Session::set($this->form_session, Input::all());
$validation_rules = array(
'email' => 'required|max:50|email|unique:users',
'password' => 'required|max:60|min:6',
'password_conf' => 'required|max:60|same:password'
);
$validator = Validator::make(Input::all(), $validation_rules);
//get forms session data
$data = Session::get($this->form_session);
//Return back to form w/validation errors & session data as input
if($validator->fails()) {
return Redirect::back()->withErrors($validator);
}
//redirect to the confirm step
return Redirect::route('account-create-confirm');
}
public function getCreateConfirm()
{
//prevent access without filling out step1
if(!Session::has($this->form_session)) {
return Redirect::route('account-create');
}
//get forms session data
$data = Session::get($this->form_session);
//retun the confirm view w/session data as input
return View::make('account.create-confirm')->with('input', $data);
}
public function postCreateConfirm()
{
$data = Session::get($this->form_session);
//insert into DB
//send emails
//etc.
//clear forms session data
Session::forget($this->form_session);
//redirect to the complete/success step
return Redirect::route('account-create-complete');
}
public function getCreateComplete() {
return View::make('account.create-complete');
}
}
create.blade.php
<form action="{{ URL::route('account-create-post') }}" method="post">
Email: <input type="text" name="email" value="{{ (isset($input['email'])) ? e($input['email']) : '' }}">
@if($errors->has('email'))
{{ $errors->first('email') }}
@endif
<br />
Password: <input type="text" name="password" value="">
@if($errors->has('password'))
{{ $errors->first('password') }}
@endif
<br />
Password Confirm: <input type="text" name="password_conf" value="">
@if($errors->has('password_conf'))
{{ $errors->first('password_conf') }}
@endif
<br />
{{ Form::token() }}
<input type="submit" value="Confirm">
</form>
create-confirm.blade.php
Email: {{ $input['email']; }}
Password: {{ $input['password']; }}
<form action="{{ URL::route('account-create-confirm-post') }}" method="post">
{{ Form::token() }}
<a href="{{ URL::previous() }}">return</a>
<input type="submit" name="submit_forward" value="Submit">
</form>
Den oben funktioniert gut, allerdings Frage ich mich, ob dies ist der beste Weg, multi-step-Formulare in Laravel?
- warum nicht verwenden Sie multi-step Formular in der client-Seite? einfach Fragen.... natürlich können Sie sessions verwenden, aber in der client-Seite, es kann auch leicht getan werden.
- Nie selbst als mit javascript. Wie würden Sie vorschlagen, Umgang mit der Validierung, serverside obwohl ajax?
- Haben Sie wählen, um auf diese Weise, oder hast du einen besseren Ansatz für die multi-step-Formulare?
- Ich bin ziemlich viel mit diesem als ist. Die einzigen änderungen, die ich da gemacht werden, um schneiden Sie die regler etwas nach unten, durch bewegen der Validierung aus, um einen Validierungs-Dienst und Datenbank - /E-Mail-Funktionalität in einem repository.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich erstellt habe, mehrteilige Formulare, ich habe es immer getan in einer Weise, so dass der Benutzer immer wieder kommen, und beenden Sie die form später, indem Sie jede form bestehen bleiben was Sie haben in die Datenbank.
Beispielsweise
Schritt 1 - Konto Anlegen
Ich würde die Benutzer erstellen Ihre authentifizierungsdetails in diesem Schritt erstellen Sie das Benutzerkonto (mit Kennwort) und auch die Anmeldung der Benutzer an, die Umleitung zum dashboard. Dort kann ich überprüfen, um zu sehen, wenn der Benutzer ein Profil, und wenn Sie nicht, leiten Sie Sie auf das Profil-Formular erstellen.
Schritt 2 - Profil Anlegen
Da haben wir einen authentifizierten Benutzer, das Profil-Formular erstellen können, speichern die Daten, um die aktuell angemeldeten Benutzer. In den nachfolgenden Abschnitten Folgen Sie den gleichen Prozess, aber überprüfen Sie die Existenz der vorherigen Schritt.
Ihre Frage scheint zu sein, zu bestätigen, ob ein Benutzer wünscht, ein Konto zu erstellen. Was ich tun würde in deiner situation wäre, auf das Formular, das Sie erstellt haben, zu bestätigen der user account, ich würde immer die Daten der Nutzer in versteckte Eingabe-Felder.
Obwohl die Anzeige die ausgewählte Benutzer-Kennwort zurück, um Sie auf dieser Seite scheint ein wenig überflüssig, wenn Sie Sie bitten, zu bestätigen, deren Passwort auf der vorherigen Seite, plus einige Benutzer möglicherweise die Frage, warum Ihre Passwort wird in Klartext auf dem Bildschirm, vor allem, wenn Sie Zugriff auf die Website von einem öffentlichen computer aus.
Die Dritte option würde ich vorschlagen würde, um das Benutzerkonto zu erstellen und soft-löschen (Laravel 4.2 Docs /Laravel 5 Docs), die RÜCKFÜHRUNG der Benutzer-Konto-Nummer auf die neue form:
dann lösen Sie die soft-löschen, wenn der Benutzer bestätigt Ihr Konto. Dies hat den zusätzlichen bonus, dass Sie konnte verfolgen, Menschen, die versuchen, melden Sie sich mehrmals für ein Konto und nicht abgeschlossen, der Prozess und sehen, ob es ein problem mit Ihrem UX.
Fazit
Natürlich könnte man auch immer noch tun, die Art und Weise haben Sie immer mit einer Sitzung, alle die ich versucht habe hier zu tun ist, zeigen Ihnen einige andere Möglichkeiten, wie Sie nähern kann es, wie mit allem zu tun mit der beste Weg, etwas zu tun, das ist eine sehr eigenwillige Thema, auf das wahrscheinlich viele gegensätzliche Ansichten, wie es getan werden sollte. Der beste Weg, es zu tun ist der Weg, der funktioniert am besten für Sie und Ihre Benutzer... vor allem Ihre Nutzer.
Gibt es zwei Möglichkeiten, es zu tun (die ich mir denken kann). Ich bevorzuge die zweite.
Hinzufügen "forget me" - Aktion wäre schön (vor allem, wenn form erfordert mehr private Daten).
Warum
getCreate()
hatSession::forget()
? Wenn jemand zurück geht, um etwas zu ändern und versehentlich die Blätter Ihrer Website seine Daten verloren.$data
variable bevor ich Sie löschen. Dann, wenn das Formular abgeschickt wird ist es wieder zurück in die Sitzung. Dies wurde getan, um zu verhindern, dass Daten in das Formular von der anhaltenden, wenn der Benutzer die Seite aktualisiert. Die Standard-Aktion, wenn eine Seite aktualisiert werden sollte, um das Formular zu resetten (löschen des Inhalts). Vielen Dank für Ihren Vorschlag, ich denke, wickelte Sie in ein service wäre eine gute Idee.1.) Erstellen Sie eine benutzerdefinierte verstecktes Feld im Formular mit einem zufälligen md5-Zeichensatz zu unterbreiten, mit der form... (es kann der Zeitstempel, der Benutzer ip-Adresse und das Land miteinander verkettet, als 3 md5-strings getrennt durch was auch immer Zeichen , oder #, so kann es als ein token der form)
2.) führen Sie das versteckte Feld in den controller und überprüfen Sie nach Erhalt der Benutzereingaben aus dem Formular von der Erzeugung der gleichen Werte, die in Ihrem controller, verschlüsseln Sie diese Werte als md5 zu, dann verketten Sie alle zusammen, und vergleichen Sie die Werte, die von der Benutzer-Eingabe-Formular mit den Werten, die Sie generieren in Ihrer Steuerung.
3.) Setzen Sie die Werte aus dem Formular im controller, in einer Sitzung, dann neu generieren der session-id bei jedem Besuch jeder der user ist zu Besuch.
4.) update der Zeitstempel in Ihrer Sitzung nach den timestamp der Benutzer besuchen jede Seite.
Nur weil Sie wissen, Laravel, bedeutet nicht, Sie müssen alles in Laravel.
Multi-step-Formulare sollten nie beinhalten server-Seite Magie. Die beste und einfachste Sie tun können, ist das ausblenden bestimmter Schritte mit
display:none;
und wechseln Sie zum nächsten Schritt mit Hilfe von javascript-Umschalten der Sichtbarkeit nur.