Дешевый php шаблонизатор с vprintf? - PullRequest
2 голосов
/ 08 мая 2009

Хорошо, поэтому printf / sprint / vprintf все принимают определенный синтаксис спецификатора типа% [num] [type]. (http://us2.php.net/sprintf см. Примеры 3 и 4) Где num - индекс для типа.

Пример: vprintf ('Number% 1 $ d строка% 2 $ s. Строка% 2 $ s, число% 1 $ d', массив (1, "нет"));

Да, оно ограничено ... И вам нужно будет поддерживать индексы. Но он родной для языка и (я думаю) быстрый.

Я просто хочу кое-что подумать о том, насколько это было бы полезно, как, скажем, второй этап, примерно так: http://www.techfounder.net/2008/11/18/oo-php-templating/.

(и если кто-нибудь знает о скорости printf / vprintf, это будет оценено)

полный пример того, о чем я говорю:

frontpage.php:

<html>

<head>

<title> %1$s </title>

</head>

<body>

Hello %2$s! You have reached page: %1$s!

</body>

</html>

what.php:

ob_start();

include frontpage.php;

$ob_output = ob_get_clean();

vprintf($ob_output,"Page Title","Bob");

Ответы [ 3 ]

6 голосов
/ 08 мая 2009

Если вы хотите дешевый PHP-шаблонизатор, используйте отдельные файлы с блоками выражений PHP. Можно создать систему шаблонов, используя строки формата printf, но при таком подходе я вижу две основные проблемы: скорость и удобочитаемость. Функции printf предназначены для использования на более коротких строках, и хотя у меня нет никакой статистики, я думаю, можно с уверенностью сказать, что sprintf() или vprintf() на одной огромной строке, представляющей тело страницы будет медленнее, чем просто использование блоков выражений PHP в файле.

Это приводит к следующей проблеме: удобочитаемость. Сравните эти два HTML-шаблона:

<html>
<head>
   <title>%s</title>
</head>
<body>
<div id="main">
    <h1>%s</h1>
    <p>%s</p>
</div>
<div id="other">
    <p>%s</p>
</div>
<p id="footer">
    %s. Took %.2f seconds to generate.
</p>
</body>
</html>

и

<html>
<head>
   <title><?= $title ?></title>
</head>
<body>
<div id="main">
    <h1><?= $header ?></h1>
    <p><?= $body_text ?></p>
</div>
<div id="other">
    <p><?= $misc_info ?></p>
</div>
<p id="footer">
    <?= $copyright ?>. Took <?= $load_time ?> seconds to generate.
</p>
</body>
</html>

Или, допустим, я решил использовать строки формата с индексированными аргументами. Скажем, что-то вроде этого:

<h1>%1$s</h1>
<p>%2$s</p>
<span id="blah">%3$s</p>
<p>%4$s</p>
<p>%5$s</p>

А что если я захочу изменить порядок?

<h1>%1$s</h1>
<p>%3$s</p>
<span id="blah">%5$s</p>
<p>%4$s</p>
<p>%2$s</p>

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

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

3 голосов
/ 08 мая 2009

У меня обычно есть два файла:

  • Контроллер некоторого вида (recipes.controller.php переписан в / recipes / 123)
  • Одно из многих представлений для контроллера (recipes.view.html)

Я просто делаю всю логику / работу с базой данных в контроллере, а затем включаю соответствующий вид в конце. Представление имеет доступ ко всем переменным в контроллере, поэтому у меня уже есть такие вещи, как $ title, $ ингридиенты [] и т. Д. Я не совсем уверен, почему люди делают это более сложным, чем это. Это очень легко следовать.

Файл вида в основном будет выглядеть так:

<html>
<head>
<title><?=$title ?></title>
</head>
etc...
1 голос
/ 08 мая 2009

Расмус Лердорф, создатель PHP, предпочитает включать свои переменные примерно так:

    <select class="f" name="cat" id="f_cat" size="1">
      <option selected>Category</option>
<?php foreach($categories as $cat) echo <<<EOB
      <option value="{$cat}">{$cat}</option>

EOB;
?>

Для справки: <<<EOB - EOB; - это heredoc .

Источник: PHP-структура MVC без фреймворка , автор Расмус Лердорф

...