Вопрос достаточно общий, но мне нужно разобраться, потому что я только начинаю осваивать Yii.
* * *
Я сделал следующую структуру приложения. Для начала - термины, в которых мыслю.
-
Область страницы (pageAreaName) - это "именованная" точка в основном макете сайта. Например
title,
menu,
info,
text,
bottom.
-
Область сайта (siteAreaName) - это название раздела сайта. По сути, это Id контроллера. Например
main,
guestBook,
newsArchive.
Есть основной макет страницы. Это чистый HTML, в нем только "отмечены" области страницы (
pageAreaName) в виде вызова специального виджета
CDrawPageArea:
<!-- Виджет меню -->
<?php $this->widget('CDrawPageArea', array('params'=>array(
'pageAreaName'=>'menu',
'siteAreaName'=>Yii::app()->getController()->getId() ))); ?>
Виджет
CDrawPageArea (назовем его "промежуточным"), основываясь на информации в каком месте сайта и в каком месте страницы произошел вызов (параметры
pageAreaName и
siteAreaName), вызывает (по таблицам) другие "конечные" виджеты, передавая им так же информацию о
pageAreaName и
siteAreaName. Таким образом, конечные виджеты знают, в каком месте сайта и в каком месте страницы они вызваны. И могут соответственно менять своё поведение, если это необходимо. Это очень удобно. Так же удобно то, что таблица вызовов "конечных" виджетов сосредоточена в одном месте, и сразу видна вся структура сайта.
Последовательность выполнения приложения следующая. Вызывается действие контроллера, в нем всего одна команда - отрисовка пустого представления. В момент отрисовки пустого представления вызывается отрисовка основного мекета. И из него уже вызываются отрисовки виджетов описанным выше способом.
* * *
Однако, у такого подхода вылезли проблемы:
1. На сайте должны быть ЧПУ (
контроллер/действие/имяПараметра1/значение1/имяПараметра2/значение2). Никаких _GET параметров. Тогда в контроллере параметры действия можно получить как параметры функции. Это красиво и правильно. Но вот вопрос. Как эти параметры передавать в "конечные" виджеты? К тому же параметры действия должны попадать не во все "конечные" виджеты, а только в те, которым они предназначены. Например, если нужно отобразить статью
articles/show/articreId/123, то
articleId, равное 123, должно попасть только в "конечные" виджеты
titleAreaDraw и
textAreaDraw, но не в виджеты
menuAreaDraw,
bottomAreaDraw и т. д.
Прописывать в коде действия (в каком-то формате) информацию о том, в какие виджеты должны попасть данные - идеологически неправильно, ведь вся карта сайта сосредоточена в одном месте - в "промежуточном" виджете
CDrawPageArea. А прописывать куда должны попасть данные в самом
CDrawPageArea - тоже неправильно, потому что данные с одним и тем же именем (например, pageNum) могут прилетать из разных контроллеров, непонятно как их различать.
2. Непонятно, как при такой структуре пользоваться достоинствами Yii. Например, пользовательским входом-выходом и стандартным контролем доступа Yii на уровне контроллеров, ведь контроллеры в описанной мной структуре по сути ничего не делают (вся логика в виджетах). У меня складывается впечатление, что я как-то не так использую Yii. В примитивном блоге, который идет в виде примера, структура сайта размазана по контроллерам, и ее невидно, нет точки управления (как у меня в
CDrawPageArea). Но люди почему-то пользуются Yii именно "в лоб". Но ведь так большой проект не удержишь. Где-то я свернул не туда, но не пойму, где. Ведь фреймверк не должен навязывать [u]структуру[/u] построения сайта, это всего лишь инструмент со своими стандартами оформления кода и каталогов, не более. Но что я делаю не так - не пойму.
Вот в этих двух проблемах я и хочу разобраться.