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