第一次出问题是因为我在layout文件中已经加载了jQuery.js(那个layout文件是美工设计好的模板,自己就用了jquery), 然后create activeform widget的时候registerCoreScript又添了一个jquery进去. 就冲突了.
第二次出问题是因为我没有写:
<div class="row">
<?php echo $form->label($model,'your new email address'); ?>
<?php echo $form->textField($model,'username') ?>
<?php echo $form->error($model,'username'); ?> <---忘记写这一句, 就不会执行server side 的ajax validation.
</div>
后来看看源码CActiveForm.php339行, 如果不设定error, 就要进这个if, 然后就return了, yiiactiveform.js都没有加载, 自然不能执行ajax动作:
if(!$this->enableAjaxValidation && !$this->enableClientValidation || empty($this->attributes)).
第三次出问题情况比较复杂, 而且很奇怪.
暂时只知道是跟我用ajax载入了页面有关, 如果在第2步中不用ajax而用刷新页面方式, 就没有问题正常使用activeform
还是先记录在这里:
1.首先是action->render view, 没有问题
public function actionProfile($page=null)
{
...
if(null===$page)
$this->render('account');
else
//load from ajax
$this->renderPartial($page);
}
2.account.php中:
…
<p class="opLink"><a href="#index.php?r=site/show&page=changeEmail" tar="#content" class="ajaxLoad">Change your email</a></p>
…
就是用ajax载入了href去掉#号的url.
3.changeEmail.php:
<div id="changeEmail">
<?php
$model = new User;
$form=$this->beginWidget(‘CActiveForm’, array(
'action'=>'index.php?r=user/changeEmail',
'id'=>'user-changeEmail-form',
'enableAjaxValidation'=>true,
'enableClientValidation'=>true,
'focus'=>array($model,'username'),
)); ?>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->label($model,'your new email address'); ?>
<?php echo $form->textField($model,'username') ?>
<?php echo $form->error($model,'username'); ?>
</div>
<div class="row">
<?php echo $form->label($model,'your current password'); ?>
<?php echo $form->passwordField($model,'password') ?>
<?php echo $form->error($model,'password'); ?>
</div>
<div class="row submit">
<?php echo CHtml::submitButton('Change it!'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
然后浏览器中查看源文件, 硬是不加载yiiactiveform.js, 以及插入js触发代码. 跟踪php代码进CactiveForm.php的run()方法, 又确实执行了yiiactiveform的注册…
我后来在页面头部手动加入 Yii::app()->clientScript->registerCoreScript("yiiactiveform"); 倒是肯定一定的可以载入这个js了, 但是…因为js触发代码没有插入, 还是不能执行ajax validation…
不知如何是好.