Laravel 4: due pulsanti di invio in un unico module e entrambi i submit devono essere gestiti da diverse azioni

Ho un module di accesso con campi email e password. E ho due pulsanti di invio, uno per il login (se l'utente è già registrato) e l'altro per la logging (per i nuovi utenti). Poiché l'azione di login e l'azione di logging sono differenti, ho bisogno di un modo per redirect la richiesta con tutti i dati del post alla rispettiva azione. C'è un modo per get questo in Laravel 4 in puro modo Laravel?

Il modo in cui lo farei

Se il tuo module è (2 pulsanti):

{{ Form::open(arrays('url' => 'test/auth')) }} {{ Form::email('email') }} {{ Form::password('password') }} {{ Form::password('confirm_password') }} <input type="submit" name="login" value="Login"> <input type="submit" name="register" value="Register"> {{ Form::close() }} 

Crea un controller 'TestController'

Aggiungi un path

 Route::post('test/auth', arrays('uses' => '[email protected]')); 

In TestController avresti un metodo che controlla su quale invio è stato fatto clic e altri due methods per l'accesso e la logging

 <?php class TestController extends BaseController { public function postAuth() { //check which submit was clicked on if(Input::get('login')) { $this->postLogin(); //if login then use this method } elseif(Input::get('register')) { $this->postRegister(); //if register then use this method } } public function postLogin() { echo "We're logging in"; //process your input here Input:get('email') etc. } public function postRegister() { echo "We're registering"; //process your input here Input:get('email') etc. } } ?> 

La mia soluzione:

prima ho creato una forma senza azione

 <script> var baseUrl = "{{ URL::to('/'); }}"; </script> {{ Form::open(arrays('url' => '', 'id'=> 'test-form')) }} {{ Form::text('username') }} {{ Form::password('password') }} {{ Form::password('confirm_password') }} <input type="submit" name="login" id="login" value="Login"> <input type="submit" name="register" id="register" value="Register"> {{ Form::close() }} 

per i routes (routes.php):

 Route::post('test/login', arrays('uses' => '[email protected]')); Route::post('test/register', arrays('uses' => '[email protected]')); 

controller (TestController.php)

 public function login(){ //do something... } public function register(){ //do something... } 

Jquery: (test.js)

 $('form :submit').on('click', function(event){ var a = $(this); var form = $('form'); var action = a.attr('id'); form.attr('action', baseUrl + '/test/' + action); form.submit(); }); 

La risposta di ClickCoder è azzeccata, l'unica cosa che vorrei sostituire, per farlo in un "puro modo Laravel" al 100%, sarebbe utilizzare anche il Generatore di forms per i pulsanti di invio.

http://laravel.com/docs/4.2/html#buttons

Il primo parametro è il valore di invio e puoi passare il suo nome nel seguente arrays di opzioni.

Quindi, invece di:

 <input type="submit" name="login" value="Login"> <input type="submit" name="register" value="Register"> 

Faresti:

 {{ Form::submit('Login', ['name' => 'login']) }} {{ Form::submit('Register', ['name' => 'register']) }} 

Se vuoi, puoi sfuggire completamente alla dichiarazione if facendoli condividere lo stesso nome e fare qualcosa del genere:

html:

 {{ Form::submit('Login', ['name' => 'action']) }} {{ Form::submit('Register', ['name' => 'action']) }} 

php:

 public function postAuth() { $action = 'post' . Input::get('action'); //becomes either postLogin or postRegister $this->$action(); } 

Un po 'less nidificazione, un po' più Laravel!

Puoi fare come il seguente:

I tuoi routes (routes.php):

 Route::post('post1', arrays('before' => 'checkForm', 'uses' => '[email protected]')); Route::get('post2', arrays('as' => 'post2', 'uses' => '[email protected]')); 

filters.php

 Route::filter('checkForm', function() { if(Input::has('button2')) { return Redirect::route('post2')->withInput(); } }); 

TestController.php

 public function post1(){ return Input::all(); } public function post2(){ return Input::old(); } 

Forma: dovrebbe essere nel tuo punto di vista. Comunque, ho creato un module temporaneo nel file di path per questa risposta.

 Route::get('form2', function() { return Form::open(arrays('url' => URL::to('post1'))). Form::text('name', null). Form::email('email', null). '<button type="submit" name="button1" value="1">submit</button>'. '<button type="submit" name="button2" value="2">submit2</button>'. Form::close(); }); 

ora sfoglia:

 http://yourDomain/form2 

Nota: non sono sicuro che questo sia l'approccio giusto per consentire due pulsanti di invio, ma funziona per due pulsanti di invio.

Dai ai pulsanti di invio nomi diversi, ad es

 <button type="submit" name="login">Login</button> <button type="submit" name="signup">Signup</button> 

Nel controller, gestisci semplicemente l'accesso o l'iscrizione a seconda del button inviato. Otterrai comunque tutti i tuoi input, puoi farlo;

 public function postLoginOrSignup(){ $data = Input::all(); if(isset($data['login'])){ //handle login process } if(isset($data['signup'])){ //handle singup process } }