Шаблоны 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: шаблоны
(источник: 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;
?>