Какое наиболее элегантное решение для создания шаблонов (желательно на чистом PHP!) Вы видели?
В частности, меня интересует обработка:
Я ищу то, что сделает это менее болезненным:
<?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-тегов заставляют меня съеживаться.
Да, по фьордам не тосковать :)
Этот код менее сложен, чем в принятом ответе;)






Я все время использую Modulo, как и вы в своем примере.
Крошечный, но сильный
Он не совершает хитрой ошибки встраивания другого макроязыка на страницу, но позволяет решить все практические проблемы веб-отображения, которые я когда-либо задавал. В частности, вышеупомянутые нечетные / четные конструкции - пустяк. Для чего-то вроде выбора кода из таблицы базы данных
В файле 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>
+1 Tiny But Strong абсолютно невероятный. Как только вы научитесь использовать магниты, создание шаблонов станет на порядки проще.
+1 Однозначно. Невероятно легкий!
Если вас смущают открывающие и закрывающие теги, напишите функцию, которая создает строку html и затем возвращает ее. По крайней мере, это сэкономит вам несколько тегов.
Не могу поверить, что кто-то предлагал это в 2008 году! Я почти чувствую, что знаю, кто это! '
Это не чистый PHP (синтаксис шаблонов), но он действительно хорошо работает; Умный.
Для циклов вы можете:
<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>
Я знаю, что это популярно, но я думаю, что Smarty - одна из худших публичных библиотек на свете.
И почему это одна из худших публичных библиотек?
У меня недостаточно места в этих комментариях, чтобы написать настоящий ответ, но в основном потому, что это совершенно другой язык, и в этом есть много ошибок. Ремонтопригодность, производительность, переносимость и т. д. Я не согласен с этим подходом к разработке.
И этот пример выглядит совершенно ужасно! Я возьму: "<? Php ul ($ users);?>" В любой день.
-1 согласился. Смарти - зло. Он просто заставляет вас использовать языки сценариев двана той же странице. Есть способы получше
Я считаю, что Smarty тоже не очень безопасен.
Лично Smarty - один из немногих фреймворков для PHP (кроме Zend), который, на мой взгляд, стоит использовать удаленно. Стоит отметить, что сам сайт W3C использует Smarty (проверьте источник w3.org).
Раньше я использовал Smarty Template Engine. Это довольно солидно. И как вы, вероятно, можете сказать по веб-сайту; Он имеет довольно большую пользовательскую базу и регулярно обновляется.
Это тоже на чистом PHP.
Вы считали phptal ?. одним из основных преимуществ этого (или чего-то подобного) является то, что вы получаете шаблоны, которые могут пройти проверку. большинство движков шаблонов php игнорируют это.
Не могу поручиться за phptal, но, использовав другую реализацию TAL в прошлом, это надежный язык шаблонов.
Не нужно открывать теги более одного раза. Вы также можете сделать из него функцию, если проделаете одно и то же несколько раз:
<?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 значительно упрощает работу с модом 2 (например, для разделения таблицы на зебру):
$("tr:odd").addClass("odd");
$("tr:even").addClass("even");
Полностью согласен с вами - не нужно усложнять решение, когда PHP уже предлагает себя в качестве языка шаблонов. Вы можете отказаться от аргумента «классы» (по крайней мере, в случае по умолчанию), поскольку классы обычно будут «нечетными» + «четными».
ну, функция написана более универсально, поэтому вы также можете передать более двух альтернатив для классов. как видите, по модулю берется значение count ($ classes).
99%: "\" ". Htmlspecialchars ($ classes [$ i ++% $ c]." \ ">". Htmlspecialchars ($ item) / "</li> \ n";
Я использую 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>
Выход:
John Jack Jill Jason
Очевидно, я бы не стал делать шаблон для этого маленького, но я мог бы использовать для него макрос или создать целую страницу и включить эту переменную. Но ты получил идею. Использование PHPTAL почти втрое увеличило мою скорость создания шаблонов и программирования, просто за счет простоты (нет нового синтаксиса, который нужно было изучать, как умный).
Как бы вы сделали полосатую зебру с помощью phptal? Я делал следующее, но это выглядит слишком многословно: <td tal: condition = "repeat / item / odd" tal: content = "item" class = "odd"> значение элемента </td> <td tal: condition = "repeat / item / even" tal: content = "item" class = "even"> значение элемента </td>
Не читаете руководство достаточно внимательно? ;) phptal.org/manual/de/split/tal-attributes.html <li tal: repeat = "name person" tal: attributes = "class php: repeat.name.odd? 'Odd': 'even'" tal: content = "name" /> делает свое дело.
Я довольно давно являюсь поклонником HAML, похоже, что у PHP-людей теперь есть HAML: см. http://phphaml.sourceforge.net/
Небольшая помощь по зацикливанию:
<? $b=false; foreach($MyList as $name) { ?>
<li class = "row<?= $b=!$b ?>"><?= htmlspecialchars($name); ?></li>
<? } ?>
Говоря $b=!$b, он автоматически меняет значение между истинным и ложным. Поскольку false печатает как "", а true печатает как "1", то, определив классы css row и row1, вы можете без проблем получить ваши изменяющиеся строки.
рассмотрите возможность использования :first-child css для другого стиля первого.
<?= ($i++ % 2 === 0) ? 'odd' : 'even' ?>
Вы делаете наоборот. Ваш первый элемент теперь называется четным, а не нечетным. Используйте ++ $ i.
У меня такая же проблема. Но я думаю, что ваше оригинальное решение - самое изящное. Так что я пойду с этим.
Как насчет XSLT? Единственная система шаблонов, за которой стоит орган по стандартизации. Работает одинаково для разных языков программирования. Узнай один раз, используй везде!
Некоторое время назад я создал простую систему шаблонов на 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>
В качестве побочного примечания чередование таблиц должно выполняться с помощью css (с использованием jquery), а не встроено в шаблон. Избавляет от головной боли.

(source: symfony-project.org)
Symfony намеревается перейти на новую систему шаблонов основан на облегченной системе шаблонов PHP веточка.
Ведущий разработчик Фабьен Потенсье объясняет свое решение здесь: http://fabien.potencier.org/article/35/templating-engines-in-php-follow-up
На Symfony обычно можно ответить, чтобы принять очень информированные решения по таким вопросам, поэтому этот фреймворк должен быть что-то посмотреть.
Компонент находится здесь: http://components.symfony-project.org/templating/
Если просто применить стиль CSS, почему бы вам не использовать селектор: nth-of-type (odd).
Например: li: nth-of-type (odd) { фон: # f2f6f8; фон: линейный градиент (сверху, # f2f6f8 0%, # e0eff9 100%); }
http://jsfiddle.net/melonangie/nU7qK/enter code here
Вопрос запрашивает PHP и относится к 2008 году. CSS3 не использовался при первоначальной публикации вопроса.
<?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;
?>
Думаю, этого забили до смерти.