PHP标签库

时间:2008-11-04 17:41:08

标签: php tag-soup

我无法忍受与代码混杂的HTML。我几乎看不到其中一个模板而不会感到恶心。我知道,当你拥有一支“网页设计师”大军时,你是唯一的开发者,使用一些模板系统是有意义的。我经常听说Smarty。但就我而言,它一直是更多工作的源泉。

无论如何,这次我要独唱,所以我不想用谚语极点触摸HTML模板。所以我目前正在做的事情是这样的:

<?php
$page = new html_page('My wonderful page');
$page->add_contents(new html_tag('p', 'It works', array('id' => 'helloworld', 'class' => 'somecssclass')));

echo $page->render();
?>

一切都属于一个很好的对象层次结构,这是好的和花花公子。当然我有很多小类,我正在考虑使用动态类(例如,'html_a'会自动创建一个'a'类型的html_tag对象。)

现在,我的问题是:似乎没有其他人这样做。为什么?我在那里太远了,而我的虚弱,缺氧的头脑却从大局中遗漏了什么?

(我清楚地记得一个开源库正是这样做的,但是再也找不到了。所以除非我实际想象的东西,否则我不是唯一想过这种渲染HTML方法的人。)

你有什么想法吗? (请不要推荐另一种语言;我最喜欢的语言是Perl,所以我可以轻松地 outfan :-)。我坚持使用PHP。)

修改

呃,呃,似乎我的神经紧张。一些澄清:

  1. 我是这个项目中唯一的开发人员。
  2. 我如何将代码与HTML混合?我的库中的“html_tag”对象非常类似于DOM中的节点。 “render”方法是创建html的方法(精美缩进,我必须添加),但我不会在任何地方写任何开始或结束标记。
  3. 我为几个任务创建小对象。这些对象具有构建标记对象的方法;然后将这些结果对象插入表格或页面中。
  4. 我是否提到我坚持使用PHP?
  5. 我的库有一些原始的访问方法来查找对象。因此,26288中发布的迭代器示例可以相对轻松地实现。
  6. 我并不担心表现(但是。)我一直认为这是一个非常好的问题,但我还没有。

13 个答案:

答案 0 :(得分:9)

嗯,最重要的是,您仍在将HTML与代码混合在一起。如果你想将“p”标签改为“div”,你必须浏览代码才能完成它。想想你的方法提供了什么:

  • 将代码与HTML混合
  • 增加了解析所有请求的开销
  • 在HTML上引入了一种新的“语言”

从本质上讲,虽然方法可能有所不同,但它与您试图摆脱的模板语言具有相同的问题。

如果你单独(或在一个小组中)工作,让PHP成为模板语言会不会更容易?

$page = new Page('test.html');
$page->load($data);
$page->render();

并在您的test.html“模板”

<html>
<head>
  <title><?php echo $title ?></title>
</head>
<body>
  <p><?php echo $hello ?></p>
</body>
</html>

其他模板引擎确实将上述代码形式化。但是如果你坚持基础(回声变量,基本条件,循环),你基本上拥有模板语言的所有功能,但是在熟悉的PHP中,没有性能开销。

另外,与您的示例不同,您可以更改HTML(我知道您不想触摸它,但在代码中将“p”更改为“div”实际上与更改{{1}没有什么不同}} <p>),无需深入研究代码。

答案 1 :(得分:3)

检查:实现JSF的php tag library

答案 2 :(得分:2)

我不确定你在谈论什么。你在寻找php的模板库吗?有很多,虽然讨厌Smarty是时髦的(就像它本身就讨厌php本身一样),它是一个很棒的图书馆。

你问为什么'每个人'在他们的PHP代码中混合html?答案就是只有初学者和白痴才能这样做。拥有真实PHP经验的每个人都使用模板引擎。

如果你问为什么没有人像你的例子那样在代码中添加每个html tage,那很明显:因为这是一个维护噩梦。你打算把你的代码交给设计师并告诉他好运吗?您是否要将每个html页面手动转换为页面和代码页?

答案 3 :(得分:2)

所以,如果我理解正确,你会说你讨厌将代码混合到你的HTML中,以至于你决定将HTML混合到代码中吗?我没有看到它如何改进任何东西 - 代码和HTML仍然是混合的 - 这是接近PHP的不太自然/更复杂的方式,这似乎提供了一个明显的解释为什么没有其他人这样做。

使用一个合适的模板系统,它实际上将代码与HTML分开,而不仅仅是在另一个中嵌入哪一个。我建议使用HTML :: Template或Template :: Toolkit,因为你与我分享了我对Perl的品味,但你已经说过非PHP语言不是可行的选择。

答案 4 :(得分:2)

略有不同,但却相似。我写了article about using DOM for binding variables to templates。你可能会发现它很有趣。

基本用例:

$t = new Domling('<p class="hello"></p>'); 
$t->capture('hello')->bind("Hello World"); 
echo $t->render();

产生:

<p class="hello">Hello World</p> 

答案 5 :(得分:2)

好吧,似乎人们对“厌恶PHP”的引用感到不安。这不是问题的预期精神,对不起,如果我把你最喜欢的语言关闭。

最后,有几个人提出了一些非常有效的观点;

  1. 不幸的命名约定:将HTML元素的名称作为对象的名称敲响钟声。
  2. 我正在重新发明Lisp,以及最糟糕的部分。
  3. 这只是另一个模板系统,也是一个不好的模板系统。
  4. 我接受的答案是troelskn发布的好文章。我得出的结论是,我需要自己的文档模型,并且我应该避免在其上使用html实体名称。正如我之前所说,这是一个小方案;那篇文章和我从评论中得到的一些指示给了我新的想法。

    (关于重新发明的Lisp部分:我是唯一一个喜欢编程DOM的人。所以那里。)

    谢谢大家的意见。

答案 6 :(得分:1)

PHP 模板语言。因此,所有PHP粉丝都使用类似模板的设计是很自然的。

有一些LISP库可以像你放在那里那样做。恕我直言,当我使用LISP语言时,这是一个很大的转折点。

答案 7 :(得分:1)

Question 261338对此有一些重要性,但是我的回答更多地针对那些对整个编程都不熟悉的php人员“关注的分离?那是什么?”人。 (对不起php人,很大程度上就是这种情况)

你可能是一个很好的perl播放器并使用perl生成你的html模板垃圾,它被加载到php中,我仍然是perl的新手,但是php很干,我已经用了很长时间了,肯定有是一种在PHP上运行的perl编写站点的方法。

第三,我希望看到一些超越变量的增强替代。

有点像jQuery样式的dom匹配但没有膨胀,java(rhino)或整个web浏览的东西。

$page = new Page("FakePage.html"); 
$page->find("div#foobar")->text = "Hahah! I rock" ; 
/* Give All H1's a numeric lead in  */  
foreach( $page->find("h1")->iterator() as $index => $node )
{
        $node->text =  ($index + 1 ) . ". " $node.text;
};
$page->render();

我真的很喜欢能做得很好而且不太费劲的东西。请注意我使用的结构可能不会被php完全喜欢。

梦想是免费的。

(这是/ only /语法真正分离设计和逻辑,所有其他模板的东西只是递归地减少编程语言)

这里特别酷的部分是:

  1. 没有必要santise html,它的DOM AWARE!
  2. 不需要奇怪的特殊模板标记,这些标记在90%的编辑器中都很糟糕,并且不能自行验证而不会让鸡只流过它。

答案 8 :(得分:0)

我知道你不想听到模板系统,但如果你只看过Smarty,那你就错过了最好的选择。试试Tiny But Strong

和我一样,我是唯一的开发人员,但我发现TBS大大提高了我的工作效率和代码的可维护性。与smarty不同,它不会在模板中强制使用宏语言,而且完全与Dreamweaver 100%兼容 - 模板确实真实地保持为所见即所得,这样可以节省大量的时间。

能够从模板中将所有代码写入单独的文件中意味着它可以以标准方式进行格式化和排列。维护很麻烦,因为我总是知道我的代码是如何构建的。

我将TBS与XAJAX库一起使用,它可以很好用,但是你可以将你喜欢的库与它混合 - 我已经把它与Dojo一起运行了很好,接下来我正在看jQuery。

答案 9 :(得分:0)

没有其他人这样做,因为它比模板文件进出PHP模式要多得多,更不用说它只是增加了开销,纯粹是为了满足你对代码美学的偏好。

这并不意味着您可以将逻辑与显示分开,例如像Owen建议的简单系统。但是,为了回避那种仅仅因为你不喜欢它而混淆了HTML的常规,这有点愚蠢 - 这就是语言的使用方式。

答案 10 :(得分:0)

有很少的PHP框架可以满足您的需求。试试PradoYii。它们支持完整的标签库,而不仅仅是模板系统。你也可以查看phpframeworks.com,你可能会找到一些其他框架来完成你需要的工作。

我也正在开发自己的框架,支持标记库和服务器端dom操作,但我仍然需要在发布任何内容之前稍微优化代码,这个项目在http://players.sourceforge.net下。

答案 11 :(得分:0)

我正在使用xml,xsl方法来开发我的表单,使用单个xls模板来呈现我在门户网站中使用的任何表单。一开始,很难找到正确的xls文件格式,但在完成之后,渲染表单非常容易。在php中我只需要创建一个XML对象并进行渲染。

显然,我会不想用xls渲染'特殊'的东西,在这种情况下我会用正常的方式渲染它们。

我不喜欢用PHP代码混合很多东西,这就是我开发这个库的原因......

答案 12 :(得分:0)

由于许多相同的原因,我开发了一个靠近金属标签库的轻量级,保持了在使用lisp生成HTML时看到的风味ID。

此处的概述/示例代码xilla_tags