Разделение содержимого PHP

Таким образом, мы все знаем, что вы всегда должны, не только в PHP, отделять код от content / design / html. (Я видел людей, которые сегодня говорят об обратном)

Я имею в виду, вы не хотите, чтобы один из них был в больших проектах, не так ли?

<?php echo '<div id="blah"><b>' . $username . '</b>' . $stuff . '<more HTML mixed with PHP...>'; ?> 

Но: Что такое хороший подход к отдельным кодам из контента?

Я использовал простую систему шаблонов, которая в основном заменяет шаблоны в шаблонах.

например:

 <div id="blah"><b>%USERNAME%</b>%STUFF% <...> 

(находится в одном файле)

Позже вы можете просто вызвать функцию, похожую на GetTemplate( 'myTemplate', array ( 'USERNAME' => 'Stranger' ) );

Наконец, вопросы:

  • Это хороший способ разделения кода и контента?
  • Как вы это делаете, когда не работаете с каркасом?
  • Есть ли способ лучше?

Я не поклонник дополнительных языков шаблонов (которые заменяют подстановочные знаки), вместо этого мне нравится сохранять мои шаблоны в чистом php, поэтому моя верность тому, что вы сделали, будет:

<div id="blah"><b><?php echo $username ?></b><?php echo $stuff ?><...>

echo GetTemplate( 'myTemplate.php', array ( 'username' => 'Stranger', 'stuff' => 'Stuff' ) );

 function GetTemplate($templatePath, array $vars = array()) { extract($vars); ob_start(); include($templatePath); return ob_get_clean(); } 

Я также комбинирую это с вспомогательными функциями / объектами-> методами, например:

<?php echo link_to($name, $url); ?>

 function link_to($name, $url, array $attributes = array()) { $attributes['href'] = urlencode($url); foreach($attributes as $attrib => $value) { $attributes[$attrib] = $attrib."=\"$value\""; } return sprintf('<a %s>%s</a>', implode(" ",$attributes), $name); } 

Обычно я применяю такие помощники к обычно используемым тэгам / структурам, а также к тегу html общего назначения, который выглядит примерно как content_tag($tag, $content, $attributes); Это помогает мне избежать php-эха для тонны атрибутов для случайных меток. Я, очевидно, не использую его для каждого html-тега, который я использую только для тех, где он обеспечивает лучшую читаемость, чем тонна эха.

Что касается шаблонов двигателей, я действительно не вижу преимущества, поскольку php является языком шаблонов. Что касается не-программистов / кодировщиков, они должны использовать синтаксис для цикла и переменной, так как я не вижу, как изменение его на подстановочные знаки или синтаксис {} smarty добавляет что-либо.

вы должны понимать, что сам PHP является языком шаблонов . ваш

 <div id="blah"><b>%USERNAME%</b>%STUFF% <...> 

отличается от

 <div id="blah"><b><?php echo $USERNAME; ?></b><?php echo $STUFF; ?> <...> 

только очень поверхностно. php, довольно глупо с его комментариями и предупреждениями вместо исключений (точка Python имеет более PHP), и ваша пользовательская реализация может с большей легкостью позволить вам, например, бросить вместо того, чтобы генерировать фатальную ошибку (о радости Smarty), если положить логика в шаблон где-то оказывается меньшим из двух зол (циклов). вы можете захотеть выбросить, если в шаблоне упоминается неопределенная переменная (PHP выдаст УВЕДОМЛЕНИЕ) и т. д.

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

Большие проекты вроде phpBB работают с использованием шаблонов. Это немного сложнее, поскольку они также позволяют (для) списки, в том числе другие шаблоны и другие расширенные функции. Вы определенно хотите разделить код и контент.

В качестве бонуса это позволяет не программистам создавать ваш html.

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

Другим способом, который мне очень нравится, является подход, используемый платформой limonade, которая использует ob_start () и включает в себя, чтобы фактически обрабатывать шаблоны