Вопрос по – CakePHP 2.0 Определите, какая кнопка отправки была нажата

9

В CakePHP 1.3 вы можете создать форму с несколькими кнопками отправки:

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

и определить, какая кнопка отправки была нажата в контроллере:

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

В CakePHP не устанавливается $ this-> params ['form' '] и значение нажатой кнопкиdoesn't appear anywhere in $this->request, $this->request->data, $this->params, $this->data or $_POST.

Как определить, какая кнопка была нажата в CakePHP 2.0?

Заранее спасибо.

Редактировать:

В соответствии с запросом, вот код формы:

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

И вывод формы:

<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>
Вы также должны опубликовать выведенный HTML - как выглядит кнопка отправки на ваш взгляд! также: есть ли у вас тег <form> вокруг вашей формы? mark

Ваш Ответ

4   ответа
19

использование обеих кнопок отправки - это одно и то же имя. Должен быть ключ "submit" в $ _POST и $ this-> request-> data

Я протестировал это в CakePHP 2.1.1, как показано ниже:

Код вида:

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

В контроллере в $ this-> request-> data:

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

И в $ _POST:

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

Вы также можете дать двум представителям разные имена:

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

Таким образом, вы можете различать их в данных $ _POST или $ this-> request->, потому что ключи будут именами отправителей:

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

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

Затем, чтобы определить, какая кнопка нажата, вы можете использовать простой isset ($ _ POST ['']) или более $ this-> request-> data?

Наиболее полный ответ imo. pbond
Не вижу этого в моем массиве постов - даже с совершенно новым проектом: -S Я расскажу немного позже и вернусь к вам ... RichardAtHome
Используете ли вы какую-либо пользовательскую фильтрацию по POST-подобному Codeigniter XSS или? Это очень странно. Тривиальный вопрос будет: вы в правильном действии? Форма указывает на правильное действие? Попробуйте это с другими именами для представлений. Не могли бы вы также предоставить содержание POST? Borislav Sabev
7

этот пример:

<?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-> data) при нажатии кнопки "Да" выдаст следующее:

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

А вот когда нажата кнопка «Нет»:

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

Чтобы проверить, какая кнопка была нажата:

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

$this->params['form'] все поля, добавленные помощником формы, заканчиваются на$this->data (что в любом случае имеет смысл)

та

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

отметим, что здесь тоже лучше empty ().

PS: вы можете использовать мою улучшенную оболочку для обновления, чтобы заменить ее в своем коде:https: //github.com/dereuromark/upgrad

это команда

cake Upgrade.Upgrade request

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

Я также не вижу «Отправить 1» в данных $ this-> :-( Кроме того, я не обновляю проект 1.3, это новый проект 2.0. RichardAtHome
Также не вижу его в $ _POST. Обновил мой вопрос, чтобы отразить это RichardAtHome
0
if (!empty($this->request->data['submit']) && $this->request->data['submit'] == "Yes") {
// do your stuff
}
@ RichardAtHome Не$this->data, это$this->request->data. пожалуйста, перепроверьте код с$this->request->data thecodeparadox
Как я упоминал в предыдущем ответе (и обновил вопрос, чтобы отразить это), я не вижу 'submit' в $ this-> data RichardAtHome
Также не вижу его в $ this-> request-> data (извините, я подумал, что это подразумевало мою точку зрения о том, что я не вижу $ this-> request) RichardAtHome

Похожие вопросы