Ответы пользователя по тегу Yii
  • Как в yii2 конвертировать дату из DatePicker?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Либо в beforeSave конвертируйте дату на нужный формат базы данных. Я использую написанное поведение и подключаю его в нужном месте на нужные атрибуты. Если надо могу скинуть пример.

    Предлагаю хранить дату в Unix формате. И конвертировать в человеческий вид. Это будет более универсальнее.

    Так же формат даты этого плагина должен быть dd.mm.yyyy

    Если вы хотите поставить валидацию для этого формата используйте format=> php: d.m.Y
    Ответ написан
    Комментировать
  • Можно сделать права доступа AccessControl для разных ролей в конфиге на все контролеры?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Посмотрите как реализован RBAC и используйте его. Пихать это все в один конфиг не лучший вариант, по моему мнению. Я бы сделал свой фильтр доступа и навесил его глобально на все запросы в конфиг. Как это делает RBAC. Да и зачем вам велосипед. Используйте его)
    Ответ написан
  • Где изменить путь к скриптам, которые подключатся из расширения в папке vendor?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Скорее всего тут просто проблема в .htaccess

    Вы говорите, что вы пробовали
    RewriteCond %{REQUEST_URI} !^/(assets)
    RewriteRule ^assets/(.*)$ web/assets/$1 [L]
    RewriteRule ^css/(.*)$ web/css/$1 [L]
    RewriteRule ^fonts/(.*)$ web/fonts/$1 [L]
    RewriteRule ^js/(.*)$ web/js/$1 [L]
    RewriteRule ^images/(.*)$ web/images/$1 [L]
    RewriteRule (.*) web/$1

    Но это для basic шаблона. Вам нужно для advanced
    <IfModule mod_rewrite.c>
        Options +FollowSymlinks
        RewriteEngine On
    </IfModule>
     
    <IfModule mod_rewrite.c>
        # deal with admin first
        RewriteCond %{REQUEST_URI} ^/(admin)
        RewriteRule ^admin/assets/(.*)$ backend/web/assets/$1 [L]
        RewriteRule ^admin/css/(.*)$ backend/web/css/$1 [L]
    
        RewriteCond %{REQUEST_URI} !^/backend/web/(assets|css)/
        RewriteCond %{REQUEST_URI} ^/(admin)
        RewriteRule ^.*$ backend/web/index.php [L]
    
        RewriteCond %{REQUEST_URI} ^/(assets|css|js|images)
        RewriteRule ^assets/(.*)$ frontend/web/assets/$1 [L]
        RewriteRule ^css/(.*)$ frontend/web/css/$1 [L]
        RewriteRule ^js/(.*)$ frontend/web/js/$1 [L]
        RewriteRule ^images/(.*)$ frontend/web/images/$1 [L]
        RewriteRule ^(.*)$ frontend/web/$1 [L]
    
        RewriteCond %{REQUEST_URI} !^/(frontend|backend)/web/(assets|css|js)/
        RewriteCond %{REQUEST_URI} !index.php
        RewriteCond %{REQUEST_FILENAME} !-f [OR]
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^.*$ frontend/web/index.php
    </IfModule>
    Ответ написан
    Комментировать
  • Свой класс для yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Как говорил Дмитрий Елисеев: «Да, представьте себе, в Yii можно использовать обычные php классы...».

    Если вы хотите создать свой хэлпер то сделайте это там, где вам удобно. Что такое хэпер? Это обычный вспомогательный php класс. Если у вас проблема его размещения и вы хотите придерживаться структуры проекта, то обычно для хэлперов используют папку helpers в модулях или самого приложения, где и размещают все свои хэлперы.

    Если вам нужно добавить свой метод в базовый Html хэплер, то свой хэлпер класс Вы наследуете от базового... Главное, чтобы в хэлпере не было бизнес-логики. Тогда это полноценный хэлпер. Но если это логика, то тогда это не хэлпер. И, скорее всего, вам придется его добавить в модель.
    Ответ написан
    Комментировать
  • Как подменить переменную из расширения dmstr/AdminLTE?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Если нужно ни один раз, то советом выше, если нужно глобально, то я использую через DI контейнер и подменяю настройки глобально для любого класса. Например, вот так:
    namespace app;
    
    class Bootstrap implements \yii\base\BootstrapInterface
    {
    
        /**
         * Bootstrap method to be called during application bootstrap stage.
         *
         * @param \yii\base\Application $app the application currently running
         */
        public function bootstrap($app)
        {
            $this->gridViewSetting();
        }
    
        /**
         * Применение настроек для yii\grid\GridView и yii\widgets\DetailView
         */
        protected function gridViewSetting()
        {
            $gridSetting = [
                'tableOptions' => ['class' => 'table table-condensed'],
                'options' => ['class' => 'table-responsive'],
                'summary' => false
            ];
            \Yii::$container->set('yii\grid\GridView', $gridSetting);
    
            $viewSetting = [
                'options' => ['class' => 'table'],
            ];
            \Yii::$container->set('yii\widgets\DetailView', $viewSetting);
    
    
        }
    }


    Я сделал отдельный класс загрузки Bootstrap и подключил его в конфиге. Далее в нем подменяю нужные параметры глобально. В вашем случае будет так:

    <?php
    
    namespace app;
    
    class Bootstrap implements \yii\base\BootstrapInterface
    {
    
        /**
         * Bootstrap method to be called during application bootstrap stage.
         *
         * @param \yii\base\Application $app the application currently running
         */
        public function bootstrap($app)
        {
            $MenuSetting = [
                'iconClassPrefix' => '',
            ];
            \Yii::$container->set('dmstr\widgets\Menu', $MenuSetting);
        }
    
    }
    Ответ написан
    2 комментария
  • Не удаётся запустить миграции?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    У вас проблема в том, что к полю, на который вы вешаете ключ имеет атрибут UNSIGNED. Уберите его и будет все хорошо!
    Ответ написан
    2 комментария
  • Трудно ли будет перенести сайт с yii2 на yii3?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Yii 3 есть в демо версии, однако там много чего не сделано, код постоянно изменяется со структурой. Разрабатывать на нём точно не стоит. В конце концов демо версия может сильно отличаться от релиза. Ждать релиза yii3 не стоит. Точной даты нет. Известен лишь год - 2019.

    Если выберите фреймворк yii2, то реализуйте проект обдуманно. Перенести проект на yii3 будет не сложно, используя паттерны проектирования и отделя бизнес логику от остальной части, за которую отвечает Фреймворк. Подробно написано здесь: Архитектура приложения. Как сделать независимые модули (сервисы)?

    Вы так же можете увидеть прогресс в репозиториях GitHub. Что нового в UPGRADE, и посмотреть структуру пакетов. Да, именно пакетов, а не модулей. Сам больше не будет монолитом он будет собираться по запчастям.

    Изменений в проектировании много, но команда постарается сохранить некоторые привычные вещи. Например, если раньше использовали Yii::t(), то в yii3 нужно будет использовать $this->app->t()
    Заменить через IDE по проекту не сложно! Однако есть и координальные решения связанные с Active Record. С большей вероятностью этот паттерн исчезнет в версии 3.0. Это обсуждается тут. Поэтому стоит обратить внимание на использование сторонних пакетов. В своём проекте вы сможете что-то изменить под Yii3, а вот сторонние расширения могут вообще никогда не переписаться по трети версию.

    Информацию про yii3 можно отслеживать тут. Так же создан новый раздел русскоязычного ФОРУМА. Попробуйте познакомиться с Yii3 Demo
    Ответ написан
    9 комментариев
  • CDbException Таблица "{{config}}", упомянутая в записи active record класса "Config", не найдена в базе данных?

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

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Второй вариант это использовать параметр в mpdf

    'destination' => Pdf::DEST_DOWNLOAD,

    'pdf' => [
                'class' => Pdf::classname(),
                'mode' => Pdf::MODE_UTF8,
                'format' => Pdf::FORMAT_A4,
                'orientation' => Pdf::ORIENT_PORTRAIT,
                'destination' => Pdf::DEST_DOWNLOAD,
                'marginTop' => 15,
                'marginLeft' => 10,
                'marginRight' => 10,
                //'cssFile' => '@backend/web/css/print-pdf.css',
                'defaultFontSize' => 12,//размер шрифта
                'filename' => Yii::$app->name.'.pdf',
                'methods' => [
                    //'SetHeader' => ['Service Desk||Generated On: ' . date("Y-m-d H:i:s")],
                    'SetFooter'=>[
                        'content' => '{DATE j-m-Y H:m} || #{PAGENO}',
                    ],
                ]
            ],
    Ответ написан
  • Yii как убрать 101 запрос при получении связанных данных?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Разобрался сам. Сделал with и joinWith прямо в связи

    /**
         * @return \yii\db\ActiveQuery
         */
        public function getAppointmentsJudges(): ActiveQuery
        {
            return $this->hasMany(Appointment::className(), ['event_id' => 'id'])
                ->joinWith(['certification', 'certification.comitet', 'certification.category'])
                ->with(['profile'])
                ->andWhere([Judge::tableName().'.role' => Judge::ROLE]);
        }
    Ответ написан
    Комментировать
  • Как создать связь Yii2-user с моей таблицей?

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

    'components' => [
            'user' => [
                'identityClass' => 'app\models\User',
            ],
        ],


    В эту модель скопировать все методы из модели расширения Yii2-user и добавить в нее нужную вам связь.

    /**
         * @return \yii\db\ActiveQuery
         */
        public function getСontact()
        {
            return $this->hasOne(Сontact::className(), ['user_id' => 'id']);
        }


    После чего использовать можно так:
    Yii::$app->user->contact

    Либо так:
    $model = User::find()->all();
    $model->contact;
    Ответ написан
  • Что за ошибка в yii2-user при выходе?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Перевод ошибки:

    Ошибку typeerror аргумент 1 принят к приложение\контроллеры\пользователь\SecurityController::getUserEvent() должен быть экземпляр dektrium\пользователь\модели\Пользователь, экземпляр приложения\модели\пользователя, данные, называется в /применения/mamp/htdocs в/строительного/контроллеры/пользователей/SecurityController.php в строке 153


    Судя по ошибке ругается, что используется другая модель вместо app\models\User должна быть dektrium\user\models\User

    Смотрите где подключаете и используете базовую модель и измените на dektrium\user\models\User

    Возможно поможет добавить в конфиг
    //.......
    'user' => [
                'identityClass' => dektrium\user\models\User',
                //...
            ],
    //.......
    Ответ написан
  • Реально ли ограничить доступ к странице не используя велосипед RBAC?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    public function behaviors()
        {
            return [
                'access' => [
                    'class' => \yii\filters\AccessControl::className(),
                    'rules' => [
                        // allow authenticated users
                        [
                            'allow' => true,
                            'matchCallback' => function ($rule, $action) {
                                if (Yii::$app->user->id == 1){
                                    return false;
                                } else {
                                    return true;
                                }
    
                            }
                        ],
                        // everything else is denied
                    ],
                 ],
            ];
        }
    Ответ написан
    4 комментария
  • Yii как настроить htaccess для api?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    # Если запрос начинается с /api, то заменяем на /api/web/
    RewriteCond %{REQUEST_URI} ^/api
    RewriteRule ^.*$ /api/web/$1
    Ответ написан
    Комментировать
  • Как вывести месяц на русском yii2 formatter?

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

    Если нужно Что-то такое
    15 мая 2018
    , то такой код подойдет
    <?= Yii::$app->formatter->asDate($item->date, 'long')?>


    Если же просто месяц, например
    мая

    <?= Yii::$app->formatter->asDate($item->date, 'php:M')?>


    Если по вашим данным, то
    <?= Yii::$app->formatter->asDate($item->date, 'php:d.M H:i')?>


    Если же не переводится язык, то нужно смотреть php.init у меня была такая же проблема решил именно в этом файле. При переводе скорее всего проблема в сервере, а не фреймворке

    В самом верху конфиге должно стоять:
    'language' => 'ru-RU',
        'timeZone' => 'Europe/Moscow',
    Ответ написан
    3 комментария
  • Yii Search Model - как сделать поиск по нескольким полям?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Решение может быть таким, используя "CONCAT_WS":

    $query = new Query();
                $query->select(['profile.user_id as id, CONCAT_WS(" ", profile.last_name, profile.name, profile.middle_name) AS text'])
                    ->from('profile')
                    ->leftJoin('user','profile.user_id = user.id','user.id = 10')
                    ->leftJoin('auth_assignment','auth_assignment.user_id = profile.user_id')
                    ->where('CONCAT_WS(" ", last_name, name, middle_name) LIKE :search')
                    ->params([':search' => '%' . $search . '%'])
                    ->orderBy(['last_name' => 'SORT_ASC', 'name' => 'SORT_ASC', 'middle_name' => 'SORT_ASC'])
                    ->andWhere(['auth_assignment.item_name'=>'organizer'])
                    ->andWhere(['user.status'=>\common\models\User::STATUS_ACTIVE])
                    ->limit(20);
                $command = $query->createCommand();
                $data = $command->queryAll();
    Ответ написан
    Комментировать
  • Как соединить поля в ArrayHelper::map?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Создайте в текущей модели подобное:

    /**
         * @return string User full name
         */
        public function getFullName()
        {
            return $this->name . ' ' . $this->surname;
        }


    обращаться нужно так:

    return ArrayHelper::map(self::find()->all(), 'id', 'fullName');


    Обратите внимание. getFullName() должен быть в той модели, к которой обращаетесь. В данном случае self

    В getFullName() Можете выводить и массив и что угодно под Ваши требования
    Ответ написан
    1 комментарий
  • Yii2 Как лучше сделать несколько профилей?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Один из вариантов решения: https://habrahabr.ru/post/274925/
    Ответ написан
    Комментировать
  • Как сделать gridview responsive?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Пропишите после 'filterModel' => $searchModel.

    'responsive' => true,

    Уберите лишнюю запятую в ответе выше
    Ответ написан
    Комментировать
  • Как сделать сложную форму из нескольких полей + Ajax?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Установить виджет Динамических полей
    2. Устранить баг при работе Select2 от Kartik. Для этого строки с 439 по 476 файла "yii2-dynamic-form.js" заменить на

    // "kartik-v/yii2-widget-select2"
        var $hasSelect2 = $(widgetOptionsRoot.widgetItem).find('[data-krajee-select2]');
        if ($hasSelect2.length > 0) {
            $hasSelect2.each(function() {
                var id = $(this).attr('id');
                var configSelect2 = eval($(this).attr('data-krajee-select2'));
    
                if ($(this).data('select2')) {
                    $(this).select2('destroy');
                }
    
                var configDepdrop = $(this).data('depdrop');
                if (configDepdrop) {
                    configDepdrop = $.extend(true, {}, configDepdrop);
                    $(this).removeData().off();
                    $(this).unbind();
                    _restoreKrajeeDepdrop($(this));
                }
                var s2LoadingFunc = typeof initSelect2Loading != 'undefined' ? initSelect2Loading : initS2Loading;
                var s2OpenFunc = typeof initSelect2DropStyle != 'undefined' ? initSelect2Loading : initS2Loading;
                $.when($('#' + id).select2(configSelect2)).done(s2LoadingFunc(id, '.select2-container--krajee'));
    
                var kvClose = 'kv_close_' + id.replace(/\-/g, '_');
    
                $('#' + id).on('select2:opening', function(ev) {
                    s2OpenFunc(id, kvClose, ev);
                });
    
                $('#' + id).on('select2:unselect', function() {
                    window[kvClose] = true;
                });
    
               if (configDepdrop) {
                    var loadingText = (configDepdrop.loadingText) ? configDepdrop.loadingText : 'Loading ...';
                    initDepdropS2(id, loadingText);
                }
            });
        }       
    
        /*
        // "kartik-v/yii2-widget-select2"
        var $hasSelect2 = $(widgetOptionsRoot.widgetItem).find('[data-krajee-select2]');
        if ($hasSelect2.length > 0) {
            $hasSelect2.each(function() {
                var id = $(this).attr('id');
                var configSelect2 = eval($(this).attr('data-krajee-select2'));
                $(this).select2('destroy');
                $.when($('#' + id).select2(configSelect2)).done(initS2Loading(id));
    
                $('#' + id).on('select2-open', function() {
                    initS2Open(id)
                });
    
                if ($(this).attr('data-krajee-depdrop')) {
                    $(this).on('depdrop.beforeChange', function(e,i,v) {
                        var configDepdrop = eval($(this).attr('data-krajee-depdrop'));
                        var loadingText = (configDepdrop.loadingText)? configDepdrop.loadingText : 'Loading ...';
                        $('#' + id).select2('data', {text: loadingText});
                    });
                    $(this).on('depdrop.change', function(e,i,v,c) {
                        $('#' + id).select2('val', $('#' + id).val());
                    });
                }
            });
        }
        */
    Ответ написан
    Комментировать