2014-01-05 2 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 Хич представить просматривались и два других методов для входа и регистрации

<?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, вы правы. Но любая идея, как передать входные данные в действие Restore store() Laravel без нарушения функциональности? –

+2

Если я правильно понимаю, у вас уже есть postLogin и postRegister (или аналогичные методы), и вы просто хотите направить либо войти в систему, либо зарегистрироваться. 'Route :: пост ('тест/аутентификации', функция() { \t если (вход :: получить ('вход')) { \t \t $ действие = ''; postLogin \t} ElseIf (Input: : получить ('регистрация')) { \t \t $ ACTION = ''; postRegister \t} \t возвращение App :: сделать ('TestController') -> $ (ACTION); }); ' делает это Помогите? У вас будет весь вход в зависимости от того, какие контроллеры вы используете. – 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(); 
    } 

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

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

Спасибо Анаму за объяснение в такой детали. Просто хотел знать, есть ли способ перенаправить на действие со всеми входами? –

+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 restful 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']) }} 

Если вы хотите, вы могли бы избежать, если заявление вообще, имея их одни и те же имя и сделать что-то как это:

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

Смежные вопросы