如果未禁用该字段,则为代码字段创建规则

ASD*_*ASD 0 php yii

我有一个现场客户代码.如果列表框的值为staff,则将禁用它,如果列表框值为admin,则将启用它.如果是admin,则需要customercode.但是如果是员工,则会禁用客户代码,并且不必应用任何规则.

怎么做?

Nar*_*etz 6

我可以想到两种方式,或者这些方式的组合.两者都需要一些调整以获得完美的结果,但它们非常好:

1)场景:请注意,我有两个字段/属性:text/dropdown在您的控制器中:

public function actionScenario()
{
    $model=new ScenarioForm;

    // if it is ajax validation request
    if(isset($_POST['ajax']) && $_POST['ajax']==='scenario-form')
    {
        if($_POST['ScenarioForm']['dropdown'] == 'admin')
            $model->scenario = 'admin';

        echo CActiveForm::validate($model);
        Yii::app()->end();
    }

    // collect user input data
    if(isset($_POST['ScenarioForm']))
    {
        $model->attributes=$_POST['ScenarioForm'];

        if($model->dropdown == 'admin')
            $model->scenario = 'admin';

        // validate user input
        $model->validate();
        //do other stuff
    }
    // display the login form
    $this->render('scenario', array('model'=>$model));
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我检查下拉值是否为admin; 如果是这样,我将模型的场景更改为"admin".在模型规则中,我有这个:

public function rules()
{
        return array(
                array('dropdown', 'required'),
                array('text', 'required', 'on' => 'admin'),
        );
}
Run Code Online (Sandbox Code Playgroud)

您会看到,仅在方案为admin时才需要文本.如果您现在在下拉列表中有管理员,并且文本字段中没有任何内容,并提交表单,您将收到正确的错误.如果您想要即时,ajax反馈,当用户更改下拉菜单时,您可能希望在您的视图中显示:

    <?php echo $form->labelEx($model,'dropdown'); ?>
    <?php echo $form->dropDownList($model,'dropdown', array('admin' => 'Admin', 'staff' => 'Staff!')); ?>
    <?php echo $form->error($model,'dropdown', array('afterValidateAttribute' => 'js:function(form, attribute, data, hasError)
    { 
        mSettings = $.fn.yiiactiveform.getSettings(form);
        $.fn.yiiactiveform.updateInput(mSettings.attributes[1], data, form)
    }')); ?>
Run Code Online (Sandbox Code Playgroud)

下拉列表错误中的第三个参数是一个包含多个html选项的数组,例如在使用ajax验证下拉列表后调用的回调.通常,只有在执行ajax验证时才会更新当前字段(即使您收到所有错误).因此,我们在回调中指定还应更新文本字段的错误.现在,您将看到在下拉列表中选择管理员时出现错误(而不是在启动时).

它并不完美,因为你没有得到文本字段所需的*,并立即得到警告.我不确定Yiiactiveform是否具有绘制字段装饰的功能,而不是警告.但你可以扩展它来做到这一点,或者在回调中使用自定义js.如果您在提交后只需要正常验证,则还可以使用自定义Javascript将所需类添加到文本标签中.目前我不确定CActiveForm在属性中是否有特殊参数.

2)自定义验证规则.与之类似,虽然您不使用场景(但仍然是视图中的js回调).而是为下拉列表创建自定义验证规则,并将其放入规则数组中.当下拉列表更改时,我们会在文本字段中添加错误.

public function check_dropdown($attribute,$params){
    if($this->$attribute=="admin"){
        $this->addError('text', 'Please enter Text!');

        $this->clearErrors('text');
    }            
}

public function check_text($attribute,$params){
    if($this->$attribute!=""){
            $this->clearErrors('text');
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,您无需在控制器中设置方案.但是你失去了必要的规则.同样的问题还有丢失的星号.

我可能会用的方式1. go如果你不想彻底的警告,你可能要宣读了JSON的错误信息,检查它是否是正确的,而正确的类适用于文本与标签回调函数中的自定义Javascript.