Шаблоны PHP – с PHP

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

В частности, я заинтересован в обработке:

  1. Обнаружение в повторяющемся блоке, является ли это первым или последним элементом
  2. Простое управление нечетными / четными случаями, такими как полосатый стол с зеброй или аналогичный
  3. Другая логика по модулю, где вы будете делать что-то каждый 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-теги, заставляет меня съеживаться.

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

 <?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"); 

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

http://www.tinybutstrong.com

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

В файле 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 ? Единственная система шаблонов, в которой за ней стоит орган стандартов. Работает одинаково на всех языках программирования. Изучите его один раз, используйте его везде!

    Компоненты Symfony: Templating

    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; ?>