2014-01-05 79 views
20

我有一個登錄表單,其中有電子郵件和密碼字段。我有兩個提交按鈕,一個用於登錄(如果用戶已經註冊),另一個用於註冊(用於新用戶)。由於登錄操作和註冊操作不同,因此我需要某種方式將請求與所有發佈數據重定向到其各自的操作。有沒有辦法在Laravel 4中以純Laravel的方式實現這一點?Laravel 4 - 兩種提交按鈕的一種形式,並提交由不同的行動處理

+0

給提交按鈕不同的名稱。 –

回答

38

的方式我會做

如果您的形式是(2個按鈕):

{{ Form::open(array('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() }} 

創建一個控制器 '的TestController'

添加路由

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

TestController你會有一個方法檢查w HICH提交被點擊和兩個其他方法進行登錄和註冊

<?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. 
    } 

} 
?> 
+0

感謝ClickCoder,你是對的。但是任何想法,如何在不中斷功能的情況下將輸入數據傳遞給Laravel寧靜的store()動作? –

+2

如果我理解正確,你已經有postLogin和postRegister(或類似的方法),你只需要路由到登錄或註冊。 '路線::後( '測試/ AUTH',函數(){ \t如果(輸入::得到( '登錄')){ \t \t $行動= 'postLogin'; \t} ELSEIF(輸入: :獲得( '註冊')){ \t \t $行動= '的postRegister'; \t} \t回報應用::讓( '的TestController') - > $行動(); });' 這是否幫幫我?無論您使用哪種控制器,您都可以獲得所有輸入。 – ClickCoder

+0

是的,你理解它是對的。這正是我想要的。我會嘗試你提供的代碼,並讓你知道結果。雖然只是通過查看代碼,我可以告訴這是完美的。謝謝:-) –

0

你可以像下面這樣:

你的路由(routes.php文件):

Route::post('post1', array('before' => 'checkForm', 'uses' => '[email protected]')); 

Route::get('post2', array('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(); 
    } 

形式:應該在你的view.however,我創建了這個答案的路徑文件的臨時形式。

Route::get('form2', function() 
{ 
     return Form::open(array('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(); 

}); 

現在瀏覽:

http://yourDomain/form2 

請注意:我不知道這是爲了讓兩個提交按鈕的正確方法,但它有兩個提交按鈕的作用。

+0

感謝Anam在這樣的細節中解釋。只是想知道,有沒有辦法將所有輸入重定向到一個動作? –

+0

你可以用'withInput();'重定向。重定向後,您可以使用'Input :: old();'來獲取所有輸入。例如檢查我的答案。 – Anam

0

給提交按鈕不同的名稱,如

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

在你的控制器,只需辦理登錄或註冊取決於哪個按鈕提交。你仍然會得到你所有的輸入,你可以這樣做;

public function postLoginOrSignup(){ 

    $data = Input::all(); 

    if(isset($data['login'])){ 
     //handle login process 
    } 

    if(isset($data['signup'])){ 
     //handle singup process 
    } 

} 
+0

感謝您的及時迴應。這很好,但實際問題從這裏開始。現在可以調用所需的動作,但是隨後我必須將輸入數據作爲參數傳遞給動作。然後我必須修改我的寧靜行動的方式。我不想要的。我想讓Laravel寧靜的store()動作完好無損。任何想法 ? –

+0

嗨,很抱歉,但我不太瞭解評論,請您詳細說明一下您不想要的內容以及您想實現的內容。 – mandeeya

+0

簡單地說,有沒有辦法將輸入傳遞給相應的動作? –

3

我的解決辦法:

首先,我建立了形式,沒有動作

<script> 
    var baseUrl = "{{ URL::to('/'); }}"; 
</script> 

{{ Form::open(array('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() }} 

的路線(路線。PHP):

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

控制器(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(); 
}); 
+0

你爲我節省了很多時間! – HirenMangukiya

2

ClickCoder的回答是點上,我唯一會取代,要以100%「純Laravel方式」來完成,也應該使用Form Builder作爲提交按鈕。

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

第一個參數是提交的值,你可以在下列選項數組中傳遞它的名字。

所以不是:

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

你會怎麼做:

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

如果你願意,你完全可以通過讓他們共享同一個名稱,並做一些逃脫的if語句像這樣:

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(); 
} 

少一點築巢,更Laravel一點!

+1

很酷的建議,但如果提交按鈕的值不只一個字 – zeckdude