LINUX.ORG.RU

Yii 1.x.x. Контроллеры, макеты и виджеты - идеология структуры проекта

 ,


0

1

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

Вот в этих двух проблемах я и хочу разобраться.

★★★★★

Yii1 сделан на старых говеных антипаттернах, лучше 2 пользовать.

anonymous ()

Во-первых, апдейтинсь до 2ой версии.
Во-вторых, апдейтинсь до 2ой версии.
В-третьих, не надо насиловать фреймворк если он тебя не устраивает.

ya-betmen ★★★★★ ()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

Во-первых, апдейтинсь до 2ой версии.

Дай документацию на русском языке по версии Yii 2, которая к тому же еще в бете.

Для меня главный критерий фреймверка - наличие актуальной документации на русском языке и сообщества. Ранее это был CodeIgniter, Теперь Yii.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Для меня главный критерий фреймверка - наличие актуальной документации на русском языке и сообщества. Ранее это был CodeIgniter, Теперь Yii.

ниасилил аглицкий? зачем тогда идти в программисты

anonymous ()
<!-- Виджет меню -->
<?php $this->widget('CDrawPageArea', array('params'=>array(
         'pageAreaName'=>'menu', 
         'siteAreaName'=>Yii::app()->getController()->getId() ))); ?>

ШТОЭТО О_О

Что за лихо закрученная хрень из цепочек вызовов, статических и не только методов, массивов, объектов, атрибутов функций и прочего гумна только для рендеринга статичного, насколько я могу судить, меню? Yii упрощает разработку? Ну-ну.

Такие вещи простым include(...) делаются что на чистом пыхе, что его аналогом на стороннем шаблонизаторе, покрывающем 100% потребностей.

anonymous ()
Ответ на: комментарий от Xintrea

Ага! Значит по третьему пункту возражений нет. Тогда первые два можешь пропустить.

ya-betmen ★★★★★ ()
Ответ на: комментарий от anonymous

Что за лихо закрученная хрень из цепочек вызовов, статических и не только методов, массивов, объектов, атрибутов функций и прочего гумна только для рендеринга статичного, насколько я могу судить, меню?

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

По значению pageAreaName='menu' виджет CDrawPageArea перекидывает на рендеринг меню. Но для некоторых областей сайта меню не будет видно, и это тоже скрыто в CDrawPageArea.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Все равно заметен сильный оверхед. Не встречал еще случая где кроме названия шаблона и массива параметров что-то требуется еще. Ну максимум, 3-й параметр - рендерить ли в переменную.

А тут вместо названия шаблона создается объект виджета, чье имя класса передается в качестве string. Что оно там дальше - eval'ится? Создается через new $$var_name()? Изврат, худшие парадигмы программирования как такового, а Yii зачем-то пропагандирует этот подход. Зачем для передачи параметров используется массив в массиве? Пока всю эту бадягу напишешь - пальцы в узлы завяжутся.

В общем, учи Yii только если планируешь зарабатывать на нем деньги, во всех остальных случаях обходи подобные решения за километр.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.