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

Думаю, этого забили до смерти.

Joe Phillips 02.10.2008 22:40

Да, по фьордам не тосковать :)

da5id 03.10.2008 02:52

Этот код менее сложен, чем в принятом ответе;)

Franz 11.03.2010 15:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
20
3
17 293
17

Ответы 17

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

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

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>

+1 Tiny But Strong абсолютно невероятный. Как только вы научитесь использовать магниты, создание шаблонов станет на порядки проще.

Sean Vieira 06.04.2010 00:23

+1 Однозначно. Невероятно легкий!

Industrial 24.05.2010 17:12

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

Не могу поверить, что кто-то предлагал это в 2008 году! Я почти чувствую, что знаю, кто это! '

Robert Moskal 14.05.2019 05:14

Это не чистый 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 - одна из худших публичных библиотек на свете.

Peter Bailey 02.10.2008 23:02

И почему это одна из худших публичных библиотек?

fijter 02.10.2008 23:26

У меня недостаточно места в этих комментариях, чтобы написать настоящий ответ, но в основном потому, что это совершенно другой язык, и в этом есть много ошибок. Ремонтопригодность, производительность, переносимость и т. д. Я не согласен с этим подходом к разработке.

Peter Bailey 02.10.2008 23:47

И этот пример выглядит совершенно ужасно! Я возьму: "<? Php ul ($ users);?>" В любой день.

Bobby Jack 04.11.2008 13:52

-1 согласился. Смарти - зло. Он просто заставляет вас использовать языки сценариев двана той же странице. Есть способы получше

Cruachan 06.02.2009 00:30

Я считаю, что Smarty тоже не очень безопасен.

Eli 27.06.2009 22:27

Лично Smarty - один из немногих фреймворков для PHP (кроме Zend), который, на мой взгляд, стоит использовать удаленно. Стоит отметить, что сам сайт W3C использует Smarty (проверьте источник w3.org).

Iain Collins 11.01.2010 20:11

Раньше я использовал Smarty Template Engine. Это довольно солидно. И как вы, вероятно, можете сказать по веб-сайту; Он имеет довольно большую пользовательскую базу и регулярно обновляется.

Это тоже на чистом PHP.

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

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

Sean McSomething 17.06.2009 04:49

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

<?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 уже предлагает себя в качестве языка шаблонов. Вы можете отказаться от аргумента «классы» (по крайней мере, в случае по умолчанию), поскольку классы обычно будут «нечетными» + «четными».

Bobby Jack 04.11.2008 13:50

ну, функция написана более универсально, поэтому вы также можете передать более двух альтернатив для классов. как видите, по модулю берется значение count ($ classes).

markus 08.12.2008 12:56

99%: "\" ". Htmlspecialchars ($ classes [$ i ++% $ c]." \ ">". Htmlspecialchars ($ item) / "</li> \ n";

jmucchiello 09.01.2009 06:23

Savant - это легкий, чистый PHP-шаблонизатор. Версия 2 имеет плагин цикл, аналогичный упомянутому ранее Smarty. Мне не удалось найти ссылку на тот же плагин в версии 3, но я уверен, что вы могли бы написать его довольно легко.

Я использую 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>

    starmonkey 25.11.2008 07:56

    Не читаете руководство достаточно внимательно? ;) 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" /> делает свое дело.

    Vadim Ferderer 27.06.2009 12:36

    Я довольно давно являюсь поклонником 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), а не встроено в шаблон. Избавляет от головной боли.

    Meep3D 01.12.2009 16:39

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

    alt text
    (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 не использовался при первоначальной публикации вопроса.

    user559633 15.05.2013 23:40

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

    Другие вопросы по теме