Создание правил для поля кода, если это поле не отключено

У меня есть поле код клиента. он будет отключен, если значение списка составлено из персонала, и включен, если значение списка установлено как admin. В случае администратора, код клиента требуется. но в случае персонала код клиента отключен, и никакие правила не применяются.

Как это сделать

 llamerr14 мая 2012 г., 19:55
Я думаю, что ты можешь сделать это с помощью сценариев, но я не уверен ... Yiiframework.com / вики / 266 / понимание-сценарий

Ответы на вопрос(1)

Решение Вопроса

настройке для идеальных результатов, но они довольно хороши:

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

Видите ли, текст требуется только в случае сценария 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 в функции обратного вызова.

 ASD15 мая 2012 г., 04:59
Я пытался, и сценарий работает нормально. Большое спасибо за отличный и подробный ответ !!!

Ваш ответ на вопрос