2015-03-31 3 views
5

Я пытаюсь использовать это правило проверки в своей модели, но он не работает.Yii2: безопасный валидатор при условии

Я имею в виду, что он всегда остается в безопасности, даже если выбрать другой вариант.

[['dhanwantri_bill_number'], 'safe', 
    'when' => function($model) { 
     return $model->bill_type =='d';     
    }, 
    'whenClient' => "function (attribute, value) { 
         return $('#opdtestbill-bill_type').val() == 'd'; 
        }" 
], 

Я делаю что-то неправильно? Есть ли альтернативное решение для достижения того же.

Спасибо.

Правило bill_type, как

[['bill_type'], 'string', 'max' => 20], 
[['bill_type','test_name','date'], 'required'], 

Редактировать безопасного атрибута общественных свойств, как в документ

$ когда - вызываемый - PHP-вызываемый которого возвращаемого значение определяет ли этот валидатор должен применяется. yii \ validators \ Validator

$ whenClient - string - имя функции JavaScript, возвращаемое значение определяет, должен ли этот валидатор применяться на стороне клиента . yii \ validators \ Validator

+0

Есть ли у вас какие-либо другие правила для этого атрибута? – topher

+0

Вы действительно хотите использовать «безопасный» валидатор? [Doc] (http://www.yiiframework.com/doc-2.0/yii-validators-safevalidator.html) говорит, что _SafeValidator служит фиктивным валидатором, основная цель которого - отметить атрибуты, которые будут безопасны для массового присваивания. вы хотите запретить назначение dhanwantri_bill_number, если bill_type - 'd'? – robsch

+0

@robsch - Нет, это совсем наоборот - я хочу разрешить присваивание, если 'dhanwantri_bill_number', если bill_type равен 'd' и запретить в других случаях. – Pawan

ответ

3

Как «безопасный» валидатор просто сообщает, что атрибут может быть установлен массивным назначением, подход не подходит. Он просто говорит, что когда вы используете метод load(), атрибут может получить значение. И если он не помечен как «безопасный», он не предотвращает установку значения, например. $model->dhanwantri_bill_number = 'asdf'. Так что это не правильное решение.

Точнее: атрибут «безопасный» не действует, когда вызывается $model->validate() (который обычно вызывается с помощью $model->save()). Он используется только тогда, когда вызывается $model->load(). Если вы посмотрите на класс source code of the SafeValidatior, вы увидите, что с этим валидатором ничего не происходит. Валидатор ничего не делает. Это всего лишь маркер (вы можете сравнить его, например, с RequiredValidator). И с load() выражение 'when' не используется. Поэтому вы можете сказать «Сейф» не работает с «когда». Безопасный валидатор может использоваться, когда правило получает оценку, но его validateAttribute() пуст, поэтому в этот момент ничего не происходит.

Кроме того, whenClient в вашем коде не имеет смысла. Что должно случиться здесь?

Я думаю, есть несколько способов понять это. Одна из идей заключалась бы в том, чтобы позволить контроллеру устанавливать атрибуты не с помощью load(), а скорее устанавливать их явно и проверять там, если $model->dhanwantri_bill_number должен быть установлен или нет. Или вы можете использовать load(), а затем вернуть атрибут после загрузки в соответствии с тем, что установлено $model->bill_type.

Или вы можете реализовать метод setter для dhanwantri_bill_number в своей модели и выбрать там, если атрибут установлен или нет. Может быть, зависит от сценария.

+0

, но документ говорит с 'safe validator' эти общедоступные свойства доступны как «вызываемые» - я добавил свойства в свой вопрос. – Pawan

+0

Так что 'safe' не работает с 'when', поэтому я должен предположить, что то, что упоминается в документах, неверно? как в документе ясно сказано, что 'когда' доступно с' безопасным' – Pawan

+0

@Pawan Да, 'когда' есть. Но безопасный валидатор действует только на load(). И при загрузке модель просто смотрит, какие атрибуты являются частью правил проверки (все упомянутые атрибуты (текущего сценария) без префикса!!). Он не оценивает выражение «когда» на этом шаге. Это происходит, когда вызывается метод validate() модели. И это уже поздно. ИМО в документе отсутствует с классом SafeValidator. – robsch

1

С Yii2 документ:

По умолчанию активный атрибут считается безопасным и может быть массово присвоены.Если атрибут НЕ должен быть массово назначен (таким образом, считается небезопасным), пожалуйста, префикс атрибута с восклицательным знаком (например, «! Rank»).

Рассмотрите возможность использования сценариев для решения вашей проблемы. http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

Смежные вопросы