Pytanie w sprawie cakephp, forms, cakephp-2.0 – CakePHP 2.0 Określ, który przycisk przesyłania został kliknięty

9

W CakePHP 1.3 możesz utworzyć formularz z wieloma przyciskami przesyłania:

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

i wykryć, który przycisk przesyłania został naciśnięty w kontrolerze za pomocą:

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

W CakePHP nie ustawiono $ this-> params ['form'] i kliknięto wartość przyciskunie pojawia się nigdzie w $ this-> request, $ this-> request-> data, $ this-> params, $ this-> data lub $ _POST.

Jak ustalić, który przycisk został kliknięty w CakePHP 2.0?

Z góry dziękuję.

Edytować:

Zgodnie z żądaniem, oto kod formularza:

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

I wynik formularza:

<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>
powinieneś także zamieścić wypisany html - jak wygląda Twój przycisk wysyłania! również: czy wokół formularza znajduje się tag <form>? mark

Twoja odpowiedź

4   odpowiedź
0

w 2.0 nie ma$this->params['form'] już wszystkie wypełnione pola formularza pomocnika kończą się w$this->data (co i tak ma więcej sensu)

więc

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

Zauważ, że tutaj również jest lepiej!

PS: możesz użyć mojej ulepszonej powłoki aktualizacyjnej, aby zastąpić ją w kodzie:https://github.com/dereuromark/upgrade

to polecenie

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

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

Również nie widzę go w $ _POST. Zaktualizowałem moje pytanie, aby to odzwierciedlić RichardAtHome
Nie widzę „Prześlij 1” w $ this-> data :-( Również nie aktualizuję projektu 1.3, jest to zupełnie nowy projekt 2.0. RichardAtHome
7

Nie używaj tej samej nazwy dla obu przycisków przesyłania. Rozważmy następujący przykład:

<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) spowoduje wyświetlenie następującego po kliknięciu przycisku „Tak”:

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

A oto kliknięcie przycisku „Nie”:

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

Aby sprawdzić, który przycisk został kliknięty:

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

Ogólnie rzecz biorąc, złym zwyczajem jest używanie tej samej nazwy dla obu przycisków przesyłania. W danych $ _POST i $ this-> request-> powinny znajdować się klucze „submit”

Przetestowałem to w CakePHP 2.1.1, jak pokazano poniżej:

Kod widoku:

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

W kontrolerze w $ this-> request-> data:

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

I w $ _POST:

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

Możesz również przekazać im dwie nazwy:

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

W ten sposób możesz je różnicować w danych $ _POST lub $ this-> request->, ponieważ klucze będą nazwami nadawców:

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

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

Następnie, aby określić, który przycisk jest wciśnięty, możesz użyć prostego zestawu ($ _ POST ['']) lub ponad $ this-> request-> data?

Czy używasz niestandardowego filtrowania przez POST - jak Codeigniter XSS lub? To jest bardzo dziwne. Błahe pytanie brzmi: czy jesteś we właściwej akcji? Czy forma wskazuje na właściwe działanie? Wypróbuj go z różnymi nazwami zgłoszeń. Czy możesz również podać treść POST? Borislav Sabev
Nie widzę tego w moim formularzu post-array - nawet z zupełnie nowym projektem: -S Zbadam trochę później i wrócę do ciebie ... RichardAtHome
Najbardziej kompletna odpowiedź imo. pbond
0
<code>if (!empty($this->request->data['submit']) && $this->request->data['submit'] == "Yes") {
// do your stuff
}
</code>
Jak wspomniałem w poprzedniej odpowiedzi (i zaktualizowałem to pytanie, aby to odzwierciedlało), nie widzę „przesłać” do $ this-> data RichardAtHome
Nie widzę tego również w danych $ this-> request-> (przepraszam, że sądziłem, że to sugerowało, że nie widziałem go $ this-> request) RichardAtHome
@RichardAtHome Not$this->data, to jest$this->request->data. sprawdź ponownie kod za pomocą$this->request->data thecodeparadox

Powiązane pytania