Способы передачи блока [content] в шаблон

AndreyK

Новичок
Способы передачи блока [content] в шаблон

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

Есть несложный "личный кабинет менеджера", используются шаблоны. Когда генерируется статичная (одинаковая для всех страница), то сформировать содержимое переменной $content (содержимое основного блока) для передачи ее в шаблон просто - один запрос к базе и уже имеем блок штмл-кода. Также есть и динамические страницы, с фильтрами и т.п., в которых данные формируются и обрабатываются сложно (будущее содержимое $content). Я в этом случае создаю переменную $out, в которую через . дописываю все содержимое будущей $content, т.е. сам "склеил" нужную строку.

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

Beavis

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

AndreyK

Новичок
Beavis
можно, точнее?

Допустим, передал я в шаблон массив с данными, которые мне нужно показать в виде таблицы. Но в каждом случае своя "структура таблицы", т.е. это нужно в шаблоне вызвать еще одну функцию, которая из данных сделает штмл-код в зависимости от флага "имя страницы", так?
 

cDLEON

Онанист РНРСlub
Зачем функцию? Можно сразу код с логикой отображения засунуть в шаблон. Если ты конечно не начал ездить на самописных велосипедах-шаблонизаторах.
PHP:
<?foreach($var as $k=>$v):?>
 <?=$k?>=<?=$v?><br/>
<?endforeach;?>
 

AndreyK

Новичок
cDLEON

пример: у меня 10 различных страниц, на которых в принципе разный контент, с разным оформлением. Шаблон один. И что, мне в шаблоне писать 10 различных вариантов с "логикой отображения" под каждую страницу?
 

С.

Продвинутый новичок
10 различных страниц с одним шаблоном? Парадокс! Где-то явно логическая ошибка. Для десяти РАЗНЫХ страниц нужно десять РАЗНЫХ шаблонов.
 

AndreyK

Новичок
10 различных страниц - я имел ввиду такие страницы как "Номенклатура товара", "Остатки товара", "Клиенты" и др. Дизайн у всех одинаков, меняется только содержимое основного блока [content]. Да, я могу сделать под каждую из них отдельный шаблон, подключить в каждом из них header.inc.php, footer.inc.php и т.д. Но в данной схеме мне больше нравится иметь один шаблон и передавать в него данные, которые запросил пользователь.

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

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

Духовность™

Продвинутый новичок
Сейчас я "клею" длинную строку штмл-кода в пхп-функции, которая выбирает и подготавливает данные для отображения пользователю. Не очень нравится.
а что тут может нравиться? шаблона как такового нет - HTML ты все равно в PHP генерируешь. где же тут шаблонизация?


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

Для каждой твоей страницы типа "Номенклатура товара", "Остатки товара", "Клиенты" долженбыть СВОЙ шаблон и свой скрипт, который занимается генерацией данных. Т.е. 10 шаблонов и 10 скриптов.
 

cDLEON

Онанист РНРСlub
ошибка начинающих программистов как раз в том, что они пытаются использовать один шаблон для всего сайта.
Не соглашусь.
Привожу пример из своего фреймворка...
ХТМЛ однотипного модуля без изменений "главного дизайна" (т.е. дизайна, который находится на один уровень выше дизайна самого модуля - того, который не нужно менять в этих модулях):
main.tpl
PHP:
<html>
<head>
</head>
<body>
ОФОРМЛЕНИЕ ХИАДЕРА
<?$this->exec();?>
ОФОРМЛЕНИЕ ФУТЕРА
</body>
</html>
Соответственно функция вьюхи exec начинает собирать шаблоны самого модуля.
А вот это шаблон модуля, для отображения ошибок вроде 404:
main.tpl
PHP:
<html>
<head>
  <title><?=$title?></title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <style type="text/css">
  <!--
    html, body { padding: 0px; margin: 0px; }
    .menu { padding: 4px 10px 4px 10px; border-bottom: 3px double #999999; background: #FFFFFF; font-size: 85%; font-weight: bold; }
    p { text-align: justify }
    h1 { font-size: 150%; }
    h2 { font-size: 130%; }
  -->
  </style>
</head>

<body bgcolor="white" text="#000000" link="#00639C" alink="#ffaa00" vlink="#00437C">

<table width="100%" height="100%" cellpadding="0" cellspacing="0" border="0">
<tr valign="top">
  <td bgcolor="#DEDFDE" width="80%" style="border-right: 1px outset">
        <div style="width=100%; padding: 0px 10px 4px 10px">
            <h1 style="margin-top: 0.2em"><?=$title?></h1>
            <?=$message?><p/>
            <?if(false && isset($err_string)):?>
            	<b>Отладочная информация:</b> <br/>
            	<?=$err_string?>
            <?endif?><p/>	
            <br/><br/>
         <hr noshade="noshade" />
         <div style='text-align: right;'><?=$tooltip_info?></div>
        </div>
  </td>
  <td bgcolor="#000000">&nbsp;</td>
</tr>
</table>
</body>
</html>
Т.е. - в данном случае на весь модуль (на всю его логику отображения) используется один, уникальный шаблон...
На лицо один огромный плюс - устранение копи-паста там, где это необходимо.

-~{}~ 27.06.09 03:13:

пример: у меня 10 различных страниц, на которых в принципе разный контент, с разным оформлением. Шаблон один. И что, мне в шаблоне писать 10 различных вариантов с "логикой отображения" под каждую страницу?
Немножко поясню свою точку зрения:
Логика отображения каждого модуля естественно для 10-ти разных случаев должна быть разной. Но вопреки твоему суждению - задумайся. Когда ты начинаешь "клеить" этот контент - ты откуда его берёшь? И зачем вообще тогда шаблоны, если в "активных" местах ты ни чего изменить (логику отображения) не сможешь без вмешательства в скрипт с "рабочей" логикой или, как её ещё называют, "бизнес логикой" ?
 

С.

Продвинутый новичок
cDLEON, нельзя называть твой main.tpl шаблоном. Хотя формально он оформлен, как шаблон, но по сути им не является. Это часть контролера, где механически склеиваются три части: шапка+тело+подвал. То что ты это засунул в файл .tpl не делает это шаблоном по сути. Например можно было бы разбить твой main.tpl на header.tpl и footer.tpl, а где-нибудь в контролере сконкатенировать:

include('header.tpl');
$this->exec();
include('footer.tpl');

И все, твой "единый шаблон" испарился, как дым.

Реальным по сути шаблоном в даном контексте является то, что генерит содержимое "тела", а оно везде разное.
 

Фанат

oncle terrible
Команда форума
Отвечая на вопросы новичков о шаблонах, надо всегда помнить, что они имеют в виду совершенно другое. не шаблонизатор для вывода разных страниц, а "шапку сайта". а в содержимом страниц у них все тот же винегрет.
 

Beavis

Banned
Автор оригинала: cDLEON
Не соглашусь.
Привожу пример из своего фреймворка...
ХТМЛ однотипного модуля без изменений "главного дизайна"
Это называется layout.. Он может быть всего один, но в него могут включаться многие другие шаблоны...
 

cDLEON

Онанист РНРСlub
Именно это я и имел ввиду - просто для топик стартера разжёвывал....
Я не отрицаю,что другие шаблоны нужны в системе, я лишь оспариваю
каждая страница должна иметь свой собственный шаблон.
 

Фанат

oncle terrible
Команда форума
опять началось. найдем козявочную частность и начнем за нее убиваться.
 

AndreyK

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

каждая страница должна иметь свой собственный шаблон.
Возможно, что я чего-то не понимаю, прошу объяснить мне: количество отдельных страниц медленно, но растет, по логике С. ()
10 различных страниц с одним шаблоном? Парадокс! Где-то явно логическая ошибка. Для десяти РАЗНЫХ страниц нужно десять РАЗНЫХ шаблонов.
я должен на каждую новую страницу создавать отдельный шаблон. Причем все они будет иметь минимальные отличия.

Что в данном случае поднимается под шаблоном? - отдельный файл tpl: pag1.tpl, page2.tpl ..... page30.tpl?

Мне больше нравится вариант с одним шаблоном. Возможно я отойду от логики MVC, но с одним шаблоном все-таки жить проще. В чем могут быть потенциальные проблемы такого решения? Процесс преобразования данных в штмл-код планирую вынести в котроллеры
 

Духовность™

Продвинутый новичок
я должен на каждую новую страницу создавать отдельный шаблон. Причем все они будет иметь минимальные отличия.
В чем могут быть потенциальные проблемы такого решения?
Сегодня - минимальные. А завтра тебе ВНЕЗАПНО понадобится каждую станицу сделать индивидуальной. Что тогда?

Вообще, шаблон - это одежда. Скрипт - это человек. У каждого скрипта должна быть своя одежда. А ты пытаешься запихнуть всю семью в одни большие дедовские семейные трусы. Ясна аналогия?

Что в данном случае поднимается под шаблоном?
ОДНА страница от html и до html для одного скрипта. Вот ты сейчас читаешь эту тему - тут 1 шаблон используется при генерации страницы. Когда ты нажмешь "редактировать" своё сообщение, отобразится второй шаблон. Список форумов - третий. Список тем - четвертый шаблон. И т.д.

Возможно я отойду от логики MV
МВС тут не при чем.

Процесс преобразования данных в штмл-код планирую вынести в котроллеры
Данные в HTML должны "преобразовываться" View, то есть шаблонизатором.
 

Фанат

oncle terrible
Команда форума
Что в данном случае поднимается под шаблоном? - отдельный файл tpl: pag1.tpl, page2.tpl ..... page30.tpl?
отдельный файл news.tpl, quiz.tpl, forum_list.tpl forum_topic.tpl

-~{}~ 29.06.09 12:42:

Главное, чего автор так и не понял - это что настоящий шаблон, о котором все вокруг говорят - это и есть "блок [content]".

А его собеседники не понимают, что говорят совсем о другом.
 

AndreyK

Новичок
Сегодня - минимальные. А завтра тебе ВНЕЗАПНО понадобится каждую станицу сделать индивидуальной. Что тогда?
Вообще, шаблон - это одежда. Скрипт - это человек. У каждого скрипта должна быть своя одежда. А ты пытаешься запихнуть всю семью в одни большие дедовские семейные трусы. Ясна аналогия?
Аналогия ясна. Спасибо за ответ. Не пойму, в чем могут быть проблемы при следующей схеме: по умолчанию для всех скриптов используется шаблон common.tpl. В то же время для каждого скрипта можно переопределить шаблон на уникальный. Если какую-либу страницу понадобилось сделать уникальной - создал новый шаблон и назначил его нужному скрипту.

Под шаблоном я понимаю файл вида news.tpl, forum_list.tpl forum_topic.tpl и т.д. Т.е. штмл-код с определенными местами, вида {content} иди другого, в которые вставляются динамические данные. Пожалуйста, объясните подробнее фразу

Главное, чего автор так и не понял - это что настоящий шаблон, о котором все вокруг говорят - это и есть "блок [content]".
 

Gas

может по одной?
Пожалуйста, объясните подробнее фразу
Блок [content] - это шаблон конкретной страницы, один файл-шаблон может быть и у нескольких страниц, если разница незначительная и if'ы код не сильно путают.

Файл, в который вставляется [content] - это layout, общий набор html-кода/логики отображения для ряда страниц, например, общий хедер/футер/меню.

Знакомые используют eval()
Более распространённый вариант получения данных шаблона в переменную ($content) через ob_-функции
 
Сверху