为代码字段创建规则(如果未禁用)


Creating rules for a code field if that field is not disabled

我有一个字段客户代码。 如果列表框的值为"员工",则将禁用它,

如果列表框的值为"管理员",则将启用它。如果是管理员,则需要客户代码。但是对于员工,客户代码被禁用,并且无需应用任何规则。

怎么做?

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

1(场景:请注意,我有两个字段/属性:文本/下拉列表在控制器中:

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));
}

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

public function rules()
{
        return array(
                array('dropdown', 'required'),
                array('text', 'required', 'on' => '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)
    }')); ?>

下拉列表错误中的第三个参数是一个数组,其中包含多个 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');
    }
}

在这里,您无需在控制器中设置方案。但是你失去了所需的规则。这里也缺少星号,存在相同的问题。

我可能会选择方式 1。如果你不想要一个直接的警告,你可能必须从JSON中读出错误消息,检查它是否正确,并在回调函数中使用自定义Javascript将正确的类应用于文本标签。