我有一点受孕问题。
我创建了一个以这种方式使用的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。
但是每次模块需要修改某些内容时,我必须在模板中添加此类调用。我宁愿保持模板不变,并在模块的类中编写“补丁”。
如何让模块“修补”模板,知道某些模块可以被禁用而且它们不应该覆盖彼此的更改?
编辑:更多细节。
答案 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分离。