Задать вопрос
MacFiss
@MacFiss
человек

Как вывести ошибку addError если атрибут — массив?

Здравствуйте! Как я понял addError не принимает в качестве параметров 'fields[name]'. (он обрезает скобки)
Подскажите пожалуйста варианты решения проблемы...

Представление:
<?php foreach( $modelsField as $_model ): ?>
                <?php
                $info = false;

                if( !empty($model->id) and ($result = $_model->getFieldValue($model->id)->one()) ) {
                    $info = $result->value;
                }
                ?>
                <?= $form->field($_model, 'other['.$_model->name.']')
                    ->textInput(['value' => $info])
                    ->label($_model->name) ?>
            <?php endforeach; ?>


Моделька, кэллбэк функция для проверки поля other:
public function checkOther($attribute, $params)
    {
        foreach( $this->$attribute as $key => $value ) {
            $this->addError('other['.$key.']', 'test');
            break;
        }
    }


Нашел вариант решения проблемы. Но у меня не получилось дописать магические геттеры и сеттеры. Может есть у кого примеры реализации? Ссылка
  • Вопрос задан
  • 1012 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
MacFiss
@MacFiss Автор вопроса
человек
И так, решение проблемы. Модель имеет метод под названием onUnsafeAttribute. Данный метод вызывается в том случае, если была передана в модель какая либо переменная, которая не была объявлена. Концепт следующий:
1) В представлении, other[name1..n] используем other_name1..n
2) Определим переменную в модели $other типа array
3) Переопределим функцию onUnsafeAttribute и сделаем запись в наш массив.
4) В правилах огласим кэллбэк на нашу переменную и в нем будем перебирать наш массив.

<?php
namespace backend\models;

use Yii;
use backend\models\Model;
use backend\filters\Filter;

class MySuperModel extends Model
{
    public $name;
    public $other = [];

    public function rules()
    {
        return [
            [['name','other'], 'required'],
            ['other', 'checkOther'],
        ];
    }

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

    public function onUnsafeAttribute($name, $value)
    {
        if( ! strpos('other_', $name) ) {
            list($other, $name) = explode('_', $name);
            $this->other[$name] = $value;
        }
    }
    
    public function checkOther(string $attribute)
    {
        if( ! is_array($this->$attribute) ) {
            return false;
        }
        
        $errors = [];

        foreach( $this->$attribute as $name => $value ) {
            $filter = Filter::run($this->site_id, $name, $value);
            $name = 'other_' . $name;
            
            if( ! $filter ) {
                $errors[$name] = Yii::t('messages', 'Field does not exist');
                continue;
            }
        }

        if( !empty($errors) ) {
            return $this->addErrors($errors);
        }

        return true;
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Видимо проблема тут:
class Model extends Component implements IteratorAggregate, ArrayAccess, Arrayable
{
public function addError($attribute, $error = '')
    {
        $this->_errors[$attribute][] = $error;
    }
}

Попробуйте переопределить.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы