И валидируются только первые 3 ключа, а массив с ключом НОЛЬ и его элементами остается в стороне...таких массивов у меня может быть несколько еще например :
public function validateAttr()
{
foreach($this->productCode as $key => $code){
if (empty($code)) {
$this->addError('productCode['.$key.']', 'Поле должно быть заполнено');
break;
}
}
}
pegas1981 писал(а):Что именно не работает? Адаптируйте код под свои данные. Код абсолютно рабочий. Валидация работает как на весь атрибут, так и на значение атрибута.
не могли бы вы, если не сложно, функцию валидатора продемонстировать в моем случае...а именно как провалидировать productCode в массиве?
public $products; // объявляем атрибут модели
public function attributeNames() {
return array(
'products',
);
}
public function attributeLabels() {
return array(
'products' => 'Продукты',
);
}
public function rules() {
return array(
array('questions', 'checkProducts', 'on' => self::getScenarioName( self::FORM_TYPE_REQUET_AVAILABILITY), // объявляем правило проверки атрибута для вашего сценария
);
}
/**
* Проверка значения атрибута "questions"
* Валидатор для использования в rules().
* @param string $attribute Наименование атрибута
* @param array $params Дополнительные параметры
* @return boolean
*/
public function checkProducts($attribute, $params) {
$data = filter_input(INPUT_POST, get_class($this), FILTER_UNSAFE_RAW, FILTER_REQUIRE_ARRAY);
if (!isset($data[$attribute])){
$this->addError($attribute, sprintf('Необходимо заполнить поле «%s».', $this->getAttributeLabel($attribute)));
return false;
}
foreach ($data[$attribute] as $key => $row) {
if (!is_numeric($row['ncode'])) {
$this->addError(sprintf('products[%s][ncode]', $key), 'Код должен быть числом.');
}
}
}
public $products; // объявляем атрибут модели
public function attributeNames() {
return array(
'products',
);
}
public function attributeLabels() {
return array(
'products' => 'Продукты',
);
}
public function rules() {
return array(
array('questions', 'checkProducts', 'on' => self::getScenarioName( self::FORM_TYPE_REQUET_AVAILABILITY), // объявляем правило проверки атрибута для вашего сценария
);
}
/**
* Проверка значения атрибута "questions"
* Валидатор для использования в rules().
* @param string $attribute Наименование атрибута
* @param array $params Дополнительные параметры
* @return boolean
*/
public function checkProducts($attribute, $params) {
$data = filter_input(INPUT_POST, get_class($this), FILTER_UNSAFE_RAW, FILTER_REQUIRE_ARRAY);
if (!isset($data[$attribute])){
$this->addError($attribute, sprintf('Необходимо заполнить поле «%s».', $this->getAttributeLabel($attribute)));
return false;
}
foreach ($data[$attribute] as $key => $row) {
if (!is_numeric($row['ncode'])) {
$this->addError(sprintf('products[%s][ncode]', $key), 'Код должен быть числом.');
}
}
}
именно, либо $model->save(true, $model->attributes)
Валидация заработала спасибо! только вот когда 1 из 2ух полей заполняешь и нажимаешь сабмит то не сохраняет значения уже введенного поля... в инпуте, как быть с этим?
Такого не может быть. Проверьте данные трассировкой заголовков браузера и в данных приходящих на сервер ($_POST). Если данные есть и валидация прошла успешно, тогда ошибка в выводе.
pegas1981 писал(а):Такого не может быть. Проверьте данные трассировкой заголовков браузера и в данных приходящих на сервер ($_POST). Если данные есть и валидация прошла успешно, тогда ошибка в выводе.
В $_POST приходит всё, валидация проходит, но value инпута пустое... =( точнее его вообще нет.
В $_POST приходит всё, валидация проходит, но value инпута пустое... =( точнее его вообще нет.
Вы сами поняли что написали? Я - нет. Рекомендую вам почитать мануалы. Мне кажется вы не понимаете что делаете.
Что именно непонятно? Отправляю форму - при этом оставляю 1 из 2ух полей пустым, проходит валидация что 1 поле не заполнено, а во втором поле должно остаться предыдущее значение (value в инпуте должно равняться предыдущему введенному значению и $_POST) - оно же пустое, пропадает....и его нужно каждый раз перезабивать... поля со стандартной валидацией работают кооректно...
Публикуйте свой код MVC. Если бы вы сделали всё правильно, то модель бы заполнилась автоматически. Я поэтому и говорю, что вы сами не понимаете что делаете.