Yii 1.1 – 使用验证创建多步骤表单
我基本上尝试使用Yii中的CActiveForm类创建一个多步骤表单.我的想法是希望使用内置功能以最简单的方式实现这一点.我的要求如下:
>多步骤ONE PAGE表单(使用显示/隐藏jQuery的DIV) 这是我迄今为止开发的半工作解决方案: 视图: <div class="form"> <?php $form = $this->beginWidget('CActiveForm',array( 'id'=>'listing-form','enableClientValidation'=>false,'enableAjaxValidation'=>true,'clientOptions'=>array( 'validateOnChange'=>true,'validateOnSubmit'=>true,'afterValidate'=>'js:validateListing',),)); ?> <?php echo $form->errorSummary($model); ?> <div class="step" id="step-1"> // model input fields <?php echo CHtml::submitButton('Next Step',array('name'=>'step1')); ?> </div> <div class="step" id="step-2" style="display: none;"> // model input fields <?php echo CHtml::submitButton('Next Step',array('name'=>'step2')); ?> </div> <div class="step" id="step-3" style="display: none;"> // model input fields <?php echo CHtml::submitButton('Submit',array('name'=>'step3')); ?> </div> <?php $this->endWidget(); ?> </div> JavaScript的: function validateListing(form,data,hasError) { if(hasError) { // display JS flash message } else { if($('#step-1').css('display') != 'none') { $('#step-1').hide(); $('#step-2').show(); } else if($('#step-2').css('display') != 'none') { $('#step-2').hide(); $('#step-3').show(); } else if($('#step-3').css('display') != 'none') { return true; // trigger default form submit } } } 控制器: public function actionCreate() { $model = new Listing; // step 1 ajax validation if(isset($_POST['step1'])) { $attributes = array('name','address1','etc'); $this->performAjaxValidation($model,$attributes); } // step 2 ajax validation if(isset($_POST['step2'])) { $attributes = array('category','type',$attributes); } // step 3 ajax validation if(isset($_POST['step3'])) { $attributes = array('details','source',$attributes); } // process regular POST if(isset($_POST['Listing'])) { $model->attributes = $_POST['Listing']; if($model->validate()) // validate all attributes again to be sure { // perform save actions,redirect,etc } } $this->render('create',array( 'model'=>$model,)); } protected function performAjaxValidation($model,$attributes=null) { if(isset($_POST['ajax']) && $_POST['ajax']==='listing-form') { echo CActiveForm::validate($model,$attributes); Yii::app()->end(); } } 总结一下.基本上我所拥有的是一个带有3个提交按钮的表单(每个步骤一个).在我的控制器中,我检查按下了哪个提交按钮,并对特定于该步骤的属性运行AJAX验证. 我使用自定义的afterValidate()函数来显示/隐藏提交时的步骤.在步骤3,触发默认表单提交,将所有表单属性发布到控制器. 这很有效,除了它不能与validateOnChange()一起使用(因为提交按钮没有被发布).另外我想知道这是否真的是最好的方法,或者是否有人知道更好的方法? 谢谢.
我建议使用场景来打开和关闭适当的规则.根据发送到控制器的内容调整模型方案.
注意:这也可能是使用CFormModel而不是CActiveRecord的好地方,具体取决于表单中的内容. 编辑:您是否可以为每个div部分添加一个隐藏字段,其中包含有关您所处步骤的信息?似乎应该工作而不是你的提交按钮. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |