Вопрос достаточно общий, но мне нужно разобраться, потому что я только начинаю осваивать 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 именно «в лоб». Но ведь так большой проект не удержишь. Где-то я свернул не туда, но не пойму, где. Ведь фреймверк не должен навязывать структуру построения сайта, это всего лишь инструмент со своими стандартами оформления кода и каталогов, не более. Но что я делаю не так - не пойму.
Вот в этих двух проблемах я и хочу разобраться.