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

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    В контроллере создаёте свойство, присваиваете ему нужное значение.
    class DefaultController extends Controller
    {
        public $test;
    
        public function actionIndex()
        {
             $this->test = 'test';
             /* остальной код метода */
        }
    }

    В main.php вызываете приблизительно так
    <?= Yii::$app->controller->view->context->test ?>
    Ответ написан
    6 комментариев
  • Как настроить yii2 advanced на ubuntu?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    RootDirectory настраиваете на корень сайта, не на backend/web и не на frontend/web
    В корне сайта .htaccess
    RewriteEngine On
    
    RewriteRule ^(frontend|backend)/web/ - [L]
    
    RewriteCond %{REQUEST_URI} ^/(admin)
    RewriteRule ^admin(\/?.*)$ backend/web/$1 [L]
     
    RewriteCond %{REQUEST_URI} ^/
    RewriteRule ^(\/?.*)$ frontend/web/$1 [L]

    В backend/web .htaccess
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php

    В backend/config/main.php, в секцию request
    'baseUrl' => '/admin'

    Перейдя по адресу http://site.com попадёте на frontend, а по адресу http://site.com/admin - в админку.
    Теперь, если захотите перенести сайт в поддиректорию, например subsite, адрес изменится на http://site.com/subsite.
    Вносите изменения в .htaccess, который в корне сайта.
    RewriteEngine On
    
    RewriteRule ^(frontend|backend)/web/ - [L]
    
    RewriteCond %{REQUEST_URI} ^/(subsite/admin)
    RewriteRule ^admin(/.*)?$ backend/web/$1 [L]
    
    RewriteCond %{REQUEST_URI} ^/(subsite)
    RewriteRule ^(.*)$ frontend/web/$1 [L]

    В backend/config/main.php добавляете переменную $baseUrl
    $baseUrl = str_replace('/backend/web', '', (new yii\web\Request)->getBaseUrl());

    и подставляете в значение baseUrl
    'baseUrl' => $baseUrl . '/admin'
    В этом случае Вы не заморачиваетсь с названием поддиректории в которую перенесёте сайт, названия можете менять как угодно, но не забываете сменить название и в корневом .htaccess
    Ответ написан
    Комментировать
  • Как правильно составить правило для url?

    slo_nik
    @slo_nik Куратор тега Yii
    'default/<id:\d+>/brand-<brand:\d+>' => 'default/index',
    'default/<id:\d+>' => 'default/index',
    'default' => 'default/index',
    
    echo Html::a('test', ['default/index', 'id' => $id, 'brand' =>  $brand])
    echo Html::a('test', ['default/index', 'id' => $id])
    echo Html::a('test', ['default/index'])
    
    http://site.loc/default/index/3/brand-2
    http://site.loc/default/index/3
    http://site.loc/default/
    Ответ написан
    Комментировать
  • Почему не срабатывает loadMultiple для модели?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Замените
    SkillsChecked::loadMultiple($sk_ch, Yii::$app->request->post(), '')

    на
    Model::loadMultiple($sk_ch, Yii::$app->request->post())

    И ещё, у Вас нет никаких $settings)))
    Замените
    SkillsChecked::validateMultiple($settings))
    на
    Model::validateMultiple($sk_ch))
    Ответ написан
    Комментировать
  • Как в renderAjax определить текущий язык?

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

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Для advanced укажите путь к миграциям --migrationPath="@frontend/migrations".
    Чтобы не указывать путь - помещайте миграции в предназначенную для этого директорию(если не ошибаюсь - console/migrations для advanced).
    И зачем через gii генерировать миграции, если для этого есть специальная консольная команда
    php yii migrate/create migrate_name? Если делать миграции при помощи этой команды, то файлы будут складываться куда положено.

    p.s. Через gii не создают миграции)))
    Ответ написан
    Комментировать
  • Как в yii2 поменять форматирование суммы в asCurrency?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    В документации честно не нашел)

    Плохо искали.
    Yii::$app->formatter->asCurrency('10650000', 'RUB', [NumberFormatter::FRACTION_DIGITS => 0])

    Должно быть установлен php-intl
    Подробней.
    Ответ написан
    Комментировать
  • Yii2. Как сохранить дату в БД в формате Unix?

    slo_nik
    @slo_nik Куратор тега Yii
    Если дата приходит в виде 2020-06-12 14:45, то в правилах валидации можно написать так.
    ['publish_at', 'datetime', 'timestampAttribute' => 'publish_at', 'format' => 'php:Y-m-d H:i'],

    На примере валидации формы контактов.
    public function contact($email)
        {
            echo $this->publish_at; // 2020-06-12 14:45.
            if ($this->validate()) {
                echo $this->publish_at;  // 1591962300
                exit();
            }
            return false;
        }
    Ответ написан
    Комментировать
  • Ссылка в столбце GridView?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    [
    'template' => '{view}',
    'buttons' => [
        'view' => function($url, $model, $key){
           return Html::a($model->title, $url)
        }
      ]
    ]

    Сверьтесь с документацией.
    https://www.yiiframework.com/doc/api/2.0/yii-grid-....
    Ещё можно сделать переход по ссылке прямо из столбца title.
    [
       'attribute' => 'title',
       'value' => function($model){
           return Html::a($model->title, ['controller/action', 'id' => $model->id])
        }
    ]
    Ответ написан
  • Как в зависимости от ответа сервера изменить иконку c помощью ajax?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Вот Вам упрощённый способ на примере смена статуса. В колонке таблицы всё те же span.
    // GirdView column
    [
        'attribute' => 'status',
        'contentOptions' => function($model, $key, $index, $column){
             return [
                 'class' => 'status-column',
                 'style' => 'cursor:pointer',
                 'id' => $key,
                 'onclick' => '
                        $.ajax({
                           url: "' . Url::toRoute('/ajax/update-status-mark') . '",
                           method: "POST",
                           data: {id: ' . $key . ', status: ' . $model->status . '},
                           success: function(data){
                              if(data == 0){
                                 $("td#' . $key . ' span").removeClass("label-success").addClass("label label-danger").text("Blocked")
                                 $("tr[data-key=' . $key . ']").removeAttr("style")
                              }
                              else{
                                 $("td#' . $key . ' span").removeClass("label-danger").addClass("label label-success").text("Active")
                                 $("tr[data-key=' . $key . ']").css("backgroundColor","rgb(226, 243, 227)")
                              }
                           }
                        })
                    '
             ];
         },
    ]
    
    // Controller action
    public function actionUpdateStatusMark($id)
    {
        $model = $this->findModel($id);
        $model->status = $model->status == 0 ? 1 : 0;
        $model->save(false,['status']);
        return $model->status;
    }
    Ответ написан
    3 комментария
  • Как в yii2 вывести js скрипт перед закрывающим тегом?

    slo_nik
    @slo_nik Куратор тега Yii
    Думаю, что весь этот цирк с отловом значения через Ваш скрипт лишний.
    Всё гораздо проще.
    echo ColorPicker::widget([
       'name' => 'Test',
       'value' => '#CCCCCC',
       'options' => [
           'onchange' => '
                 console.log($(this).val())
                // ВОТ ТУТ ДЕЛАЙТЕ ЧТО ХОТИТЕ, ХОТЬ ПО AJAX ОТПРАВЛЯЙТЕ, ХОТЬ КУДА ПРИСВАИВАЙТЕ.
            '
       ]
    ]);

    Так что писать скрипт, который будет отлавливать значения виджета лишняя работа.
    Написали бы сразу в вопросе как положено - не потребовалось бы морочить голову в комментариях.
    Ответ написан
  • Как создавать многоступенчатые запросы?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Во-первых, можно использовать andFilterWhere().
    C условиями можно разбить запрос на части.
    $request = Model::find();
    if(...){
      $request->andWhere(...);
    }
    $query = $request->all(); // or one()
    Ответ написан
    2 комментария
  • Как поместить блок в yii2 ссылку?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    $html = '<div>block</div>';
    echo Html::a($html, []);
    Ответ написан
    2 комментария
  • Как осуществить сортировку по связанным полям в YII2?

    slo_nik
    @slo_nik Куратор тега Yii
    $query->orderBy([
         '{{%table_name}}.name'  => SORT_ASC,
         'objectName' => SORT_ASC
    ]);
    Ответ написан
    8 комментариев
  • Выборка данных rest api на yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Тут полно информации.
    Ответ написан
    Комментировать
  • Как сделать выборку из промежуточной таблицы?

    slo_nik
    @slo_nik Куратор тега Yii
    yura_born, ну тогда должно быть как-то так
    Сотрудники:
    id - primaryKey
    name - имя сотрудника
    surname - фамилия сотрудника

    SotrRank
    id - primaryKey
    id_employee - id сотрудника из таблицы Sotrudnik
    id_position - id должности

    RankList
    id - primaryKey
    name - название должности

    Вам надо получить когда и какую должность занимал сотрудник. В модели Sotrudnik делаем связь на SotrRank
    public function getSotrRank()
    {
         return $this->hasMany(SotrRank::class, ['id_employee' => 'id');
    }

    Но так получите только id должности, вместо названия. Поэтому в модели SotrRank делаете связь на RankList
    public function getRank()
    {
         return $this->hasOne(Rank::class, ['id' => 'id_position');
    }

    И выводите в цикле
    // действие
    public function actionSql($code)
        {
            $employee = Sotrudniki::find()->where(['code' => $code])->all();
    
            return $this->render('sql', [
                'employee' => $employee
            ]);
        }
    // вид sql
    foreach($employee as $value){
        echo $value->name; // имя сотрудника
        // ещё один цикл для получения данных по связи SotrRank
        foreach($value as $sotrRank){
        // получить название должности через связь Rank
         echo $sotrRank->rank->name;
        }
    
    }

    Вот как-то так.

    p.s. Обязательно будут ошибки, но Вы их сами исправите, я уверен.
    Ответ написан
    2 комментария
  • Поменять конфиг приложения из компонента?

    slo_nik
    @slo_nik Куратор тега Yii
    Вариантов может быть несколько.
    Через модуль.
    например есть какой-то модуль. Пусть он установлен или через composer или вручную в приложение.
    В конфигурационном файле надо прописать подключение этого модуля.
    Например так
    'modules' => [
            'support' => [
                'class' => ModuleTicket::class,
               // далее могут быть настройки самого модуля.
            ],
        ],

    В самом модуле есть файл ModuleTicket.php и Bootstrap.php
    Сам Bootstrap.php может выглядеть так
    class Bootstrap implements BootstrapInterface
    {
        /**
         * @inheritdoc
         */
        public function bootstrap($app)
        {
            if ($app->hasModule('support') && ($module = $app->getModule('support')) instanceof ModuleTicket) {
    
                $app->urlManager->addRules(
                    [
                        '<_m:support>/new-ticket' => '<_m>/ticket/create',
                        '<_m:support>/<id:\w+>' => '<_m>/ticket/view',
                        '<_m:support>' => '<_m>/ticket/index',
                    ]
                );
    
                if (!$app->has($this->getModule()->queueComponent)) {
                    $app->set($this->getModule()->queueComponent, [
                        'class' => Queue::class,
                        'handle' => true, // whether tasks should be executed immediately
                    ]);
                }
            }
    
            // Add module I18N category.
            if (!isset($app->i18n->translations['slo-nik/*'])) {
                $app->i18n->translations['slo-nik/*'] = [
                    'class' => PhpMessageSource::class,
    
                ];
            }
        }
    }

    Тут настраиваются и очереди и urlManager и переводы модуля. Всё налету и по условиям может быть настроено.
    Можно настроить через компонент
    В конфигурационном файле приложения, в секции 'components' подключаете свой компонент.
    'siteSettings' => [
            'class' => SiteSettings::class
          ],

    Все данные для настройки сайта у Вас хранятся в базе данных. Например, настройки smtp у Вас в базе.
    Как подключить свои настройки для mailer в yii?
    Вот так
    'mailer'       => function () {
            return Yii::createObject([
              'class'            => 'yii\swiftmailer\Mailer',
              'useFileTransport' => true,
    
              'transport'     => [
                'class'      => 'Swift_SmtpTransport',
                'host'       => Yii::$app->siteSettings->get('SITE.MAIL_HOST'),
                'port'       => Yii::$app->siteSettings->get('SITE.MAIL_PORT'),
                'username'   => Yii::$app->siteSettings->get('SITE.MAIL_USER'),
                'password'   => Yii::$app->siteSettings->get('SITE.MAIL_PASS'),
                'encryption' => Yii::$app->siteSettings->get('SITE.MAIL_ENCR')
              ],
              'messageConfig' => [
                'to'   => [ Yii::$app->siteSettings->get('SITE.EMAIL_ADMIN') ],
                'from' => [ Yii::$app->siteSettings->get('SITE.MAIL_USER') ]
              ]
            ]);

    Все данные берутся из базы.
    В общем тут можно по разному действовать.
    Вот тут создаётся магазин на примере yii2. И в этом же мастер-классе рассказано, как работать с контейнером зависимостей.
    Ну а компонент настроек сайта делайте по примеру этой статьи. Статья для первой версии yii, но переделать для второй версии не составит труда.
    Ответ написан
    Комментировать
  • Как при вызове hasOne/hasMany вызывать функцию класса с которого мы берем данные?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Не надо никаких своих методов, всё уже придумали за Вас.
    https://www.yiiframework.com/doc/guide/2.0/ru/db-a...
    Ответ написан
    Комментировать
  • Как в ActionColumn добавить свой идентификатор?

    slo_nik
    @slo_nik Куратор тега Yii
    'columns' => [
        // ...
        [
            'class' => ActionColumn::className(),
            'buttons' => [
                'view' => function($url, $model, $key){
                    return Html::a('View', ['sotrudniki/view', 'code' => $model->id);
                }
            ]
        ],
    ]

    До рабочего состояния доведёте сами.
    Ответ написан
    2 комментария
  • Как в yii2 вывести данные из БД в конфиг?

    slo_nik
    @slo_nik Куратор тега Yii
    'SMSCenter' => function(){
        return Yii::$app->createObject( [
                'class' => 'integready\smsc\SMSCenter',
                'login' => '',
                'password' => '',
                'useSSL' => false,
                'options' => [
                ],
            ]);
    }

    Теперь останется только добавить в настройки нужные значения.
    Можно через статический метод попробовать, а можно сделать компонент "Настройки" и уже через него получать нужные значения.
    Есть пример такого компонента, написанный для YII1, но переписать на вторую версию большого труда не составит.
    Тогда добавить параметр из базы сведётся к следующему
    'login' => Yii::$app->settings->get('password),
    Сам компонент подключить в том же конфигурационном файле.
    'components' => [
        'settings' => [
            // настройки компонента
        ]
    ]

    p.s.
    Так же можно перенести настройки для mailer в базу.
    Ответ написан
    2 комментария