Какие проблемы вы обнаружите в этом ОЧЕНЬ базовом движке шаблонов в PHP, используя eval? - PullRequest
0 голосов
/ 14 сентября 2010

Уже несколько лет я использую свой собственный шаблонизатор 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 для упрощения рендеринга шаблона, но я ищу другие вещи Скорее всего, я упустил из виду или совсем забыл или просто упустил знание.

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

1 Ответ

1 голос
/ 14 сентября 2010

Я полагаю, что другие языки решают эту проблему, предлагая разметку на стороне сервера, например, элемент управления ретранслятором asp , и я нашел этот вопрос и здесь, который предлагает вам придерживаться своего решения и дает -1 человеку, который предлагает свернуть свои собственные шаблоны тегов, чтобы добиться того же самого ... возможно, это просто не становится намного проще, а построение - это чрезмерный дизайн.

...