2015-03-18 2 views
2

Рассмотрим меня Somthing как это:Yii2: Правила валидации для всего объекта модели вместо отдельных атрибутов?

class Dummy extends yii\base\Model { 
    public $a; 
    public $b; 

    public function rules() { 
     return [ ??? ]; 
    } 
} 

Как я мог бы создать правило проверки с учетом как атрибуты $ а и $ Ь в то же время? Представьте себе, что либо $ a, либо $ b или оба должны иметь значение. Если ни один из них не установлен, я хочу получить одну ошибку проверки, например «Либо a, либо b должен быть установлен». Я думаю, что when property здесь не помогает (я мог бы создать условия для каждого атрибута, проверив другое свойство соответственно, но это создаст две ошибки проверки).

Приведенный выше пример является простым. Но это может быть намного сложнее и зависит от других вещей.

С Model::addError() нужен атрибут, кажется, я не могу этого добиться. Ошибки зависят от атрибута. Так как еще я могу проверить весь объект и, например, выяснить, можно ли сохранить объект модели с его текущими значениями. Существует ли какая-либо проверка, которая находится поверх проверки атрибута? Валидация более высокого уровня?

ответ

0

Я считаю, что вам нужно, это пользовательские правила проверки:

public function rules() 
{ 
    return [ 
     [['a', 'b', 'c'], 'myCustomRule'], 
    ]; 
} 

public function myCustomRule($attribute) 
{ 
    if(!$this->a && !$this->b && !$this->c) { 
     $this->addError($attribute, "One of these attributes is required: a, b, c"); 
    } 
} 
+0

Спасибо, но это не то, что я ожидал. Это вызывает 3 ошибки, поскольку правило выполняется для каждого атрибута. – robsch

+0

Да Я сделал это нарочно: пользователь увидит три выделенных поля и будет знать, какие поля мы подразумеваем в сообщении об ошибке. Вы можете оставить только одну, если хотите, но все три будут проверены: '' ' public function rules() { { [ [['a',], 'myCustomRule'], [['b' , 'c'], 'string'], // или любой другой ]; } '' ' –

0

Согласно guide можно передать * в качестве атрибута addError($attribute, $error). Однако, поскольку сообщение не связано с существующим атрибутом, сообщение должно отображаться с errorSummary() как часть ActiveForm. Метод

Правила в модели

public function rules() { 
    return [ 
     [['a', 'b'], 'validateAandB'], 
    ]; 
} 

Пользователи:

public function validateAandB($attribute, $params) { 
    $this->addError('*', 'a and/or b should have a value.'); 
} 

В связи с формой:

<?php $form = ActiveForm::begin(); ?> 
    <?= $form->errorSummary($model) ?> 
    <?= $form->field($model, 'a') ?> 
    <?= $form->field($model, '') ?> 
    <?= Html::submitButton('Submit', ['class' => 'btn btn-success']) ?> 
<?php ActiveForm::end(); ?> 

На самом деле, это не требуется, чтобы использовать *, любая строка в порядке , Если это имя свойства, ошибка подтверждения будет показана рядом с входом и в сводке, в противном случае она отображается только в сводке (в итоговой таблице не отображаются имена атрибута, а также сообщения об ошибках).

Обратите внимание, что сообщение добавляется дважды, поскольку проверка выполняется для двух атрибутов. Однако, поскольку он добавляется для одного и того же имени (здесь: *), и по умолчанию отображается только первое сообщение атрибута, оно будет отображаться только один раз.

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