2012-04-16 2 views
9

В CakePHP 1.3 вы можете создать форму с нескольких кнопок отправки:CakePHP 2,0 Определить, какая кнопка отправить была нажата

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

и обнаружения, который подают кнопку прессовали в контроллере с:

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

В CakePHP $ this-> params ['form'] не установлен, а значение кнопки clicked не отображается нигде в $ this-> request, $ this-> request-> data, $ this-> params , $ this-> data или $ _POST.

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

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

Edit:

В соответствии с просьбой, вот код формы:

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

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

<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

вы также должны опубликовать выводимый html - что представляет собой кнопка отправки на ваш взгляд! также: у вас есть тег

вокруг вашей формы? – mark

ответ

0

в 2.0 нет $this->params['form'] больше все form helper размещены в $this->data (что имеет смысл в любом случае)

так

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

обратите внимание, что! Пусто() лучше здесь.

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

его команда

cake Upgrade.Upgrade request 

(https://github.com/dereuromark/upgrade/blob/ мастер/Console/Command/UpgradeShell.php # L833)

+0

Я не вижу «Отправить 1» в $ this-> данных :(( Кроме того, я не обновляю проект 1.3, это совершенно новый проект 2.0. – RichardAtHome

+0

Также не вижу его в $ _POST либо Обновили мой вопрос, чтобы отразить это – RichardAtHome

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

Как я уже упоминал в предыдущем ответе (и обновил вопрос, чтобы отразить это), я не вижу 'submit' в $ this-> data – RichardAtHome

+0

@RichardAtHome Не '$ this-> данные ', это' $ this-> request-> data'. перепроверите код с '$ this-> request-> data' – thecodeparadox

+0

Также не видите его в $ this-> request-> data (извините, я думал что подразумевалось с моей мыслью о том, что я не вижу этого $ this-> request) – RichardAtHome

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

отладки ($ this-> request-> данные) будет производить следующее, когда кнопка "Да" щелкают:

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

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

Я тестировал это в 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()?> 

в контроллере в $ этом-> request-> данных:

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?

+0

Самый полный ответ imo. – pbond

+0

Не видя этого в моем блоке сообщений формы - даже с совершенно новым проектом: -S Я расскажу немного позже и вернитесь к вам ... – RichardAtHome

+0

Используете ли вы какую-либо пользовательскую фильтрацию через POST - например, Codeigniter XSS или? Это очень странно. Тривиальный вопрос: будете ли вы в правильном действии? Форма, указывающая на правильное действие? Попробуйте его с другими именами для отправки. Не могли бы вы также указать содержание POST? –

Смежные вопросы