slo_nik
@slo_nik

Как передать модель в пользовательский виджет yii2?

Добрый день.
Нужно вывести данные из нескольких моделей на главную страницу, в footer.
Виджет написал, но возник вопрос, как теперь динамически передавать модель в класс виджета?
Сейчас выгладит это так:
// вызов виджета на главной
<?= MainWidget::widget(['limit' => 7]); ?>

// класс виджета
class MainWidget extends Widget
{
    public $limit; // LIMIT на количество записей из базы
    public $data; // Сюда надо передать модель

    public function init()
    {
        if($this->limit == null){
            $this->limit = 5;
        }
        parent::init();
    }

    public function run()
    {
      
       $listGlobe = Countries::find()->where(['status' => Countries::STATUS_ACTIVE])->limit($this->limit)->all();

       return $this->render('index', ['listGlobe' => $this->data]);
    }
}


Не могу понять, как в public $data передать модель из вне, чтобы не писать для каждой модели
<?php
$listGlobe = NameModel::find()->where(['status' => Countries::STATUS_ACTIVE])->limit($this->limit)->all();
?>

а в вызове виджета указать
<?php
GlobeWidget::widget(['data' => NameModel]);
?>
  • Вопрос задан
  • 1008 просмотров
Решения вопроса 2
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Например так:
<?php
$model = MyModel::find()->all();
echo MainWidget::widget(['limit' => 7, 'data'=>$model]); ?>

Можно конечно и имя класса передавать в модель, но это не правильно:
<?php
echo MainWidget::widget(['limit' => 7, 'data'=>MyModel::classname]); ?>

В идеале модель должна возникать в контроллере и передаваться в view, где дальше передаваться в виджет. Или в виджет должны попадать не сама модель, а определенные данные. Возможно Вам надо написать свой dataProvider. посмотрите на примере activedataprovider www.yiiframework.com/doc-2.0/guide-output-data-pro...
Ответ написан
zetamen
@zetamen
В поисках нового
Используйте виджеты для логики вывода, а не для получения данных. Данные получаются в контроллере.
В вашем виджете совсем нет логики, поэтому можно напрямую передавать данные во view виджета.

Чтобы не создавать каждый раз однотипный запрос, можно кастомизировать ActiveQuery и сделать что-то вида
Countries::find()->findActiveAll($limit);
Towns::find()->findActiveAll($limit);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы