За последние 24 часа нас посетили 21813 программистов и 1076 роботов. Сейчас ищут 720 программистов ...

Yii2 / Конфликт между валидацией, сценарием и загрузкой изображения

Тема в разделе "Yii", создана пользователем Exort, 16 ноя 2018.

  1. Exort

    Exort Активный пользователь

    С нами с:
    30 апр 2016
    Сообщения:
    100
    Симпатии:
    2
    Друзья, здравствуйте!

    Случилась непонятная для меня лично дилемма, которую не могу решить уже более 5-ти часов.

    У меня есть модель ActiveRecord — Post, а также контроллер — PostController. В модели я создаю дополнительное поле upload, в которое загружаю изображение из контроллера.
    В контроллере я устанавливаю сценарий "create", а также в свойство upload передаю изображение. Так вот, если я добавляю свойство upload в сценарий create ( scenarios() ), то ActiveRecord модель Post не выполняет save() в таблицу, а если убираю свойство upload из сценария, тогда модель не валидирует это поле, но выполняет save() в таблицу. Подскажите пожалуйста, как разрешить это противоречие?

    Контроллер:
    PHP:
    1. <?php
    2.  
    3. namespace app\controllers;
    4.  
    5. use Yii;
    6. use yii\web\UploadedFile;
    7. use app\models\Post;
    8.  
    9. class PostController extends RestController
    10. {
    11.     public $modelClass = 'app\models\Post';
    12.  
    13.     public function actionCreate()
    14.     {
    15.         $post = new Post('create');
    16.         $post->load(Yii::$app->request->post(), '');
    17.         $post->upload = UploadedFile::getInstanceByName('image');
    18.         return $post->create();
    19.     }
    20.  
    21.     public function behaviors()
    22.     {
    23.         $behaviors = parent::behaviors();
    24.  
    25.         $behaviors['authenticator'] = [
    26.             'class' => \yii\filters\auth\HttpBearerAuth::className()
    27.         ];
    28.  
    29.         return $behaviors;
    30.     }
    31. }

    Модель:

    PHP:
    1. <?php
    2.  
    3. namespace app\models;
    4.  
    5. use Yii;
    6.  
    7. class Post extends Rest
    8. {
    9.     public $upload = null;
    10.  
    11.     public function create()
    12.     {
    13.         if (!$this->validate())
    14.             return self::createAnswer(401,'Invalid authorization data',
    15.                                         ['status' => false, 'message' => 'Invalid authorization data',
    16.                                         'errors' => self::reidentErrors($this->errors)]);
    17.         $this->image = 'web/post_images/' . $this->upload->name;
    18.         $this->upload->saveAs($this->image);
    19.         $this->upload = $this->image;
    20.         $this->datetime = Yii::$app->formatter->asDate('now', 'yyyy-MM-dd hh:i:ss');
    21.         $this->save();
    22.     }
    23.  
    24.     public function __construct($scenario = 'default')
    25.     {
    26.         $this->scenario = $scenario;
    27.     }
    28.  
    29.     public function scenarios()
    30.     {
    31.         return [
    32.           'create' => [
    33.               'title', 'datetime', 'anons', 'text', 'tags', 'image', 'upload'
    34.           ]
    35.         ];
    36.     }
    37.  
    38.     public function rules()
    39.     {
    40.         return [
    41.             [['title', 'anons', 'text'], 'required', 'on' => 'create'],
    42.             ['upload', 'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, png', 'on' => 'create']
    43.         ];
    44.     }
    45.  
    46.     public static function tableName()
    47.     {
    48.         return '{{posts}}';
    49.     }
    50. }
    За ранее большое спасибо за потраченное время!
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    если не выполнился save, почти всегда есть записи об ошибках в модели. Посмотрите отладчиком, что внутри.
     
  3. Exort

    Exort Активный пользователь

    С нами с:
    30 апр 2016
    Сообщения:
    100
    Симпатии:
    2
    Это ведь RESTful, скажите, где я могу посмотреть конкретно?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    В моделе AR есть поле errors, в которое заносятся ошибки валидации. Если save не проходит, там обычно какое-нибудь сообщение имеется.
     
  5. Exort

    Exort Активный пользователь

    С нами с:
    30 апр 2016
    Сообщения:
    100
    Симпатии:
    2
    [​IMG]

    Но файл в upload загружен, как так..

    Модель:

    PHP:
    1.     public function create()
    2.     {
    3.         if (!$this->validate())
    4.             return self::createAnswer(401,'Invalid authorization data',
    5.                                         ['status' => false, 'message' => 'Invalid authorization data',
    6.                                         'errors' => self::reidentErrors($this->errors)]);
    7.         $this->image = 'web/post_images/' . $this->upload->name;
    8.         $this->upload->saveAs($this->image);
    9.         $this->upload = $this->image;
    10.         $this->datetime = Yii::$app->formatter->asDate('now', 'yyyy-MM-dd hh:i:ss');
    11.         $this->save();
    12.         var_dump($this->errors);die;
    13.     }
    Контроллер:
    PHP:
    1.     public function actionCreate()
    2.     {
    3.         $post = new Post('create');
    4.         $post->load(Yii::$app->request->post(), '');
    5.         $post->upload = UploadedFile::getInstanceByName('image');
    6.         return $post->create();
    7.     }
    Причём картинка то загружается в папку
    --- Добавлено ---
    Проблема решена!