Подтвердить что ты не робот

Laravel 4 - две кнопки отправки в одной форме и оба отправляются для обработки различными действиями

У меня есть форма входа в систему, в которой есть поля электронной почты и пароля. И у меня есть две кнопки отправки, одна для входа (если пользователь уже зарегистрирован), а другой для регистрации (для новых пользователей). Поскольку действия входа и действия регистра различны, поэтому мне нужно каким-то образом перенаправить запрос со всеми данными сообщения в соответствующее действие. Есть ли способ достичь этого в Laravel 4 в чистом Laravel пути?

4b9b3361

Ответ 1

Как я это сделаю

Если ваша форма (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 у вас будет один метод, который проверяет, на какую кнопку было нажато, и два других метода для входа и регистрации

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

}
?>

Ответ 2

Мое решение:

сначала я устанавливаю форму без действия

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

Ответ 3

Ответ на ClickCoder - это пятно, единственное, что я заменил, чтобы сделать это на 100% -ном "чистом пути Laravel", было бы использовать Form Builder для кнопок отправки.

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

Первым параметром является значение submit, и вы можете передать его имя в следующем массиве параметров.

Итак, вместо:

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

Ответ 4

Вы можете сделать следующее:

Ваши маршруты (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();
    }

Форма: должна быть в вашем представлении. Однако я создал временную форму в файле маршрута для этого ответа.

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

Обратите внимание: Я не уверен, что это правильный подход, чтобы разрешить две кнопки отправки, но он работает для двух кнопок отправки.

Ответ 5

Дайте кнопкам отправки разные имена, например

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

}