Ответы пользователя по тегу Yii
  • Yii2 почему не работает подключение стилей?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Вместо
    'http://yii2.loc/web/css/bootstrap-reboot.css'
    пишется так же, как и для js
    'css/bootstrap-reboot.css'
    Ответ написан
  • Yii2 обаботка формы без ActiveForm?

    slo_nik
    @slo_nik Куратор тега Yii
    Ваша ошибка здесь
    public function actionLogin() {
        return $this->render("landing");
    
       // ......
    
        return $this->render('landing', [
            'model' => $model,
        ]);
      }


    Вы подключаете представление с формой, куда не передаёте саму форму. Потом обрабатываете данные с формы и опять же подключаете этот же представление. В представлении виджет ждёт атрибуты формы, а их нет, поэтому и ошибка

    Так что bootstrap тут совершенно ни при чём.
    Ответ написан
    Комментировать
  • Kartic fileinput как подставить программно файл?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Вот рабочий вариант, измените под свои нужды.
    echo FileInput::widget([
                'name'          => 'attachment_' . $id,
                'options'       => [
                    'multiple' => true
                ],
                'pluginOptions' => [
                    'minFileCount' => 1,
                    'required' => true,
                    'deleteUrl'            => Url::to(['ajax-cars/del-img-moderator']),
                    'initialPreview'       => $initialPreview,
                    'initialPreviewConfig' => $caption,
                    'initialPreviewAsData' => true,
                    'showCaption'          => false,
                    'showBrowse'           => false,
                    'showRemove'           => false,
                    'showUpload'           => false,
                    'initialCaption'       => "The Moon and the Earth",
                    'overwriteInitial'     => false,
                    'fileActionSettings'   => [
                        'showDrag' => false,
                        'showZoom' => false
                    ]
                ]
            ])

    Здесь нужно подгрузить данные
    'initialPreview'       => $initialPreview,
    'initialPreviewConfig' => $caption,

    Можно сделать так, но лучше вынести в методы.
    $initialPreview = [];
    $caption        = [];
    
    foreach ($images as $image) {
         $initialPreview[] = Url::toRoute($image->path . DIRECTORY_SEPARATOR . 'mini' . DIRECTORY_SEPARATOR . $image->title, true);
         $caption[]        = [
               'key'   => $image->id,
               'extra' => [
                   'img' => [
                        'big'   => $image->path . DIRECTORY_SEPARATOR . $image->title,
                        'small' => $image->path . DIRECTORY_SEPARATOR . 'mini' . DIRECTORY_SEPARATOR . $image->title
                    ]
               ]
         ];
    }


    p.s. На js всё тоже самое
    $this->registerJs('
      var input = $("#uploadsfiles-imagesfile");
      $("#uploadsfiles-imagesfile").on("filebatchselected", function(){
          input.fileinput("upload")
      })
      
      var OtherActionButtons = "<button class=\"set-main btn btn-sm btn-kv btn-default btn-outline-secondary\" type=\"button\" {dataKey} title=\"Main photo\">";
          OtherActionButtons += "<i class=\"fa fa-star\"></i>";
          OtherActionButtons += "</button>";
          OtherActionButtons += "<button class=\"set-main btn btn-sm btn-kv btn-default btn-outline-secondary\" type=\"button\" {dataKey} title=\"Left\">";
          OtherActionButtons += "<i class=\"fa fa-undo\"></i>";
          OtherActionButtons += "</button>";
          OtherActionButtons += "<button class=\"set-main btn btn-sm btn-kv btn-default btn-outline-secondary\" type=\"button\" {dataKey} title=\"Right\">";
          OtherActionButtons += "<i class=\"fa fa-repeat\"></i>";
          OtherActionButtons += "</button>";
         
    /*  $(".btn-submit").on("click", function(){
          var Text = $(".file-caption-name").val();
          input.fileinput("upload");
          if(Text == ""){
            return false;
          }  
      })   */
        
      var funCi = $("#uploadsfiles-imagesfile").on("fileuploaded", function(event, data, previewId, index) {
      input.fileinput("destroy").fileinput({
        maxFileCount: 2,
        validateInitialCount: true,
        overwriteInitial: false,
        required: true,
        multiple: true,
        /*showUpload: false,
        showRemove: false,*/
        initialPreviewAsData: true,
        initialPreview: data.response.initialPreview,
        initialPreviewConfig: data.response.initialPreviewData,
        otherActionButtons: OtherActionButtons,
        uploadUrl: "' . Url::to(['upload-img']) . '",
        deleteUrl: "' . Url::to(['delete-img']) . '",
      })
      // setTimeout(function(){funCi}, 2500)
      input.closest("form").find("button").attr("disabled", false)
        console.log(data);
    });
    ', View::POS_END);
    Ответ написан
  • Как правильно настроить роутинг Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Рекомендую почитать документацию и посмотреть это видео.
    Если у Вас форма поиска, то описывать в конфигурации варианты будет морочительно.
    Это потому, что в строке запроса количество данных может меняться.
    Если количество данных у Вас фиксировано, то можно начать с этого.
    'rules' => [
      // если main у Вас контролер, а search действие
      '' => 'main/index',
     '<_a:(search)>/<request:\w+>' => 'main/search'
    ]

    Эти ссылки тоже помогут Вам.
    https://yiiframework.ru/forum/viewtopic.php?f=19&t...
    https://yiiframework.ru/forum/viewtopic.php?f=19&t...
    https://habr.com/ru/post/308948/
    Ответ написан
    21 комментарий
  • Как сортировать кастомное поле с ActiveDataProvider?

    slo_nik
    @slo_nik Куратор тега Yii
    Вам надо добавить в модель Profile публичное свойство для вывода количества проданных полисов.
    У Вас оно сейчас называется $count.
    Так же есть связь с моделью Policy.
    Значит запрос может выглядеть так:
    $query = Profile::find()
       /* получаем все поля из таблицы профиля и считаем записи в таблице полисов */
       ->select(['{{%profile}}.*', 'count' => 'COUNT({{%policy}}.id)'])
       /* подгружаем "не жадно" необходимые данные через связь getPolicy() */
      ->joinWith('policy', false)
     /* группируем записи по id профиля */
      ->groupBy('{{%profile}}.id')
    /* сортируем по количеству проданных полисов в порядке убывания */
      ->orderBy(['count' => SORT_DESC]);
    
    $dataProvider = new ActiveDataProvider([
       'query' => $query
    ]);
    Ответ написан
    6 комментариев
  • Как стилизовать пункты меню в Menu::widget?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Кроме того, что можно сделать так, как написал @kawabanga(хотя правильней будет использовать encodeLabel) можно попробовать дополнительно настроить виджет используя следующие методы:
    $labelTemplate
    $lastItemCssClass
    $linkTemplate
    $submenuTemplate
    и куча других способов.
    Подробней здесь.
    Ответ написан
    Комментировать
  • Почему возникает ошибка - Unable to link models: the primary key of app\models is null?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброй ночи.
    Думаю, что Вы не до конца поняли работу link();
    Вот документация, а вот цитата из документации.
    Примечание: Невозможно связать два свежесозданных объекта Active Record.

    У Вас, как я понимаю, как раз этот случай.
    Ответ написан
    Комментировать
  • Почему скрипты не записываются в папке assets?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Попробуйте перенести ModalAssets::register($this->getView()); в метод run();
    В ModalAssets, в методе init()
    public function init()
        {
            $this->sourcePath = __DIR__ . '/assets';
            parent::init();
        }

    Структура виджета.
    assets /* js and css */
    view /* view widget */
    ModalWidget.php
    ModalAssets.php

    Первый слеш лишний
    public $js = [
       '/js/modal.js'
    ]
    Ответ написан
  • Как в gridview yii2 вывести вместо иконок glyphicon fontawesome?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Можно конечно же переопределить, как советует Дмитрий Дерепко.
    А можно сделать следующим образом.
    Необходимо настроить вывод кнопок.
    Вот как-то так.
    [
    'class' => 'yii\grid\ActionColumn',
      'buttons' => [
         'update' => function($name, $model, $key){
            return Html::a('<i class="fa fa-plus fa-lg" aria-hidden="true"></i>', ['update']);
          }
       ]
    ]
    Ответ написан
  • Почему yii/helpers/Url::To криво генерирует URL во время тестирования?

    slo_nik
    @slo_nik Куратор тега Yii
    Открываете консоль.
    Вводите команду
    php yii serve
    В результате работы этой команды в консоли должны увидеть что-то подобное.
    Server started on http://localhost:8080/
    Document root is "/home/slonik/localhost/www/test.loc/yii2_test/web"
    Quit the server with CTRL-C or COMMAND-C.

    Переходите в браузере по адресу.
    http://localhost:8080/index-test.php
    В конфигурационных файлах ничего не меняете.
    Получаете страницу без ошибки 404.
    5d2f59996db25518154643.png

    p.s.
    В config/web.php
    'urlManager'   => [
                'enablePrettyUrl' => true,
                'showScriptName'  => false,
                'rules'           => [
                    ''                            => 'site/index',
                    '<_a:(contact|about)>'        => 'site/<_a>',
                    '<_a:(login|logout|sign-up)>' => 'users/<_a>',
                    '<_c:[-\w]+>/<_a:[-\w]+>'     => '<_c>/<_a>',
                    '<_c:[-\w]+>'                 => '<_c>/index',
                    '<_a:(offline)>'              => 'offline/index',
    
                ],
            ],

    В config/test.php
    'urlManager' => [
                'showScriptName' => true,
            ],
    Ответ написан
  • Как работать с Pjax в yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Pjax имеет дело только с тем содержимым, которое располагается между begin() и end().
    Поэтому можно просто добавить нужный div после формы.
    Код формы.
    <?php
       yii\widgets\Pjax::begin(['id' => 'new_note', 'enablePushState' => false]) ?>
            <?= Html::beginForm(['/system/system/fastsearch'], 'post', ['data-pjax' => '1','enctype' => 'multipart/form-data', 'class'=>'form-inline' ]) ?>
            <?= Html::input('text', 'search', "", ['class' => "form-control form-control-sm ml-3 w-75"]) ?>
            <?= Html::submitButton('<i class="glyphicon glyphicon-search"></i>&nbsp;Найти', ['class' => 'btn btn-default', 'id'=>'press_search'])?>
            <?= Html::endForm() ?>
            <div id="reload-pjax"><?= $search ?? null ?></div>
        <?php Pjax::end();
    ?>

    Действие в контролере может быть таким.
    public function actionFastsearch()
    {
        if(Yii::$app->request->isAjax){
            $search = Yii::$app->request->post('search');
            return $this->render('index', ['search' => $search]);
        }
    }

    Или, что по моему мнению лучше, оправлять форму и обрабатывать ответ сервера используя обычный js или jquery.

    P.S.
    Хотя можно использовать и такой вариант. Поле формы должно быть заполнено обязательно.
    <?php
    Pjax::widget([
        'id' => 'reload-pjax',
        'enablePushState' => false, 
        'enableReplaceState' => false, 
        'formSelector' => '#options-form',
        'submitEvent' => 'submit',])
    ?>
    <?= Html::beginForm(['/site/fastsearch'],
                        'post',
                        [
                            'class'=>'form-inline',
                            'id' => 'options-form'
                        ]) ?>
    <?= Html::input('text', 'search', "", ['class' => "form-control form-control-sm ml-3 w-75"]) ?>
    <?= Html::submitButton('<i class="glyphicon glyphicon-search"></i>&nbsp;Найти', ['class' => 'btn btn-default', 'id'=>'press_search'])?>
    <?= Html::endForm() ?>
    <div id="reload-pjax"></div>
    Ответ написан
  • Почему в передаются не все атрибуты при запросах ActiveRecord?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    ActiveRecord работает только с атрибутами модели.
    Используйте, например, yii\db\Connection и получите свой псевдоним в конце массива атрибутов.
    query = Yii::$app->db->createCommand("SELECT *, DATE_FORMAT(".Cars::tableName().".car_created_date,'%m') as mouth From `cars` WHERE `status` = 3 LIMIT 2")->queryAll();
    Ответ написан
    Комментировать
  • Где храняться сессии в файлах?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    А чем Вас не устраивает destroySession()?
    Ответ написан
  • Как задать action в форме поиска с дополнительными GET-параметрами Yii2 Framework?

    slo_nik
    @slo_nik Куратор тега Yii
    Если провожу поиск, то контроллер закономерно ругается, что отсутствуют обязательные параметры: course_id.

    В поисковой модели используете andWhere()?
    Для тех данных, которых может не быть в запросе используйте andFilterWhere(), тогда не будет ругаться на отсутствие данных.
    Зачем в действие передавать параметр, которого может и не быть в запросе?
    Удалите $course_id из обязательного параметра и получайте данные из строки.
    Ответ написан
    Комментировать
  • Существует ли дефолтный пользователь / админ в yii2 advanced?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Можно использовать дополнительные пакеты, а можно, если хотите разобраться как это всё работает, отредактировать модель User...
    Как это сделать можно прочитать здесь, с подробностями. Ну и заглянуть в документацию(раздел "Безопасность").

    p.s. Я бы не стал ставить сторонний пакет.

    p.s.s.
    Есть ли возможно сделать админа без заморочек

    Используйте RBAC.
    Упрощённый вариант.
    Видео о rbac.
    Ответ написан
    Комментировать
  • Почему происходит ошибка при миграции базы данных?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Какой шаблон используете, advanced или base?
    Есть ли ещё какие-то конфиги?
    Во время миграции можете явно указать, в какую базу делать миграции.
    В конфигурационном файле
    'db' => [
       'class' => 'yii\db\Connection',
       'dsn' => 'mysql:host=localhost;dbname=fedorov_shop',
       'username' => 'fedorov_shop',
       'password' => '***',
       'charset' => 'utf8',
       'enableSchemaCache' => true,
       'schemaCacheDuration' => 3600,
    ]

    В командной строке.
    php yii migrate --db=db
    Так же можно в самой миграции указать, с какой базой работать.
    public function init()
        {
            $this->db = 'db2';
            parent::init();
        }
    Ответ написан
    Комментировать
  • Как подключить bootstrap только в модуле?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброй ночи.
    В файле модуля, в методе init()
    public function init()
         {
             parent::init();
             Yii::$app->view->setAssetManager(new AssetManager());
         }
    Ответ написан
    1 комментарий
  • Почему не выводит название категории в yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Связь у Вас называется "ArticleCategory", так же есть атрибут, который называется "article_category"
    Соответственно $model->atricle_category выводит id, а если обратиться к связи, то будет Вам название категории
    echo $model->articleCategory->title;
    Ответ написан
    Комментировать
  • Подключение класса из vendor в Yii2 - Class not found?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    1)Какое отношение Ваш вопрос имеет к "github"
    2) Вы делали обновление автозагрузчика после того, как сделали запись в composer.json? Если нет - сделайте composer dump-autoload
    3) Или возьмите с packagist.com пакет, установите через composer и не мучайтесь.
    Ответ написан
    22 комментария
  • Что нужно прописать чтоб был правильный URL для frontend и backend в yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Можно сделать так:
    В common/config/main.php
    $baseUrlFrontend = str_replace('backend/web', '', (new Request)->getBaseUrl());
    
    return [
        'components' => [
            'cache'              => [
                'class' => 'yii\caching\FileCache',
            ],
            'urlManagerFrontend' => [
                'class'           => 'yii\web\UrlManager',
                'baseUrl'         => $baseUrlFrontend,
                'enablePrettyUrl' => true,
                'showScriptName'  => false,
            ]
        ]
    ]

    Изображения хранятся в frontend/web/images. В backend получаете их так:
    $img =  (Yii::$app->urlManagerFrontend->createUrl( $model->images[0]['path'] . DIRECTORY_SEPARATOR . $model->images[0]['title']));
    echo Html::img($img);

    В frontend получаете обычным способом.
    echo Html::img('@web/' . $model->images[0]['path'] . DIRECTORY_SEPARATOR . $model->images[0]['title']);


    p.s. У меня на одну запись может быть несколько изображений, поэтому использую связь "images" и вывожу первое изображение из массива с индексом "0".

    p.s.s. urlManagerFrontend расположил в common потому, что не только в backend использую его. Вы попробуйте расположить в backend/config/main.php
    Ответ написан
    Комментировать