2015-04-27 5 views
3

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

У меня есть модуль с моделью «Страница» в моем коде ниже.

У меня есть два атрибута, которые мне нужно использовать для проверки модели. Это hero_link и hero_linked. Если hero_linked истинно, я хочу потребовать hero_link.

В руководстве here они объясняют правильный синтаксис для такого рода валидатора

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

мой соответствующий код ниже:

// Page model 
namespace common\modules\page\models; 

use Yii; 

class Page extends \yii\db\ActiveRecord 
{ 
    public function rules() 
    { 
     return [ 
      [['hero_linked',], 'boolean'], 
      [['hero_linked',], 'required'], 
      [['hero_link',], 'string', 'max' => 255], 
      [ 
       'hero_link', 
       'required', 
       'when' => function($model) { 
        return $model->hero_linked == true; 
       }, 
       'whenClient' => "function (attribute, value) { 
        return $('#page-hero_linked').val() == '1'; 
       }", 
      ], 
     ]; 
    } 
} 

// _form view 
<?php $form = ActiveForm::begin(); ?> 
    <?= $form->field($model, 'hero_linked')->checkbox() ?> 
    <?= $form->field($model, 'hero_link')->textInput(['maxlength' => 255]) ?> 
<?php ActiveForm::end(); ?> 

Необходимое средство проверки правильности применения, но это, кажется, не обращая внимания на когда имущество, требующее даже если мой флажок снят. Является ли мой синтаксис неправильным, или я пропустил требование? Любая помощь приветствуется, спасибо заранее!

+0

Синтаксис кажется правильным. Может быть, проблема в том, что «hero_linked» также является обязательным, так что на самом деле другое условие никогда не произойдет. Старайтесь, если 'hero_linked' не проверен - это reutrns и error. просто думая ... – Asped

+0

, если это единственная проблема с js, можете ли вы попробовать обновить часть «whenClient», чтобы вернуть '$ (« # page-hero_linked »). attr ('checked')'? – arkoak

+0

Я выяснил, что из-за того, что yii2 делает флажки, вы не можете использовать JS для получения значения этого флажка с помощью атрибута checked. флажок имеет скрытое поле, которое я предполагаю обновления при представлении, но не в режиме реального времени. –

ответ

1

Я думаю, это то, что вы хотите. Сначала используйте свойство «checked» в поле whenClient поля ввода, чтобы получить, если флажок установлен или нет.

Скрытое поле флажка не является проблемой.

Значение whenClient в hero_linked (флажок) используется для проверки поля hero_link (textinput) при изменении флажка. Итак, вы сразу видите, требуется ли hero_link (textinput) или нет.

Вам не нужен дополнительный код js в вашей форме, если вы используете эти правила.

Но поскольку вы также можете видеть, что из-за полного имени «страница-что-то» это действительно исправлено только для модели «страница», и я думаю, что это также зависит от имени формы. Поэтому вы должны использовать некоторые другие фиксированные «id» для обоих полей в form.php, чтобы это также работало, если вы расширяете свою модель страницы до другого класса.

[ 
    'hero_linked', 'required', 
    'whenClient' => "function (attribute, value) { 
     $('form').yiiActiveForm('validateAttribute', 'page-hero_link'); 
     return true; 
    }", 
], 
[['hero_link',], 'string', 'max' => 255], 
[ 
    'hero_link', 'required', 'when' => function ($model) { 
     return $model->hero_linked == true; 
    }, 
    'whenClient' => "function (attribute, value) { 
     return $('#page-hero_linked').prop('checked'); 
    }", 
], 
0

Я узнал, как сделать эту работу. Если вы используете флажок, вы не можете использовать только проверку на стороне сервера или клиента. Мне приходилось использовать как when, так и whenClient. Мне нужно было зарегистрировать сценарий в моем представлении, чтобы проверенный атрибут обновился.

$('label > #page-hero_linked').click(function(event) { 
    var checked = $(this).attr('checked'); 
    if (checked) { 
     $(this).removeAttr('checked'); 
    }else{ 
     $(this).attr('checked', ''); 
    }; 
}); 

и ниже мое правило проверки.

[['hero_link'], 
'required', 
'when' => function($model) { 
    return $model->hero_linked == true; 
}, 
'whenClient' => "function (attribute, value) { 
    return $('#page-hero_linked').attr('checked'); 
}",], 

В общем, довольно простой код, чтобы заставить его работать, но не для меня очевидно, что это много требуется от документации.