Ответы пользователя по тегу Yii
  • Как в Yii2 загрузка изображений и последующее хранение их имен в БД?

    Мой вам совет. Создайте дополнительную модель для формы. В ней производите валидацию непосредственно данных введенных пользователем, в том числе и самого файла.
    А после загрузки файла и валидации всей формы - создавайте объект вашей модели, записывайте туда имя файла и сохраняйте ее.
    Это нормальная практика иметь одну модель для связи с базой, и другую для валидации формы.

    В данном примере модель формы имеет метод SaveModel. Который сохраняет модельку сущности из базы. В моем случае не нужно редактировать файл изображения (Attachment), поэтому я просто создаю новый, а старый удаляю. Имхо не самый лучше код, но какой сумел быстро найти.

    <?php
    /**
     * Created by PhpStorm.
     * User: Jakeroid
     * Date: 17-Jul-15
     * Time: 13:28
     */
    
    namespace app\modules\cp\models;
    
    use app\models\Attachment;
    use Yii;
    use yii\base\Model;
    use app\models\Team;
    
    class TeamForm extends Model
    {
        public $name;
        public $logo;
    
        /**
         * @var Team
         */
        private $dbModel;
    
        /**
         * @return array the validation rules.
         */
        public function rules()
        {
            return [
                [['name'], 'required'],
                [['name'], 'string', 'max' => 255],
                [['logo'], 'file', 'extensions' => 'gif, jpg, jpeg, png', 'skipOnEmpty' => false],
            ];
        }
    
        /**
         * @return array customized attribute labels
         */
        public function attributeLabels()
        {
            return [
                'name' => Yii::t('app', 'Team name'),
                'logo' => Yii::t('app', 'Team logo (flag)'),
            ];
        }
    
        /**
         * @param $is_update boolean
         * @return boolean from save method of dbModel
         */
        public function saveModel($is_update = false)
        {
            $attachment = new Attachment();
            $attachment->type = 'team_logo';
            $attachment->attachments_group_id = 0;
            $attachment->saveWithFile($this->logo);
            if ($is_update) {
                $this->dbModel->logo->delete();
            }
            $this->dbModel->logo_id = $attachment->id;
            $this->dbModel->name = $this->name;
            return $this->dbModel->save();
        }
    
        public function loadModel($model)
        {
            $this->dbModel = $model;
            $this->name = $model->name;
        }
    
        /**
         * @return Team from current dbModel
         */
        public function getModel()
        {
            return $this->dbModel;
        }
    }


    Контроллер такой:
    public function actionUpdate($id)
        {
            $model = new TeamForm();
            $model->loadModel($this->findModel($id));
    
            if ($model->load(Yii::$app->request->post())) {
                $model->logo = UploadedFile::getInstance($model, 'logo');
                if ($model->validate() && $model->logo) {
                    $model->saveModel(true);
                    return $this->redirect(['view', 'id' => $model->getModel()->id]);
                }
            }
    
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    Ответ написан
    6 комментариев
  • Yii Framework: как настроить авторизацию и аутентификацию?

    У вас плохой вопрос. Из разряда "почему не работает сайт?", ведь конкретики никакой. Подключите xdebug или даже тем же var_dump найдите где ошибка и спросите совета как ее решить. А так вы выложили свой код, и хотите что бы мы сами нашли где у вас ошибка? Это потому что вам лень или вы не умеете искать?

    Что вообще происходит после попытки логина? Метод login() какое значение возвращает?
    Ответ написан
    Комментировать
  • Yii: rules и очень много сценариев, в которых чёрт ногу сломит?

    Я использую для подобных дел валидацию обычной модели, а не ActiveRecord. Например, для администратора AdministratorUserEditModel. В ней все правила для администратора. Так же для модератора и обычного пользователя. Получается что вы выносите лишнее проверки в другие классы и в итоге меньше засоряете код модели.
    Ответ написан
    Комментировать