2015-07-22 6 views
0

При попытке разобраться в этом, но никуда не с ним. У меня есть массив как атрибут для модели, и я пытаюсь создать специальную проверку для некоторых из ключей в массиве, как требуется. Или даже не можете понять, как будут работать метки атрибутов? Вот мой код:Пользовательские правила и проверки Yii2 для атрибута, который является массивом

МОДЕЛЬ

... 
public $company = [ 
        'name'     => '', 
        'trading_name'   => '', 
        'type'     => '', 
       ]; 

public function attributeLabels(){ 
    return [ 
      'company[name]' => 'Company Name', 
    ]; 
} 

public function rules(){ 

    return [ 
      [['company[name]','company[trading_name'], 'safe'], 
      [['company[name]'], 'return_check','skipOnEmpty'=> false], 

    ]; 
} 

public function return_check($attribute, $params){ 

    $this->addError($attribute ,'Required '); 
    return false; 
} 
... 

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

ответ

1

Я думаю, вам нужна отдельная модель для компании.

+0

Да, если я создаю различные модели, а затем с помощью ActiveForms генерировать форму, это может сделать проверку, но моя проблема в том, что я хочу для пропуска ActiveRecords. Есть ли другой путь? А для простых атрибутов (а не массивов) все же пользовательский валидатор не запускается. Я что-то упускаю? –

+0

Затем создайте собственное правило для переменной $ company и manualy, чтобы проверить все элементы. – Konstantin

+0

@ThinkDifferent Вам не нужно позволять вашей модели наследовать от ActiveRecord, просто используйте 'yii \ base \ Model'. Он легкий, но позволяет делать все виды валидации. Yii поощряет объектно-ориентированное программирование на основе классов; если вы попытаетесь работать против этого, у вас будет плохое время. – tarleb

0

Я использовал функции пользовательских правил, и все они работали. Попробуйте удалить предложение return в конце функции return_check.

Вот что работает для меня:

class Essid extends ActiveRecord { 
    public function rules() { 
     return [ 
      ['network_name', 'checkNetworkName'] 
     ] 
    } 

    public function checkNetworkName($attribute, $params){ 
     if (!$this->hasErrors()) { 
      if (!ctype_alnum($this->network_name)) 
       $this->addError($attribute, Yii::t('app', 'Not a valid Network Name')); 
     } 
    } 
} 

Надеется, что это помогает