Pergunta sobre cakephp, forms, cakephp-2.0 – CakePHP 2.0 Determine qual botão de submissão foi clicado

9

No CakePHP 1.3 você pode criar um formulário com vários botões de envio:

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

e detectar qual botão de submissão foi pressionado no controlador com:

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

No CakePHP, $ this-> params ['form'] não está definido e o valor do botão clicadonão aparece em nenhum lugar em $ this-> request, $ this-> request-> data, $ this-> params, $ this-> data ou $ _POST.

Como faço para determinar qual botão foi clicado no CakePHP 2.0?

Desde já, obrigado.

Editar:

Conforme solicitado, aqui está o código do formulário:

<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>

E a saída do formulário:

<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>
Você também deve postar o html de saída - o que o botão de envio parece na sua opinião! também: você tem uma tag <form> em seu formulário? mark

Sua resposta

4   a resposta
0
<code>if (!empty($this->request->data['submit']) && $this->request->data['submit'] == "Yes") {
// do your stuff
}
</code>
Também não vejo isso em $ this-> request-> data (desculpe, eu pensei que estava implícito com o meu ponto sobre não vê-lo $ this-> pedido) RichardAtHome
Como mencionei em uma resposta anterior (e atualizei a pergunta para refletir isso), não vejo 'submit' em $ this-> data RichardAtHome
@RichardAtHome Não$this->data, isto é$this->request->data. por favor, verifique novamente o código com$this->request->data thecodeparadox
0

em 2.0 não há$this->params['form'] mais todos os campos de formulário ajudante postados acabam em$this->data (o que faz mais sentido de qualquer maneira)

assim

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

note que! empty () é melhor aqui também.

PS: você pode usar meu shell de upgrade aprimorado para substituí-lo em seu código:https://github.com/dereuromark/upgrade

é o comando

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

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

Também não o vejo em $ _POST também. Atualizei minha pergunta para refletir isso RichardAtHome
Eu não vejo "Submeter 1" em $ this-> dados :-( Além disso, não estou atualizando um projeto 1.3, este é um novo projeto 2.0. RichardAtHome
7

plo:

<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) produzirá o seguinte quando o botão "Sim" for clicado:

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

E aqui é quando o botão "Não" é clicado:

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

Para verificar qual botão foi clicado:

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

é uma prática ruim usar o mesmo nome para os dois botões de envio. Deve haver uma chave "submit" nos dados $ _POST e $ this-> request->

Eu testei isso no CakePHP 2.1.1 como mostrado abaixo:

O código da 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>

O no controlador em $ this-> request-> data:

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

E em $ _POST:

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

Você também pode dar dois nomes diferentes aos usuários:

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

Desta forma, você pode diferenciá-los nos dados $ _POST ou $ this-> request->, porque as chaves serão os nomes dos envios:

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

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

Então, para determinar qual botão é pressionado, você pode usar um simples isset ($ _ POST ['']) ou acima de $ this-> request-> data?

Resposta mais completa imo. pbond
Não vendo isso na minha forma post array - mesmo com um novo projeto: -S vou explorar um pouco mais depois e voltar para você ... RichardAtHome
Você está usando alguma filtragem personalizada sobre o XS Codeigniter ou POST? Isto é muito estranho. Uma pergunta trivial seria: você está na ação certa? O formulário está apontando para a ação correta? Experimente com nomes diferentes para os envios. Você poderia também fornecer o conteúdo do POST? Borislav Sabev

Perguntas relacionadas