@FrelFrloich

Yii2 Виджеты и база данных?

Доброго времени суток, я совсем юн и зелен в php и в yii в частности, меня интересует вопрос, правильно ли в виджете подключаться к таблице бд. Если не правильно прошу по возможности объяснить как правильно вывести данные в виджет.
Для наглядности, вот таким образом, в этом меню будут картинки которые я бы хотел заменять по своей надобности, других способов я не знаю как из базы тянуть картинки в меню(допустим на тот же бг) и в последствии их менять как душе угодно.
$menu = Imagemenumain::find()->all();
                         
        return $this->render
        ('myimagemenu',
            ['menuimg' => $menu]
        );     
  }


myimagemenu это view виджета где html. Буду очень благодарен если укажите на какую либо статью с этой темой, и как действовать в правильном ключе(собственные тщетные поиски так и не привели ни к чему, в том числе и в офф документации к yii, а знаний маловато для самостоятельного решения вопроса).
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Тут наверное любой ответ будет спорным, но я думаю лучше поступать так:
в конфиге (или в базовом контролере) цепляемся за событие beforeAction:
'on beforeAction' => function($event){
      Yii::$app->params['menuData'] = ArrayHelper::map(Imagemenumain::find()->all(),'id','title');
      //ArrayHelper тут для примера, хотел обозначить, что не стоит засовывать в params более чем нужно виджету. Там должен оказаться подготовленный массив с нужными данными
    },

в views/layout/main.php юзаем виджет
echo SomeMyWidget::widget([
  'someWidgetParam' => Yii::$app->params['menuData'],
  'someWidgetParam2' => 'маракуя',
  'otmetitOtvetom' => true
]);

Виджет не должен знать о базе данных. Завтра сменится структура базы, а виджет продолжит работать. Так как он получает определенный массив данных. И при смене структуры БД вы просто смените метод формирования нужного массива, что бы передать в виджет. По той же причине его можно будет переиспользовать в других проектах.
ПыСы: Формирование массива вместе с запросом в базу наверное имеет смысл закешировать.
Ответ написан
Комментировать
usdglander
@usdglander
Yipee-ki-yay
Фактически виджет - изолированный код, который должен сформировать html. То есть это часть вида. А в самом виде доступ к данным осуществляться не должен. Все данные, которые нужны для отображения должны передаваться из вне.
Ответ написан
Ваш ответ на вопрос

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

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