Ответы пользователя по тегу Yii
  • Как привиль слить массивы ArrayHelper?

    slo_nik
    @slo_nik Куратор тега Yii
    есть другие предложения ?

    Читать документацию, сказал сначала себе и теперь это повторяю Вам))))
    $form->field($model, 'test')->dropDownList(ArrayHelper::map(User::find()->asArray()->all(), 'id', function($models){
           return $models['firstName'] . ' - ' . $models['lastName'];
       }
     )
    )
    Ответ написан
    Комментировать
  • Как задать value для prompt dropdownlist в Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Вы уже задали options и если хотите задать атрибут data-*, то это делается так
    [
       'prompt' => 'Select',
       'data' => [
          'text' => 'Text',
          'image' => 'Image'
       ]
    ]

    или чуть проще
    [
      'prompt' => 'Select',
      'data-text' => 'Text',
      'data-image' => 'Image'
    ]

    Ну а для prompt можно использовать массив
    'prompt' => [
        'text' => 'Select',
        'options' => [
            'value' => 'prompt',
            'class' => 'prompt-class',
            'selected' => 'selected'
        ]
    ]


    В документации всё расписано
    Ответ написан
    1 комментарий
  • Можно ли сделать якорь при redirect в PHP?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Приблизительно так
    return $this->redirect(['index',  '#' => 'custom-order-form']);

    Переведёт на страницу index, к <div id="custom-order-form">

    P.S.
    Для строки задаём параметр id, в котором будет содержаться id записи в базе. Пусть это будет столбец "id" в таблице GridView, хотя так параметр можно задать для любой ячейки.
    [
        'attribute' => 'id',
        'headerOptions' => ['class' => 'head-id-column'],
        'contentOptions' => function($model){
               return ['id' => 'test-' . $model->id];
            }
    ],

    Далее, в контроллере прописываем redirect с нужным параметром.
    return $this->redirect(['index', '#' => 'test-' . $id]);

    Всё, "якорь" готов.

    P.S.S
    Или. Не делать 'contentOptions', а сделать 'rowOptions'.
    GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $searchModel,
            'rowOptions' => function($model){
                return ['id' => 'test-' . $model->id];
            },
            'columns' => [
                // остальной код
             ],
        ]);
    Ответ написан
    4 комментария
  • Как правильно сделать статистику?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Попробуйте так
    ->where(['between', 'date', date('Y-m-d', strtotime("2018-01-01")), date('Y-m-d', strtotime("2019-01-01")) ])

    А лучше хранить дату в timestamp, тогда не будет подобных проблем.
    Так же в input можно выводить дату в нужном формате. Даже нужно настроить разделитель даты.
    Из документации по strtorime()
    Замечание:

    Даты в формате m/d/y или d-m-y разрешают неоднозначность с помощью анализа разделителей их элементов: если разделителем является слеш (/), то дата интерпретируется в американском формате m/d/y, если же разделителем является дефис (-) или точка (.), то подразумевается использование европейского формата d-m-y.

    Чтобы избежать потенциальной неоднозначности, рекомендуется использовать даты в формате стандарта ISO 8601 (YYYY-MM-DD), либо пользоваться функцией DateTime::createFromFormat() там, где это возможно.
    Ответ написан
  • Как поставить заглушку на метод со связаной моделю?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Попробуйте так
    $sessionResourceOption->resourceOptions->seatsCount;

    Хотя...
    Покажите метод getSeatsCount() и напишите, что он выполняет.
    Возможно правильней будет его сделать static и вызывать следующим способом с передачей параметра
    ResourceOptions::getSeatsCount($param)
    Ответ написан
  • Как организовать разные комментарии на каждой странице, YII2?

    slo_nik
    @slo_nik Куратор тега Yii
    Допустим есть две таблицы. В первой хранятся статьи, во второй комментарии для каждой статьи.
    В таблице комментариев есть поле id_article, в котором хранится id статьи.
    Вам надо вывести отдельную статью и комментарии, которые принадлежат этой статье.
    Ссылка для просмотра статьи может выглядеть так:
    echo Html::a('Title article', ['view', 'id' => $id]);

    В контроллере есть действие view, для вывода отдельной статьи:
    public function actionView($id)
    {
        $comment = new Comments();
        $article = $this->findArticle($id);
        $query = Comments::find()->where('id_article=:id', [':id' => $id]);
        $dataProvider = new ActiveDataProvider([
            $query = $query
         ]);
    
         return $this->render('view', ['article' => $article, 'dataProvider' => $dataProvider, 'comment' => $comment])
    }
    public function findArticle($id)
    {
       if(($model = Article::find()->where('id=:id', [':id' => $id])->one()) !== null){
            return $model;
       }
       else{
          throw new NotFoundHttpException();
       }
    }

    В представлении:
    echo $article->title;
    // вывод комментариев
            echo ListView::widget([
                'dataProvider' => $dataProvider,
               'itemView' => 'path_to_view'
            ])

    В форме подачи комментария скрытое поле для id статьи:
    $form->field($comment, 'id_article')->hiddenInput(['value' => $article->id])

    Вот как-то так.
    Всё!

    p.s. На ошибки не проверял. Написал всё на скорую руку.

    p.s.s.
    Пример модели комментариев с минимальным набором полей. Namespace укажите свой
    Comments
    <?php
    
    namespace app\modules\comments\models;
    
    use Yii;
    use yii\behaviors\TimestampBehavior;
    use yii\db\ActiveRecord;
    
    /**
     * This is the model class for table "{{%comments}}".
     *
     * @property int $id
     * @property string $body
     * @property int $id_article
     * @property int $created_at
     * @property int $update_at
     * @property int $status
     */
    class Comments extends ActiveRecord
    {
        /**
         * @inheritdoc
         */
        public static function tableName()
        {
            return '{{%comments}}';
        }
    
        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [['body', 'status', 'id_article'], 'required'],
                [['id_article', 'created_at', 'update_at', 'status'], 'integer'],
                [['body'], 'string', 'max' => 300],
            ];
        }
    
        /**
         * @inheritdoc
         */
        public function attributeLabels()
        {
            return [
                'id' => Yii::t('app', 'ID'),
                'body' => Yii::t('app', 'Body'),
                'id_article' => Yii::t('app', 'Article ID'),
                'created_at' => Yii::t('app', 'Created At'),
                'update_at' => Yii::t('app', 'Update At'),
                'status' => Yii::t('app', 'Status'),
            ];
        }
    
        public function behaviors()
        {
            return TimestampBehavior::class;
        }
    }



    p.s.s.s.
    Начнём сначала. Без foreach, pjax, вообще, без всяких лишних деталей.
    Comments
    <?php
    
    namespace app\modules\comments\models; // укажите свой namespace
    
    use Yii;
    use yii\behaviors\TimestampBehavior;
    use yii\db\ActiveRecord;
    
    /**
     * This is the model class for table "{{%comments}}".
     *
     * @property int $id
     * @property string $body
     * @property int $id_article
     * @property int $created_at
     * @property int $update_at
     * @property int $status
     */
    class Comments extends ActiveRecord
    {
        /**
         * @inheritdoc
         */
        public static function tableName()
        {
            return '{{%comments}}';
        }
    
        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [['body', 'status', 'id_article'], 'required'],
                [['id_article', 'created_at', 'update_at', 'status'], 'integer'],
                [['body'], 'string', 'max' => 300],
            ];
        }
    
        /**
         * @inheritdoc
         */
        public function attributeLabels()
        {
            return [
                'id' => Yii::t('app', 'ID'),
                'body' => Yii::t('app', 'Body'),
                'id_article' => Yii::t('app', 'Article ID'),
                'created_at' => Yii::t('app', 'Created At'),
                'update_at' => Yii::t('app', 'Update At'),
                'status' => Yii::t('app', 'Status'),
            ];
        }
    
        public function behaviors()
        {
            return TimestampBehavior::class;
        }
    }

    Действие в контроллере
    public function actionView($id)
    {
        $comment = new Comments();
        
        $query = Comments::find()->where('id_article=:id', [':id' => $id]);
    
        $article = $this->findArticle($id);
    
        $dataProvider = new ActiveDataProvider([
            'query' => $query
        ]);  
    
        render $this->render('view', ['comment' => $comment, 'dataProvider' => $dataProvider, 'article' => $article);
    }
    
    public function findArticle($id)
    {
       if(($model = Blog::find()->where('id=:id', [':id' => $id])->one()) !== null){
            return $model;
       }
       else{
          throw new NotFoundHttpException();
       }
    
    }



    В представлении view, выводим заголовок одной новости, комментарии к этой новости и форму для комментариев.

    view.php
    <?php
    // через use подключаете необходимые классы, виджеты и тому подобное
    
    // выводим заголовок новости.
    echo $article->title;
    
    // выводим комментарии
    echo ListView::widget([
      'dataProvider' => $dataProvider
      'itemView' => '_view_comment' // содержимое файла будет ниже.
    ])
    
    // выводим форму для комментариев
    $form = ActiveForm::begin([
       'action' => 'путь_к_действию_создания_комментария'
    ])
    echo $form->field($comment, 'body')->textInput(['placeholder' => 'Текст комментария')->label(false)
    echo Html::submitButton('Отправить')
    ActiveForm::end();
    ?>



    Файл _view_comment.php для виджета ListView();. Положить рядом с файлом view.php
    <div>
     <?= $model->body; ?>
    </div>

    Кстати, модель Blog у Вас подозрительная. Вы полностью её код показали?
    Всё.
    Ответ написан
  • Как отобразить количество комментариев одного поста при этом еще выводить кто оставил?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Связи к комментариям должны быть hasMany(), у Вас, скорей всего hasOne().
    Дополните свой вопрос связями, а там видно будет.
    Ответ написан
  • Как передать данные на страницу main.php(frontend/views/layouts)?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    В контроллере
    public $main_layout;
    
    public actionIndex()
    {
       $this->main_layout = 'TESTING';
    }

    В main.php
    echo $this->context->main_layout;
    Ответ написан
  • Как в Yii2 передать url в виде параметра?

    slo_nik
    @slo_nik Куратор тега Yii
    Ответ написан
    Комментировать
  • Как загрузить файл на сервер. Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    У Вас в модели Book всё свалено в кучу. И данные автора и данные об изображении.
    Не надо ничего выдумывать. Возьмите статью из документации и сделайте отдельную модель для загрузки файла.
    И когда она у Вас заработает, то тогда будет думать, как совмещать её с другими моделями.
    Это во-первых.
    Во-вторых, что именно у Вас не получается? Какие ошибки, предупреждения в debug панели и консоли браузера?
    Вы уверены, что путь
    dirname(dirname(dirname(__DIR__))) . '/public_html/uploads/books/'
    верен?
    Проверьте, что покажет Вам
    echo dirname(dirname(dirname(__DIR__))) . '/public_html/uploads/books/'
    , куда он Вас ведёт?
    Ответ написан
    1 комментарий
  • Как отобразить часть контента используя Pjax yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    У Вас есть выпадающий список
    <select name="spjax" id="spjax">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
    </select>

    Где-то в другом месте страницы есть блок, который надо обновить. При обновлении к заголовку необходимо добавить значение переменной $Ipjax. Оборачиваем этот блок Pjax и добавляем пользовательский js.
    <?php
       Pjax::begin([
           'id' => 'view-mode-pjax'
       ])
    ?>
    <div class="col-lg-4">
        <h2>Heading <?= $Ipjax ?></h2>
    
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
            dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
            ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
            fugiat nulla pariatur.</p>
    
        <p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
    </div>
    <?php
      Pjax::end();
    $this->registerJs("
    $(function(){
      $('#spjax').on('change', function(){
        var Id = $(this).val()
        console.log(Id)
        $.pjax.reload({
            container: \"#view-mode-pjax\", // контейнер, в котором надо обновить данные.
            url: window.location.href,
            timeout: 0,
            data: {
               'id': Id // данные, которые отправляются на сервер.
            },
        });
      })  
    })    
    ", View::POS_END)
    ?>

    А в контроллере, в действии, которое подключает данный вид передаёте нужную переменную.
    public function actionIndex()
    {
        $Ipjax = Yii::$app->request->get('id') ?: null;
        return $this->render('index', ['Ipjax' => $Ipjax]);
    }

    Отлавливаете изменение выпадающего списка и запускаете pjax. Идёт запрос на сервер, проверяется переменная и возвращается всё тот же вид, но уже с переменной.
    И Pjax, ушлый зверёк, обновит не всю страницу, а только тот блок, который Вы укажите.

    p.s. Пример сделан на yii2-basic, в файле views/index и в DefaultController.
    Ответ написан
  • Yii2 данные из связной таблицы?

    slo_nik
    @slo_nik Куратор тега Yii
    Ответ написан
    Комментировать
  • В чем ошибка настройки дебага Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброй ночи.
    Для начала попробуйте в конфигурационном файле указать параметр allowedIPS для модуля debug
    В значение параметра передайте свой ip, с которого Вы заходите на хостинг.
    Узнать его можно на 2ip.ru
    if (YII_ENV_DEV) {
        // configuration adjustments for 'dev' environment
        $config['bootstrap'][] = 'debug';
        $config['modules']['debug'] = [
            'class' => 'yii\debug\Module',
            'allowedIPs' => ['тут_ваш_ip']
        ];
    }

    И конечно должен быть выставлен режим разработчика.
    Ответ написан
  • Как сделать ajax пагинацию страницы?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Как я понял Вам надо сделать бесконечную подгрузку контента на страницу.
    Вот статья, написана для yii1, но, я уверен, Вы сможете переделать под yii2.
    По крайней мере поймёте принцип.
    Ответ написан
    Комментировать
  • Как сконфигурировать редирект на еще одну часть advanced-приложения Yii2 в nginx?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Возможно у Вас проблема в правиле.
    Пример из .htaccess, но может он натолкнёт Вас на правильное решение
    ^api(/.*)?$ api/web/$1 [L]
    Соответственно Вам надо будет ещё изменить пути к файлам конфигурации и vendor в api/web/index.php
    Ответ написан
    Комментировать
  • Pjax, как переключить view для данных?

    slo_nik
    @slo_nik Автор вопроса, куратор тега Yii
    Зря всех беспокоил, проблема решилась.
    При клике на ссылку отправляется ajax запрос на действие, где устанавливаются cookie, и потом в success перегружается нужный блок при помощи PJAX.
    $('a.vmpjax').click(function (e) {
            e.preventDefault();
    
            $(this).addClass('active').closest('li').siblings().find('a').removeClass('active');
    
            var viewMode = $(this).attr('data-view-mode');
            var url = $(this).attr('href');
                $.ajax({
                    type: "GET",
                    url: url,
                    data: {
                        'id': viewMode
                    },
                    success: function (data) {
                        $.pjax.reload({container: "#view-mode-pjax", url: window.location.href, timeout: 0 });
                    }
                });
        });

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

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Первый .htaccess, который в корне сайта, можно проще сделать.
    <IfModule mod_rewrite.c>
      Options +FollowSymlinks
      RewriteEngine on
    </IfModule>
    
    <IfModule mod_rewrite.c>
       RewriteCond %{REQUEST_URI} ^/.*
       RewriteRule ^(.*)$ web/$1 [L]
    
       RewriteCond %{REQUEST_URI} !^/web/
       RewriteCond %{REQUEST_FILENAME} !-f [OR]
       RewriteCond %{REQUEST_FILENAME} !-d
       RewriteRule ^.*$ web/index.php
    
    </IfModule>

    В web оставить .htaccess по умолчанию.
    Если проект находится в поддиректории сервера, то в конфигурации указать такой параметр
    $baseUrl = str_replace('/web', '', (new Request)->getBaseUrl());
    return [
    // параметры конфигурации
    'request' => [
       'baseUrl' => $baseUrl,
    ],
    // другие параметры конфигурации
    ]
    Ответ написан
    Комментировать
  • Как организовать смену select в верхнем меню Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Можно форму, можно через js отлавливать значение option и отправлять ajax на сервер.
    На сервере проверять права доступа к специальности и возвращать результат.
    Ответ написан
    5 комментариев
  • Layout из базы данных в yii2?

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

    Молчат как изменять layout? А может Вы просто не разобрались с документацией?
    Если это модуль, то можно прописать в конфигурации, какой layout для какого модуля использовать.
    Можно для каждого контроллера задавать отдельный layout
    $this->layout = 'my_layout';
    и view, которые хранятся в базе данных а не файлами

    Вы храните html в базе?
    Есть встроенный шаблонизатор twig.
    Ответ написан
  • Как обработать две модели в одной форме?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Для начала сохраните модель Products, сформируйте имя для нового файла и передайте это имя в модель UploadForm.
    Имя файла создайте в beforeSave();
    Так же используйте транзакцию. Если файл не загрузится - откатите транзакцию.
    Получается, что Вам надо сохранить одну модель.
    Ответ написан
    Комментировать