Posso dirigir dois botões diferentes para a mesma função em um controlador com a mesma vista em CakePHP?

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

  •  03-07-2019
  •  | 
  •  

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?

Foi útil?

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
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top