我正在尝试制作一个超轻量模板引擎,它几乎不做任何事情。 为什么另一个模板引擎呢?因为我们有太多可以做的事情,或只是没什么或太多......
我想要做的是使用给定的所有变量并编译PHP代码。 我不想做的是创建一个简单的脚本,只执行str_replace和period ... 但是,我也不想在我的模板代码中使用任何PHP代码或相似内容。
我想要做的是加载数组并使用它来创建多层菜单。
例如,我得到了以下代码:
{menu}
<ul>
{item}<li>
<a href="[@url]">[@link]</a>
{submenu}
<u>
{item_active}<li><a href="[@url]"><strong>[@link]</strong></a></li>{/item_active}
{item}<li><a href="[@url]">[@link]</a></li>{/item}
</ul>
{/submenu}
</li>
{/item}
{itemactive}<li>
<a href="[@url]"><strong>[@link]</strong></a>
{submenu}
<u>
{item_active}<li><a href="[@url]"><strong>[@link]</strong></a></li>{/item_active}
{item}<li><a href="[@url]">[@link]</a></li>{/item}
</ul>
{/submenu}
</li>{/itemactive}}
</ul>
{/menu}
我想提取数据并将其组合成一个数组,以便将其用于菜单中。
加载此代码后,我想通过以下方式在我的模板引擎中调用它来使用它:
$tpl->block(
'menu',
array(
array(
'name' => 'item',
'url' => 'www.bing.com',
'link' => 'Bing search',
),
array(
'name' => 'itemactive',
'url' => 'maps.bing.com',
'link' => 'Bing maps',
),
array(
'name' => 'item',
'url' => 'www.google.com',
'link' => 'Google search',
),
array(
'name' => 'item',
'url' => 'maps.google.com',
'link' => 'Bing maps',
)
)
);
但我确实陷入困境。 我绝对 0 了解如何推进......我不断改写代码并改变主意。但我根本无法弄清楚它的工作原理。
以前有人做过这样的事吗?有人会知道我应该使用哪种逻辑来实现这项工作吗?
这不一定要基于我的想法。只要它能起作用我真的很开心!!
提前致谢!!
我已经创建了以下代码来提取HTML
///########-------------------------------------------------------------
///########-------------------------------------------------------------
///######## FUNCTION TO FILTER A TEMPLATE FOR ARRAY BLOCKS
///########-------------------------------------------------------------
///########-------------------------------------------------------------
private function GetMultipleBlocks($var, $FileString) {
///########==================================================
///######## COMPILE THE SEARCH PATTERN
///########==================================================
$StartElement = $this->Seperators['grpstart'].$var.$this->Seperators['grpend'];
$EndElement = $this->Seperators['grpstart'].'\/'.$var.$this->Seperators['grpend'];
///######## CREATE THE SEARCHPATTERN
$SearchPattern = '/\\'.$StartElement.'.*?'.$EndElement.'/s';
///########==================================================
///########==================================================
///######## SEARCH FOR THE TEMPLATE OBJECT
///########==================================================
preg_match_all($SearchPattern, $FileString, $SearchResult, PREG_SET_ORDER);
///########==================================================
///########==================================================
///######## IF THE FIRST PART SUBSECTION HAS BEEN SET
///########==================================================
if(isset($SearchResult[0][0]) === true){
///######## SET THE HTML BLOCK
$HTMLBlock = $SearchResult[0][0];
///########==================================================
///######## RESET THE START AND END ELEMENT
///########==================================================
$StartElement = $this->Seperators['grpstart'].$var.$this->Seperators['grpend'];
$EndElement = $this->Seperators['grpstart'].'/'.$var.$this->Seperators['grpend'];
///########==================================================
///########==================================================
///######## CLEANING THE TEMPLATE
///########==================================================
$FileString = str_replace($HTMLBlock, NULL, $FileString);
///######## CLEAN THE TEMPLATE BLOCK
$HTMLBlock = str_replace(array($StartElement, $EndElement), NULL, $HTMLBlock);
///########==================================================
///########==================================================
///######## RETURNING THE PLACEHOLDER CONTENTS
///########==================================================
return($HTMLBlock);
///########==================================================
}
///########==================================================
///########==================================================
///######## IF THE SUBSECTION HAS NOT BEEN SET
///########==================================================
else{
///########==================================================
///######## RETURN FALSE
///########==================================================
return(false);
///########==================================================
}
///########==================================================
}
班级中的分隔符定义:
/// **** SEPERATORS
public $Seperators = array(
'grpstart' => '{',
'grpend' => '}',
'plcstart' => '[@',
'plcend' => ']'
);