PHP шаблоны - с PHP

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

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

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

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

<?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-тегов заставляют меня съеживаться.

17 ответов

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

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

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

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, он автоматически чередуется между истиной и ложью. Так как false печатает как "", а true печатает как "1", то путем определения классов CSS row а также row1Вы можете получить свои изменяющиеся строки без каких-либо проблем.

рассмотреть возможность использования :first-child CSS по-разному стилизовать первый.

Это не чистый 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>

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

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

PHP-код:

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

Шаблон:

  
  • Джон Доу

Выход:

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

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

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

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

    http://components.symfony-project.org/images/components/templating/home.png

    Symfony намеревается перейти на новую систему шаблонов, основанную на упрощенной ветке шаблонов PHP.

    Ведущий разработчик Фабьен Потенсьер объясняет решение здесь: 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(odd) { background: #f2f6f8; фон: линейный градиент (вверху, # f2f6f8 0%, # e0eff9 100%); }

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

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

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

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

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

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

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

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

    Я создал простую систему шаблонов в 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>
    
    Другие вопросы по тегам