Шаблоны: супервизор

stopkran

Дилетант
Как мы уже обсуждали ранее, четких границ между M, V и C не существует. Есть моменты, которые можно отнести как к одному, так и к другому. Выбор показывать ли блок ленты навостей на новостной странице тоже не однозначно относится к бизнес логике или отображению. Положа руку на сердце, а бы тоже отнес это к БЛ. Но!
Да, чётких границ mvc нет. Но границу между БЛ и вычислениями желательно проводить всегда. Если "Повелеваю решать вопрос об отображении новостей в шаблоне" - это просто значит, что часть БЛ вынесена в шаблон. Но это всё равно БЛ (если не показывать ленту, изменится смысл сайта). И ничего страшного в том, что БЛ в шаблоне, главное, чтобы это было документировано (а не контрабандой). Я не встречал сайтов, в которых вся БЛ была бы в одном месте (в "бизнес-слое" :))
 

С.

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

Фанат

oncle terrible
Команда форума
Ещё вопрос ко всем.
Меню, обычно - это не совсем простой код, и по-хорошему, оно бы должно быть оформлено отдельный блок в шаблоне... со своим собственным контроллером(?), который получает данные для построения меню.
Вопросы:
Где этот контроллер должен быть расположен?
Откуда вызываться?

Кстати, по терминологии. Вот у нас есть модуль(?) новостей. В нём есть различные экшены(?) - скажем, экшен для показа списка новостей и экшен для показа отдельной новости.
Как это называется в общеупотребительной терминологии?
 

Фанат

oncle terrible
Команда форума
Не нравится мне, кстати, юзабилити этого форума. Когда происходит переход страницы, посты теряются.
 

stopkran

Дилетант
Как это называется в общеупотребительной терминологии?
:) если бы эта терминология была... У меня, например, в моей общепринятой терминологии "Новость" выводится тем же модулем, что и "Страница" или "Статья", а "Меню" выводится тем же модулем, что и "Список новостей" (т.е. список новостей - это просто меню с анонсами).

"Главный системный Контроллер" дёргает View_site ("приложение" в терминологии Фиксера?), а там написано что-то вроде $menu1 = Menu::get($entity, $type, ...);. А в шаблоне, соответственно, "<td class='sidebar'>$menu1</td>" (<?=$menu1?> в терминологии битриксеров).

Меню создаются все сразу, вплоть до $menu16, даже если потом на странице не используются. Плохо это? Да пофиг, запас карман не тянет. В принципе, ничто не мешает прямо в шаблоне писать $menu1 = Menu::get(...), и я так иногда делаю. Накопится материал, проанализирую зависимости и пойму точно, как правильнее (где генерировать меню).
 

Фанат

oncle terrible
Команда форума
$entity - это что?

Блин, неужели я настолько непонятно пишу, что никто не понимает моих вопросов? (Это не сарказм, если чо, а крик души)

один и тот же модуль не может готовить данные и для меню и для списка новостей.
экшен списка новостей должен обработать фильтры, запросить модель, отформатировать данные
это не имеет ничего общего с формированием меню.

вопрос не только "кто выводит", но и "кто готовит". где лежит контроллер.

ПРИМЕР:
У нас есть пресловутая форма входа/ссылка на личный кабинет.
Это, очевидно, "экшен" в модуле "юзер".
При формировании страницы некая сущность (природа которой нам сейчас не важна) дёргает модуль юзер экшен логин форм, чтобы та сказала, какой шаблон юзать и какие данные в него лить.

В этом случае расположение "контроллера" или хер его знает, как назвать, определено и логично,

Вопрос:
экшеном какого модуля долно быть формирование меню?

Блин, давайте читать посты внимательно, не как обычно - "за пол-секунды схватил суть, еще пол-секунды на ответ"? ЗДЕСЬ ЭТО НЕ РАБОТАЕТ.
 

Вурдалак

Продвинутый новичок
Фанат, обычно существуют специальные action'ы before()/after(), которые выполняются соответственно до/после основного action'а, в некоторых реализациях существуют фильтры, являющиеся по своей сути теми же контроллерами. В них и можно закладывать общую для приложения/раздела логику, связанную с меню.
 

Ragazzo

TDD interested
Фанат
экшеном какого модуля долно быть формирование меню?
Никакого я считаю, это должен быть самостоятельный виджет, который живет самостоятейльной жизнью, у него есть свои view которые он рендерит и т д. Если надо что-то ему передеать, то передавать в начале его инициализации.
 

Фанат

oncle terrible
Команда форума
Ragazzo
что такое "виджет"? модуль, такой же, как новости? с единственным экшеном?

я понимаю понятие "виджет" в смысле "блок в шаблоне".

но в данном случае речь идет не о шаблоне, а о контроллере, который готовит данные для шаблона
 

stopkran

Дилетант
ЗДЕСЬ ЭТО НЕ РАБОТАЕТ
Фанат,
мне показалось, ты хочешь получить на свои вопросы честные ответы, из практики. Примерно год назад я начал задавать себе похожие вопросы. Ответы, которые находил я, привели меня к созданию CMS. И вот, например, сайт, где ЭТО РАБОТАЕТ - и меню, и списки анонсов создаются одним и тем же "модулем" (контроллером и шаблонизатором в одном лице):

PHP:
$menu_top = Menu::out($entity, 2, null, 'index.html', 1, 'table');
$main_anonce = Menu::row($entity, null, 'order, mtime, title', 'meropriatia.html', 25);
$entity - это сущность: например, 'articles', 'comments', 'users'. '25' - это тип отображения 'title & img & anonce'.

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

Далее,
У нас есть пресловутая форма входа/ссылка на личный кабинет.
Это, очевидно, "экшен" в модуле "юзер".
"Вы будете смеяться", но и ЭТО далеко не очевидно! У меня это - "экшен" build_form, которому в качестве параметра передаётся $entity='user'.
 

Ragazzo

TDD interested
Фанат
Я использую Yii, и терминология оттуда, думаю что проще тебе будет прочитать вот это. Там в гайде совсем мало про них написано, но основную суть думаю ты уловишь.
я понимаю понятие "виджет" в смысле "блок в шаблоне".
Что-то типа того, но не совсем :D
stopkran
пиаритесь?наймите верстальщика что-ли, а то дизайн 90х какой-то :D
 

fixxxer

К.О.
Партнер клуба
Мне кажется, что все делают по сути примерно одинаково (единственное различие - активные/ пассивные шаблоны), но называют все разными словами. =)

Может, просто взять какой-то небольшой но показательный таск, и каждый покажет, как он его реализует?
 

NeD

Новичок
Мне кажется, что все делают по сути примерно одинаково (единственное различие - активные/ пассивные шаблоны), но называют все разными словами. =)

Может, просто взять какой-то небольшой но показательный таск, и каждый покажет, как он его реализует?
Поддерживаю
 

stopkran

Дилетант
stopkran
меню к какой ентити относится?
Ну, я не знаю... Меню - это просто отдельный класс в отдельном файле. Menu в Menu.php :). Типа "компонент". Он может обрабатывать любые сущности.

Давайте уже переходить к формированию задачи. Инициатива наказуема, предлагаю проголосовать, чтобы Фиксер сформулировал свой таск.
 

stopkran

Дилетант
fixxxer,
ты готов создать свой небольшой таск?
(Ну, хотя, если кто-то другой вызовется, я не против :)
 

Фанат

oncle terrible
Команда форума
stopkran
тебе не удалось ответить на мой вопрос даже с трёх попыток.
можно тебя попросить не писать в этот топик больше?
Спасибо.
 

NeD

Новичок
Выложил свои наработки с использованием активных шаблонов на https://github.com/karneds/RightCMS Есть админка и несколько базовых модулей.
Беременным и особо впечатлительным не смотреть :) (документации нет, код без тестов и комментариев)
Код очень сырой, какие-то методы/классы могут быть переписаны в дальнейшем без обратной совместимости.
Буду рад любой обоснованной критике :)
 

lagoff

Новичок
OMG... Народ, какой-то непролазный концептуальный тупняк в треде, если честно. Одна только фраза про то, что M, V и C не разделяются чего стоит... Но не будем удлинять тред.

По сути:

1)
Меню, обычно - это не совсем простой код, и по-хорошему, оно бы должно быть оформлено отдельный блок в шаблоне... со своим собственным контроллером(?), который получает данные для построения меню.
Вопросы:
Где этот контроллер должен быть расположен?
Откуда вызываться?
Все верно, чтобы вынести логику такого рода лучше внедрить некую концептуальную сущность под названием "виджет" или "компонент". Принцип такой же как в HMVC. Т.е. по сути тот же модуль, только диспетчеризация внешних запросов запрещена. Разрешены только внутренние, т.е. напрямую из кода, запросы. Он и будет заниматься рендерингом меню. Где и как его вызвать - дело второе. Главное что, логика обработки запроса + рендеринг UI инкапсулированы в одной сущности.

2)
меню к какой ентити относится?
Вопрос задан неверно. Меню это и есть сущность. Сущности в свою очередь могут подразделяться на сущности ресурсов, сущности предметной области и пр.
В данном случае это будет сущность ресурса "Меню".

В дополнение: сущность "Компонент"::Меню будет юзать сущность "Ресурс"::Меню для получения данных. А вот где хранятся сами данные вообще не важно ибо ресурс это успешно инкапсулирует.
 
Сверху