目录
My Webpage
Members
Index
Table Of Contents
首页 后端开发 php教程 TWIG 模板设计 快速入门手册 中文_PHP教程

TWIG 模板设计 快速入门手册 中文_PHP教程

Jul 13, 2016 pm 05:48 PM
twig 东西 中文 入门 关于 快速 手册 模板 设计

写了好几篇关于twig的东西。。居然还没写个快速入门之类的。现在就写

 

概要
twig 的模板就是普通的文本文件,也不需要特别的扩展名,.html .htm .twig 都可以。
模板内的 变量 和 表达式 会在运行的时候被解析替换,标签(tags)会来控制模板的逻辑
下面是个最小型的模板,用来说明一些基础的东西

 
 
   

 
        My Webpage 
     
     
         
 
       

My Webpage

 
        {{ a_variable }} 
     
 


   
        My Webpage
   
   
       

       

My Webpage


        {{ a_variable }}
   

里面包含两种符号 {% ... %} 和 {{ ... }} 第一种用来控制的比如for循环什么的,第二个是用来输出变量和表达式的


ide 支持
很多ide 都对twig进行高亮支持。大伙自己找需要的吧。
Textmate via the Twig bundle
Vim via the Jinja syntax plugin
Netbeans via the Twig syntax plugin
PhpStorm (native as of 2.1)
Eclipse via the Twig plugin
Sublime Text via the Twig bundle
GtkSourceView via the Twig language definition (used by gedit and other projects)
Coda and SubEthaEdit via the Twig syntax mode
变量
程序会传递给模板若干变量,你需要在模板里输出他们。例如输出 $hello

{{ hello }} 
{{ hello }}如果传递给模板的是对象或者数组,你可以使用点 . 来输出对象的属性或者方法,或者数组的成员。或者你可以使用下标的方式。
{{ foo.bar }} 
{{ foo['bar'] }} 
{{ foo.bar }}
{{ foo['bar'] }}
如果你访问的值不存在就会返回null。TWIG有一整套的流程来确认值是否存在。


for.bar会进行以下操作
。。。如果 foo是个数组,就尝试返回bar成员,如果不存在的话,往下继续
。。。如果foo是个对象,会尝试返回bar属性,如果不存在的话,往下继续
。。。会尝试运行bar方法,如果不存在的话,往下继续
。。。会尝试运行getBar方法,如果不存在的话,往下继续
。。。会尝试运行isBar方法,如果不存在的话,返回null


for['bar'] 就简单很多了 for必须是个数组,尝试返回bar成员,如果不就返回null
全局变量
TWIG定义了有一些全局变量

_self  这个参看macro标签
_context 这个就是当前的环境
_charset: 当前的字符编码


变量赋值
具体参见set标签

{% set foo = 'foo' %} 
{% set foo = [1, 2] %} 
{% set foo = {'foo': 'bar'} %} 
{% set foo = 'foo' %}
{% set foo = [1, 2] %}
{% set foo = {'foo': 'bar'} %}


过滤器 Firters
变量可以被过滤器修饰。过滤器和变量用(|)分割开。过滤器也是可以有参数的。过滤器也可以被多重使用。
下面这例子就使用了两个过滤器。

{{ name|striptags|title }} 
{{ name|striptags|title }}striptas表示去除html标签,title表示每个单词的首字母大写。更多过滤器参见我博客


过滤器也可以用在代码块中,参见 filter标签

{% filter upper %} 
  This text becomes uppercase 
{% endfilter %} 
{% filter upper %}
  This text becomes uppercase
{% endfilter %}

函数 Function
这个没什么好说的,会写程序的都知道,TWIG内置了一些函数,参考我的博客
举个例子 返回一个0到3的数组,就使用 range函数
{% for i in range(0, 3) %} 
    {{ i }}, 
{% endfor %} 
{% for i in range(0, 3) %}
    {{ i }},
{% endfor %}

流程控制
支持for循环 和 if/elseif/else结构。直接看例子吧,没什么好说的。

Members

 
     
        {% for user in users %} 
           
  • {{ user.username|e }}
  •  
        {% endfor %} 
 

Members



        {% for user in users %}
           
  • {{ user.username|e }}

  •     {% endfor %}

{% if users|length > 0 %} 
   
     
            {% for user in users %} 
               
  • {{ user.username|e }}
  •  
            {% endfor %} 
       
 
{% endif %} 
{% if users|length > 0 %}
   

            {% for user in users %}
               
  • {{ user.username|e }}

  •         {% endfor %}
       

{% endif %}


注释
{# ... #} 包围的内容会被注释掉,可以是单行 也可以是多行。


载入其他模板
详见include标签(我博客内已经翻译好哦),会返回经过渲染的内容到当前的模板里

{% include 'sidebar.html' %} 
{% include 'sidebar.html' %}当前模板的变量也会传递到 被include的模板里,在那里面可以直接访问你这个模板的变量。
比如

{% for box in boxes %} 
    {% include "render_box.html" %} 
{% endfor %} 
{% for box in boxes %}
    {% include "render_box.html" %}
{% endfor %}在 render_box.html 是可以访问 box变量的
加入其他参数可以使被载入的模板只访问部分变量,或者完全访问不到。参考手册


模板继承
TWIG中最有用到功能就是模板继承,他允许你建立一个“骨骼模板”,然后你用不同到block来覆盖父模板中任意到部分。而且使用起来非常到简单。
我们先定义一个基本骨骼页base.html 他包含许多block块,这些都可以被子模板覆盖。

 
 
   

 
        {% block head %} 
             
            {% block title %}{% endblock %} - My Webpage 
        {% endblock %} 
     
     
       
{% block content %}{% endblock %}
 
         
     
 


   
        {% block head %}
           
            {% block title %}{% endblock %} - My Webpage
        {% endblock %}
   
   
       
{% block content %}{% endblock %}

       
   
我们定义了4个block块,分别是 block head, block title, block content, block footer
注意
1、block是可以嵌套的。
2、block可以设置默认值(中间包围的内容),如果子模板里没有覆盖,那就直接显示默认值。比如block footer ,大部分页面你不需要修改(省力),但你需要到时候仍可以方便到修改(灵活)
下面我看下 子模板应该怎么定义。
{% extends "base.html" %} 
 
{% block title %}Index{% endblock %} 
{% block head %} 
    {{ parent() }} 
     
{% endblock %} 
{% block content %} 
   

Index

 
   

 
        Welcome on my awesome homepage. 
   

 
{% endblock %} 
{% extends "base.html" %}

{% block title %}Index{% endblock %}
{% block head %}
    {{ parent() }}
   
{% endblock %}
{% block content %}
   

Index


   


        Welcome on my awesome homepage.
   


{% endblock %}注意 {% extends "base.html" %} 必须是第一个标签。其中 block footer就没有定义,所以显示父模板中设置的默认值
如果你需要增加一个block的内容,而不是全覆盖,你可以使用 parent函数

{% block sidebar %} 
   

Table Of Contents

 
    ... 
    {{ parent() }} 
{% endblock %} 
{% block sidebar %}
   

Table Of Contents


    ...
    {{ parent() }}
{% endblock %}
extends标签只能有一个,所以你只能有一个父模板,但有种变通到方法来达到重用多个模板到目的,具体参见手册的use标签


HTML转义
主要是帮助转义 尖括号等  ,  &,  "  可以有两种办法。一种是用标签,另一种是使用过滤器。其实TWIG内部就是调用 php 的htmlspecialchars 函数

{{ user.username|e }} 
{{ user.username|e('js') }} 
 
{% autoescape true %} 
    Everything will be automatically escaped in this block 
{% endautoescape %} 
{{ user.username|e }}
{{ user.username|e('js') }}

{% autoescape true %}
    Everything will be automatically escaped in this block
{% endautoescape %}
因为{{是TWIG的操作符,如果你需要输出两个花括号,最简单到办法就是

{{ '{{' }} 
{{ '{{' }}
还可以使用 raw 标签和raw 过滤器,详细参考手册

{% raw %} 
   

     
        {% for item in seq %} 
           
  • {{ item }}
  •  
        {% endfor %} 
       
 
{% endraw %} 
{% raw %}
   

        {% for item in seq %}
           
  • {{ item }}

  •     {% endfor %}
       

{% endraw %}

macros宏
宏有点类似于函数,常用于输出一些html标签。
这里有个简单示例,定义了一个输出input标签的宏。

{% macro input(name, value, type, size) %} 
     
{% endmacro %} 
{% macro input(name, value, type, size) %}
   
{% endmacro %}宏参数是没有默认值的,但你可以通过default过滤器来实现。
一般来说宏会定义在其他到页面,然后通过import标签来导入,
{% import "forms.html" as forms %} 
 

{{ forms.input('username') }}

 
{% import "forms.html" as forms %}

{{ forms.input('username') }}

你也可以只导入一个文件中部分宏,你还可以再重命名。
{% from 'forms.html' import input as input_field, textarea %} 
 
 
   
Username
 
   
{{ input_field('username') }}
 
   
Password
 
   
{{ input_field('password', type='password') }}
 
 

{{ textarea('comment') }}

 
{% from 'forms.html' import input as input_field, textarea %}


   
Username

   
{{ input_field('username') }}

   
Password

   
{{ input_field('password', type='password') }}


{{ textarea('comment') }}

上面的代码表示 从forms.html中导入了 input 和 textarea宏,并给input重命名为input_field。
表达式
TWIG允许你在任何地方使用表达式,他的规则和PHP几乎一模一样,就算你不会PHP 仍然会觉得很简单。
最简单的有
字符串:“hello world”  或者 'hello world' 
数字:42 或者 42.33
数组:['a','b','c']
哈希:{'a':'av', 'b':'bv'} 其中keys 可以不要引号 也可以是数字 还可以是一个表达式,比如{a:'av', b:'bv'}  {1:'1v', 2:'2v'}  {1+2:'12v'}
逻辑: true 或者 false
最后还有null
你可以嵌套定义
{% set foo = [1, {"foo": "bar"}] %} 
{% set foo = [1, {"foo": "bar"}] %}运算符
包括数字运算+ - * /  %(求余数)  //(整除) **(乘方)

{{ 2 * 3 }}=6 

{{ 2 * 3 }}=8 

{{ 2 * 3 }}=6

{{ 2 * 3 }}=8逻辑运算 and or  not
比较运算 > = 包含运算 in 以下的代码会返回 true
{{ 1 in [1, 2, 3] }} 
{{ 'cd' in 'abcde' }} 
{{ 1 in [1, 2, 3] }}
{{ 'cd' in 'abcde' }}测试运算 is 这个不用多说 直接看代码
{{ name is odd }} 
{% if loop.index is divisibleby(3) %} 
{% if loop.index is not divisibleby(3) %} 
{# is equivalent to #} 
{% if not (loop.index is divisibleby(3)) %} 
{{ name is odd }}
{% if loop.index is divisibleby(3) %}
{% if loop.index is not divisibleby(3) %}
{# is equivalent to #}
{% if not (loop.index is divisibleby(3)) %}其他操作符
.. 建立一个指定开始到结束的数组,他是range函数的缩写,具体参看手册

{% for i in 0..3 %} <br>
    {{ i }}, <br>
{% endfor %} <br>
<pre name="code" class="html">{% for i in 0..3 %}<br>
    {{ i }},<br>
{% endfor %}
<p>| 使用一个过滤器<br>
<br>
{# output will be HELLO #} <br>
{{ "hello"|upper }} <br>
{# output will be HELLO #}<br>
{{ "hello"|upper }}~ 强制字符串连接<br>
{{ "Hello " ~ name ~ "!" }} <br>
{{ "Hello " ~ name ~ "!" }}?:  三元操作符<br>
{{ foo ? 'yes' : 'no' }} <br>
{{ foo ? 'yes' : 'no' }}. [] 得到一个对象的属性,比如以下是相等的。<br>
<br>
{{ foo.bar }} <br>
{{ foo['bar'] }} <br>
{{ foo.bar }}<br>
{{ foo['bar'] }}<br>
你还可以在一个字符串内部插入一个表达式,通常这个表达式是变量。 格式是 #{表达式}<br>
{{ "foo #{bar} baz" }} <br>
{{ "foo #{1 + 2} baz" }} <br>
{{ "foo #{bar} baz" }}<br>
{{ "foo #{1 + 2} baz" }}</p>
<p><br>
空白控制<br>
和 php一样,在TWIG模板标签之后的第一个换行符会被自动删掉,其余的空白(包括 空格 tab 换行等)都会被原样输出。<br>
使用spaceless标签就可以删除这些HTML标签之间的空白<br>
<br>
{% spaceless %} <br>
    </p><div> <br>
        <strong>foo</strong> <br>
    </div> <br>
{% endspaceless %} <br>
 <br>
{# output will be <div><strong>foo</strong></div> #} <br>
{% spaceless %}<br>
    <div>
<br>
        <strong>foo</strong><br>
    </div><br>
{% endspaceless %}
<p>{# output will be </p><div><strong>foo</strong></div> #}<br>
使用-操作符,可以很方便的删除TWIG标签之前或之后与html标签之间的空白。<br>
{% set value = 'no spaces' %} <br>
{#- No leading/trailing whitespace -#} <br>
{%- if true -%} <br>
    {{- value -}} <br>
{%- endif -%} <br>
 <br>
{# output 'no spaces' #} <br>
{% set value = 'no spaces' %}<br>
{#- No leading/trailing whitespace -#}<br>
{%- if true -%}<br>
    {{- value -}}<br>
{%- endif -%}
<p>{# output 'no spaces' #}<br>
{% set value = 'no spaces' %} <br>
</p>
登录后复制
  •     {{- value }}   
  •  
     
    {# outputs '
  • no spaces   
  • ' #} 
    {% set value = 'no spaces' %}
  •     {{- value }}   
  • {# outputs '

  • no spaces   
  • ' #}

    结束,如果你坚持看到这里,恭喜自己吧,你又多掌握了一些知识,恭喜恭喜

    摘自 jiaochangyun的专栏

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/478452.htmlTechArticle写了好几篇关于twig的东西。。居然还没写个快速入门之类的。现在就写 概要 twig 的模板就是普通的文本文件,也不需要特别的扩展名,....
    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    AI Hentai Generator

    AI Hentai Generator

    免费生成ai无尽的。

    热门文章

    R.E.P.O.能量晶体解释及其做什么(黄色晶体)
    3 周前 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳图形设置
    3 周前 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您听不到任何人,如何修复音频
    3 周前 By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25:如何解锁Myrise中的所有内容
    4 周前 By 尊渡假赌尊渡假赌尊渡假赌

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    一键生成PPT!Kimi :让「PPT民工」先浪起来 一键生成PPT!Kimi :让「PPT民工」先浪起来 Aug 01, 2024 pm 03:28 PM

    Kimi:一句话,十几秒钟,一份PPT就新鲜出炉了。PPT这玩意儿,可太招人烦了!开个碰头会,要有PPT;写个周报,要做PPT;拉个投资,要展示PPT;就连控诉出轨,都得发个PPT。大学更像是学了个PPT专业,上课看PPT,下课做PPT。或许,37年前丹尼斯・奥斯汀发明PPT时也没想到,有一天PPT竟如此泛滥成灾。吗喽们做PPT的苦逼经历,说起来都是泪。「一份二十多页的PPT花了三个月,改了几十遍,看到PPT都想吐」;「最巅峰的时候,一天做了五个PPT,连呼吸都是PPT」;「临时开个会,都要做个

    复古潮流!HMD与喜力联合推出翻盖手机:透明外壳设计 复古潮流!HMD与喜力联合推出翻盖手机:透明外壳设计 Apr 17, 2024 pm 06:50 PM

    4月17日消息,HMD携手知名啤酒品牌喜力以及创意公司Bodega,联袂推出了一款别具一格的翻盖手机——无聊手机(TheBoringPhone)。这款手机不仅在设计上充满新意,更在功能上返璞归真,旨在引领人们回归真实的人际交往,享受与朋友畅饮的纯粹时光。无聊手机采用了独特的透明翻盖设计,展现出一种简约而不失优雅的美感。其内部配备了2.8英寸QVGA显示屏,外部则是一块1.77英寸的显示屏,为用户提供了基本的视觉交互体验。在摄影方面,虽然仅搭载了30万像素的摄像头,但足以应对日常的简

    首发899元 中兴5G随身Wi-Fi U50S开售:最高网速500Mbps 首发899元 中兴5G随身Wi-Fi U50S开售:最高网速500Mbps Apr 26, 2024 pm 03:46 PM

    4月26日消息,中兴5G随身Wi-FiU50S目前已经正式开售,首发899元。外观设计上,中兴U50S随身Wi-Fi简约时尚,易于手持和包装。其尺寸为159/73/18mm,携带方便,让您随时随地畅享5G高速网络,实现畅行无阻的移动办公与娱乐体验。中兴5G随身Wi-FiU50S该设备支持先进的Wi-Fi6协议,峰值速率高达1800Mbps,依托骁龙X55高性能5G平台,为用户提供极速的网络体验。不仅支持5G双模SA+NSA网络环境和Sub-6GHz频段,实测网速更可达惊人的500Mbps,轻松满

    CVPR 2024全部奖项公布!近万人线下参会,谷歌华人研究员获最佳论文奖 CVPR 2024全部奖项公布!近万人线下参会,谷歌华人研究员获最佳论文奖 Jun 20, 2024 pm 05:43 PM

    北京时间6月20日凌晨,在西雅图举办的国际计算机视觉顶会CVPR2024正式公布了最佳论文等奖项。今年共有10篇论文获奖,其中2篇最佳论文,2篇最佳学生论文,另外还有2篇最佳论文提名和4篇最佳学生论文提名。计算机视觉(CV)领域的顶级会议是CVPR,每年都会吸引大量研究机构和高校参会。据统计,今年共提交了11532份论文,2719篇被接收,录用率为23.6%。根据佐治亚理工学院对CVPR2024的数据统计分析,从研究主题来看,论文数量最多的是图像和视频合成与生成(Imageandvideosyn

    荣耀Magic V3首发AI离焦护眼技术:有效缓解近视发展 荣耀Magic V3首发AI离焦护眼技术:有效缓解近视发展 Jul 18, 2024 am 09:27 AM

    7月12日消息,荣耀MagicV3系列今日正式发布,搭载全新荣耀视力舒缓绿洲护眼屏,在屏幕本身具备高规格和高素质的同时,还开创性的引入AI主动式护眼技术。据悉,传统的缓解近视的方式是“近视镜”,近视眼镜度数均匀分布,保证了视线中心区域成像在视网膜之上,但周边区域成像在视网膜后,视网膜感应到成像在后,促进眼轴向后生长,从而使度数加深。目前主要的缓解近视发展的方式之一是“离焦镜”,其中心区域度数正常,周边区域通过光学设计分区调整,从而使周边区域成像落在视网膜前,

    从裸机到700亿参数大模型,这里有份教程,还有现成可用的脚本 从裸机到700亿参数大模型,这里有份教程,还有现成可用的脚本 Jul 24, 2024 pm 08:13 PM

    我们知道LLM是在大规模计算机集群上使用海量数据训练得到的,本站曾介绍过不少用于辅助和改进LLM训练流程的方法和技术。而今天,我们要分享的是一篇深入技术底层的文章,介绍如何将一堆连操作系统也没有的「裸机」变成用于训练LLM的计算机集群。这篇文章来自于AI初创公司Imbue,该公司致力于通过理解机器的思维方式来实现通用智能。当然,将一堆连操作系统也没有的「裸机」变成用于训练LLM的计算机集群并不是一个轻松的过程,充满了探索和试错,但Imbue最终成功训练了一个700亿参数的LLM,并在此过程中积累

    AI在用 | AI制作独居女孩生活Vlog,3天狂揽上万点赞量 AI在用 | AI制作独居女孩生活Vlog,3天狂揽上万点赞量 Aug 07, 2024 pm 10:53 PM

    机器之能报道编辑:杨文以大模型、AIGC为代表的人工智能浪潮已经在悄然改变着我们生活及工作方式,但绝大部分人依然不知道该如何使用。因此,我们推出了「AI在用」专栏,通过直观、有趣且简洁的人工智能使用案例,来具体介绍AI使用方法,并激发大家思考。我们也欢迎读者投稿亲自实践的创新型用例。视频链接:https://mp.weixin.qq.com/s/2hX_i7li3RqdE4u016yGhQ最近,独居女孩的生活Vlog在小红书上走红。一个插画风格的动画,再配上几句治愈系文案,短短几天就能轻松狂揽上

    细数RAG的12个痛点,英伟达高级架构师亲授解决方案 细数RAG的12个痛点,英伟达高级架构师亲授解决方案 Jul 11, 2024 pm 01:53 PM

    检索增强式生成(RAG)是一种使用检索提升语言模型的技术。具体来说,就是在语言模型生成答案之前,先从广泛的文档数据库中检索相关信息,然后利用这些信息来引导生成过程。这种技术能极大提升内容的准确性和相关性,并能有效缓解幻觉问题,提高知识更新的速度,并增强内容生成的可追溯性。RAG无疑是最激动人心的人工智能研究领域之一。有关RAG的更多详情请参阅本站专栏文章《专补大模型短板的RAG有哪些新进展?这篇综述讲明白了》。但RAG也并非完美,用户在使用时也常会遭遇一些「痛点」。近日,英伟达生成式AI高级解决

    See all articles