если это про index.php, то привёл как пример return-а результата обработки шаблона, чтобы потом можно было вставить в виде переменной в другой шаблон. можно конечно бы и весь хтмл код запихнуть в один файл шаблона, но тогда бы возник вопрос "а почему бы просто не инклудить данный файл в конце без всяких функций?". Задача шаблонизатора - обработать шаблон и вернуть содержимое в виде строки для дальнейшей обработки. так же как и в обычном пхп коде <div><?php echo templater('/path/to/block_template.html', $block_vars); ?></div> http://www.php.ru/forum/viewtopic.php?p=210962#210962 вроде там тот же вопрос поднимался, правда там используется кеширование в том-то и дело, что я много времени обходился тем, что формировал хтмл код внутри пхп. Очень неудобно держать логику отображения (то бишь кучу ненужного хтмл кода) внутри функций. Подумывал и о том, чтобы вынести формирование хтмл в отдельную функцию, но затем передумал просто потому, что если писать отдельную функцию для каждого формирования хтмл кода, то получится что каждая моя вторая функция будет дублироваться ниже с тем же названием + "_html"
Я считаю что да. Т.е это имхо нормально если шаблон вида: PHP: <table> <?php foreach($array as $value):?> <tr> <td><?php echo htmlspecialchars($value);?></td> </tr> <?php endforeach;?> </table> Это нормально, ибо $value это оригинальные данные которые помимо шаблона может быть пригодиться посылать куда-то ещё в совершенно другом формате (т.е htmlspecialchars это забота именно шаблонизатора)
Dagdamor Vladson прав. К тому же есть варианты, когда сами модели могут перед отдачей данных во view эскейпить их. Шаблон пишется один раз и лишний раз поставить эскейп данных не страшно.
Vladson тоже так считаю =) Хотя сам чаще экранирую сразу при вставке в БД. обычно это более рационально.
Всё должно обрабатываться и эскейпиться в представлении, даже если в вид передаётся дата рождения пользователя, а её надо представить в двух других форматах - всё это делается в представлении. Тем более никто не мешает писать так: PHP: <div><?php echo $t->d($t->user_date, 'Y-m-d')?></div> <table> <?php foreach($t->array as $value):?> <tr> <td><?php echo $t->e($value);?></td> </tr> <?php endforeach;?> </table> Хелперы представления сделают всё, что хотите гибко, просто и быстро.
Vladson Мой вопрос был в другом - "не лень писать htmlspecialchars() снова и снова"? Как я понимаю, ответ - "нет, не лень" Насчет экранирования прямо перед выводом согласен, тоже всегда так делаю и никогда не храню экранированные данные в БД. Gromo То есть, если вспомогательный шаблон вызывается в цикле, файл и инклудиться будет много раз? Имхо, не вариант. И все тот же вопрос: что, если вспомогательных шаблонов много? Скажем, штук 20-30 на странице (для не шибко примитивных сайтов это норма). Каждый раз инклудить/читать 20-30 файлов? Учтите, даже столь ненавидимый вами Смарти начал от этой стратегии понемногу уходить.
Dagdamor А не достаёт постоянно писать foreach ($something as $bla) ... ? Код всёравно надо писать. Можно настроить сокращения скажем htsc -> htmlspecialchars, fnc -> function () {} и.т.д. Что до вспомогательных шаблонов - я обычно не делаю их. Я делю только на логические отдельные блоки, поэтому обычно у меня в худшем случае ну может 7-10 шаблонов на самую сложную страницу. Если нужно больше - значит что-то уже делается не так. Да и постепенный уход сайтов к AJAX навигации сильно упрощает жизнь.
Нет, ответ "проще один раз в шаблоне, чем бегать по скрипту искать какие бы данные отескейпить..." Данные это данные, в шаблон должны идти они, и там они уже должны форматироваться (в HTML если это HTML-шаблонизатор, в XML если это RSS, и для мыла и для итд/итп) Данные надо обрабатывать не в зависимости откуда они пришли, а в зависимости куда они уйдут ! © dark-demon.
обычно для этого в шаблоне и делают циклы, если один и тот же кусок повторяется много раз. и правильнее данный цикл делать именно в шаблоне, а не в коде инклюдить по многу раз. нет, не плохо. Можно даже сказать почти идеально. Сам на джанго работаю. Но в отличие от питона, пхп изначально создавался с условием интеграции с хтмл. Потому решение с нативным пхп быстрее, не требует дополнительного изучения синтаксиса и позволяет делать всё, что душе угодно. Правда редактировать такие шаблоны должны только разработчики, а не пользователи. Но и задумка была сделать интуитивно понятный шаблонизатор в помощь разработчику, а не пользователю. Для дизайнеров или посторонних лиц, конечно же, твиг по вопросу безопасности намного лучше.
а тут уже своё представление, если данные отдаёются json-ом то их надо эскейпить перед json_encode, и это тоже будет в представлении или в аджакс экшенах, где данные будут передаваться уже обработанными...
а что реально дофига пользователей радактируют шаблоны или верстальщиков? С теми с кем я работал еще ни одного не видел....
ТОВАРИЩИ !!! Вспомните что такое "шаблонизатор" (попробуйте написать любое приложение на том-же "Перл" или "Си") и вы поймёте что я прав
Недогоняю. Если эскейпнуть дважды одну и ту же строку htmlspecialchars, получится типа HTML: Preved, &lt;b&gt;world!&lt;/b&gt;
[vs] не надо "дважды" надо чтоб "слешами занимался мускул, тегами занимался html-щик, а лизанием жопы занимался манагер" каждый должен быть на своём месте, и чтоб они друг другу они не мешали...
В общем по теме, чем дальше в лес, тем больше кажется что такой КАЗАЛОСЬ БЫ говнокод, вовсе не настолько и является то таковым... PHP: <?php mysql_connect('localhost', 'root', ''); mysql_select_db('test'); $posts = mysql_query("SELECT * FROM `guestbook` ORDER BY `date` DESC"); ?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>Guestbook</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <h1>Guestbook</h1> <form action="posting.php" method="post"> <p> <textarea name="text" cols="30" rows="7"></textarea> <br> <input type="text" name="username" value="Анонимус"> <input value="Submit" type="submit"> </p> </form> <hr> <?php while ($row = mysql_fetch_assoc($posts)): ?> <p><b><?php echo htmlspecialchars($row['name'])?></b> - <i><?php echo htmlspecialchars($row['date'])?></i><br> <?php echo nl2br(htmlspecialchars($row['text']))?></p><hr> <?php endwhile; ?>
Vladson это легко превратить в НАСТОЯЩИЙ говнокод! PHP: <?php mysql_connect('localhost', 'root', ''); mysql_select_db('test'); ?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>Guestbook</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <h1>Guestbook</h1> <form action="posting.php" method="post"> <p> <textarea name="text" cols="30" rows="7"></textarea> <br> <input type="text" name="username" value="Анонимус"> <input value="Submit" type="submit"> </p> </form> <hr> <?php $posts = mysql_query("SELECT * FROM `guestbook` ORDER BY `date` DESC"); while ($row = mysql_fetch_assoc($posts)): ?> <p><b><?php echo htmlspecialchars($row['name'])?></b> - <i><?php echo htmlspecialchars($row['date'])?></i><br> <?php echo nl2br(htmlspecialchars($row['text']))?></p><hr> <?php endwhile; ?> ;D