PHPTAL模板引擎

作者: 全栈技术圈 | 来源:发表于2018-07-30 15:42 被阅读0次

    PHPTAL模板引擎语法

    PHP 数据

    本文档的使用到的数据($talData)

    //定义talData变量
    $talData = array();
    
    $talData['title'] = 'title1';
    $talData['key'] = 'key1';
    $talData['href'] = 'xxx.html';
    $talData['html'] = '<h1>h1标题</h1>';
    $talData['fun'] = function($key=''){
        return $key === 'key1'? true : false;
    };
    //两维数组
    $talData['list1'] = array(
        array('id'=>'1', 'title'=>'标题1'),
        array('id'=>'2', 'title'=>'标题2'),
        array('id'=>'3', 'title'=>'标题3'),
        array('id'=>'4', 'title'=>'标题4')
    );
    
    //输出的数据结构
    {"title":"title1","key":"key1","href":"xxx.html","html":"
    h1\u6807\u9898<\/h1>","fun":{},"list1":[{"id":"1","title":"\u6807\u98981"},{"id":"2","title":"\u6807\u98982"},{"id":"3","title":"\u6807\u98983"},{"id":"4","title":"\u6807\u98984"}]}
    

    属性优先权

    • define 定义变量
    • condition
    • repeat
    • content or replacae
    • attributes 属性
    • omit-tag

    TAL有效空间

    定义变量


    定义全局(global)变量title和局部变量 key
    <div tal:define="global title talData/title; key talData/key">
        ${title} && ${key}
    </div>
    ${title} && ${key}
    <!-- 结果 -->
    <div>title1 && key1</div>
    title1 && 
    
    定义默认值变量
    <div tal:define="global fname string:fname1 string; lname string:lname1 string;">
        ${fname} && ${lname}
    </div>
    ${fname} && ${lname}
    <!-- 结果 -->
    <div>fname1 string && lname1 string</div>
    fname1 string &&
    

    TAL有效空间

    定义变量


    定义拼接变量
    <p tal:define="global hello string:hello $fname welcome on this page">
        ${hello}
    </p>
    或
    <p tal:define="global hello string:hello ${fname} welcome on this page">
        ${hello}
    </p>
    <!-- 结果 -->
    <p>hello fname1 string welcome on this page</p>
    
    定义变量,执行php方法
    <p tal:define="global rand php: rand(1, 4)">
        ${rand}
    </p>
    <!-- 结果 -->
    <p>2</p>
    

    TAL有效空间

    输出内容


    tal:replace="数据" 将用值替代整个标签,如果没有赋值将替空
    <tal:block>
        <p>渲染1</p>
    </tal:block>
    <tal:block tal:replace="">
    不渲染这里
    </tal:block>
    <tal:block tal:replace="talData/title">
        <p>不渲染这里</p>
    </tal:block>
    <p>${talData/title}</p>
    <!-- 结果 -->
    <p>渲染1</p>
    title1
    <p>title1</p>
    
    tal:content="数据" 将会替代标签内的内容
    <p tal:content="talData/title">
        test data<span>tips</span>
    </p>
    <!-- 结果 -->
    <p>title1</p>
    

    TAL有效空间

    输出内容


    ${数据}
    <p class="p p_${talData/title}">${talData/title}</p>
    <!-- 结果 -->
    <p class="p p_title1">title1</p>
    
    tal:attributes 将会改变tag的属性或值
    <a href="http://www.foo.com" title="some foo link" tal:attributes="href talData/href; title talData/title" tal:content="talData/key">sample link</a>
    <!-- 结果 -->
    <a href="xxx.html" title="title1">key1</a>
    
    tal:on-error="string: 出错时显示内容" ;出错时显示error内容,并且没有当前标签;
    <span tal:on-error="string: 当前数据不存在" tal:content="talData/key">key 已经是定义了</span>
    <span tal:on-error="string: 当前数据不存在" tal:content="talData/ky">ky 没有定义的</span>
    <!-- 结果 -->
    <span>key1</span>
    当前数据不存在
    

    TAL有效空间

    判断条件


    tal:condition="数据",条件是true,标签和它的内容就会被显示
    <p tal:condition="php: true" tal:content="talData/title">标题</p>
    <p tal:condition="php: talData['key'] == 'key1'" tal:content="talData/key">关键词</p>
    <p tal:condition="php: key == 'key1'" tal:define="key talData/key" tal:content="talData/key">关键词</p>
    <p tal:condition="talData/key" tal:content="talData/key">关键词</p>
    <p tal:condition="talData/fun" tal:content="talData/key">关键词</p>
    <!-- 结果 -->
    <p>title1</p>
    <p>key1</p>
    <p>key1</p>
    <p>key1</p>
    

    TAL有效空间

    循环


    tal:repeat="赋值变量 数据";属性循环它的元素和内容直到结束
    <ul tal:repeat="item talData/list1">
        <li tal:condition="php: repeat.item.index == 0">
            repeat/item/key: ${repeat/item/key} ;(如果talData/list1是一组联合对象,返回item的键)<br/>
            repeat/item/index: ${repeat/item/index} ;(返回索引号(0~count-1))<br/>
            repeat/item/number: ${repeat/item/number} ;(返回索引号(1~count))<br/>
            repeat/item/even: ${repeat/item/even} ;(如果是偶数,true)<br/>
            repeat/item/odd: ${repeat/item/odd} ;(如果是奇数,true)<br/>
    
            repeat/item/start: ${repeat/item/start} ;(如果是第一个元素,true)<br/>
            repeat/item/end: ${repeat/item/end} ;(如果是最后一个元素,true)<br/>
            repeat/item/length: ${repeat/item/length} ;(返回talData/list1里面元素个数)<br/>
            -------------
        </li>
        <li tal:condition="php: repeat.item.index > 0" tal:content="item/title">列表li</li>
    </ul>
    <!-- 结果 -->
    <li>
    repeat/item/key: 0 ;(如果talData/list1是一组联合对象,返回item的键)<br/>
    repeat/item/index: 0 ;(返回索引号(0~count-1))<br/>
    repeat/item/number: 1 ;(返回索引号(1~count))<br/>
    repeat/item/even: 1 ;(如果是偶数,true)<br/>
    repeat/item/odd: 0 ;(如果是奇数,true)<br/>
    repeat/item/start: 1 ;(如果是第一个元素,true)<br/>
    repeat/item/end: 0 ;(如果是最后一个元素,true)<br/>
    repeat/item/length: 4 ;(返回talData/list1里面元素个数)<br/>
    </li>
    <li>标题2</li>
    <li>标题3</li>
    <li>标题4</li>
    

    TAL有效空间

    标签渲染与否


    tal:omit-tag="condition";要求phptal解析时忽略实体的开关闭标签,它的内容仍然会显示.
    <p tal:omit-tag="php: false">
        omit-tag值为真,不出现当前p标签,否则就出现当前p标签
    </p>
    <p tal:omit-tag="php: true">
        omit-tag值为真,不出现当前p标签,否则就出现当前p标签
    </p>
    <!-- 结果 -->
    <p>omit-tag值为真,不出现当前p标签,否则就出现当前p标签</p>
    omit-tag值为真,不出现当前p标签,否则就出现当前p标签
    
    <tal:block>;代替标签,标签永远不输出
    <tal:block tal:repeat="x php:range(1,10)" tal:content="x">文字会出现十次</tal:block>
    <!-- 结果 -->
    12345678910
    

    METAL空间 支持宏


    metal:define-macro 定义宏
    <!-- 在pWeb/_macro/common.html文件中代码 -->
    <tal:block metal:define-macro="WinPageData">
        <script type="text/javascript">
            window.WinPageData = ${structure WinPageData};
        </script>
    </tal:block>
    
    metal:use-macro 调用宏
    <tal:block metal:use-macro="pWeb/_macro/common.html/WinPageData">
        当前内容会被宏替换掉
        <script type="text/javascript">
            window.WinPageData = {};
        </script>
    </tal:block>
    <div metal:use-macro="${路径变量}/macros.html/main_menu"></div>
    

    METAL空间 支持宏


    metal:define-slot 定义宏标签替换
    <!-- 在pWeb/_macro/mlog.html文件中代码 -->
    <tal:block metal:define-macro="mobile">
        <script>
            <metal:block define-slot="mlog_page">
            var mlog_page = 'mobile_other';
            </metal:block>
            var mlog_track = function(){};
        </script>
        <script src='xxx.js'></script>
    </tal:block>
    
    metal:fill-slot 使用宏标签替换
    <tal:block metal:use-macro="pWeb/_macro/mlog.html/mobile">
        <tal:block metal:fill-slot="mlog_page">
            var mlog_page = 'mobile_index';
        </tal:block>
    </tal:block>
    

    METAL空间 支持宏


    宏获取参数
    <!-- 在pWeb/_macro/mlog.html文件中代码 -->
    <tal:block metal:define-macro="conent">
        <p>${title}</p>
        <p>${key}</p>
    </tal:block>
    
    宏传参数(tal:define)
    <tal:block metal:use-macro="pWeb/_macro/mlog.html/conent"  tal:define="title '标题'; key '关键词'"></tal:block>
    

    phptal空间


    phptal:debug
    phptal:cache 使整个元素(包括标签)保存在磁盘而不重新解析直到cache失效,有效期的格式由数字和'd', 'h','m'或's'组成.
    <div class="footer" phptal:cache="3h">...</div>
    有效期可以有选择的跟随'per'参数来定义多少个缓存被共享,使用'per url'分别针对每个url复制元素.
    <ol id="breadcrumbs" phptal:cache="1d per url">...</ol>
    

    使用php:语法


    如下所述同正规表达式,除了->被替换成.及变量不需要前缀$,使用空格装配由点分隔的字符串.
    php:htmlentities(foo)
    php:'string ${varReplaced}'
    php:'string ${some.path().to[0].var}'
    php:foo.a.b.c(e).htmlentities(SomeClass::staticMethod())
    php:SomeClass::ConstOfClass
    php:SomeClass::$staticVar
    

    使用not:、exists:语法


    not:可以用于tal:condition中,相反判断
    <span tal:condition="not: logged">not logged</span>
    <!-- 结果 -->
    <span>not logged</span>
    
    exists:可以用于tal:condition中,判断存在
    <span tal:condition="exists: talData/title" tal:content="talData/title">存在</span>
    <!-- 结果 -->
    <span>title1</span>
    

    使用default、structure语法


    default默认值;在 tal:define、tal:content、tal:attributes 使用
    <span tal:define="myVar talData/title | default">
    default my var value
    </span>
    <p tal:content="some/var | other/path | default">
    没有var,没有找到path
    </p>
    <a href="unknown.html" title="Unknown page" tal:attributes="href item/href | default; title talData/title | default" tal:content="item/title | default">Unknown page</a>
    <!-- 结果 -->
    <p>没有var,没有找到path</p>
    <a href="unknown.html" title="title1">Unknown page</a>
    

    使用structure语法

    允许将包括html/xml等变量输出显示;

    注意存在XSS攻击风险,谨慎使用


    在tal:content中使用
    <div tal:content="talData/html"></div>
    <div tal:content="structure talData/html"></div>
    <!-- 结果 -->
    <div>&lt;h1&gt;h1标题&lt;/h1&gt;</div>
    <div><h1>h1标题</h1></div>
    
    在${}中使用
    <div>${talData/html}</div>
    <div>${structure talData/html}</div>
    <!-- 结果 -->
    <div>&lt;h1&gt;h1标题&lt;/h1&gt;</div>
    <div><h1>h1标题</h1></div>
    

    相关资料

    相关文章

      网友评论

        本文标题:PHPTAL模板引擎

        本文链接:https://www.haomeiwen.com/subject/pcufvftx.html