Шаблоны PHP - с PHP

Какое самое элегантное решение для шаблонов (желательно в чистом PHP!), которое вы видели?

В частности, меня интересует обработка:

  • Обнаружение в повторяющемся блоке того, является ли он первым или последним элементом
  • Простая обработка нечетных/четных случаев, таких как таблица с полосками зебры или аналогичная
  • Другая логика modulos, где вы будете делать что-то каждый n-й раз.

Я ищу что-то, что делает это меньше боли:

<?php
$persons = array('John', 'Jack', 'Jill', 'Jason');
?>

<?php $i = 0; ?>
<?php if (isset($persons)): ?>
<ul>
<?php foreach ($persons as $name): ?>
    <li class="<?= ($i++ % 2 === 0) ? 'odd' : 'even' ?>"><?= $name ?></li>
<?php endforeach ?>
</ul>
<?php endif ?>

Неужели на самом деле нужно сделать что-то вроде этого ниже?

<ul>
    <li class="odd">John</li>
    <li class="even">Jack</li>
    <li class="odd">Jill</li>
    <li class="even">Jason</li>
</ul>

Является ли это только тем, что нахожу вышеприведенное почти отвратительным?

Все те, кто запускает и закрывает php-теги, заставляет меня съеживаться.

Ответ 1

Вам не нужно открывать теги несколько раз. Вы также можете сделать функцию из нее, если вы делаете одно и то же несколько раз:

<?php
function makeul($items, $classes) {
  $c = count($classes);
  $out = "";

  if (isset($items) && count($items) > 0) {
    $out = "<ul>\n";
    foreach ($items as $item) {
      $out .= "\t<li class=\"" . $classes[$i++%$c] . "\">$item</li>\n";
    }
    $out .= "</ul>\n";
  }
  return $out;
}
?>

other page content

<?php
$persons = array('John', 'Jack', 'Jill', 'Jason');
$classes = array('odd', 'even');
print makeul($persons, $classes);
?>

Кроме того, если вы не против использования Javascript, Jquery упрощает выполнение mod 2 (например, для полоса зебры a таблицу):

$("tr:odd").addClass("odd");
$("tr:even").addClass("even");

Ответ 2

Крошечный, но сильный

www.tinybutstrong.com

Это не делает ошибку smarty встраивания другого макроязыка на страницу, но позволяет вам обрабатывать каждую практическую проблему с веб-дисплеем, которую я когда-либо бросал на нее. В частности, приведенные выше нечетные/четные конструкции являются поворотными. Для чего-то вроде вашего кода, выбираемого из таблицы базы данных

В файле PHP

$TBS->MergeBlock('blk1',$sqlconnect, "SELECT name from people ");

И в файле HTML

<ul>
    <li class="odd">[blk.name;block=ul]</li>
    <li class="even">[blk.name;block=ul]</li>
</ul>

И что это. Обратите внимание, что HTML полностью совместим с Dreamweaver. Кроме того, если бы я хотел сделать эту альтернативу по трем стилям линии, мне нужно было бы добавить дополнительную строку, возможно, с разными классами, поэтому

<ul>
    <li class="linestyle1">[blk.name;block=ul]</li>
    <li class="linestyle2">[blk.name;block=ul]</li>
    <li class="linestyle3">[blk.name;block=ul]</li>
</ul>

Ответ 3

Небольшая помощь при циклировании:

<? $b=false; foreach($MyList as $name) { ?>
   <li class="row<?= $b=!$b ?>"><?= htmlspecialchars($name); ?></li>
<? } ?>

Говоря $b=!$b, он автоматически чередуется между true и false. Так как ложные отпечатки как ", а true печатаются как" 1", то, определяя классы css row и row1, вы можете получить свои строки изменений без каких-либо проблем.

рассмотрим использование :first-child css для стилизации первого по-другому.

Ответ 4

Это не чистый PHP (синтаксис templating then), но он работает очень хорошо; Smarty.

Для петель, которые вы можете сделать:


<ul>
{foreach from=$var name=loop item=test}
  {if $smarty.foreach.loop.first}<li>This is the first item</li>{/if}
  <li class="{cycle values="odd,even"}">{$var.name}</li>
  {if $smarty.foreach.loop.last}<li>This was the last item</li>{/if}
{/foreach}
</ul>

Ответ 5

Вы считали phptal?. одним из основных преимуществ этого (или чего-то подобного) является то, что вы получаете шаблоны, которые могут пройти проверку. Большинство механизмов шаблонов php, похоже, игнорируют это.

Ответ 6

Я использую PHPTAL для шаблонов, потому что он написан на 100% фактическом HTML с данными заполнителя, поэтому он даже работает в WYSIWYG редактор для веб-дизайнера. Это и просто понять легко.

Вот как это будет выглядеть для меня. Прошу простить разметку, я здесь новый, и четыре блока пробелов не работают для меня (список был списком, а не разметкой).

Код PHP:

  $tal = new PHPTAL;
  $tal->setTemplate('people.htm')
      ->set('people', array('John', 'Jack', 'Jill', 'Jason'));
  echo $tal->execute();

Шаблон:

  <ul>
    <li tal:repeat="person people" tal:content="person">John Doe</li>
  </ul>

Вывод:

Джон Джек Jill Джейсон

Теперь, очевидно, я бы не сделал шаблон для этого мало, но я мог бы использовать макрос для него или создать целую страницу и включить эту переменную. Но ты получил идею. Использование PHPTAL только что утроило мою скорость при шаблонизации и программировании, просто по простоте (без нового синтаксиса, чтобы узнать, как smarty).

Ответ 7

Как насчет XSLT? Единственная система шаблонов, в которой за ней стоит орган стандартов. Работает одинаково на всех языках программирования. Изучите его один раз, используйте его везде!

Ответ 8

Компоненты Symfony: шаблоны

alt text
(источник: symfony-project.org)

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

Ведущий разработчик Фабьен Потенциер, объясняет решение здесь: http://fabien.potencier.org/article/35/templating-engines-in-php-follow-up

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

Компонент находится здесь: http://components.symfony-project.org/templating/

Ответ 9

Я использовал Smarty Template Engine в прошлом. Это довольно солидно. И, как вы, вероятно, можете сказать с сайта; он имеет довольно большую пользовательскую базу и регулярно обновляется.

Он также в чистом PHP.

Ответ 10

Savant - это простой, простой PHP-шаблон. В версии 2 есть плагин cycle, похожий на Smarty, упомянутый ранее. Я не смог найти ссылку на тот же плагин в версии 3, но я уверен, что вы могли бы написать его довольно легко.

Ответ 11

Если нужно применить стиль CSS, почему бы вам не использовать селектор: nth-of-type (нечетный).

Например:   li: nth-of-type (нечетный) {       фон: # f2f6f8;       background: linear-gradient (top, # f2f6f8 0%, # e0eff9 100%);   }

http://jsfiddle.net/melonangie/nU7qK/ enter code here

Ответ 12

Я использую Modulo, как вы делали в вашем примере все время.

Ответ 13

Если то, что сжимает вас, является открывающим и закрывающим тегами, напишите функцию, которая создает строку html, а затем вернет ее. По крайней мере, это сэкономит вам несколько тегов.

Ответ 14

Я долгое время был поклонником HAML, похоже, что у PHP-людей теперь есть HAML: см. http://phphaml.sourceforge.net/

Ответ 15

<?= ($i++ % 2 === 0) ? 'odd' : 'even' ?>

Вы делаете это наоборот. Ваш первый элемент теперь называется даже вместо нечетного. Используйте ++ $i.

У меня такая же проблема. Но я думаю, что ваше оригинальное решение является самым аккуратным. Поэтому я пойду с этим.

Ответ 16

Я создал простую систему шаблонов в PHP для решения этой проблемы некоторое время назад:

http://code.google.com/p/templatephp/

Он принимает многомерный массив и требует добавления некоторых дополнительных тегов в HMTL для создания комбинированного шаблона.

Это не так сложно (хотя и мощный), как Smarty и некоторые другие солитоны, но много раз выигрывает в простоте. Демонстрация создания меню:

<p>Main Menu</p>
<ul>
{block:menu_items}
        <li><a href="{var:link}">{var:name}</a></li>
{/block:menu_items}
</ul>

Слияние с...

    array (
        'menu_items' => array (
                array (
                        'link' => 'home.htm',
                        'name' => 'Home'
                ),
                array (
                        'link' => 'about.htm',
                        'name' => 'About Us'
                ),
                array (
                        'link' => 'portfolio.htm',
                        'name' => 'Portfolio'
                ),
                array (
                        'link' => 'contact.htm',
                        'name' => 'Contact Us'
                )
        )
);

Создает меню...

<p>Main Menu</p>
<ul>
        <li><a href="home.htm">Home</a></li>
        <li><a href="about.htm">About Us</a></li>
        <li><a href="portfolio.htm">Portfolio</a></li>
        <li><a href="contact.htm">Contact Us</a></li>
</ul>

Ответ 17

<?php
    define ('CRLF', "\r\n");
    $persons = array('John', 'Jack', 'Jill', 'Jason');

    $color = 'white'; // Init $color for striped list
    $ho = '<UL>' . CRLF; // Start HTML Output variable
    foreach ($persons as $name)
    {
       $ho .= '  <li class="' . $color . '">' . $name . '</li>' . CRLF;
       $color = ($color == 'white') ? 'grey' : 'white'; // if white, make it grey else white
    }
    $ho .= '</ul>' . CRLF;
    echo $ho;
?>