PHP模板-使用PHP
我们所看到的最优雅的模板解决方案(最好在纯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类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>
替代文字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/