• Миграция существующих таблиц в YII?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Нет. На Doctrine такая возможность есть. Но на Yii только расширения искать.
    Ответ написан
    2 комментария
  • Как подключить sass к yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Используйте Webpack. Затем сбилденный файл подключайте к фреймворку.
    2. Расширение
    Ответ написан
    Комментировать
  • Как настроить маршрутизацию в yii2 чтобы это было как в zend framework?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Как настроить маршрутизацию в yii2 чтобы это было как в zend framework?

    Установить Zend

    А если по делу:
    1. Почитать документацию.
    2. Маршрут обрабатывается с помощью регулярных выражений (или без них)
    3. Маршрут это очень просто: адрес => перенаправление. Например

    'afisha/past/default/all' => 'afisha/past/all'
    Ответ написан
    Комментировать
  • Есть ли смысл использовать Yii2 с Vue?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Стек технологий вы выбираете сами. Вам нужно разобраться в каждом из них и под ваши требования подобрать.

    Статичен - это когда у вас данные меняются через редактор. Если какие-либо данные меняются с использованием php это уже динамичен.

    Как сделать Yii+Vue есть масса примеров. Даже есть готовый шаблон на github.
    Ответ написан
  • Как сделать тех. работы на сайте вкл/выкл через catchAll?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Можете использовать как предложил Дмитрий,
    'on afterAction'  => function ($event) {
          if ( Yii::$app->siteSettings->get('SITE.OFF_LINE') == 'on' ) {
            if ( !Yii::$app->user->isGuest && !Yii::$app->user->can('admin') ) {
              Yii::$app->user->logout();
              return Yii::$app->response->redirect([ 'offline/off-mode' ]);
            }
          }
          return false;
        },
    но вынесите этот код в поведение. В конфиге лучше не оставлять.
    Так же можете использовать этот модуль https://github.com/Dominus77/yii2-config-db, или по аналогии этого модуля создать что-то свое.
    Ответ написан
  • Почему не работает LIMIT в датапровайдере через union запрос на Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вам нужно к запросу добавить ->limin(10)

    $query1 = Model1::fond()->select('id')->andWhere('...')->limin(10);
    $query2 = Model2::find()->select('id')->andWhere('...')->limin(10);
    $query1->union($query2);
    $dataProvider = new ActiveDataProvider([
                    'query' => $query1,
                    'pagination' => [
                        'pageSize' => 10
                    ],
    ]);


    Так же можете попробовать ->groupBy() и ->district()
    Ответ написан
    Комментировать
  • Как правильно и безопасно пользоваться ORM в Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Даже если вы или кто-то другой «примонтировал» доктрину к проекту Yii2 (такое в принципе возможно), то это не означает, что не нужно понимать смысл миграций. Как уже сказал, Максим Федоров, миграции нужны для версионирования базы данных. Использовать версионирование (миграции) БД как команду - глупая затея.

    Кроме того, миграции не должны работать с данными, они версионируют только схему. На рабочем проекте, с данными, вы работаете: через скрипты, SQL запросами и т.д.

    К примеру. Вы скачали проект из репозитория. Создали пустую базу данных. Подключили к проекту. Применяете миграции, а они выдают ошибку, связанную с миграцией данных которых у вас нет. Это понятно?

    Дак как же вам организовать работу заказчика не через консоль, а через веб интерфейс? Пойти можно двумя способами:

    1. С помощью Web скрипта. Создать методы в контроллере, которые будут удалять данные, изменять автоикремент напрямую, как при работе с обычными данными. У вас получится некая обертка над базой. Работайте хоть через простой SQL запрос или используя Доктрину, но это не должно быть с помощью миграций!
    2. С помощью консольного скрипта и очереди. Сделать тоже самое что и в первом варианте, только при вызове метода в контроллере вы не удаляете данные, а закидываете задачу в очередь: "Удали мне все данные из таблицы". Очередь запускается по крону, например, каждые 5 минут. Заказчик видит статус очередей по своим командам: в очереди, в работе, выполнено. Можно пойти и без очередей, но так будет лучше и у заказчика будет обратная связь.

    Когда использовать второй вариант? Тогда, когда у вас могут возникнуть ошибки по лимиту памяти. Как правило, это работа с большими данными.

    Например, если в вашей таблице 10 записей, то такой процесс легко можно запустить через обычный Web-овский скрипт. Но если у вас в БД 10 000 000 млн. записей, то у вас возникнет ошибка по лимиту памяти. Про 10 млн. написал преувеличено. Ошибка может возникать и с меньшим количеством данных. Всё зависит от вашего лимита памяти и самой операции.

    Пример запуска скрипта из приложения без очередей используя exec:
    class AdminController extends \yii\web\Controller
    {
        public function actionIndex()
        {
            return $this->render('index');
        }
    
        public function actionComposerUpdate()
        {
            return $this->commandExec('composer update');
        }
    
        public function actionComposerInstall()
        {
            return $this->commandExec('composer install');
        }
    
        public function actionComposerSelfUpdate()
        {
            return $this->commandExec('composer self-update');
        }
    
        private function commandExec($command)
        {
            $projectPath = \Yii::getAlias('@app');
            $exec = "cd {$projectPath} && {$command}";
    
            exec($exec, $resultArray);
    
            if ($resultArray){
                \Yii::$app->getSession()->setFlash('info', implode("<br>", $resultArray));
            }
    
            return $this->redirect('index');
        }
    }
    Ответ написан
  • Назначить разрешение роли RBAC?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вы должны назначить либо роль с имеющимися разрешениями, либо само разрешение напрямую пользователю.
    Ответ написан
  • Как подружить валидацию в yii2 и type hint's в php7?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Строгая типизация хорошее дело. Её можно отключить, но это не имеет смысла. Подробнее.

    Поэтому, вам придётся идти по другому пути - преобразовывать данные в соотвествующие типы. Например, если прилетает строка, а нужен int, то вам нужно преобразовать в int. Либо можно api заставить присылать данные соответствующего типа и показывать эти ошибки типов.
    Ответ написан
  • Как оптимизировать vue js проект для сео?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Для сео, конечно, нужен nuxt.
    Ответ написан
    2 комментария
  • Можно ли реализовать в yii2 поиск по нескольким таблицам?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Конечно можно. Вариантов несколько:
    1. С помощью SQL запроса
    2. С помощью QueryBuilder
    3. С помощью ActiveRecord.

    Последовательность указана по быстроте выполнения таких запросов. Для соединения таблиц можно использовать union.

    На примере Query Builder:
    $query1 = (new \yii\db\Query())
        ->select("id, category_id AS type, name")
        ->from('post')
        ->limit(10);
    
    $query2 = (new \yii\db\Query())
        ->select('id, type, name')
        ->from('user')
        ->limit(10);
    
    $query1->union($query2);
    Ответ написан
    Комментировать
  • Как выкинуть пользователей при смене пароля в Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Аутентификация в Yii2 работает не только через сессии. Еще есть кука \yii\web\User::$identityCookie. Если сессия удалена, или протухла по времени, то фреймворк восстановит пользовательскую аутентификацию через эту самую куку. То есть, в первую очередь, нужно сбросить куку.

    За валидацию пользовательских cookie отвечает \yii\web\IdentityInterface::getAuthKey. На стороне БД обычно это поле auth_key в таблице user. Его содержимое нужно перегенерить новым случайным значением при смене пароля.

    А, затем, если в вашем случае сеcсии хранятся в базе данных, удалить все сесcии конкретного пользователя. Для этого таблица с сессиями должна иметь поле с пользовательским ID.

    Если используются встроенные сессии, то это можно не делать. Сессия и сама протухнет достаточно быстро.

    Посмотрите уроки касательно этой темы.
    Ответ написан
  • Symfony - разделение на модули?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Варианта два:

    1. Разделить модули на бандлы
    2. Разделить папками.

    Первый способ достаточно популярный. Можете найти много вариантов на гидхаб, например Sylius. Но, я думаю, вам больше нужен второй. Создаете папку Model (Доменная модель). Туда помещаете весь доменный слой, в том чиле сущности и репозитории.
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Model/User/Entity,Model/Work/Entity,Migrations,Tests,Kernel.php}'

    User и Work Модули.

    Репозитории:
    App\Model\User\Entity\User\UserRepository: ~
    App\Model\Work\Entity\Members\Group\GroupRepository: ~
    App\Model\Work\Entity\Members\Member\MemberRepository: ~
    App\Model\Work\Entity\Projects\Role\RoleRepository: ~
    App\Model\Work\Entity\Projects\Project\ProjectRepository: ~
    App\Model\Work\Entity\Projects\Task\TaskRepository: ~


    В переводах просто добавляйте 'translation_domain' => 'user' и ваш файл в переводах будет user.ru.yaml. Подробнее есть в документации.

    Пример проекта есть на гитхабе
    Ответ написан
  • DI - как подменить findIdentityByAccessToken в IdentityInterface?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Делайте токен таким, чтобы вся информация хранилась в токене. Вы можете закодировать его как вам надо, «снаружи»! Интерфейс для того и интерфейс. Зачем его изменять. Не тем заморочились вы.
    Ответ написан
    1 комментарий
  • Yii2 Select2 виджет не сбрасывает последнее значение в режиме мультиселекта?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Откажитесь от PJAX. Идёт конфликт скриптов. Если хотите мучаться, то ищите проблему там.
    Ответ написан
    Комментировать
  • Правильная архитектура моделей Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Model – это весь доменный слой (Domain Model). Доменный слой работает только с доменной логикой. В доменный слой входит не только модель Active Record, но и другие классы, например сервисы. В Yii2 принято называть моделью то, что наследуется от класса Model. Но сами модели в действительности являются сущностями (Entity). Разберитесь с этим.

    При таком понимании разделении в вашей Модели должна быть логика только относящиеся к доменному слою. На примере CRUD это CUD. При этом раздел (модуль) должен работать только со своим модулем и не должен работать с другими модулями на прямую, но он может иметь слабую связь, например, через контроллеры.

    Для чтения данных мы можем выделить ReadModel. Она может выдавать данные в виде массивов которые получают из SQL запросов, QueryBuider или AR. На примере CRUD это R. В итоге мы имеем чистый доменный слой, а другие слои могут быть связаны друг с другом в модулях.

    Пример такой архитектуры можно посмотреть тут.

    Мои ответы на схожую тему:
    1. Архитектура приложения. Как сделать независимые модули (сервисы)?
    2. Смысл модулей в Yii2?
    Ответ написан
  • Кто занет полезные сайты для yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    По секрету, всему свету:
    https://github.com/
    https://www.yiiframework.com/extensions
    Ответ написан
    Комментировать
  • Как исправить ошибку "Cannot use object of type stdClass as array"?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Невозможно использовать объект типа stdClass в качестве массива
    $dataу вас объект, а не массив.

    json_decode($data, true)
    Ответ написан
  • Какой ноутбук выбрать для графического дизайна?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Если убрать требование Windows, то приобретайте MACBOOK PRO 15! Большинство графических дизайнеров используют его. Качество экрана не сравнится ни с каким другим. Не глючит, удобный пользовательский интерфейс, простота и приятное использование. Все остальное лично я, как владелец MAC 5 лет не посоветую!)
    Ответ написан
    2 комментария
  • Есть заказ, как его разбить на разные группы?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Вы можете просто отсортировать массив таким образом
    $data = [...];
    $sortedData = []
    foreach($data as $row) {
       $sortedData[$row['group']][] = $row['item'];
    }

    И работать с отсортированным массивом
    Ответ написан
    Комментировать