动态“修补”模板

时间:2011-07-30 15:58:19

标签: php oop templates

我有一点受孕问题。

我创建了一个以这种方式使用的View类:

$view = new View('title');
$view->setTemplate('name_of_template');
$view->setVar('name', 'value');
$view->display();

模板是简单的PHP / HTML文件,在调用display时包含在View类中。

然后我有“模块”。它们是可以激活或停用的对象,应该允许它们更改页面的行为。但是我不想因为模块而改变脚本:所有属于它的代码都必须在他的类中。

我已经有了一些机制。其中之一是Events,一个类似于经典listen / trigger模式的系统。您可以指定在触发事件时要发送的参数,并确定是否可以通过侦听功能更改其中一些参数。

在将页面发送到客户端之前触发事件。然后,监听器可以更改或添加模板变量。

但是,我希望模块能够在模板中添加一些元素,而我无法想出一个很好的方法来实现这一点。目前,我在模板中调用了一个方法,模块可以在其中添加或更改元素。这是原型:patch($name, $replacement) 让我们说其中一个想要将一个单词改成一个链接:

  

这是一个<?= $ this->补丁('slot1','sentence')?>可以由模块“修补”。 <?= $ this-> patch('slot2','')?>他们可以在段落之间添加元素。

模块可以“抓住”patch个调用,然后可以将单词“sentence”更改为<a href="page.php">sentence</a>,或者在“slot2”中添加内容。如果没有任何模块抓取呼叫,则显示$ replacement。

但是每次模块需要修改某些内容时,我必须在模板中添加此类调用。我宁愿保持模板不变,并在模块的类中编写“补丁”。

如何让模块“修补”模板,知道某些模块可以被禁用而且它们不应该覆盖彼此的更改?

编辑:更多细节。

  • 大部分时间模块的更改都是小的添加或更改单词。
  • 如果我必须以某种方式“标记”模板,我希望能够在模块需要时无需添加标记就能完成一次。
  • “补丁”不应该依赖于行号。他们可以在某种程度上依赖内容,但尽可能不在整条线上。
  • 我更喜欢添加和修改的统一方式,但如果我有两种不同的方法就可以了。
  • 我已经在使用输出缓冲(ob_start等)将所选模板包含到一个全局模板中。
  • 如果我选择依赖这些功能的系统,我宁愿在preg_replace上使用str_replace,这会更慢。

1 个答案:

答案 0 :(得分:0)

在这种情况下,最好的选择是使用更纤薄的标记系统。类似的东西:

这是一个可以修补的{link href =“http://www.someurl.com/”}句子{/ link} ......

使用ob_start和ob_get_clean捕获模板的输出,然后使用preg_match_all在该输出上运行模块以获取缩短标签的所有实例并将其解析出来。然后,您可以循环遍历所有匹配项,并使用模块中的渲染输出替换每个匹配项。

在上面的示例中,解析器将调用“link”模块并向其传递一个参数:此格式的数组:array('href'=&gt;'http://www.someurl。 com /')

这是允许模块覆盖模板输出而不需要多次调用preg函数的最佳选择。这将需要单个preg函数调用来获取所有标记。从那里你可以使用字符串函数来替换数据。

我实际上会支持上面的评论,并敦促你使用像Smarty这样的模板引擎,除非你有特定的理由避免它。我在我的许多项目中都使用Smarty,因为它可以很容易地扩展,并因此提供了出色的PHP / Markup分离。