Ответы пользователя по тегу Yii
  • Yii2 many-to-many как правильно сохранять?

    vakorovin
    @vakorovin
    Разработчик
    Добрый день. А вы в rules для этого свойства что прописали?
    Ответ написан
    2 комментария
  • Как изменить пути к уже загруженным фотографиям?

    vakorovin
    @vakorovin
    Разработчик
    Вы меня конечно извините, но возникает такое чувство, что Гугл, как и поиск по Тостеру у вас запрещен. Множество раз задавались вопросы такого характера и в том числе на этом ресурсе. Экшн я думаю мало кто возьмется писать за вас, все-таки это ваша работа. Заголовок вопроса не совпадает с самим вопросом. Насколько понятно из вопроса, менять нужно не пути к фото (как можно вообще поменять путь к конкретному файлу, если он лежит в конкретном месте?), а порядок загруженных фотографий. Что мешает вам прикрутить какой-нибудь jquery-плагин сортировки к форме с фотографиями конкретного материала и при сохранении обновлять в таблице фотографий дополнительное поле аля serail_id? Примеры? Не так давно я писал подобный ответ, можете в ответах посмотреть, конкретно вопрос реализации обсуждался, хотя с того времени мы перешли на несколько иной алгоритм - написали файловый менеджер (прямо сейчас оформление причесываем), и уже в материалах только выбираем загруженные через него файлы. Получается таблица изображений + таблица привязок изображений к материалам (грубо говоря с такими полями: post_id, img_id, serial_id). Подумайте над такой же архитектурой.

    Собственно сам файловый менеджер:
    76b6ce28d03f459fb22109b1ff94ed6d.png

    Привязка фотографий к материалу (кнопка открывает модальное окно с файловым менеджером и оттуда выбираются изображения) - тут же мышкой можно сдвинуть изображение вниз (автоматически поменяется значение Image[serail_id]):
    c6a3e28a72a843dca3bbca1c695258b0.png
    Ответ написан
    Комментировать
  • Как организовать загрузку файлов в форме?

    vakorovin
    @vakorovin
    Разработчик
    Здравствуйте! Не раскрыли вы полностью ваш вопрос, но постараюсь ответить, исходя из наших проектов на yii2.
    Если используется механизм, при котором файлы можно прикреплять на этапе создания некой модели (скажем Portfolio), и загружаются они сервер посредством ajax-запроса (к примеру https://github.com/hayageek/jquery-upload-file), то возникает ситуация, что привязываться то еще не к чему (объект класса Portfolio еще не сохранен), а файлы уже на сервере. На этот случай используем поле hash, значение которого уникально, и именно по нему привязываются файлы. Т.е. при создании нового объекта Portfolio сразу генерируем уникальный hash, передаем его в форму создания, и с ним грузим аяксом файлы. При желании можно повесить cron-задачу для удаления из файловой системы файлов, которые привязаны к несуществующему Portfolio.hash.

    Далее, сама модель. Берем официальную документацию:

    https://github.com/yiisoft/yii2/blob/master/docs/g...

    Расширяем как нам угодно, например так:

    class File extends \yii\db\ActiveRecord
    {
        public $file;
    
        public function rules()
        {
            return [
                [['file'], 'file'],
                [['filename', 'parent_id'], 'required'],
                [['parent_id'], 'integer'],
                [['filename', 'path'], 'string', 'max' => 255],
                [['description'], 'string']
            ];
        }


    Далее, в контроллере как себя вести, описано как раз по ссылке выше, но в нашем случае суть такова - для каждой новой модели (об этом чуть позже) получаем сам файл:

    $model = new File();
            $model->file = UploadedFile::getInstance($model, 'file');


    и назначаем все остальные параметры, будь то parent_id или что-то еще (включая генерацию нового имени для хранения в файловой системе). Далее, если модель проходит валидацию - сохраняем ее в БД и сохраняем файл в файловой системе:

    if ($model->file && $model->validate()) {                
                $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
            }


    Одно уточнение. Если загружать файлы по одному, и только в форме показывать несколько полей, то это решается средствами js, повесить кнопку для создания очередных fileInput с именем File[][file] и textInput File[][description] - проблем не составит. А вот если требуется закинуть их сразу пачкой, то выходов 2 - либо как в указанном по ссылке примере - в одной модели разрешить мультизагрузку, и уже из нее (после валидации) создавать нужные вам модели, либо (что мне кажется логичнее) играться с методом formName(), который будет возвращать нужное имя аттрибута из формы.

    Т.е. в базовом случае поля формы имею имена File[file], File[description], File[id]. В нашем же случае получаются такие имена:

    File[0][file], File[0][description], File[0][id];
    File[1][file], File[1][description], File[1][id];
    File[2][file], File[2][description], File[2][id];


    Теперь в контроллере в цикле проходим

    foreach (Yii::$app->request->post('File') as $sn => $file){
            $model = new File;
            $model->fakeFormName = "File[{$sn}]";
            $model->file = UploadedFile::getInstance($model, 'file');
        }


    В примере выше мы заранее создали свойство $fakeFormName, в которое поместим требуемое для каждого случая базовое имя полей формы и вернем его значение в методе formName(), в таком случае UploadedFile::getInstance($model, 'file') сработает как надо.

    Уф, не знаю, насколько доходчиво разъяснил, что-то может потерял в потоке сознания, но думаю основную суть и опорные точки разъяснил. Если что-то непонятно, отпишитесь, я распишу подробнее (проектов на Yii2 много, все включают работу с файлами в той или иной степени, есть разные реализации, в том числе прямо сейчас пишем файловый менеджер для нашей админки на yii2).
    Ответ написан
    Комментировать
  • SQLSTATE[42602]: Invalid name: 7 ERROR: invalid name syntax?

    vakorovin
    @vakorovin
    Разработчик
    Да вроде как нет этой проблемы - в проекте 2 базы данных: mysql + postgresql.
    Заглянул в Schema.php:
    public function getLastInsertID($sequenceName = '')
        {
            if ($this->db->isActive) {
                return $this->db->pdo->lastInsertId($sequenceName === '' ? null : $this->quoteSimpleTableName($sequenceName));
            } else {
                throw new InvalidCallException('DB Connection is not active.');
            }
        }

    синтаксис отличается (оборачивается в одинарные кавычки при необходимости). Возможно у нас с вами различные версии Yii2. Да и ошибка " invalid name syntax" наводит на эту же мысль.
    Ответ написан
  • Как лучше разработать клиентское приложение на Yii?

    vakorovin
    @vakorovin
    Разработчик
    Yii действительно хорош, используйте сразу 2 версию. С каждым днем разработки вы будете убеждаться всё больше, что не ошиблись с выбором. Касаемо вопроса, слишком уж он расплывчатый, не уловил сути, что значит много функциональности. В любом случае, если речь о ajax-запросах, в yii заложена возможность ответа в xml, json, хотя и без этих встроенных возможностей всё легко реализуется средствами php. Если речь просто о богатом функционале в пределах страницы, опять-таки, yii никоим образом вам не мешает подключить все необходимые js-скрипты и работать со страницей также, как вы это делали без использования фреймворка. Если уточните вопрос, возможно смогу ответить более подробно. Есть несколько работающих сайтов на yii/yii2, также достаточно нагруженный внутренний проект на yii2, не сказал бы, что были проблемы, которые не удалось решить. Как бы то ни было, с выбором вы не ошиблись точно, фреймворк просто замечательный, к тому же здесь появляется разработчик фреймворка, Александр Макаров, который достаточно активно помогает с решением возникающих проблем.
    Ответ написан
  • Yii2: Как сделать сортировку по кол-ву записей через кросс-таблицу?

    vakorovin
    @vakorovin
    Разработчик
    У меня так:
    Модель Service - услуги. Подключаются к клиентам посредством таблицы clients_services (ServiceViaUser), ну и модель Client.

    В ServiceSearch:

    public function search($params)
        {
            $query = Service::find();
    
            $query->joinWith(['clients']);
    
            $query->groupBy(['products_services.id']);
    
            $query->select([Service::tableName().'.*', 'COUNT('.ServiceViaUser::tableName().'.id) as num_clients']);
    
            $dataProvider = new ActiveDataProvider([
                'query' => $query,
            ]);
    
            $dataProvider->sort->attributes['num_clients']=[
                'asc' => ['num_clients' => SORT_ASC],
                'desc' => ['num_clients' => SORT_DESC],
            ];


    Думаю этого кода достаточно для понимания, если нет, отпишитесь, я приведу более подробные примеры.
    Ответ написан
    2 комментария
  • Почему может не срабатывать $application->run(); в YII2?

    vakorovin
    @vakorovin
    Разработчик
    Включите логи и посмотрите, где ошибка. Возможно, что включили 5.4, а при переносе затерли .htaccess
    Ответ написан