Ответы пользователя по тегу Yii
  • Не отсылает сообщение на почту при отправители, почему?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    В yii2 существует специальный класс Mailer, который и занимается отправкой почты.
    Изучите этот класс, а свой код выкиньте.
    Ответ написан
    4 комментария
  • Yii Почему не работает такая конструкция?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    'submenuTemplate' => '<ul><div class="main_menu">{items}</div></ul>'

    Так же в документации есть linkTemplate и можно дополнительно настроить в items

    p.s. Это только догадки, что именно Вам нужно. Опишите подробно, с примером html, который Вы хотите получить.
    Ответ написан
  • Организация ролей RBAC?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Вот две статьи про RBAC. В первой статье как раз рассматривается вариант с тремя ролями - админ, модератор и пользователь.
    Для неподтверждённых, я думаю, можно ориентироваться на статус, так же как и для заблокированных. Если статус не "активен", то они не смогут войти под своими учётными записями и соответственно не смогут попасть в закрытые разделы сайта.
    Ответ написан
    Комментировать
  • Как мне сделать url backend отдельную ссылку?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Для этого надо использовать два .htaccess, один в корне проекта, второй в web.
    В директории web(frontend и backend) достаточно такого .htaccess
    RewriteEngine on
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteRule . index.php

    В корне проекта .htaccess должен быть следующего содержания:
    RewriteEngine On
    
    # End the processing, if a rewrite already occurred
    #RewriteRule ^(frontend|backend)/web/ - [L]
    
    # Handle the case of backend, skip ([S=1]) the following rule, if current matched
    RewriteCond %{REQUEST_URI} ^/(name_folder/backend)
    RewriteRule ^backend(/.*)?$ backend/web/$1 [L]
    
    # handle the case of frontend
    RewriteCond %{REQUEST_URI} ^/(name_folder)
    RewriteRule ^(.*)$ frontend/web/$1 [L]

    name_folder - имя директории, если проект находится в поддиректории сайта.

    p.s.
    Кстати, забыл уточнить. У Вас basic шаблон или advanced? Примеры htaccess я привёл для advanced. А если у Вас basic, то решается через модули, как Лентюй подсказал.
    С модулями решается чуть иначе.
    Ответ написан
    Комментировать
  • Можно ли передать сортировку в select?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Возможно Вам поможет addOrderBy()
    Ответ написан
  • Yii2: Как авторизовать пользоваетля использую данные из двух баз данных?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Вообще то этого можно достичь используя связи.
    Попробуйте сделать как написано в документации.
    Ответ написан
  • Как добавить произвольную строку в GridView?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Можно сделать так
    [
      'label' => 'test',
      'value' => 'value test'
    ]


    p.s. В документации есть такие параметры(и не только эти)
    1) $afterRow
    2) $beforeRow
    Используются следующим образом(на моём примере таблицы пользователей):
    GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $searchModel,
            'beforeRow' => function($model, $key, $index, $grid){
                 return '<tr><td colspan="6">' . $model->username . '<td></tr>';
            },
            'afterRow' => function($model, $key, $index, $grid){
                return '<tr><td colspan="6">' . $model->email . '<td></tr>';
            },
            'columns' => [
                // вывод нужных колонок
            ]

    В итоге перед каждой моделью будет выводится имя пользователя, а после email пользователя
    h_1516649447_6657150_be4d58086b.png
    Ну а что нужно именно Вам - непонятно. Дополняйте свой вопрос.
    Ответ написан
  • Как d yii2 работать с моделью USER?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Используйте связь между таблицами.
    Во второй модели создайте метод, который будет возвращать Ф.И.О. пользователя.

    p.s.
    У Вас есть две модели, User и Personal.
    Первая используется для авторизации, вторая используется для дополнительных данных пользователя.
    Есть две связи, в модели User на модель Personal, в модели Personal на модель User.
    С этим разобрались.
    Но связи не работают у Вас как надо, связь идёт через несуществующие атрибуты. Например, откуда Вы взяли userID? Ни в одной из предоставленных моделей нет такого атрибута.
    Добавьте в модель Personal атрибут userID, тогда связь будет работать.
    Вот так связь будет выглядеть в модели User
    public function getPersonal()
    {
       retun $this->hasOne(Personal::className(), ['userID' => 'id']);
    }

    Но в данном случае, я думаю, связь особо не нужна. После авторизации у Вас есть id авторизованного пользователя Yii::$app->user->identity->id. Вот через этот параметр можно получить данные определённого пользователя из модели Personal.
    В модели Personal можно создать статический метод для получения данных пользователя
    public static function getDataUser($id)
    {
       $model = Personal::find()->where('id=:id', [':id' => $id])->one();
       return $model;
    }

    И получить Ф.И.О пользователя можно будет так.
    $data = Personal::dataUser(Yii::$app->user->identity->id);
    echo $data->fio;

    p.s.s. Код не проверял, возможны ошибки, но идея, я думаю, понятна.
    Ответ написан
  • YII2. Почему таблица GreadView съедает 'data-toggle' и 'onchange'?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Используйте 'format' => 'raw' и ничего не потеряется.
    Ответ написан
    Комментировать
  • Yii2, можно ли сделать ссылку в стартовой странице без user/login?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Этого можно добиться при помощи urlManager.
    Пишите соответствующее правило в настройках и всё.
    Что-то похожее на это
    rules => [
      '' => 'user/login'
    ]
    Ответ написан
    Комментировать
  • Как узнать что связные модели связаны?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    и правильно ли задана связь?

    Что Вы имеете ввиду?
    Если посмотреть в документации, то Вы найдёте такие методы:
    1) getRelatedRecords() - вернёт все связи модели
    2) getRelation() - вернёт данные по отдельно взятой связи, в Вашем случае $model->getRelation('tovar')
    А как посмотреть какие данные возвращает $model

    Как обычно, например через print_r($model) или print_r($model->attributes)
    Ответ написан
    Комментировать
  • Как сохранить выбранные значения из чекбокса в базу?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Замените return $all->save(); на просто $all->save();
    Ответ написан
  • После создания формы Ajax не проходит валидация?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Это видео Вам поможет.
    Pjax тут совсем не нужен.
    Вам в параметрах надо указать, что нужна ajax валидация, сделать действие для этой валидации и указать адрес, по которому будет проходить валидация.
    Приблизительно вот так:
    $form = ActiveForm::begin([
          'id' => 'testForm',
          'enableAjaxValidation' => true,
          //'enableClientValidation' => false,
          'validationUrl' => ['dynamic/ajax-validation']
      ]);
    
    // и действие в контролере
    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }
    Ответ написан
  • Как вывести результат валидации в отдельном месте, Yii?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Исправьте <?=$form->errorSummary($model);?> на <?=$model->getErrors();?> и выводите в любом месте вёрстки.
    Или, в Вашем варианте, добавьте вторым параметром массив, где и укажите, как выводить и где выводить.
    www.yiiframework.com/doc-2.0/yii-widgets-activefor...
    Ответ написан
    Комментировать
  • Данные отправляются но не применяются?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    У Вас получается, что цена должна быть и больше и меньше.
    Может правильней будет условие "или". Или даже between
    Что-то вроде этого:
    $query->andFilterWhere(['between', 'price', $this->max, $this->min]);
    Ответ написан
    2 комментария
  • Как сохранить связанные таблицы в модели yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Для начала немного переписать в действии сохранение модели.
    $renameGroup = new RenameGroup();
    if ($renameGroup->load(Yii::$app->request->post()) && $renameGroup->save()) {
        if($renameGroup->saveNameGroup($renameGroup->id)){
             return $this->refresh();
        }       
    }

    И я добавил бы здесь ещё транзакцию. В случае ошибки откат таблиц в базе данных в исходное положение, то есть, до начала записи.

    p.s.
    В случае с id ситуация чуть непонятная, поэтому дописал своё предположение. Подправьте на свои данные.
    Ответ написан
    1 комментарий
  • Как настроить фильтр и сортировку по связанным таблицам?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Покажите, именно, как Вы фильтруете в поисковой модели.
    Если настроить нужно по разным моделям фильтрацию, то Вам надо ещё создать псевдонимы таблиц.
    Покажу на своём примере.
    Мне требовалось в маршрутах сделать поиск по городам.
    В модели "маршруты" создал публичное свойство "$city_id;". Так же есть связующая таблица, где маршруты связаны с городами. В самом запросе добавил связь и joinWith().
    $query = Routes::find()
                ->from(['r' => Routes::tableName()])
                ->with(['city', 'routesCities', 'price'])
                ->joinWith([
                    'city' => function(ActiveQuery $query){
                        $query->from(['rc1' => Cities::tableName()]);
                    }
                ])
                ->joinWith([
                    'routesCities' => function(ActiveQuery $query){
                        $query->from(['rc2' => RoutesCities::tableName()]);
                    }
                ])

    В этом запросе я делаю псевдоним для таблицы маршрутов, для таблицы city и связующей таблицы.
    Соответственно получаю три псевдонима "r" - маршруты, "rc1" - города, "rc2" - связующая таблица, хранится привязка города к маршруту.
    И тогда в фильтрации пишу следующее:
    $query->andFilterWhere([
                'r.id' => $this->id,
                /*****/
                'rc1.id' => $this->city_id, // фильтрую по id города.
            ]);

    И в GridView делаю саму колонку фильтра, вывожу через запятую города, через которые проходит маршрут.
    [
                    'attribute' => 'city_id',
                    'label' => "Города",
                    'filter' => Cities::find()->select(['title', 'id'])->indexBy('id')->orderBy(['title' => SORT_ASC])->column(),
                    'value' => function(Routes $routes){
                         return implode(',', ArrayHelper::map($routes->city, 'id', 'title'));
                    }
                ],
    Ответ написан
    Комментировать
  • Как правильно наследовать модуль dektrium/yii2-user?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброй ночи.
    Переопределите правила url у себя в конфигурации или файле модуля.

    UPD.
    Если Вы хотите скрыть меню от не авторизованных пользователей, то необязательно переопределять представление.
    Достаточно проверить, является вошедший на сайт гостем или нет.
    if(!Yii::$app->user->isGuest){
        echo Nav::widget([
            // your code
        ])
    }

    Если хотите исключить из показа только некоторые пункты меню, то можно сделать так:
    echo Nav::widget([
        'items' => array_filter([
            if(!Yii::$app->user->isGuest) :
              [ 'label' => 'выход']
             : false,
         ])
    ])

    Правила urlManager можно сделать группой при помощи yii\web\GroupUrlRule
    'rules' => [
        [
          'class' => 'yii\web\GroupUrlRule',
          'prefix' => 'admin',
          'routePrefix' => 'admin',
          'rules' => [
             '<_a:(login|logout)>' => 'user/users/<_a>',
          ],
        ],
        // правила не для модуля
    ]

    Можно переопределить с самом файле модуля.

    UPD.
    В директории модуля создаёте файл ModuleBootstrap.
    <?php
    namespace app\modules\nameModule;
    use yii\base\BootstrapInterface;
    
    class ModuleBootstrap inplements BootstrapInterface{
      public function bootstrap($app)
      {
          $app->getUrlManager()->addRules([
              // rule declarations here
          ], false);
      }
    }

    Регистрируете этот файл в конфигурационном файле в секции bootstrap.
    'bootstrap' => [
       'app\modules\nameModule\ModuleBootstrap'
    ]
    Ответ написан
  • Как выделить активную ссылку Pjax?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Используйте виджеты Nav или Menu. У обоих виджетов, для свойства items есть параметр active. Вот при помощи этого параметра и укажите, когда ссылка должна быть активирована, а когда нет.
    Например:
    'active' => $context->module->id == 'user',
    Есть у этих виджетов и другие свойства для определения активных элементов, подробней смотрите по ссылкам.
    Ответ написан
    7 комментариев