• Как в gridview yii2 вывести вместо иконок glyphicon fontawesome?

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

    1. Создать свой класс ActionColumn и наследовать его от базового ActionColumn. В этом классе переопределить нужную реализацию. Как советует Дмитрий Дерепко

    2. Замена в одном месте. Если требуется заменить только в одном месте имеет смысл использовать решение Дмитрий

    3. Сочетать всё это используя DI контейнер. Всегда рекомендую использовать такую глобальную подмену данных. Это более гибко. Для этого создаем Bootstrap класс с реализацией интерфейса \yii\base\BootstrapInterface. Подключаем его в автозагрузку приложения (bootstrap в config.php) и заменяем всё что нам нужно:
    $actionColumnSetting = [
                'buttons' => [
                    'view' => function($name, $model, $key){
                        return Html::a('<i class="fas fa-eye" aria-hidden="true"></i>', ['update']);
                    },
                    'update' => function($name, $model, $key){
                        return Html::a('<i class="fas fa-pencil-alt" aria-hidden="true"></i>', ['update']);
                    },
                    'delete' => function($name, $model, $key){
                        return Html::a('<i class="fas fa-trash" aria-hidden="true"></i>', ['delete']);
                    }
                ],
            ];
            \Yii::$container->set(ActionColumn::class, $actionColumnSetting);


    Это удобно во всех случаях. Например, вы вдруг захотите во всех gridview использовать другие экшены редактирования. Заменить это будет просто. Необходимо update переименовать в edit. Либо вам во всех gridview нужна дополнительная кнопка "перенести Архив"

    $actionColumnSetting = [
                'buttons' => [
                    'view' => function($name, $model, $key){
                        return Html::a('<i class="fas fa-eye" aria-hidden="true"></i>', ['edit']);
                    },
                    'update' => function($name, $model, $key){
                        return Html::a('<i class="fas fa-pencil-alt" aria-hidden="true"></i>', ['update']);
                    },
                    'delete' => function($name, $model, $key){
                        return Html::a('<i class="fas fa-trash" aria-hidden="true"></i>', ['delete']);
                    },
      'archive' => function($name, $model, $key){
                        return Html::a('<i class="fas fa-trash" aria-hidden="true"></i>', ['archive']);
                    }
                ],
            ];
            \Yii::$container->set(ActionColumn::class, $actionColumnSetting);

    Ответ написан
    Комментировать
  • Как произвести правильный подсчет в тесте?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Такой код, где много if, else тестировать очень сложно и это сложно читаемо. Вынесите весь код логики в отдельные классы, с методами и тестируйте их. Например класс может быть класс QuestionPoint . В нем методы
    public function isAnswerExists($answers){}

    и тому подобные..

    Получится такой код, если совсем примитивно

    $question = 1;
    foreach ($questions as $key => $question) {
    $questionPoint = new  QuestionPoint($question);
    $questionPoint->isAnswerExists($question, $answer)
    }


    Поэтому делайте код по ООП или DDD и тогда будет вам счастье. В вашем случае будет гемор. Особенно если код в контроллере. Тестировать его будет крайне сложно и долго. Такие тесты запускать никому не захочется. Вам придется в тестах поднимать приложение и базу данных. Хотя в вашем случае это вообще лишнее!

    В общем выносите код из контроллера и избавляйтесь от лапши. Создавайте объекты.
    Ответ написан
    2 комментария
  • Как сделать импорт csv файлов в таблицу/БД?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Пишет, что директория не найдена. У вас путь к папке не полный. Вы указываете /загрузки....
    Начинаете искать от корня. Не уверен я в том, что загрузки у вас находятся в корне. Скорее всего они в папке web. Ваш путь должен быть полным от корня к этой папке. Либо используете Алиал web. @web/загрузки/....
    Ответ написан
  • Как сверстать формы в yii?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Я думаю, что вам поможет эта статья https://yiico.ru/blog/499-shpargalka-po-formam-act...

    Вам нужно смотреть в сторону параметра “template”. Думаю, что это поможет

    <?php $form = ActiveForm::begin([
            'layout'=>'horizontal',
            'options' => ['class' => 'signup-form form-register1'],
            'fieldConfig' => [
                 'template' => "{label}\n{beginWrapper}\n{input}\n{hint}\n{error}\n{endWrapper}",
                'horizontalCssClasses' => [
                    'label' => 'col-sm-4',
                    'offset' => 'col-sm-offset-4',
                    'wrapper' => 'col-sm-8',
                    'error' => '',
                    'hint' => '',
                ],
            ],
        ]); ?>


    Или так
    <?= Html::activeLabel($model, 'password') ?>
    <?= Html::activePasswordInput($model, 'password') ?>
    <?= Html::error($model, 'password') ?>
    
    or
    
    <?= Html::activeLabel($model, 'username', ['label' => 'name']) ?>
    <?= Html::activeTextInput($model, 'username') ?>
    <div class="hint-block">Please enter your name</div>
    <?= Html::error($model, 'username') ?>
    Ответ написан
    Комментировать
  • Как добавить кнопку import в DynaGrid?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Судя по документации это так:
    'gridOptions'=>[
            'dataProvider'=>$dataProvider,
            'filterModel'=>$searchModel,
            'showPageSummary'=>true,
            'panel'=>[
                'heading'=>'<h3 class="panel-title"><i class="glyphicon glyphicon-book">  Library',
                'before'=>'{dynagrid}' . Html::a('Custom Button', '#', ['class'=>'btn btn-default'])
            ],
        ]
    Ответ написан
  • Как можно повторно инициализировать select 2 kartik?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вопрос не по тематике Yii2 это относится к JS и самому Select2 копайте в эту сторону. И предлагаю такой JS. Попробуйте, возможно подойдет...

    /*<!--Устраняем баг Select2-->*/
    $(document).ready(function () {
        $.fn.modal.Constructor.prototype.enforceFocus = function () {
        };
    });
    /*<!--/Устраняем баг Select2-->*/

    $(".select2me-filter").select2("destroy");
    
    ... Here do option updates you need
    
    $(".select2me-filter").select2();
    Ответ написан
    Комментировать
  • Как заменить GridView на DynaGrid?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Добавьте в кофигурацию DynaGrid как модуль
    'modules'=>[
       'dynagrid'=> [
            'class'=>'\kartik\dynagrid\Module',
            // other module settings
        ],
        'gridview'=> [
            'class'=>'\kartik\grid\Module',
            // other module settings
        ],
    ];


    2. Используйте в своем приложении
    <?= \kartik\dynagrid\DynaGrid::widget([
        'columns' => $columns,
        'theme'=>'panel-warning',
        'gridOptions'=>[
            'dataProvider'=>$dataProvider,
            'filterModel'=>$searchModel,
            'showPageSummary'=>true,
            'panel'=>[
                'heading'=>'<h3 class="panel-title"><i class="glyphicon glyphicon-book">  Library',
                'before'=>'{dynagrid}' . Html::a('Custom Button', '#', ['class'=>'btn btn-secondary'])
            ],
        ]
    ]); ?>
    Ответ написан
  • Как в 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 комментария
  • MySQL - рекомендации наименования таблиц и столбцов?

    myks92
    @myks92 Автор вопроса
    Нашёл решение — пометь вопрос ответом!
    Ещё одно решение: https://m.habr.com/ru/post/207102/
    Ответ написан
    Комментировать
  • Не удаётся запустить миграции?

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

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    А что его искать? Калькулятор написан на js и имеет исходный код на самом сайте. Берите и делайте под себя! kivigroup.by/calc/calc_script.js?2 Вопрос только разберётесь ли вы... Но если не знаете данный язык смысла нет пытаться даже искать. Любой код вы не сможете сделать под себя без знаний...

    Вопрос не имеет отношения к Yii и php.
    Ответ написан
    Комментировать
  • Трудно ли будет перенести сайт с 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;
    Ответ написан