За последние 24 часа нас посетили 60657 программистов и 1745 роботов. Сейчас ищет 1171 программист ...

Простейший шаблонизатор с использованием самого пхп

Тема в разделе "Решения, алгоритмы", создана пользователем Gromo, 1 ноя 2010.

  1. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    если это про 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"
     
  2. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Я считаю что да. Т.е это имхо нормально если шаблон вида:
    PHP:
    1.  
    2. <table>
    3. <?php foreach($array as $value):?>
    4.    <tr>
    5.       <td><?php echo htmlspecialchars($value);?></td>
    6.    </tr>
    7. <?php endforeach;?>
    8. </table>
    9.  
    Это нормально, ибо $value это оригинальные данные которые помимо шаблона может быть пригодиться посылать куда-то ещё в совершенно другом формате (т.е htmlspecialchars это забота именно шаблонизатора)
     
  3. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Dagdamor
    Vladson прав. К тому же есть варианты, когда сами модели могут перед отдачей данных во view эскейпить их. Шаблон пишется один раз и лишний раз поставить эскейп данных не страшно.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Костян
    спс!
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Vladson
    тоже так считаю =)
    Хотя сам чаще экранирую сразу при вставке в БД. обычно это более рационально.
     
  6. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Всё должно обрабатываться и эскейпиться в представлении, даже если в вид передаётся дата рождения пользователя, а её надо представить в двух других форматах - всё это делается в представлении. Тем более никто не мешает писать так:
    PHP:
    1.  
    2.   <div><?php echo $t->d($t->user_date, 'Y-m-d')?></div>
    3.   <table>
    4.   <?php foreach($t->array as $value):?>
    5.     <tr>
    6.         <td><?php echo $t->e($value);?></td>
    7.     </tr>
    8.   <?php endforeach;?>
    9.   </table>
    10.  
    Хелперы представления сделают всё, что хотите гибко, просто и быстро.
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Главное - эскейпить надо в одном месте, в каком именно - решайте сами ))
     
  8. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Vladson
    Мой вопрос был в другом - "не лень писать htmlspecialchars() снова и снова"? Как я понимаю, ответ - "нет, не лень" ;)
    Насчет экранирования прямо перед выводом согласен, тоже всегда так делаю и никогда не храню экранированные данные в БД.

    Gromo
    То есть, если вспомогательный шаблон вызывается в цикле, файл и инклудиться будет много раз? Имхо, не вариант.
    И все тот же вопрос: что, если вспомогательных шаблонов много? Скажем, штук 20-30 на странице (для не шибко примитивных сайтов это норма). Каждый раз инклудить/читать 20-30 файлов? Учтите, даже столь ненавидимый вами Смарти начал от этой стратегии понемногу уходить.
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Dagdamor
    А не достаёт постоянно писать foreach ($something as $bla) ... ?
    Код всёравно надо писать. Можно настроить сокращения скажем htsc -> htmlspecialchars, fnc -> function () {} и.т.д.

    Что до вспомогательных шаблонов - я обычно не делаю их. Я делю только на логические отдельные блоки, поэтому обычно у меня в худшем случае ну может 7-10 шаблонов на самую сложную страницу. Если нужно больше - значит что-то уже делается не так. Да и постепенный уход сайтов к AJAX навигации сильно упрощает жизнь.
     
  10. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    А это плохо?
     
  11. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Нет, ответ "проще один раз в шаблоне, чем бегать по скрипту искать какие бы данные отескейпить..."

    Данные это данные, в шаблон должны идти они, и там они уже должны форматироваться (в HTML если это HTML-шаблонизатор, в XML если это RSS, и для мыла и для итд/итп)

    Данные надо обрабатывать не в зависимости откуда они пришли, а в зависимости куда они уйдут ! © dark-demon.
     
  12. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    обычно для этого в шаблоне и делают циклы, если один и тот же кусок повторяется много раз. и правильнее данный цикл делать именно в шаблоне, а не в коде инклюдить по многу раз.

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

    Для дизайнеров или посторонних лиц, конечно же, твиг по вопросу безопасности намного лучше.
     
  13. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    можно даже так <?php $t->html($t->var)?>
     
  14. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    а тут уже своё представление, если данные отдаёются json-ом то их надо эскейпить перед json_encode, и это тоже будет в представлении или в аджакс экшенах, где данные будут передаваться уже обработанными...
     
  15. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    а что реально дофига пользователей радактируют шаблоны или верстальщиков? С теми с кем я работал еще ни одного не видел....
     
  16. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    ТОВАРИЩИ !!!

    Вспомните что такое "шаблонизатор" (попробуйте написать любое приложение на том-же "Перл" или "Си") и вы поймёте что я прав
     
  17. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    АААААААА !!!
     
  18. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    АААААААА +1 :)
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Недогоняю. Если эскейпнуть дважды одну и ту же строку htmlspecialchars, получится типа
    HTML:
    1. Preved, &amp;lt;b&amp;gt;world!&amp;lt;/b&amp;gt;
     
  20. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    [vs] не надо "дважды" надо чтоб "слешами занимался мускул, тегами занимался html-щик, а лизанием жопы занимался манагер" каждый должен быть на своём месте, и чтоб они друг другу они не мешали...
     
  21. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Костян
    Ужоснахбля :/
     
  22. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    igordata
    О тёлках и сиськах это в помойке. Так что извини, deleted :p
     
  23. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    В общем по теме, чем дальше в лес, тем больше кажется что такой КАЗАЛОСЬ БЫ говнокод, вовсе не настолько и является то таковым...
    PHP:
    1. <?php
    2. mysql_connect('localhost', 'root', '');
    3. $posts = mysql_query("SELECT * FROM `guestbook` ORDER BY `date` DESC");
    4. ?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
    5.  
    6. <title>Guestbook</title>
    7. <meta http-equiv="content-type" content="text/html; charset=utf-8">
    8.  
    9. <h1>Guestbook</h1>
    10. <form action="posting.php" method="post">
    11.     <p>
    12.         <textarea name="text" cols="30" rows="7"></textarea>
    13.         <br>
    14.         <input type="text" name="username" value="Анонимус">
    15.         <input value="Submit" type="submit">
    16.     </p>
    17. </form>
    18.  
    19. <hr>
    20. <?php while ($row = mysql_fetch_assoc($posts)): ?>
    21.     <p><b><?php echo htmlspecialchars($row['name'])?></b> - <i><?php echo htmlspecialchars($row['date'])?></i><br>
    22.     <?php echo nl2br(htmlspecialchars($row['text']))?></p><hr>
    23. <?php endwhile; ?>
     
  24. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Vladson
    это легко превратить в НАСТОЯЩИЙ говнокод!
    PHP:
    1.  <?php
    2.  mysql_connect('localhost', 'root', '');
    3.  mysql_select_db('test');
    4.  ?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
    5.  
    6.  <title>Guestbook</title>
    7.  <meta http-equiv="content-type" content="text/html; charset=utf-8">
    8.  
    9.  <h1>Guestbook</h1>
    10.  <form action="posting.php" method="post">
    11.      <p>
    12.          <textarea name="text" cols="30" rows="7"></textarea>
    13.          <br>
    14.          <input type="text" name="username" value="Анонимус">
    15.          <input value="Submit" type="submit">
    16.      </p>
    17.  </form>
    18.  
    19.  <hr>
    20.  <?php
    21.  $posts = mysql_query("SELECT * FROM `guestbook` ORDER BY `date` DESC");
    22.  while ($row = mysql_fetch_assoc($posts)): ?>
    23.      <p><b><?php echo htmlspecialchars($row['name'])?></b> - <i><?php echo htmlspecialchars($row['date'])?></i><br>
    24.      <?php echo nl2br(htmlspecialchars($row['text']))?></p><hr>
    25.  <?php endwhile; ?>
    26.  
    ;D
     
  25. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    *ушел писать ~twig*