Шаблонизатор с синтаксисом PHP и наследованием.

Ragazzo

TDD interested
Всегда было интересно, тех кто поддерживает "чистый" MVC не смущают например в модели, запросы к БД, которые потом будут служить например исключительно для вывода какого-нибудь одного <select>, и таким образом в модели будет 5-10 методов вида getSmthForHtml образно говоря, м?и при том что после выборки из БД, придется данные отформатировать под нужные хэлперы/виджеты/etc
 

Духовность™

Продвинутый новичок
мепперы пусть эти методы имеют, а модели - чисто обертка над бизнес-логикой и данными
 

Gas

может по одной?
Духовность™
Ну это когда есть отдельные маперы, в случае active record часто в моделях и бизнес-логика, и мапинг. Это конечно идеологически не правильно, но для большинства проектов пох из-за скудой бизнес-логики.

Rin
в твоём описании App_View похож на базовый класс для виджетов в yii - самодостаточные блоки с логикой и своим view. Я вот только не совсеми понял, а контроллер у тебя есть, кто рулит какой шаблон должен быть отрендерен?
 

Ragazzo

TDD interested
Духовность™,Gas
мапинг это хорошо, но меня интересует именно решение, когда нужно уложится надо в рамках модели(не строго конечно), нет никаких мапперов, кто куда убирает эти "избыточные" методы?Допустим, когда пишет на фреймворке Zend или Yii. Например, несмотря на то что в Yii есть различные классы и хелперы, под них все равно иногда код из базы надо подстроить.
 

Gas

может по одной?
Ragazzo
если пара методов, то в модели и оставляю, если скопится такая ерунда, то делаю service класс, например, ServiceUserFinder который не от чего не наследуется и в котором могут быть всякие выборки чтоб модель User не засорять. Так в yii делаю, но не говорю что это правильно, при использовании честного datamaper'а, а не AR, туда бы сносил такое.
 

Ragazzo

TDD interested
Gas
Я так понимаю, у тебя этот класс ServiceUserFinder, просто сборище этих "излишних" методов, а вот про честный datamaper не понял, я знаю что это, но не представляю как ты собирался сделать описанное, или у тебя datamaper если говорить о Yii, например, это модель не AR-типа м?
 

Absinthe

жожо
Я считаю, стоит смотреть в сторону самых простых и понятных решений, как делает, например, Apple, все данные любой программы структурированы в пакет, это понятно как программисту, так и рядовому пользователю, удалить программу для юзера - это удалить один явный для него файл, для системы - это явно нечто большее. Пользование простыми вещами навеивает мне мысль, что далеко не каждый может создать простоту, а обязательно придумает ветви, которые уводят от явных понятных всем решений и будет с пеной у рта пропагандировать свои интеллектуальные изыски.
MVC - оно не для пользователя, оно для программиста. А продукты Apple внутри ужасны(имею ввиду API) :(
 

Gas

может по одной?
Ragazzo
а вот про честный datamaper не понял, я знаю что это, но не представляю как ты собирался сделать описанное, или у тебя datamaper если говорить о Yii, например, это модель не AR-типа м?
я имел ввиду, что при использовании AR, обычно есть один базовый класс от которого наследуются все модели, которым нужно мапится на таблицы. Чтоб не плодить лишние сущности, даже одноразовые методы часто оставляю внутри модели (речь идёт о коде реализации, ), до тех пор пока не почуствую что нужно их куда-то выделить. С использованием подхода data mapper'ов, я всегда считал, что у каждой модели есть свой отдельный класс, который занимается мапингом (в пропеле так и было, а в доктрине вроде не совсем), и естественно в него пихать весь код связанный с выборками.
 

Rin

*
Gas

>кто рулит какой шаблон должен быть отрендерен
Указывается явно в методах App_View, смотрите внимательнее
 

Rin

*
В Model-View-Component можно даже сделать так, чтобы шаблон вызывался рекурсивно. Для генерации html кода иерархических меню очень удобно.
Пример.

В шаблоне main.tpl.php (он же макет или layout)
PHP:
...
<?=$view->run('page_children|page_menu_top', array('pid' => 2, 'depth' => 1))?>
...
В файле page_menu_top.tpl.php
PHP:
...
<? foreach ($rows as $id => $row) : ?>
    ...
    <? if ($row['child_nodes'] && (! $depth || $row['ns_level'] <= $depth)) : ?>
        <?=$view->render('page_menu_top', array('rows' => $row['child_nodes']))?>
    <? endif ?>
    ...
<? foreach ($rows as $id => $row) : ?>
...
В файле page_menu_top.tpl.php (вариант без лишнего if)
PHP:
...
<? foreach ($rows as $id => $row) : ?>
    ...
    <?=$view->route($row['child_nodes'] && (! $depth || $row['ns_level'] <= $depth), null, null, 'page_menu_top', array('rows' => $row['child_nodes']))?>
    ...
<? foreach ($rows as $id => $row) : ?>
...
 

С.

Продвинутый новичок
В Model-View-Component можно даже сделать так, чтобы шаблон вызывался рекурсивно.
Это вопрос шаблонизатора, а никак не парадигмы.

Вообще я пробовал поискать, что такое Model-View-Component и не нашел ничего. Сам придумал? Оно неплохо, только надо объяснить, чем оно отличается от MVC. Хотя бы угол поворота обзора яиц.

Вот как я объясняю MVC:
MVC.png
Здесь видна "парадигменность" MVC, а именно то, что границы ее составляющих не совпадют с границами реальных практических понятий. А что такое твой Model-View-Component?
 
  • Like
Реакции: AmdY

Gas

может по одной?
Rin
про использование $view внутри шаблона понятно, в yii/zend внутри шаблона тоже можно можно вызвать $this->render() и отрендерить подшаблон (правда не рекурсивно), но при этом эти фрейморки не теряют понятие Controller. Мне не ясно кто принимает решение о том, что нужно отрендерить какой-то view-шаблон страницы. Например, обычный flow у известных фреймворков - запрос попадает на FrontController, он используя описанные в конфиге route-правила, решает какой контроллер и его метод(action) запустить, action вытягивает из моделей данные, определает шаблон для рендеринга и запускает. Результат работы реднеринга aсtion'а вставляется в layout-шаблон. При этом шаблон может рендерить подшаблоны, создать виджеты (своя логика + шаблон).
Извиняюсь за описание этой банальщины.

Rin, ты мог бы описать кратко как у тебя сделано, мне действительно интересно но не понятно. В твоих примерах описана уже либо последняя страдия (тогда наверное какой-то вышестоящий код есть и он выполняет функции контроллера), либо http запросы попадают напрямую на скрипты с шаблонами, например, при обращении к site/news.php сразу и вызывается news.php, где идёт иннициализация и подтягивание нужных данных (тогда понятно)
 

Rin

*
С.
Смотрю на изображение-схему MVC. Какая взаимосвязь между Model и Template Helpers?
 

MiksIr

miksir@home:~$
Template Helpers - это типа "модель, дай мне новости для главной страницы" или "модель, дай мне новости для админки"
 

Rin

*
С.
Вообще я пробовал поискать, что такое Model-View-Component и не нашел ничего. Сам придумал? Оно неплохо, только надо объяснить, чем оно отличается от MVC. Хотя бы угол поворота обзора яиц.
Впервые я увидел это определение в этой книге (посмотрите аннотацию), но ещё в первом издании.
Видимо, нужно сделать какую-нибудь таблицу сравнения MVC с Model-View-Component или более детально описать схему работы (на моём примере).
 

С.

Продвинутый новичок
В анотации не упоминается Model-View-Component. Даже ближе к концу во фразе "подходам к отделению PHP-кода от HTML-шаблонов сайта" его нет. Вопрос остается: откуда термин и что означает?
 

С.

Продвинутый новичок
Смотрю на изображение-схему MVC. Какая взаимосвязь между Model и Template Helpers?
Это когда в шаблон проникают элементы биз. логики или наоборот в модель элементы оформления. И никак от этого не избавишься. Пример: отображение отрицательных сумм красным в бухгалтерских проводках.
 
Сверху