Стратегия блоков?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
MpaK
Сообщения: 10
Зарегистрирован: 2011.09.30, 08:01

Стратегия блоков?

Сообщение MpaK »

Еще раз здравствуйте все.

Так как с предыдущим топиком понимаю, что видимо захожу не с той стороны.
Потому решил создать еще одну отдельную тему в которой хотелось бы узнать ваши стратегии создания Блочно-Модульных сайтов, CMS например или Блог сайтов.

Что такое блоки?
В моём понимании (когда писал на CodeIgniter) - блок, это модуль со своим фронт контроллером, возвращающий результат своей работы (работа контроллера, модели, отображения).
Например:
- модуль фотоальбом PhotoAlbum, у него внутри есть контроллер FrontController и метод actionAlbums (показывает все альбомы), actionShow (показывает выбранный альбом)
- модуль Blog, внутри него два контроллера AdminController и FrontController, первый за админку (пока оставим его), второй имеет два метода actionPosts (показывает ленту постов), actionShow (показывает уже развернутый пост)

модули лежат в папке protected/modules/*

И вот есть например наше приложение SiteControll, которое на роутинг /blog/show/12 отвечает:
- достаёт из базы список связанных с этим адресом модулей, например у нас получается нужно на странице показать развернутое сообщение из блога и фотоальбом
- подключаем эти два модуля Blog, Photoalbum (!!!) и вызываем их методы из FrontController'а показать 12ый пост из модуля Blog/FrontController/actionShow/12 и точно такой же фотоальбом Photoalbum/FrontController/actionShow/12
- результаты складируем в переменные для шаблона и показываем нужный шаблон

Код: Выделить всё

$this->render( $blog_show_tpl, array( 'blog_front_show' => $blog_front_show_result,  'photoalbum_front_show' => $photoalbum_front_show_result) ); // понятно что названия здесь просто для удобства, а на деле будут динамеческие переменные блоки 
- в нашем уже layout файле название которого было в $blog_show_tpl у нас есть например просто отображение уже переменных
<?= $blog_front_show ?>
<hr/>
<?= $photoalbum_front_show ?>

Блоки именно динамические, которые можно было бы легко убрать с одной страницы контроллера и подключить в другом а-ля SiteController

Это моя стратегия блоков.

Расскажите может о своей, более принятой в YII среде и удобной для программирования, развития, расширения и главное удобной?

Заранее спасибо
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Стратегия блоков?

Сообщение greatdane »

Есть же виджеты, зачем модули городить? Я использую модули, когда нужно «приложение в приложении» — с отличающимся layout'ом и функционалом. Админка, например.
MpaK
Сообщения: 10
Зарегистрирован: 2011.09.30, 08:01

Re: Стратегия блоков?

Сообщение MpaK »

Ну у тех же блоков есть не только вывод же, есть и админка, она в другом контроллере лежит. Потому получается именно отличающиеся приложения в приложении.

Еще одна вещь по виджетам, что их надо в layout'е прописывать, то есть получается активный шаблон, который сам решает, что ему показать в левой колонке, а что в правой. В случае с блоками в какие переменные шаблона и что загрузить решает основной Контроллер. Этот огород позволяет например прямо в админке рассортировать нужные блоки по колонкам дизайна, удалить, вставить и т.п.
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Стратегия блоков?

Сообщение greatdane »

Во-первых, можно сделать layout в layout'е (в генерируемом приложении так и сделано, и это очень удобно). Во-вторых, виджеты можно вызывать во вьюшках. В-третьих, в layout'e можно собрать все возможные виджеты, а уже внутри самих виджетов проверять контроллер и action и определять, должен ли показываться виджет. Также в зависимости от текущего контроллера и action'а могут изменяться переменные в виджете. У меня так сделано, к примеру, дополнительное меню — для каждого контроллера показывается свое меню.
Вот хорошая статья про виджеты.

А запихивать всю логику в один основной контроллер — ИМХО, подойдет только для мелких проектов. Иначе тяжеловесненько получится.
MpaK
Сообщения: 10
Зарегистрирован: 2011.09.30, 08:01

Re: Стратегия блоков?

Сообщение MpaK »

Основная цель не собирать в один контролер. Внутри одного модуля напротив делится всё на разные конроллеры, FrontController отвечает за визуализацию для клиента.

Например Photoalbum/Controllers/FrontController.php actionShow будет доставать альбом, рендерить своей View и отдавать уже в основной Контроллер, тот уже в Layout результат вернёт, но тот же Photoalbum/Controllers/AdminController.php actionForm будет например форму создания альбома отдавать в основной контроллер админки.

Это гибко, получается напримере CMS на странице есть 2-3 блока, у которых свои разные формы, разные действия внутри них и они сами знают, что нужно показать и как показать. Основная задача Основного Контроллера, просто достать названия блоков (МОДУЛЕЙ) связанных с текущей страницей, вызвать их КОНТРОЛЛЕРЫ с определенным ЭКШЕНОМ.

Это не такая большая логика, роутинг, обработка модулей, выдача результата в layout'е. Тем более это даёт возможность центрально обрабатывать права на доступ к страницам.
MpaK
Сообщения: 10
Зарегистрирован: 2011.09.30, 08:01

Re: Стратегия блоков?

Сообщение MpaK »

По виджетам я понял, что вы имели в виду, это некая замена Helpers из CI и RoR, но эта замена не включает логику подключения и администрирования этого самого блока. А хотелось бы видеть всё внутри модуля.
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: Стратегия блоков?

Сообщение because »

как-то странно это - вызывать контроллеры из других контроллеров, чтобы получать данные. в моем понимании в контроллере должно обрабатываться какое-то действие пользователя, а работа с данными должна организовывать в другом месте, в модели или компоненте. а блоки это виджеты, которым скармливаются данные и они выводят их через $this->widget()
RTFM !
MpaK
Сообщения: 10
Зарегистрирован: 2011.09.30, 08:01

Re: Стратегия блоков?

Сообщение MpaK »

Ну, а что странного, такая же единица, есть запрос, есть данные из модели, есть вью.
Зато добавляет удобство тестирования, можно тестировать модули-контроллеры раздельно.
andreyrud
Сообщения: 265
Зарегистрирован: 2011.09.26, 14:59

Re: Стратегия блоков?

Сообщение andreyrud »

because писал(а): а блоки это виджеты, которым скармливаются данные и они выводят их через $this->widget()
Выводят куда? Допустим есть виджет "корзина" в представлении main в правом верхнем углу. Есть действия в контроллерах, приводящие к добавлению товара в корзину. Контроллеры эти используют представление layout2. Если в действии контроллера написать $this->widget(...), то получается пустая страница с измененным виджетом "карзина" в левом верхнем углу. Если написать как обычно в действии контроллера отображение его представления $this->render(...) - перерисуется layout2, а виджет останется без изменений.

Вопрос: Если блоки это виджеты, расположенные в произвольном месте, как их персонально отрисовывать без изменения остального вида? Да еще отрисовывать так чтобы блоки изменялись ровно там где поставлены в main?
Как вообще апдейтить что-либо в header или footer из контроллеров?
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: Стратегия блоков?

Сообщение because »

вызывать виджет в layout-е в нужном месте
RTFM !
andreyrud
Сообщения: 265
Зарегистрирован: 2011.09.26, 14:59

Re: Стратегия блоков?

Сообщение andreyrud »

because писал(а):вызывать виджет в layout-е в нужном месте
А если нужного виджета нет в представлении этого контроллера?
Виджет сидит в main представлении, а контроллер работает с layout2. Как отрисовать виждет в main не перерисовывая все и не трогая layout2?
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: Стратегия блоков?

Сообщение because »

не совсем понял, но может это вам подойдет ? viewtopic.php?f=8&t=1947
RTFM !
andreyrud
Сообщения: 265
Зарегистрирован: 2011.09.26, 14:59

Re: Стратегия блоков?

Сообщение andreyrud »

Да вроде не то...

Поясню.
Есть на сайте строка "Число товаров = 0". Есть layout-ы, контроллеры и прочее. В каких-то контроллерах есть действие "товары++". В результате этого действия должна обновиться строка "Число товаров = 0" и стать "Число товаров = 1". Как можно оформить эту строку "Число товаров = 0" (виджет, еще что-то), чтобы извне можно было дать ей команду перерисоваться? Обычный подход ЖабаСкриптом найти "Число товаров = 0" и подменить 0 на 1. А средствами yii как? Подмена в ЖабаСкрипте хорошо работает с простой строкой, а если что-то серьезнее чем "Число товаров = 0"? И еще в определенном состоянии со своей логикой? Т.е. мне явно нужен аналог actionXXX() в виджете, который можно было бы позвать откуда угодно и виджет перерисовался на своем месте.
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: Стратегия блоков?

Сообщение esche »

andreyrud писал(а):Да вроде не то...

Поясню.
Есть на сайте строка "Число товаров = 0". Есть layout-ы, контроллеры и прочее. В каких-то контроллерах есть действие "товары++". В результате этого действия должна обновиться строка "Число товаров = 0" и стать "Число товаров = 1". Как можно оформить эту строку "Число товаров = 0" (виджет, еще что-то), чтобы извне можно было дать ей команду перерисоваться? Обычный подход ЖабаСкриптом найти "Число товаров = 0" и подменить 0 на 1. А средствами yii как? Подмена в ЖабаСкрипте хорошо работает с простой строкой, а если что-то серьезнее чем "Число товаров = 0"? И еще в определенном состоянии со своей логикой? Т.е. мне явно нужен аналог actionXXX() в виджете, который можно было бы позвать откуда угодно и виджет перерисовался на своем месте.
извне = из клиента (т.е. когда страница уже просматривается в браузере)?
или в пределах выполнения скрипта?

Если речь конкретно о корзине, то её содержимое, как правило, хранится в сессии/в куках/в базе т.е. там, где значение сохраняется при переходе между страницами. В контроллере (в действии, которое отвечает за ++/--) изменяем это значение (и, по хорошему, перенаправляем на страницу корзины/товара... т.е. в действие, которое выводит страницу), а в виджете - получаем его и отображаем.. Размещаем виджет в нужном месте вьюшки...
Для ajax-действия можно возвращать результат выполнения виджета (или параметры для замены), а на клиенте скриптом помещать результат в нужный элемент.

Виджет сидит в main представлении, а контроллер работает с layout2. Как отрисовать виждет в main не перерисовывая все и не трогая layout2?
Если задача - изменить виджет по ходу выполнения, то можно передать нужные параметры вторым аргументом
http://www.yiiframework.ru/doc/guide/ru/basics.view - раздел "Виджеты"

Код: Выделить всё

<?php $this->widget('CMaskedTextField',array('mask'=>'99/99/9999')); ?>
...
Ответить