PHP超级简单的超轻模板引擎创建菜单

时间:2015-01-12 14:22:41

标签: php template-engine

我正在尝试制作一个超轻量模板引擎,它几乎不做任何事情。 为什么另一个模板引擎呢?因为我们有太多可以做的事情,或只是没什么或太多......

我想要做的是使用给定的所有变量并编译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'        =>      ']' 
                                                );

0 个答案:

没有答案