¿Puedo dirigir dos botones diferentes a la misma función en un controlador con la misma vista en CakePHP?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Hay dos botones en mi página de cakephp, uno para registrar nuevos usuarios y el otro para iniciar sesión. ¿Se puede dirigir la acción de ambos botones a la misma función en el controlador y tener el mismo archivo view.ctp? Si es así, ¿cómo puedo hacerlo?

¿Fue útil?

Solución

Sí, solo establece la URL correcta en tus botones. Pero no sé por qué harías esto. Si solo se trata de reutilizar view.ctp, no necesita usar una sola acción para usar la misma vista. Ejemplo:

<?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');
    }
}
?>

Otros consejos

Creo botones en mis páginas de administrador de CRUD que permiten " Confirmar (editar / eliminar / crear / etc) " o " Cancelar " ;. Hago esto creando 2 botones de envío en el formulario y dando a cada uno un nombre único. Por ejemplo:

Ver código:

...
$form->submit('Delete', array('name' => 'delete'));
$form->submit('Cancel', array('name' => 'cancel'));
...

Lógica de acción:

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 otro lado, esencialmente estás rompiendo 2 acciones en una por el simple hecho de reutilizar una vista. La solución de Sander Marechal es mejor.

Bueno, sí, ¿por qué no? ¿No es solo una cuestión de establecer la URL apropiada en las acciones de su formulario? ¿O me estoy perdiendo algo?

Puede usar un valor de formulario oculto para indicar qué acción es.

$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');

Sin embargo, no está claro por qué no quieres usar 2 funciones. Básicamente, tendrás que verificar manualmente qué acción es, en lugar de dejar que Cake lo haga por ti.

En tu controlador

function process()
{
    if ($this->data['User']['signup'] == 1)
    {
        // process signup
    }
    if ($this->data['User']['login'] == 1)
    {
        // process login
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top