PHP模板-使用PHP

时间:2020-03-06 15:02:32  来源:igfitidea点击:

我们所看到的最优雅的模板解决方案(最好在纯PHP中!)是什么?

特别是我对处理感兴趣:

  • 在重复块中检测是第一个元素还是最后一个元素
  • 轻松处理偶数/偶数情况,例如斑马纹桌或者类似的东西
  • 其他模逻辑,我们每n次执行一次操作。

我正在寻找可以减轻痛苦的东西:

<?php
$persons = array('John', 'Hyman', '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">Hyman</li>
    <li class="odd">Jill</li>
    <li class="even">Jason</li>
</ul>

难道只有我发现上面的东西吗?

所有那些php-tags的开始和结束都使我感到畏缩。

解决方案

我一直像我们在示例中一样使用Modulo。

小而强

www.tinybutstrong.com

在页面中嵌入另一种宏语言并不会犯聪明的错误,但是可以让我们处理我曾经遇到过的每一个实际的Web显示问题。特别地,上述奇/偶构造是轻而易举的。对于像代码这样的事情,请从数据库表中进行选择

在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>

如果让我们担心的是开始和结束标签,请编写一个函数来创建html字符串,然后将其返回。至少它将为我们节省一些标签。

它不是纯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模板引擎。挺扎实的,很稳固的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。正如我们可能从网站上看到的那样;它拥有庞大的用户群,并定期更新。

它也使用纯PHP。

我们是否考虑过phptal?它(或者类似的东西)的一个主要优点是我们可以获得可以通过验证的模板。大多数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', 'Hyman', 'Jill', 'Jason');
$classes = array('odd', 'even');
print makeul($persons, $classes);
?>

另外,如果我们不介意使用Javascript,则Jquery使mod 2的工作变得非常简单(例如,用于对表进行斑马线剥离):

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

Savant是一个轻量级的纯PHP模板引擎。第2版​​有一个类似于前面提到的Smarty的循环插件。我无法在版本3中找到对同一个插件的引用,但是我敢肯定我们可以很轻松地编写它。

我使用PHPTAL进行模板制作,因为它是使用100%实际HTML编写的,并带有占位符数据,因此它甚至可以在所见即所得的Web设计器编辑器中使用。那是很容易理解的方式。

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

PHP代码:

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

模板:

<ul>
    <li tal:repeat="person people" tal:content="person">John Doe</li>
  </ul>

输出:

JohnHymanJillJason

现在显然我不会为此做一个模板,但是我可以为其使用宏或者构建整个页面并包含该变量。但是你明白了。仅凭简单性(没有像Smarty一样学习新语法),使用PHPTAL几乎使我在模板和编程上的速度提高了两倍。

我一直是HAML的支持者已有一段时间了,看起来PHP人士现在已经有了HAML:请参阅http://phphaml.sourceforge.net/

循环的一个小帮助:

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

通过说" $ b =!$ b",它会自动在true和false之间切换。由于false打印为"",true打印为" 1",因此通过定义css类rowrow1,我们可以轻松地更改行。

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

<?= ($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>

替代文字http://components.symfony-project.org/images/components/templating/home.png

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

首席开发人员Fabien Potencier在这里解释了此决定:http://fabien.potencier.org/article/35/templating-engines-in-php-follow-up

通常可以依靠Symfony在此类问题上做出非常明智的决定,因此应该研究一下该框架。

该组件在这里:http://components.symfony-project.org/templating/