• Как в объект добавить еще данных?

    vakorovin
    @vakorovin
    Разработчик
    Вы перебираете массив объектов $models, а в цикле присваиваете значение некому $model, т.е. $model вообще не определена. Это первое. Второе - если найденные записи нужны не в виде объектов класса UserModel, а в виде массивов, используйте asArray() (погуглить удосужтесь сами), и конечно не плохо бы перед тем как использовать foreach убедиться в том, что элементы вообще найдены.
    Ответ написан
    1 комментарий
  • Как в конфиге задать SQL, вполняющийся после создания DbConnection?

    vakorovin
    @vakorovin
    Разработчик
    Добрый день. Попробуйте вот что: в yii\db\Connection есть несколько триггеров, вам определенно нужно зацепиться за EVENT_AFTER_OPEN.
    Что-то в духе:
    ...
    'db' => [
    	'class' => 'yii\db\Connection',
    	'dsn' => 'mysql:host=localhost;dbname=mydb',
    	'username' => 'myname',
    	'password' => 'mypassword',
    	'charset' => 'utf8',
    	'on ' . yii\db\Connection::EVENT_AFTER_OPEN => function () {
    				Yii::$app->db->createCommand("SET wait_timeout = 259200")->execute();
    		Yii::$app->db->createCommand("SET interactive_timeout = 259200")->execute();
       },
    ]
    ...
    Ответ написан
    2 комментария
  • В чем ошибка при вигрузке файлов?

    vakorovin
    @vakorovin
    Разработчик
    Добрый день. Прочтите свой код по порядку.
    Создали новый объект класса Advertisement, загрузили в него POST-параметры и далее, еще НЕ СОХРАНИВ , пробежались в цикле по файлам и каждому объекту Advertisement_Image прописали в advertisement_id "$model->id", а откуда возьмется id у модели до ее сохранения в БД? В этом и проблема. Связанные файлы сохраняйте после сохранения $model.

    И еще пара рекомендаций: пробегитесь по www.php-fig.org/psr, лишним не будет (стилистика кода). Складывали бы файлы не в common, а в frontend.
    Ответ написан
    1 комментарий
  • Yii2 many-to-many как правильно сохранять?

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

    vakorovin
    @vakorovin
    Разработчик
    Скажите, а что вы включаете в создание сервиса? Только функционал, или же и дизайн?
    На любом современном фреймворке это реализуется за месяца за 2-3, в зависимости от особенностей, проще сразу разделить поэтапно стадии разработки и соответственно сначала запуск версии для поставщиков, обкатка сервиса, доработки, а потом уже загонять туда клиентов. Пользователей все-таки не 2 роли, а как минимум 3 (+ админ), админка отдельным модулем, товары, параметры товаров, реляция товаров с параметрами, на основе этих связей динамические формы редактирования разных товаров. Заказы, их статусы, решение спорных ситуаций, как проходят платежи, через сервис или в обход его. Мало информации, чтобы дать трезвую оценку, дизайн/верстка/разработка/настройка сервера под проект. По моему опыту могу сказать, что подобные сервисы поднимаются командой месяца за 3. По одной верстке могут быть такие пожелания заказчика, что только на верстку писем с поддержкой всех возможных почтовых клиентов может неделя уйти.
    Ответ написан
    5 комментариев
  • Определение браузера и устройства?

    vakorovin
    @vakorovin
    Разработчик
    Мы для своих проектов используем mobiledetect.net, чего и вам советую.
    Ответ написан
    2 комментария
  • Какое правило валидации есть в yii 2 для валидации двух полей, чтобы искались совпадения или в первом иливтором поле по одному атрибуту?

    vakorovin
    @vakorovin
    Разработчик
    С exist пока работать не приходилось - ни в одном проекте не было в нём нужды. По большому счету можно написать свой валидатор в используемой модели, что-то в духе:

    public function validateUsername($attribute, $params)
        {
            if (!$this->hasErrors()) {
                if (($user = User::find()->where("phone = :username OR email LIKE :username", ['username'=>$this->$attribute])->one()) === null) {
                    $this->addError($attribute, 'User not found');
                }
            }
        }

    и добавить это правило в rules:

    public function rules()
        {
            return [
                ...
                ['username', 'validateUsername'],
                ...
            ];
        }
    Ответ написан
    Комментировать
  • Как изменить пути к уже загруженным фотографиям?

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

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

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

    vakorovin
    @vakorovin
    Разработчик
    Ответ пишу с планшета, не очень удобно, поэтому код не приведу, а расскажу только последнее применение, недельной давности. Как известно, md5(microtime()) не гарантирует уникальности, возможны коллизии. Так вот пример, файловый менеджер на php, во время загрузки файла на сервер генерируется имя по принципу md5(microtime()) . $extension, далее проверяется нет ли такого имени файла в БД. Т.е. в этом случае минимум один раз выполнится необходимая операция. Ээх, приведу и пример кода:

    ...
    do {
        $filename = md5(microtime()) . $extension;
        $file = File::find()->where(["filename"=>$filename])->one(); // yii2 синтаксис
        if ($file === null) break;
    } while (true);
    ...


    Есть хороший пример использования do while при работе с пространственными данными, при поиске альтернативного пути (есть карта сети провайдера, в случае аварии ищет свободные волокна на других магистралях), правда сейчас я в отпуске и не могу показать пример кода - его просто нет под рукой, хотя возможно такой пример будт сложным для студентов. А пример выше достаточно прост для понимания и абсолютно точно показывает необходимость в таком цикле.
    Ответ написан
    Комментировать
  • Как организовать загрузку файлов в форме?

    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
    Ответ написан
  • Как сохранить несколько фотографий (мульти загрузка) в базу в Laravel 4?

    vakorovin
    @vakorovin
    Разработчик
    1. Для yii недавно в проекте использовал hayageek.com/docs/jquery-upload-file.php , лучшего решения не нашел.
    2. Лучше конечно в отдельной таблице, с указанием id объявления и имени файла.
    Ответ написан
    Комментировать
  • Вертикальное меню bootstrap3 — dropdown со сдвигом вниз не осилил

    vakorovin
    @vakorovin Автор вопроса
    Разработчик
    Ответ пришел из контакта, решение представлено тут: codepen.io/benderskiy/pen/GfFDs
    Автору еще раз спасибо! ;)
    Ответ написан
  • Разыскивается каркас приложения без жирка, а также желающие присоединиться к разработке open source проекта?

    vakorovin
    @vakorovin Автор вопроса
    Разработчик
    Кусок сети, лежат 2 коммутатора и один линк (красным подсвечено).
    image
    Кусок админки
    image
    Ответ написан
  • Кто знает как решить проблему с сервисным кодом Fly?

    vakorovin
    @vakorovin
    Разработчик
    А почему мастер не предложил Вам обновление прошивки? Infinity же должен поддерживать эту модель.
    Ответ написан
    Комментировать
  • Работа с двумя базами данных?

    vakorovin
    @vakorovin Автор вопроса
    Разработчик
    Fesor, Вы правы. В mysql абоненты и платежи, в postgre — база оборудования, геоданные, заббикс
    Ответ написан
    Комментировать