webhamster
@webhamster

Yii 1.x.x. Контроллеры, макеты и виджеты... Какую выбрать структуру проекта?

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

Вот в этих двух проблемах я и хочу разобраться.
  • Вопрос задан
  • 2337 просмотров
Пригласить эксперта
Ответы на вопрос 1
@maxyc_webber
Web-программист
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы