LINUX.ORG.RU

Повторное использование куска кода (шаблона) в цикле

 


1

2

Сильно упрощённый пример.

Используются нативные шаблоны PHP.

Есть основной шаблон, в нём в цикле для каждого элемента в массиве выполнить код дополнительного шаблона. Если наиболее тупо то:

<ul>
  <?php foreach($this->items as $this->item): ?>
    <?php include('templates/items.php'); ?>
  <?php endforeach; ?>
</ul>

Сам templates/item.php например таков:

    <li><?= $this->item ?></li>

Но в цикле инклудить многократно файл не очень эффективно. Это ведь тут пример упрощённый, реальный код сложнее.

Другой вариант, чтобы исключить многократное подключение одного и того же файла это:

<ul>
  <?php foreach($this->items as $this->item): ?>
    <?php $this->templaPart('templates/items.php'); ?>
  <?php endforeach; ?>
</ul>

где templatePart() это

    public function templatePart($template)
    {
        if(isset(!$this->cached_templates[$template]))
        {
            $this->cached_templates[$template] = file_get_contents($template);
        }
        eval('?>'. $this->cached_template[$template]);
    }

Второй вариант уже поэффективнее, но eval...

Есть ли что получше без использования сторонних библиотек?

Deleted

Последнее исправление: pyroman (всего исправлений: 3)

eval -> evil

Генерируй код вместо eval и потом его подставляй в виде функции или класса.

Не используй лапшу в коде в виде php-вставок внутри html-кода т.к. это идет вразрез всем принципам MVC, да и вообще каша из смеси логики, данных, представления. Задумайся как это сопровождать и понимать.

Альтернатива MVC - разделяй данные, логику, представления на слои.

Это возможно использовать рекурсивно в каждом уровне при соответствующем уровне абстрагирования.

Самые крутые нативные шаблоны это XML+XSLT и им подобные технологии, их единственный недостаток сложность и неосиляторство. Можно свой велосипед: html-шаблон с плейсхолдерами и файл/поток данных для вставки. Можно в формате YAML или JSON. Наконец, задуматься о шаблонизации на стороне клиента, хотя там свои pros & cons

Лучше избегать безконтрольных include - организовать единую точку вызова, через автолоад.

Не хочешь зависимостей - в php достаточно встроенных средств.

anonymous
()
Ответ на: комментарий от anonymous

Генерируй код вместо eval и потом его подставляй в виде функции или класса.

Ну что-то такое шаблонизаторы типа Twig и делают, imho оверхед.

Не используй лапшу в коде в виде php-вставок внутри html-кода т.к. это идет вразрез всем принципам MVC, да и вообще каша из смеси логики, данных, представления. Задумайся как это сопровождать и понимать.

Это не php вставки, это имитация шаблонных тегов. По сути php имеет встроенный шаблонизатор. Какая разница, было бы в коде что-то типа

<ul>
{% for item in list %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

вместо

<ul>
  <?php foreach($list as $item): ?>
    <li><?= $item ?></li>
  <?php endforeach; ?>
</ul>
Что это меняет?

разделяй данные, логику, представления на слои.

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

Самые крутые нативные шаблоны это XML+XSLT и им подобные технологии, их единственный недостаток сложность и неосиляторство. Можно свой велосипед: html-шаблон с плейсхолдерами и файл/поток данных для вставки. Можно в формате YAML или JSON. Наконец, задуматься о шаблонизации на стороне клиента, хотя там свои pros & cons

Оверхед. Последний вариант не нравится. Ну он может сгодиться если это не совсем сайт, а интерактивное веб приложение какое-то, а не динамический документ типа wiki, форумов, cms и т.д.

Deleted
()
Ответ на: комментарий от anonymous

Да уж, в начале 2000 я делал мега-проект в котором как раз использовал в выводе xml+xslt, мне это казалось на то время верх совершенства. Что может быть универсальней генерировать XML, а потом трансформировать его через xslt? В то время, насколько помню, его понимали все браузеры(кажется за исключением IE, для него я прогонял через php+xslt и отдавал уже чистый html). Прошли года, а он так и не стал популярным. Да он сложный, нудный и для обычных сайтов это больше обуза, чем выигрыш. Хотя насколько я помню одно время он был «модным» и я часто замечал на сайтах эту связку.

gobot ★★★★
()
Ответ на: комментарий от Deleted

оверхед.

кому как

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

- это «самый ранний Рубенс» (c) - пока еще сложно назвать разделением на слои...

man logicless для начала

anonymous
()
Ответ на: комментарий от anonymous

совсем не обязательно в браузере его рендерить - можно и на сервере

Я естественно выполнял не в браузере, а вгетом, выкидывая выхлоп в /dev/null.

Deleted
()
Ответ на: комментарий от anonymous

man logicless для начала

А есть реальный пример? А то посмотрел я Mustache, который преподносится как logicless, но на самом деле логика там урезанная вполне себе есть, просто завуалированы. В чём смысл по сравнению с темплейтами типа django/jinja2 не понял.

Deleted
()
Ответ на: комментарий от Deleted

+100500

Абсолютно поддерживаю...

Единтвенная проблема что php слишком мощный, неопытный разработчик может запороть концепцию logicless view наговнякав бизнес-логики прямо во view...

dimzon
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.