Pregunta sobre cakephp-2.0, forms, cakephp – CakePHP 2.0 Determine en qué botón de envío se ha hecho clic

9

En CakePHP 1.3 puedes crear un formulario con múltiples botones de envío:

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

y detectar qué botón de envío se presionó en el controlador con:

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

En CakePHP, $ this-> params ['form'] no está configurado y el valor del botón pulsadono aparece en ningún lugar de $ this-> request, $ this-> request-> data, $ this-> params, $ this-> data o $ _POST.

¿Cómo puedo determinar en qué botón se ha hecho clic en CakePHP 2.0?

Gracias por adelantado.

Editar:

Según lo solicitado, aquí está el código para el formulario:

<code><?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()?>
</code>

Y la salida de la forma:

<code><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>
</code>
también debe publicar el código HTML generado: ¡cómo se ve el botón de envío en su vista! también: ¿tienes una etiqueta <form> alrededor de tu formulario? mark

Tu respuesta

4   la respuesta
7

No use el mismo nombre para ambos botones de envío. Considera este ejemplo:

<code><?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(); ?>
</code>

debug ($ this-> request-> data) producirá lo siguiente cuando se haga clic en el botón "Sí":

<code>array(
    'submit1' => 'Yes',
    'input' => 'test'
)
</code>

Y aquí es cuando se hace clic en el botón "No":

<code>array(
    'submit2' => 'No',
    'input' => 'test'
)
</code>

Para comprobar en qué botón se hizo clic:

<code>if (isset($this->request->data['submit1'])) {
    // yes button was clicked
} else if (isset($this->request->data['submit2'])) {
    // no button was clicked
}
</code>
0
<code>if (!empty($this->request->data['submit']) && $this->request->data['submit'] == "Yes") {
// do your stuff
}
</code>
Como mencioné en una respuesta anterior (y actualicé la pregunta para reflejar esto), no veo "enviar" en $ this-> data RichardAtHome
Tampoco lo vea en $ this-> request-> data (lo siento, pensé que estaba implícito con mi punto de no verlo $ this-> request) RichardAtHome
@RichardAtHome No$this->data, es$this->request->data. Vuelva a verificar su código con$this->request->data thecodeparadox
0

en 2.0 no hay$this->params['form'] ya que todos los campos publicados de los formularios de ayuda terminan en$this->data (lo que tiene más sentido de todos modos)

asi que

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

tenga en cuenta que! empty () es mejor aquí también.

PD: puedes usar mi shell de actualización mejorado para reemplazarlo en tu código:https://github.com/dereuromark/upgrade

es el comando

<code>cake Upgrade.Upgrade request
</code>

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

Tampoco veo "Enviar 1" en $ this-> data :-( Además, no estoy actualizando un proyecto 1.3, este es un proyecto 2.0 completamente nuevo. RichardAtHome
Tampoco lo veo en $ _POST tampoco. He actualizado mi pregunta para reflejar esto RichardAtHome
19

En general, es una mala práctica usar el mismo nombre para ambos botones de envío. Debe haber una clave de "envío" en los datos $ _POST y $ this-> request-> data

Probé esto en CakePHP 2.1.1 como se muestra a continuación:

El código de vista:

<code><?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()?>
</code>

El en el controlador en $ this-> request-> data:

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

Y en $ _POST:

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

También puedes darles a los dos envios diferentes nombres:

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

De esta manera puede diferenciarlos en los datos $ _POST o $ this-> request-> data, porque las claves serán los nombres de los envíos:

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

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

Luego, para determinar qué botón se presiona, puede usar un número simple ($ _ POST ['']) o más de $ this-> request-> data?

¿Está utilizando algún filtro personalizado sobre POST, como Codeigniter XSS o? Esto es muy extraño. Una pregunta trivial sería: ¿Estás en la acción correcta? ¿La forma apunta a la acción correcta? Pruébalo con diferentes nombres para los envíos. ¿Podrías también proporcionar los contenidos del POST? Borislav Sabev
No veo esto en mi matriz de publicaciones de formularios, incluso con un nuevo proyecto: S Exploraré un poco más y le responderé ... RichardAtHome
La respuesta más completa imo. pbond

Preguntas relacionadas