Проблема валилации при использовании поведений

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
geee
Сообщения: 18
Зарегистрирован: 2017.02.19, 18:20

Проблема валилации при использовании поведений

Сообщение geee »

Уже голову сломал. Есть AR, в нем есть атрибут file(file Inut) и есть img, с помощью поведения в img сохраняется строка пути к загруженному файлу, а сам file никуда не загружается, но в правилах валидации он отмечен как required.
И теперь ситуация: если файл в форме не прикрепляю, то выдает ошибку как и надо, НО если прикрепляю и отправляю, происходит загрузка открывается эта же страница, но с ошибкой, что файла нет. Не понятно почему так. Пробовал делать эту опрацию без поведений, переопределив метод save() так было все ок.
Благодарю за помощь.

PS: Причем поведение реагирует на событие. Пробовал ставить событие EVENT_AFTER_VALIDATE - та же штука.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Проблема валилации при использовании поведений

Сообщение Nerf »

Проблема в 13 строке.
geee
Сообщения: 18
Зарегистрирован: 2017.02.19, 18:20

Re: Проблема валилации при использовании поведений

Сообщение geee »

Модель

Код: Выделить всё

class Category extends ActiveRecord
{
    public $file;

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'category';
    }

    public function behaviors()
    {
        return [
            [
                'class' => UploadFileBehavior::className(),
                'attributes' => [
                    self::EVENT_AFTER_VALIDATE => ['img'],
                ],
            ],
            [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    self::EVENT_BEFORE_INSERT => ['up_date'],
                    self::EVENT_BEFORE_UPDATE => ['up_date'],
                ],
            ]
        ];
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['file', 'required'],
            [['name', 'slug'], 'required'],
            ['description', 'string'],
            ['short_description', 'string', 'max' => 500],
            [['name', 'slug'], 'string', 'max' => 255],
            [['slug'], 'unique'],
            ['file', 'file', 'extensions' => ['jpg', 'png', 'gif'], 'maxSize' => 1024 * 1024 * 5]
        ];
    }
}
Поведение

Код: Выделить всё

class UploadFileBehavior extends AttributeBehavior
{
    public function getValue($event)
    {
        if ($file = UploadedFile::getInstance($this->owner, 'file')){
            $fileName = FileHelper::getRandomPath($file);

            if ($file->saveAs(Yii::getAlias('@uploadroot') . $fileName)) {
                return Yii::getAlias('@uploadweb') . $fileName;
            }
        }

        return $this->owner->img;
    }
}
geee
Сообщения: 18
Зарегистрирован: 2017.02.19, 18:20

Re: Проблема валилации при использовании поведений

Сообщение geee »

Nerf писал(а): 2017.03.29, 03:22 EVENT_BEFORE_VALIDATE
Ничего не поменялось. Я пробовал разные валидаторы в т.ч. before save/update
geee
Сообщения: 18
Зарегистрирован: 2017.02.19, 18:20

Re: Проблема валилации при использовании поведений

Сообщение geee »

Никто не сталкивался с такой проблемой?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблема валилации при использовании поведений

Сообщение ElisDN »

В BEFORE_VALIDATE нужно UploadedFile::getInstance($this->owner, 'file') в $this->owner->file присвоить если файл загружен чтобы валидаторы сработали.
Ответить