Это мой код:
<?php $form = $this->beginWidget('CActiveForm', array( 'id' => 'swim-subscribe-form', 'enableAjaxValidation' => true, 'action'=>"/mycontroller/myfunction" )); ?> <?php echo CHtml::ajaxSubmitButton('Save',array('/mycontroller/myfunction'),array( 'type'=>'POST', 'dataType'=>'post', 'success'=>'js:function(data){ }', )); $this->endWidget(); ?>
Это мой контроллер:
public actionMyFunction(){ $model = new MyModel; $this->performAjaxValidation($model); if ($model->save()) { $this->redirect('/another_controller'); } } protected function performAjaxValidation($model) { if (isset($_POST['ajax']) && $_POST['ajax'] === 'swim-subscriber-form') { echo CActiveForm::validate($model); Yii::app()->end(); } }
Этот код так или иначе, он всегда выполняет мой url /mycontroller/myfunction
. Он не показывает на моей консоли, что я вызываю /mycontroller/myfunction
через ajax. Зачем ?
UPDATE Это то, что сгенерировало мой ajaxSubmitButton:
<input name="yt0" value="Save" id="yt0" type="submit">
Это нормально ?
У вас есть опечатка в коде. В файле просмотра ID формы
'id' => 'swim-subscribe-form',
Но во время проверки ajax вы проверяете идентификатор
$_POST['ajax'] === 'swim-subscriber-form' // there is an extra R at the end of "subscriber"
Поэтому проверка ajax никогда не запускается, приложение yii никогда не заканчивается, и оно всегда считается отправкой.
Либо исправьте идентификаторы формы, либо удалите проверку идентификатора из проверки ajax в контроллере:
if (isset($_POST['ajax']) && $_POST['ajax'] === 'swim-subscribe-form') { // this has to match with the form ID echo CActiveForm::validate($model); Yii::app()->end(); }
ИЛИ
if(Yii::app()->getRequest()->getIsAjaxRequest()) { echo CActiveForm::validate($model); Yii::app()->end(); }
Проверка идентификатора формы полезна, если у вас есть несколько форм на странице (с тем же действием), и вы не хотите, чтобы ajax проверял каждую из них или если проверка ajax мешает другому запросу ajax к тому же действию. Я редко проверяю идентификатор формы во время проверки ajax.