Могу ли я направить две разные кнопки на одну и ту же функцию в контроллере с одинаковым представлением в CakePHP?
Вопрос
На моей странице cakephp есть две кнопки: одна для регистрации новых пользователей, а другая для входа в систему.Могут ли оба действия кнопки быть направлены на одну и ту же функцию в контроллере и иметь один и тот же файл view.ctp?Если да, то как я могу это сделать?
Решение
Да, просто укажите правильный URL-адрес в своих кнопках.Но я не знаю, зачем тебе это делать.Если речь идет просто о повторном использовании view.ctp, то вам не нужно использовать одно действие только для использования того же представления.Пример:
<?php
class FoobarController extends AppController
{
function view()
{
// This will render views/foobar/view.ctp because the action
// is named "view"
}
function register()
{
// Normally this would render views/foobar/register.ctp but you can
// call the render() function manually and render something else. The
// following call will render views/foobar/view.ctp
$this->render('view');
}
function login()
{
// Same thing here...
$this->render('view');
}
}
?>
Другие советы
Я создаю кнопки на своих страницах администратора CRUD, которые позволяют либо "Подтвердить (редактировать / удалить / создать / etc)", либо "Отменить".Я делаю это, создавая 2 кнопки отправки в форме и присваивая каждой уникальное имя.Например:
Просмотр кода:
...
$form->submit('Delete', array('name' => 'delete'));
$form->submit('Cancel', array('name' => 'cancel'));
...
Логика действия:
function admin_delete( ... ) {
// Bail if cancel button pressed
if (isset($this->params['form']['cancel'])) {
$this->redirect('/');
}
// Delete if delete button pressed
if (isset($this->params['form']['delete'])) {
// delete stuff
...
}
...
}
С другой стороны, вы, по сути, объединяете 2 действия в одно ради повторного использования представления. Решение Сандера Марешаля это лучше.
Ну, да, почему бы и нет?Разве это не вопрос только установки соответствующего URL-адреса в ваших действиях формы?Или я что-то упускаю?
Вы можете использовать скрытое значение формы, чтобы указать, к какому действию оно относится.
$form->create('User', array('action' => 'process');
$form->hidden('User.signup', array('value' => '1'));
$form->end('Signup');
$form->create('User', array('action' => 'process');
$form->hidden('User.login', array('value' => '1'));
$form->end('Login');
Однако не совсем понятно, почему вы не хотите использовать 2 функции.По сути, вам придется вручную проверить, что это за действие, вместо того, чтобы позволить cake сделать это за вас.
В вашем контроллере
function process()
{
if ($this->data['User']['signup'] == 1)
{
// process signup
}
if ($this->data['User']['login'] == 1)
{
// process login
}
}