У меня есть форма входа в систему, в которой есть поля электронной почты и пароля. И у меня есть две кнопки отправки, одна для входа (если пользователь уже зарегистрирован), а другой для регистрации (для новых пользователей). Поскольку действия входа и действия регистра различны, поэтому мне нужно каким-то образом перенаправить запрос со всеми данными сообщения в соответствующее действие. Есть ли способ достичь этого в Laravel 4 в чистом Laravel пути?
То, как я это сделаю
Если ваша форма (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», было бы использовать 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!
Вы можете сделать следующее:
Ваши маршруты (routes.php):
Route::post('post1', array('before' => 'checkForm', 'uses' => 'TestController@post1')); Route::get('post2', array('as' => 'post2', 'uses' => 'TestController@post2'));
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
Обратите внимание: я не уверен, что это правильный подход, чтобы разрешить две кнопки отправки, но он работает для двух кнопок отправки.
Дайте кнопкам отправки разные имена, например
<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 } }