Уже несколько лет я использую свой собственный шаблонизатор PHP, который на самом деле не «мой», как я видел его в уроке много лет назад. Тем не менее, я реорганизовал большую часть кода, чтобы сделать его проще и проще в использовании. Я редко делаю проект PHP без него.
Это очень просто, и у класса есть только 3 метода: load, assign и render. load
загружает файл шаблона (обычно HTML) и сохраняет его как строковую переменную. assign
позволяет назначать ссылки в HTML переменным в виде {reference}
. Визуализатор анализирует файл шаблона и заменяет ссылки переменными. Это в основном это. Очень простой, очень простой и экономящий время для меня.
Мне нравится этот шаблонизатор, потому что я ненавижу смешивать PHP с HTML и прочим. И поэтому я не очень люблю сам PHP как движок шаблонов (как шаблоны WordPress), хотя и очень мощный для таких вещей. Мне не нравится идея сохранять мои файлы в формате .php, а затем включать / требовать их с кучей смешанного PHP-кода, мне нравится быть простым.
Однако, поскольку этот шаблонизатор имеет элементарный элемент, он не учитывает условия и циклы, две очень важные вещи, которые иногда необходимы. До сих пор я работал над этой проблемой, разделяя файлы шаблонов, а затем выполнял все условия / циклы в контроллере. Например, у меня есть основной файл шаблона, в котором есть список <ul>
, в котором элементы поступают из базы данных, у меня будет отдельный файл шаблона с одной строкой кода для элемента <li>
. Выполните цикл в контроллере и визуализируйте столько <li>'s
, сколько необходимо.
Это было введение, чтобы вы понимали, откуда я. Теперь к реальному вопросу ...
Я размышлял и экспериментировал с альтернативами этому методу и начал использовать PHP в файлах шаблонов HTML с как можно меньшим количеством кода. Например, вот так:
<ul>
<?php foreach($array as $val): ?>
<li><?php echo $val; ?></li>
<?php endforeach; ?>
</ul>
А в контроллере что-то вроде этого:
// assuming the data comes from a
$array = array('Item 1', 'Item 2', 'Item 3'); database...
ob_start();
eval(' ?>'.$TPL->render('main').'<php ');
echo ob_get_clean();
- Первое, что я хочу сделать, это то, что это представляет для меня проблему. Это своего рода побеждает цель этого движка шаблонов. Там я звоню
echo $val
, где мне нужно заменить ссылку. Но разве не было бы совершенно идиотским иметь ссылку для замены в шаблоне рендеринга, когда у меня есть переменная $val
, ожидающая использования? Но мне также не нравится идея использования большого количества PHP-кода в моих файлах шаблонов, я бы предпочел избегать столько, сколько мог, не ставя под угрозу все это слишком много. Тем не менее, я не вижу, как я могу иметь ссылку вместо echo
и заменить ее на $val
для каждого цикла. Что вы думаете об этом?
- Во-вторых, мне бы хотелось узнать ваше мнение и [еще] вопросы, которые, по вашему мнению, могут иметь это решение. Или, если что-то не так в коде или как его можно улучшить и т. Д. ... Я знаю, что мог бы использовать дополнительный метод для выполнения всей буферизации вывода и eval для упрощения рендеринга шаблона, но я ищу другие вещи Скорее всего, я упустил из виду или совсем забыл или просто упустил знание.
Может быть, я слишком много задумываюсь об этом, может быть, я должен просто забыть обо всем этом и продолжать делать то же, что и последние несколько лет. Это сработало очень хорошо для меня и упростило все мои проекты. В конце концов, я в основном ищу способ упростить условия и циклы в моих файлах шаблонов, не требуя дополнительных файлов шаблонов, в некоторых только с несколькими простыми строками кода.