【问题标题】:PHP templates - with PHP [closed]PHP 模板 - 使用 PHP [关闭]
【发布时间】:2010-09-14 21:32:41
【问题描述】:

你见过的最优雅的模板(最好是纯 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-tags 的开始和结束都让我感到畏缩。

【问题讨论】:

  • 我想这个已经被打死了。
  • 是的,有点超出了对任何峡湾的渴望:)
  • 这段代码没有接受的答案复杂;)

标签: php templates


【解决方案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 的工作变得非常容易(例如,用于对表格进行斑马条纹处理):

$("tr:odd").addClass("odd");
$("tr:even").addClass("even");

【讨论】:

  • 在这里完全同意你的看法 - 当 PHP 已经将自己作为模板语言提供时,无需过度复杂化解决方案。您可以删除“类”参数(至少在默认情况下),因为类通常是“奇数”+“偶数”。
  • 好吧,这个函数写得更通用,所以你也可以为类传递两个以上的替代方案。如您所见,取模是根据 count($classes)。
  • 99%: "\"" . htmlspecialchars($classes[$i++%$c] . "\">" . htmlspecialchars($item) / "\n";
【解决方案2】:

小而强

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 绝对令人难以置信。一旦你学会使用磁铁,模板就会变得容易几个数量级。
  • +1 绝对。难以置信的轻量级!
【解决方案3】:

关于循环的小帮助:

<? $b=false; foreach($MyList as $name) { ?>
   <li class="row<?= $b=!$b ?>"><?= htmlspecialchars($name); ?></li>
<? } ?>

通过说$b=!$b,它会自动在真假之间交替。由于 false 打印为“”,而 true 打印为“1”,因此通过定义 css 类 rowrow1,您可以轻松更改行。

考虑使用:first-child css 为第一个设置不同的样式。

【讨论】:

    【解决方案4】:

    它不是纯 PHP(当时的模板语法),但它工作得非常好; 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>
    

    【讨论】:

    • 我知道它很受欢迎,但我认为 Smarty 是有史以来最糟糕的公共图书馆之一。
    • 为什么它是最糟糕的公共图书馆之一?
    • 我在这些 cmets 中没有足够的空间来写一个真正的答案,但基本上是因为它是一种完整的其他语言,并且有很多问题。可维护性、性能、可移植性等。这不是我同意的开发方法。
    • 这个例子看起来非常糟糕!我会接受:“” 任何一天。
    • -1 同意。聪明是邪恶的。它只是迫使您在同一页面中使用两种脚本语言。还有更好的方法
    【解决方案5】:

    你考虑过phptal吗?它(或类似的东西)的一个主要好处是您可以获得可以通过验证的模板。大多数 php 模板引擎似乎都忽略了这一点。

    【讨论】:

    • 不能保证 phptal,但在过去使用过另一种 TAL 实现,它是一种可靠的模板语言。
    【解决方案6】:

    我使用PHPTAL 作为模板,因为它是用 100% 实际的 HTML 和占位符数据编写的,所以它甚至可以在网页设计师的所见即所得编辑器中工作。这很容易理解。

    这就是我的样子。请原谅标记,我是新来的,四个空格块不适合我(列表是列表,而不是标记)。

    PHP 代码:

    $tal = 新 PHPTAL; $tal->setTemplate('people.htm') ->set('people', array('John', 'Jack', 'Jill', 'Jason')); 回声$tal->执行();

    模板:

    • John Doe

    输出:

  • 约翰
  • 杰克
  • 吉尔
  • 杰森
  • 现在显然我不会为这个小模板制作模板,但我可以为它使用宏或构建整个页面并包含该变量。但你明白了。使用PHPTAL 使我在模板和编程方面的速度几乎提高了三倍,仅仅是因为简单(无需像 smarty 那样学习新语法)。

    【讨论】:

    • 你将如何使用 phptal 进行斑马条纹处理?我正在执行以下操作,但它看起来太冗长了:item value 项目值
    • 没有仔细阅读手册? ;) phptal.org/manual/de/split/tal-attributes.html
    • 可以解决问题。
    【解决方案7】:

    XSLT 怎么样?唯一拥有标准机构的模板系统。跨编程语言的工作方式相同。一次学习,随处使用!

    【讨论】:

      【解决方案8】:

      Symfony 组件:模板


      (来源:symfony-project.org

      Symfony 打算迁移到基于轻量级 PHP 模板系统 twig 的新模板系统

      首席开发人员 Fabien Potencier 在此解释该决定: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(odd) 选择器。

            例如: li:nth-of-type(奇数){ 背景:#f2f6f8; 背景:线性渐变(顶部,#f2f6f8 0%,#e0eff9 100%); }

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

            【讨论】:

            • 问题要求 PHP 并且是从 2008 年开始的。当提问者最初发布时,CSS3 不是一个选项。
            【解决方案12】:

            我一直使用模数,就像您在示例中所做的那样。

            【讨论】:

              【解决方案13】:

              如果让您畏惧的是开始和结束标签,请编写一个函数来创建 html 字符串,然后让它返回它。至少它会为你节省一些标签。

              【讨论】:

              • 我不敢相信有人在 2008 年提出这个建议!我几乎觉得我知道它是谁!'
              【解决方案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>
                  

                  【讨论】:

                  • 附带说明,表的条带化应该使用 css(使用 jquery)完成,而不是内置到模板中。省去了很多麻烦。
                  【解决方案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;
                  ?>
                  

                  【讨论】:

                    猜你喜欢
                    相关资源
                    最近更新 更多
                    热门标签