Могу ли я направить две разные кнопки на одну и ту же функцию в контроллере с одинаковым представлением в CakePHP?

StackOverflow https://stackoverflow.com/questions/806262

  •  03-07-2019
  •  | 
  •  

Вопрос

На моей странице 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
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top