Posso indirizzare due pulsanti diversi alla stessa funzione in un controller con la stessa vista in CakePHP?
Domanda
Ci sono due pulsanti nella mia pagina cakephp, uno per la registrazione di nuovi utenti e l'altro per l'accesso. Entrambe le azioni del pulsante possono essere dirette alla stessa funzione nel controller e avere lo stesso file view.ctp? Se sì, come posso farlo?
Soluzione
Sì, basta impostare l'URL corretto nei pulsanti. Ma non so perché lo faresti. Se si tratta solo di riutilizzare view.ctp, non è necessario utilizzare una singola azione solo per utilizzare la stessa vista. Esempio:
<?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');
}
}
?>
Altri suggerimenti
Creo pulsanti nelle mie pagine di amministrazione CRUD che consentono " Conferma (modifica / elimina / crea / etc) " o " Annulla " ;. Lo faccio creando 2 pulsanti di invio nel modulo e dando a ciascuno un nome univoco. Ad esempio:
Visualizza codice:
...
$form->submit('Delete', array('name' => 'delete'));
$form->submit('Cancel', array('name' => 'cancel'));
...
Logica di azione:
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
...
}
...
}
D'altro canto, essenzialmente stai fracassando 2 azioni in una per il riutilizzo di una vista. La soluzione di Sander Marechal è migliore.
Beh, sì, perché no? Non si tratta solo di impostare l'URL appropriato nelle azioni del modulo? O mi sto perdendo qualcosa?
Puoi usare un valore di modulo nascosto per indicare quale azione è.
$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');
Non è esattamente chiaro il motivo per cui non si desidera utilizzare 2 funzioni. Fondamentalmente dovrai controllare manualmente quale azione è, invece di lasciare che la torta lo faccia per te.
Nel controller
function process()
{
if ($this->data['User']['signup'] == 1)
{
// process signup
}
if ($this->data['User']['login'] == 1)
{
// process login
}
}