@AlikDex

Глобальная переменная в yii2?

В общем смотрите. Есть layout, типа main. Стандартный такой. С колонкой категории. Эти категории выводятся виджетом. Могоуровневые. В каждой категории есть список товаров. Суть в чем. Заходим мы на сайт, и получаем список товаров каких-то, они не устраивают конечно же, идем в категорию искать нужный. Вот. В это время обработку шараханий по категориям осуществляет контроллер CategoryController.php, например. Также есть правило для роутинга:
'<category:\w+>' => 'category/index',
Итак, зашли мы значит в категорию какую-то, котроллер вызвался, экшен вызвался, входящий параметр конечно же получился:
public function actionIndex($category = null)
{
    //....
}

В это время, виджет получает свою переменную, полученную из параметра экшена:
echo \frontend\widgets\Categories::widget([
    'category' => isset(Yii::$app->controller->actionParams['category']) ? Yii::$app->controller->actionParams['category'] : null,
]);

Все отлично, замечательно, работает!

Подбираемся к вопросу. =)
Как мы помним, у нас еще остались товары, у которых есть своя категория! Итак. Шарились мы шарились, нашли нужный нам товар в категории iphone например. Зашли на страницу, и вот тут у нас проблема. Категории для виджета из урла больше не получить, но она есть в товаре. Как передать эту категорию в виджет? Чтобы у товара высветилась активная категория. Решение в лоб:
Yii::$app->controller->actionParams['category'] = $model->category->slug;

Т.е. прямо варварски вписываем переменную в экшен параметры. Вариант второй - хранить где-то глобальную переменную. Сессии конечно можно, но тоже кажись не очень вариант. Есть еще идеи?
  • Вопрос задан
  • 1682 просмотра
Решения вопроса 1
bitver
@bitver
В контроллере:
$this->view->params
Прям во вьюшке:
$this->params

Посмотрите как работают стандартные хлебные крошки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@springimport
Можно сделать сервис которым будет управлять контроллер. В нормальном случае будет задавать параметр с url, в других - по-другому.
Так же можно использовать сессию.

P.S. Или пишите на английском, или не делайте ошибок.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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