Есть самописанный проект на php (MVC), существует проблема, на сайте есть одинаковые блоки например (рейтинги, комментарии или форма для комментариев)
Блоки могут вытаскиваться в разных частях сайта, причем могут быть вставлены в любой части страницы.
Соответственно подготавливать данные в каждом методе для этих блоков не хочется,сейчас просто из view дергается метод какого то контроллера что не очень удобно. приходиться прыгать из контроллера в контроллер чтобы исправить что то в блоке. Хотелось бы управляемости из одного места где то может во Front контроллере все подгружать, но опять же грузить не все а только по требованию от нужного роутера, потому что лишние запросы к базе не нужны если блок не используется.
Нужен класс виджета. Если еще нет, сделайте нечто вроде
class Widget{
public function getHtml(){
}
}
class MyWidget extends Widget{
public function __construct($options){
}
public function getHtml(){
}
}
$w = new MyWidget([/*options*/]);
echo $w->getHtml();
Да часть проблем он решит , но в виджет придется передавать массив, данных выбранных из БД, и для него придется делать одинаковые запросы в методах и передавать их во view. А если их 5 -10 на странице используется. В каждом методе придется писать одни и те де выборки.
зачем? в конструкторе или отдельном методе init() сделайте выборки. опции в конструктор - чисто для настроек типа сколько рядов, в каком виде какого цвета ит.п. зависит от фантазии и требований.
Ну если так то можно, единственно получается какой то сферический виджет который умеет читать базу, насколько мне помниться та же концепция виждетов в Yii этого не подразумевает.
itcoder: ИМХО, виджет для полноценного функционирования должен выполнять функции контроллера, который отличается от обычных своей самодостаточностью, тем, что не обязательно привязан к конкретному адресу (хотя и может иметь свой - для редактирования/настроек, к примеру), и может быть подключен засчет этого в любом месте.
Понятия не имею что в других фреймворках понимают под виджетом, можете назвать такой контроллер по-другому, если это вызывает у вас непонимание.
В моем фреймворке, к примеру, иерархическая структура контроллеров (HMVC), куда виджеты-миниконтроллеры вписываются по определению. Если вам мешают рамки вашего фреймворка, решать вам - либо расширить эти рамки, либо упорно пытаться в них втиснуться.
olamedia .: Спасибо, за ответ. Скажите как вы в (HMVC) решаете проблему рода, когда нужно во фронтовой вьюхе, на одной странице показывать один блок, а на другой в этом самом месте рендерить другой, какой то стек есть ? где в методе контроллера указываются какие блоки в данный момент нужно рендерить или как то гибче обходите?
itcoder: не понял вопроса. разные страницы - это разные методы же? или в том же методе? чем if/else не устраивает? по каким критериям выбирается какой где блок?
на ваши вопросы больше вопросов, чем ответов ) переформулируйте что-ли...
у меня контроллеры передают друг другу по цепочке параметры, начиная с корневого, отвечающего за корень (обычно "/") сайта, дополняя по ходу необходимыми для следующего.
olamedia .: Наверное не очень понятно написал попробую более доступно.
Вот пример есть главный шаблон в нем центральная и правая колонка.
- В правой части дергается необходимый метод контроллера, который показывает рейтинг пользователя.
- В центральную часть рендериться весь контент из контроллеров
- Переходим на другую страницу, например профиля пользователя и вместо блока рейтинга в правой колонке нужно загрузить коментарии а на другой старнице еще что то.
Соответственно правой частью мы управлять не можем из view контроллера, так как она находиться в главном шаблоне.
if/else в правом блоке может быть слишком много, придется все время смотреть url страницы
itcoder: если правая колонка меняется, ее не должно быть в главном шаблоне. лучше пусть из кусков собирается на каждой странице. либо в правой колонке воткнуть плейсхолдер типа {right_content}, который собирать в другой вьюшке.