Posso dirigir dois botões diferentes para a mesma função em um controlador com a mesma vista em CakePHP?
Pergunta
Existem dois botões na minha página cakephp, um para registrar novos usuários e outra para login. tanto a ação do botão pode ser direcionado para a mesma função no controlador e têm o mesmo arquivo view.ctp? Se sim, como posso fazê-lo?
Solução
Sim, basta definir a URL correta em seus botões. Mas eu não sei por que você faria isso. Se é apenas cerca de re-utilizando o view.ctp então você não precisa usar uma única ação apenas para usar o mesmo ponto de vista. Exemplo:
<?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');
}
}
?>
Outras dicas
Eu criar botões em minhas páginas de administração CRUD que permitem que qualquer um "Confirmar (editar / apagar / criar / etc)" ou "Cancelar". Eu faço isso através da criação de dois botões de envio na forma, e dando a cada um nome único. Por exemplo:
Ver código:
...
$form->submit('Delete', array('name' => 'delete'));
$form->submit('Cancel', array('name' => 'cancel'));
...
lógica de ação:
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
...
}
...
}
Por outro lado, você está quebrando essencialmente 2 ações em um para o bem de reutilizar uma vista. A solução da Sander Marechal é melhor.
Bem, sim, por que não? Não é isto apenas uma questão de definir o URL apropriado em suas ações de formulário? Ou estou faltando alguma coisa?
Você pode usar um valor forma oculta para denotar que a ação é.
$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');
Não é exatamente claro por que você não quer usar 2 funções embora. Você está basicamente vai ter que verificar manualmente qual a acção é, em vez de deixar o bolo fazer isso por você.
Em seu controlador
function process()
{
if ($this->data['User']['signup'] == 1)
{
// process signup
}
if ($this->data['User']['login'] == 1)
{
// process login
}
}