Доброго времени суток! Начал изучать Yii и возникла проблема, на всех страницах нужно выводить имя авторизованного юзера. Это нужно как-то вытащить из бд и вставить в layouts/main.php, но я не понимаю, как это сделать.
Сколько не гуглил, везде описано только, как передать данные из контролера и понеслась, но не ужели я буду сидеть и передавать из каждого контролера, я не верю, что так сложно.
Что касается конкретно авторизованного юзера, то его данные можно на этапе логина сохранять, а потом извлекать через getState (см документацию про авторизацию и аутентификацию) прямо в лейауте. <?= Yii::app()->user->… ?>
Теперь про передачу общесайтовых данных вообще. Вариантов несколько:
Использовать виджеты. Виджет - это такой мини-контроллер, со своей логикой и представлением. Допустим, меню таким образом удобно делать.
Отнаследоваться от некоего промежуточного контроллера, в котором создать переменную для хранения. Заполнять ее в каком-нибудь хуке, beforeRender, например. Примерно так сделан вывод $title в лейауте.
Виджеты тоже использовать как-то грамоздко получается… Получается, что для каждого вывода создавать новый файлик, чтобы записать туда одну строчку в несколько символов
Неужели нельзя как-нибудь так:
<span><?php echo $username; ?></span>
а в самом начале лейату построить нужные запросы к бд и поместить все в нужные переменные
Ну, я не уверен, но к Yii вроде можно прикрутить twig и smarty, и из их шаблонов уже до модели не достучаться.
Прошу прощения, если ошибаюсь, я никогда не пытался отойти от дефолтного php-шного движка.
Я из контроллера передаю массив. Тут ведь вот какая штука: для создания выпадающих списков AR-то не нужен, поэтому круто было бы не просто findAll() сделать, а, к примеру, выгрести только два поля (id, name) - ну, чтобы лишние данные не гонять туда-сюда. В идеале - еще и в объект не маппить, а сразу массивом. Поэтому результирующий код может быть несколько громоздким, и его наличие внутри селекта будет сильно давить на мозг.
Вот в Yii2, кстати, есть офигенная штука - asArray(). Устанавливает флажок, выключающий маппинг в объект.
На правах оффтопа… Я считаю, что большая часть методов ActiveRecord нужна только для использования внутри класса модели. К ним относятся все find*, кроме find() и findAll(), причём передавать извне критерий в качестве аргумента тоже не следует. Вот тогда будет настоящий MVC
Т.е. если нам где-то нужны модели с условием "active = 1", то правильней делать scope либо findActive(). Хотя удобство AR именно в том, что и логика модели, и методы для доступа к БД собраны вместе (и в то же время недостаток).