В общем смотрите. Есть 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;
Т.е. прямо варварски вписываем переменную в экшен параметры. Вариант второй - хранить где-то глобальную переменную. Сессии конечно можно, но тоже кажись не очень вариант. Есть еще идеи?