2012-04-16 14 views
9

In CakePHP 1.3 è possibile creare un modulo con più presentare pulsanti:CakePHP 2.0 Determinare quale pulsante di invio è stato cliccato

echo $this->Form->submit('Submit 1', array('name'=>'submit'); 
echo $this->Form->submit('Submit 2', array('name'=>'submit'); 

e rilevare quali pulsante di invio è stato premuto nel controller con:

if (isset($this->params['form']['submit']) && $this->params['form']['submit'] == "Submit 1") { 
    // first button clicked 
} 

In CakePHP, $ this-> params ['form'] non è impostato e il valore del pulsante cliccato non viene visualizzato da nessuna parte in $ this-> request, $ this-> request-> data, $ this-> params $ this-> data o $ _POST.

Come determinare quale pulsante è stato selezionato in CakePHP 2.0?

Grazie in anticipo.

Edit:

Come richiesto, ecco il codice per il modulo:

<?php echo $this->Form->create('History', array('action'=>'add')); ?> 
<div class='submit'> 
<?php 
echo $this->Form->submit('Yes', array('div'=>false, 'name'=>'submit')); 
echo $this->Form->submit('No', array('div'=>false, 'name'=>'submit')); 
?> 
</div> 
<?php echo $this->Form->end()?> 

E l'uscita del modulo:

<form action="/projects/kings_recruit/trunk/www/histories/add" id="HistoryAddForm" method="post" accept-charset="utf-8"> 
    <div style="display:none;"> 
    <input name="_method" value="POST" type="hidden"> 
    </div> 
    <div class="submit"> 
    <input name="submit" value="Yes" type="submit"> 
    <input name="submit" value="No" type="submit"> 
    </div> 
</form> 
+0

dovresti anche pubblicare l'html in uscita - come appare il pulsante di invio nella tua vista! Inoltre: hai un tag

attorno al tuo modulo? – mark

risposta

0

in 2.0 non c'è $this->params['form'] più tutto i campi per l'helper della forma finiscono in $this->data (che comunque ha più senso)

così

if (!empty($this->data['submit']) && $this->data['submit'] == "Submit 1") {} 

nota che! Empty() è meglio anche qui.

PS: è possibile utilizzare il mio guscio di aggiornamento migliorato per sostituirlo nel codice: https://github.com/dereuromark/upgrade

sua il comando

cake Upgrade.Upgrade request 

(https://github.com/dereuromark/upgrade/blob/ master/Console/Comando/UpgradeShell.php # L833)

+0

Non vedo "Invia 1" in $ this-> data :-( Inoltre, non sto aggiornando un progetto 1.3, questo è un nuovissimo progetto 2.0 – RichardAtHome

+0

Anche non vedendolo in $ _POST Ho aggiornato la mia domanda per riflettere questo – RichardAtHome

0
if (!empty($this->request->data['submit']) && $this->request->data['submit'] == "Yes") { 
// do your stuff 
} 
+0

Come ho menzionato in una risposta precedente (e aggiornato la domanda per riflettere questo), non vedo 'submit' in $ this-> data – RichardAtHome

+0

@RichardAtHome Non '$ this-> data ', è' $ this-> request-> data'. ricontrollare il codice con '$ this-> request-> data' – thecodeparadox

+0

Inoltre non lo vedo in $ this-> request-> data (mi dispiace ho pensato è stato sottinteso con il mio punto di non vederlo $ this-> request) – RichardAtHome

7

Non utilizzare lo stesso nome per entrambi i pulsanti di invio. Considerate questo esempio:

<?php echo $this->Form->create(false); ?> 
<?php echo $this->Form->text('input'); ?> 
<?php echo $this->Form->submit('Yes', array('name' => 'submit1')); ?> 
<?php echo $this->Form->submit('No', array('name' => 'submit2')); ?> 
<?php echo $this->Form->end(); ?> 

debug ($ this-> request-> dati) produrrà il seguente quando il pulsante "Sì" viene cliccato:

array(
    'submit1' => 'Yes', 
    'input' => 'test' 
) 

E qui è quando il "No pulsante "viene cliccato:

array(
    'submit2' => 'No', 
    'input' => 'test' 
) 

Per controllare quale pulsante è stato cliccato:

if (isset($this->request->data['submit1'])) { 
    // yes button was clicked 
} else if (isset($this->request->data['submit2'])) { 
    // no button was clicked 
} 
19

In genere è una cattiva pratica utilizzare lo stesso nome per entrambi i pulsanti di invio. Ci dovrebbe essere un tasto "invia" in $ _POST e $ this-> request-> Dati

Ho provato questo in CakePHP 2.1.1 come illustrato di seguito:

Il codice della vista:

<?php echo $this->Form->create('Message', array('action'=>'test')); 
// Extra test input field 
echo $this->Form->input('test'); 
?> 

<div class='submit'> 
<?php 
echo $this->Form->submit('Yes', array('div'=>false, 'name'=>'submit')); 
echo $this->Form->submit('No', array('div'=>false, 'name'=>'submit')); 
?> 
</div> 
<?php echo $this->Form->end()?> 

La nell'unità di controllo nei dati $ this-> request->:

array(
    'submit' => 'Yes', 
    'Message' => array(
     'test' => 'TestFieldTest' 
    ) 
) 

E in $ _POST:

array(
    '_method' => 'POST', 
    'data' => array(
     'Message' => array(
      'test' => 'TestFieldTest' 
     ) 
    ), 
    'submit' => 'Yes' 
) 

È inoltre possibile assegnare ai due nomi di sottomenu diversi:

echo $this->Form->submit('Yes', array('div'=>false, 'name'=>'submitY')); 
echo $this->Form->submit('No', array('div'=>false, 'name'=>'submitN')); 

In questo modo è possibile si differenziano per il $ _POST o $ this-> request-> i dati, perché le chiavi saranno i nomi dei sottopone:

array(
    'submitY' => 'Yes', 
    'Message' => array(
     'test' => 'foo' 
    ) 
) 

array(
    '_method' => 'POST', 
    'data' => array(
     'Message' => array(
      'test' => 'Bar' 
     ) 
    ), 
    'submitY' => 'Yes' 
) 

Poi per determinare quale pulsante viene premuto si puoi utilizzare un semplice isset ($ _ POST ['']) o più $ this-> request-> data?

+0

La risposta più completa imo. – pbond

+0

Non vedendo questo nella mia forma post array - anche con un progetto nuovo di zecca: -S esplorerò un po 'più tardi e torna da te ... – RichardAtHome

+0

Stai usando un filtro personalizzato rispetto al codificatore XSS POST o simile? Questo è molto strano Una domanda banale sarebbe: sei nella giusta azione? Il modulo punta all'azione giusta? Provalo con nomi diversi per i submits. Potresti fornire anche il contenuto del POST? –

Problemi correlati