• Правильно ли я сделал Абстрактную Фабрику?

    qonand
    @qonand
    Software Engineer
    Фабрика сделана правильно, но нужно смотреть код где она используется. Поскольку Ваша фабрика отвечает за создание нескольких разных объектов есть риск нарушения принципа разделения интерфейсов
    Ответ написан
    Комментировать
  • Как лучше сделать wizard form в yii2?

    qonand
    @qonand
    Software Engineer
    1) Я ее могу реализовать в одном view через tab-pane, но как валидировать формочки от перехода одного таба к другому... Или вообще другое решение есть?

    Не изобретайте велосипед, есть куча готовых расширений позволяющих это сделать например вот это или это . Вообще подобных расширений полно, достаточно погуглить например так
    2) Мне посоветовали сделать по типу "actionCreate", но после удачного сохранения сделать редирект на следующий шаг заполнения анкеты,

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

    qonand
    @qonand
    Software Engineer
    ох что-то Вы намудрили, должно быть что-то типа такого
    SELECT
    	*
    FROM
    	clients
    INNER JOIN customer ON clients.customer = customer.id_customer
    INNER JOIN size_lower_body ON clients.size_lowe_body = size_lower_body.id_lower_size
    INNER JOIN size_upper_body ON clients.size_upper_body = size_upper_body.id_upper_size
    INNER JOIN messengers ON clients.primary_messager = messengers.id_messenger
    INNER JOIN social_networks ON clients.primary_network = social_networks.id_network


    Запрос делал для того, чтобы выводить значения вместо id

    Лучше Вам использовать LEFT JOIN вместо INNER_JOIN
    Ответ написан
    2 комментария
  • Правильно ли я реализовал паттерн наблюдатель?

    qonand
    @qonand
    Software Engineer
    Правильно ли я реализовал observer?

    Сложно сказать т.к. репозиторий на который Вы ссылаетесь по всей видимости приватный. Но вроде как движетесь в правильном направлении

    Меня смущает, что так много параметров передаётся

    Сделайте отдельный класс событий, который будет содержать все необходимые данные и работайте непосредственно с ним, а не с кучей параметров

    Возможно, было бы правильнее передавать только тип события и входящее сообщение, а другие модули уже сами бы определяли, какое сообщение отправить в ответ и на какой "уровень" опроса перевести пользователя.

    Тут все зависит исключетельно от Вашей системы и ее организации.
    Ответ написан
    1 комментарий
  • Как, в моем случае, сделать поиск в CRUD приложении на yii2?

    qonand
    @qonand
    Software Engineer
    В моделе объявлена реляция Status? + в моделе Status объявлена реляция Vacancy?
    Если да, тогда можно сделать так:
    $query->joinWith(['status s', 'status.vacancy v'])->where([
        'like',
        's.id_vacancy',
        $this->idVacancy
    ])->andWhere([
        'like',
        'v.title',
        $this->titleVacancy
    ]);


    Между прочим:
    1. У Вас что идентификаторы в виде строк хранятся? или причем здесь like?
    2. $q->where('status.id_vacancy LIKE "%' . $vacancy_id . '%"'); - поздравляю! Вы только что сделал дыру в безопасности сайта, про SQL-injection не слышали?
    Ответ написан
    Комментировать
  • Как настроить тестирование codeception?

    qonand
    @qonand
    Software Engineer
    Рекомендую Вам потратить небольшое количество времени и посмотреть вот это видео вроде бы в нем все понятно разжёвано
    Ответ написан
  • Почему меняется автоматически путь у изображение?

    qonand
    @qonand
    Software Engineer
    Во первых указания ссылки в стиле "img/holland.png" означает что ссылка будет формироваться относительно текущей страницы. То есть если Вы будете находиться на странице mysite.com/page то ссылка у Вас сформируется как mysite.com/page/img/holland.png

    Во вторых судя по всему Вы используете Advanced-шаблон, а это значит что Вам нужно настроить нормально Ваш Apache что бы не было этой кучи вложенных папок и Вы могли работать с front-end частью как с отдельным сайтом. Это позволит Вам избежать кучи проблем с ссылками. Ну а если не хотите этого делать тогда формируйте ссылки с помощью Url-хелпера, например
    Url::toRoute(['@web/img/image.png'], true)
    Ответ написан
    Комментировать
  • Действия с массивами?

    qonand
    @qonand
    Software Engineer
    Используйте для этого функцию array_diff, например
    $arr1 = [3, 45, 25, 4, 66];
    $arr2 = [45, 77, 4, 33];
    $result = array_diff($arr1, $arr2);
    Ответ написан
    Комментировать
  • Подготовленные запросы в yii2?

    qonand
    @qonand
    Software Engineer
    Зачем Вы работает с классом Command? этим Вы только создаете себе трудности... для создания сложных запрос в yii есть класс Query, который прекрасно решает Вашу задачу, например так:
    $query = new \yii\db\Query();
    $query->from('Pages')
        ->leftJoin('categories', ['categories' => 'id_categories'])
        ->where(['status' => 1])
        ->andFilterWhere(['like', 'path', $filter_category]);
    if (! empty($filter_time)) {
        $expression = new \yii\db\Expression('now() - interval :filter_time minute', [
            ':filter_time' => $filter_time
        ]);
        $query->andWhere(['>', 'date_created', $expression]);
    }
    Ответ написан
    Комментировать
  • Как разбить сложное представление на части?

    qonand
    @qonand
    Software Engineer
    А в чем проблема использовать описанную Вами конценпцию? это вполне нормальный вариант аля HMVC
    Ответ написан
    2 комментария
  • Как накопить данные перед записью в таблицы?

    qonand
    @qonand
    Software Engineer
    В функции aggregator над каждой строкой выполняются многочисленые действия, после чего разные части строк записываются по таблицам.

    Плохо, метод должен отвечать только за реализацию одного логического действия, а не за все и сразу
    Меня интересует как можно накопить записи в массив в функции aggregator,

    По нормальному никак ... можно например использовать global или аналогичные варианты - но это будет плохой код

    Лучше разделите ответственность методов, например так:

    class MyClass
    {
        public function uploader($rows)
        {
            $items = [];
            foreach ($rows as $row => $data) {
                $items[] = $this->aggregator($data);
            }
            $this->save($items)
        }
    
        public function aggregator($data)
        {
            // выполнение нужных операций над данными
        }
    
        public function save($items)
        {
            // сохранение массива данных, аля batchInsert
        }
    }
    Ответ написан
    5 комментариев
  • Вопросец yii'стам, ну и симфонисты тоже загляните?

    qonand
    @qonand
    Software Engineer
    Не нравятся мне всякие Yii::$app->params['site_title'] массивы для настроек.

    И правильно что не нравятся, такой подход создает только ненужные и не очевидные связи. Как его избегать зависит от конкретных задач.

    ну типа чтоб в шаблоне было $this->settings->get('site_title');. Нормально не?

    ну как бы не очень нормально. Получается что в настройках конкретного View содержаться тайтлы всех View-сайта. Вроде бы ничего страшного, но это как-то не правильно

    Насколько я понимаю Вы хотите вынести настройки title всех страниц в единый файл настроек. В таком случае уж лучше реализовать какое-то поведение которое будет реагировать на соответствующее событие View, выбирать необходимый title для конкретного View (например по роуту) и задавать его
    Ответ написан
  • Динамическая смена даты и времени с момента публикации на Yii2, как это сделать?

    qonand
    @qonand
    Software Engineer
    Блоков на странице может быть хоть 1000 но пользователь всегда видит только определенное количество из них. Поэтому по хорошему Вам нужно обновлять срок давности не для всех блоков выведенных на станице, а только для тех которые у пользователя на виду. Соответственно Вам нужно:
    1. Определять (например при скроле страницы) какие блоки видны в текущий момент пользователю
    2. Определять массив селекторов для каждого из блока
    3. В цикле проходиться по этому массиву и для каждого из блока пересчитывать дату
    Ответ написан
  • Список в mysql?

    qonand
    @qonand
    Software Engineer
    Нужно сделать столбец, который будет описывать очередь к этому пользователю.

    Это плохая идея, раз уж Вы используете реляционную СУБД тогда стоит придерживаться правил ее построения.
    В очереди будут id других пользователей. Как реализовать?

    Отдельной таблицей в которой будут id пользователя к которому очередь и id пользователя который в очереди. Соответственно эта таблица должна быть связана с помощью внешних ключей с таблицей самих пользователей
    Ответ написан
    Комментировать
  • Как организовать характеристик товаров в БД для интернет магазина?

    qonand
    @qonand
    Software Engineer
    смотрите в сторону EAV- модели
    Ответ написан
    Комментировать
  • Как без лишних костылей сделать разные конфиги для БД в Yii2 advanced?

    qonand
    @qonand
    Software Engineer
    папка environments содержит скелет для настроек приложения зависимых от окружения. Тоесть по факту, когда Вы разворачиваете проект в определенном окружение и выполняете команду init происходит копирование конфигов из папки environments в соответствующие папки и уже в них Вы указываете все параметры которые зависят от окружения (доступы к БД и т.п.). Соответственно в конфигах /common/config/main.php и т.п. указываются настройки не относящиеся к окружению (список компонентов и т.п.)

    Как без лишних костылей сделать разные конфиги для БД в Yii2 advanced?

    итого Вам нужно:
    1. Выполнить инициализацию проекта с помощью init
    2. Заполняете данные доступа в конфигах с префиксом -local
    Ответ написан
    6 комментариев
  • Как лучше использовать экземпляр класса одного в другом?

    qonand
    @qonand
    Software Engineer
    И у меня вопрос правильно ли я делаю , используя global во втором классе. А если нет ,как лучше сделать?

    Использование global это не только зло но и вообще не ООП-подход. Почему - можете погуглить, этому вопрос посвящено множество статей. Гораздо лучше будет если Вы экземпляр класса будете внедрять с помощью конструктора или сеттера

    P.S. Настоятельно рекомендую почитать про такие вещи как Dependency Injection Principle и Inversion of Control
    Ответ написан
    1 комментарий
  • Как передать get параметр из view1 во view2?

    qonand
    @qonand
    Software Engineer
    Ссылку можно сформировать например так:
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            [
                'attribute' => 'id',
                'content' => function ($model, $key, $index, $column) {
                    $url = \yii\helpers\Url::toRoute(['url', 'id' => $model->id]);
                    return Html::a($model->id, $url);
                }
            ]
            'name',
        ],
    ]) ?>


    вместо URL - должен быть адрес контроллера отвечающего за вывод информации о товаре
    Ответ написан
  • Получить model в layout?

    qonand
    @qonand
    Software Engineer
    Как мне в этом файле обратится к моделе компаний например?

    Не нужно обращаться к моделям на уровне слоя, это плохая практика. Лучше уж для этой задачи создать виджет

    но при выводе результата я не вижу полей которые там должны присутсвовать

    Именно полей или данных? если полей - тогда покажите как Вы вводите, если данных - тогда их и быть не может, т.к. Вы СОЗДАЕТЕ модель, которая по умолчанию данных и не имеет.
    Ответ написан
    2 комментария
  • Как вывести kartik\select2 в модальном окне на Yii2 через renderAjax?

    qonand
    @qonand
    Software Engineer
    По всей видимости у Вас отсутствуют на страницы ресурсы для этого виджета, т.к. renderAjax - их не загружает. Соответственно Вам необходимо на самой странице (на которой выводиться всплывающее окно) сделать регистрацию соответствующих наборов ресурсов, например:
    \kartik\select2\Select2Asset::register($this)
    Ответ написан
    1 комментарий