簡體   English   中英

Laravel 4 - 一個表單中有兩個提交按鈕,並且兩個提交都由不同的操作處理

[英]Laravel 4 - two submit buttons in one form and have both submits to be handled by different actions

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

我會這樣做的方式

如果您的表單是(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' => 'TestController@postAuth'));

TestController 中,您有一種方法可以檢查點擊了哪個提交,另外兩種方法用於登錄和注冊

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

}
?>

我的解決方案:

首先我設置了沒有操作的表單

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

對於路線(routes.php):

Route::post('test/login', array('uses' => 'TestController@login'));
Route::post('test/register', array('uses' => 'TestController@register'));

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

ClickCoder 的答案是准確的,我唯一要替換的是,要以 100%“純 Laravel 方式”進行操作,也將使用表單生成器作為提交按鈕。

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!

您可以執行以下操作:

您的路線(routes.php):

Route::post('post1', array('before' => 'checkForm', 'uses' => 'TestController@post1'));

Route::get('post2', array('as' => 'post2', 'uses' => 'TestController@post2'));

過濾器.php

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

測試控制器.php

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

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

表單:應該在您的視圖中。但是,我在路由文件中為此答案創建了一個臨時表單。

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

請注意:我不確定這是允許兩個提交按鈕的正確方法,但它適用於兩個提交按鈕。

給提交按鈕不同的名字,例如

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM