Ответы пользователя по тегу Yii
  • Как настроить маршрутизацию в 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 заставить присылать данные соответствующего типа и показывать эти ошибки типов.
    Ответ написан
  • Можно ли реализовать в 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.

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

    Посмотрите уроки касательно этой темы.
    Ответ написан
  • 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
    Ответ написан
    Комментировать
  • Как зарегистрировать стили в модуле Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Скорее всего модуль в вашей системе будет лишним. Так как большинство не понимают его использование. Модуль это независимая часть приложения, которая слабо зависима от других. Например, shop, blog, auth, gii и так далее. Поэтому подумайте, стоит ли код выносить в модуль. Если нет, то и вопрос решается общим подключением. В 90% случаях он не нужен. Чаще всего он используется для выделения расширения и подключения через composer. Модульность можно заменить разделением папок в проекте.

    2. Подключать в представлении можно любой AssetBundle
    use app\assets\AppAsset;
    AppAsset::register($this);  // $this - представляет собой объект представления
    Ответ написан
  • Как узнать CallbackURL для yiisoft / yii2-authclient?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Как это нет?
    use app\components\AuthHandler;
    
    class SiteController extends Controller
    {
        public function actions()
        {
            return [
                'auth' => [
                    'class' => 'yii\authclient\AuthAction',
                    'successCallback' => [$this, 'onAuthSuccess'],
                ],
            ];
        }
    
        public function onAuthSuccess($client)
        {
            (new AuthHandler($client))->handle();
        }
    }

    <?= yii\authclient\widgets\AuthChoice::widget([
         'baseAuthUrl' => ['site/auth'],
         'popupMode' => false,
    ]) ?>
    Ответ написан
    Комментировать
  • Как вывести текст после отправки формы?

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

    Если же хотите использовать в таком виде, то добавьте модальное окно в index. Открытие модального окна будет зависеть от сессии, как сделано в flash сообщениях.
    Ответ написан
  • Как подсчитать количество комментариев в связанной таблице?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    News::find()->select(['news.*', 'COUNT(comment.id) AS comment_count'])
                    ->joinWith('comments')
                    ->groupBy('news.id')
                    ->andWhere(['news.status' => 1])
    Ответ написан
  • Нормально ли грузить HTML по AJAX?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Попробуйте использовать js framework, например, vue. Таких мелочей при вашем подходе может всплыть масса. И, как уже вам советовали, стоит подумать о разделении проекта на front и back. Либо внедрить vue в yii2.
    2. Если же это вам не нужно и вы хотите идти своим путём можно в контроллере сделать примерно так:

    if (Yii::$app->request->isAjax) {
                return $this->renderPartial('_list', [
                    'dataProvider' => $dataProvider,
                    'checker' => $this->checker
                ]);
            } else {
                return $this->render('index', [
                    'searchModel' => $searchModel,
                    'dataProvider' => $dataProvider,
                    'checker' => $this->checker,
                    'futureCount' => $futureCount,
                    'pastCount' => $pastCount,
                    'myCount' => $myCount,
                ]);
            }

    index.php
    <div class="box-body">
                <div id="search-content">
                    <?= $this->render('_list', [
                        'dataProvider' => $dataProvider,
                        'checker' => $checker
                    ]) ?>
                </div>
            </div>


    Таким образом, там, где идет загрузка от yii2 - там выводится index.php в котором рендерится_list.php, там где вы обновляете страницу без перезагрузки контроллер вам выдаст только структуру в _list.php. После добавлении записи - просто перезагружаете страницу ajax.
    Ответ написан
    Комментировать
  • Можно ли использовать модели из Yii2 в данном случае?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Второй вариант. Примеры на гитхаб
    Ответ написан
    Комментировать