Какое из самых элегантных шаблонов (желательно в чистом 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-теги, заставляет меня съеживаться.
Вам не нужно открывать теги несколько раз. Вы также можете сделать функцию из нее, если вы делаете то же самое несколько раз:
<?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 (например, для разбиения таблицы на зебра):
$("tr:odd").addClass("odd"); $("tr:even").addClass("even");
Крошечный, но сильный
Это не делает умную ошибку встраивания другого макроязыка на страницу, но позволяет вам обрабатывать каждую практическую проблему с веб-дисплеем, которую я когда-либо бросал на нее. В частности, приведенные выше нечетные / четные конструкции являются поворотными. Для чего-то вроде вашего кода, выбираемого из таблицы базы данных
В файле 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>
Небольшая помощь при циклировании:
<? $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 для стиля первого по-разному.
Это не чистый 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>
вы считали phptal ?. одним из основных преимуществ этого (или чего-то подобного) является то, что вы получаете шаблоны, которые могут пройти проверку. Большинство механизмов шаблонов php, похоже, игнорируют это.
Я использую PHPTAL для шаблонов, потому что он написан на 100% фактическом HTML с данными заполнителя, поэтому он даже работает в редакторе WYSIWYG для веб-дизайнера. Это, и это просто легко понять.
Вот как это будет выглядеть для меня. Пожалуйста, простите разметку, я здесь новый, и четыре пробела не работают для меня (список был списком, а не разметкой).
Код PHP:
$ tal = новый PHPTAL; $ TAL-> setTemplate ( 'people.htm') -> set («люди», массив («Джон», «Джек», «Джилл», «Джейсон»)); echo $ tal-> execute ();
Шаблон:
<UL> <li tal: repeat = "person people" tal: content = "person"> John Doe </ li> </ UL>
Вывод:
Джон разъем Джил Джейсон
Теперь, очевидно, я бы не сделал шаблон для этого мало, но я мог бы использовать макрос для него или построить целую страницу и включить эту переменную. Но ты получил идею. Использование PHPTAL только утроило мою скорость при шаблонизации и программировании, просто по простоте (без нового синтаксиса, чтобы узнать, как smarty).
Как насчет XSLT ? Единственная система шаблонов, в которой за ней стоит орган стандартов. Работает одинаково на всех языках программирования. Изучите его один раз, используйте его везде!
alt text http://img.ruphp.com/templates/components
Symfony намерена перейти к новой системе шаблонов, основанной на легкой ветке шаблонов PHP-шаблонов.
Ведущий разработчик Fabien Potencier объясняет это решение: http://fabien.potencier.org/article/35/templating-engines-in-php-follow-up
На Symfony обычно можно ответить, чтобы принимать очень обоснованные решения по таким вопросам, поэтому эта структура должна быть чем-то, что нужно изучить .
Компонент находится здесь: http://components.symfony-project.org/templating/
В прошлом я использовал Smarty Template Engine . Это довольно солидно. И, как вы, вероятно, можете сказать с сайта; он имеет довольно большую пользовательскую базу и регулярно обновляется.
Это также в чистом PHP.
Savant – легкий, простой PHP-шаблон. Версия 2 имеет плагин цикла, похожий на Smarty, упомянутый ранее. Мне не удалось найти ссылку на тот же плагин в версии 3, но я уверен, что вы могли бы написать его довольно легко.
Если нужно применить стиль CSS, почему бы вам не использовать селектор: nth-of-type (odd).
Например: li: nth-of-type (нечетный) {background: # f2f6f8; background: linear-gradient (top, # f2f6f8 0%, # e0eff9 100%); }
http://jsfiddle.net/melonangie/nU7qK/ enter code here
Я использую Modulo, как вы делали в вашем примере все время.
Если то, что сжимает вас, является открывающим и закрывающим тегами, напишите функцию, которая создает строку html, а затем вернет ее. По крайней мере, это сэкономит вам несколько тегов.
Я был поклонником HAML довольно долгое время, похоже, что у людей с PHP теперь есть HAML: см. http://phphaml.sourceforge.net/
<?= ($i++ % 2 === 0) ? 'odd' : 'even' ?>
Вы делаете это наоборот. Ваш первый элемент теперь называется даже вместо нечетного. Используйте ++ $ i.
У меня такая же проблема. Но я думаю, что ваше оригинальное решение является самым аккуратным. Поэтому я пойду с этим.
Я создал простую систему шаблонов в 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>
<?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; ?>