0

0

Twig 的 tags学习(中文) 之二_PHP教程

php中文网

php中文网

发布时间:2016-07-13 17:48:03

|

1199人浏览过

|

来源于php中文网

原创

set标签
主要是用来给变量赋值的。

 

志设AI
志设AI

志设AI是一站式AI设计平台,集“AI生图 + 在线设计 + 素材交易 + 收益分成”于一体。

下载

 

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

{% set foo = [1, 2] %}

{% set foo = {'foo': 'bar'} %}

{% set foo = 'foo' ~ 'bar' %}

立即学习PHP免费学习笔记(深入)”;

{% set foo, bar = 'foo', 'bar' %}
其中 'foo'~'bar' 这个我没怎么看明白,测试了一下,可能是字符串连接的。

set还有一种用法,就是把 块内的内容赋值给变量


{% set foo %} 
 

 
{% endset %} 
{% set foo %}
 
{% endset %}


extends标签
这个标签用来表示本模板继承自另外一个模板。和php一样,twig不支持多重继承,所以你只能有一个extends标签,而且要在模板的最上方。

我们先来定义一个“基模板” base.html 他就像一个骨架一个。


 
 
   

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


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

       
   

{% block %}标签定义了4个区块(block head, block title, block content, block footer),可以让子模板来填充内容。block的作用就是告诉模板引擎,这里面的内容可以被子模板覆盖。

一个子模板大概类似于这样的


{% 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)。当模板引擎解析到本模板时,会首先载入父模板。extends标签应该是模板内的第一个标签。

如果子模板没有定义block footer ,那么父模板会用默认值代替。


注意:block标签的名字是不能重复的。如果你想让同一个block多次打印。可以使用block函数


{% block title %}{% endblock %} 

{{ block('title') }}

 
{% block body %}{% endblock %} 
{% block title %}{% endblock %}

{{ block('title') }}


{% block body %}{% endblock %}

父block
也许你会需要 父block的内容。可以使用parent函数,这很有用比如你想往一个block里添加内容而不是覆盖时。


{% block sidebar %} 
   

Table Of Contents

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

Table Of Contents


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


命名endblock
模板引擎 允许你命名结束标记,这样可读性会提高很多。但个人觉得没啥用处。

{% block sidebar %} 
    {% block inner_sidebar %} 
        ... 
    {% endblock inner_sidebar %} 
{% endblock sidebar %} 
{% block sidebar %}
    {% block inner_sidebar %}
        ...
    {% endblock inner_sidebar %}
{% endblock sidebar %}

嵌套block
允许你嵌套生成block ,来形成更复杂的block


{% for item in seq %} 
   

  • {% block loop_item %}{{ item }}{% endblock %}
  •  
    {% endfor %} 
    {% for item in seq %}
       
  • {% block loop_item %}{{ item }}{% endblock %}

  • {% endfor %}


    简写block
    以下这两种写法是等效的


    {% block title %} 
        {{ page_title|title }} 
    {% endblock %} 
     
    {% block title page_title|title %} 
    {% block title %}
        {{ page_title|title }}
    {% endblock %}

    {% block title page_title|title %}

     


    动态继承
    你可以用一个变量来继承不同的模板。


    {% extends some_var %} 
    {% extends some_var %}
    如果变量是一个twig模板对象,也可以。


    $layout = $twig->loadTemplate('some_layout_template.twig'); 
     
    $twig->display('template.twig', array('layout' => $layout)); 
    $layout = $twig->loadTemplate('some_layout_template.twig');

    $twig->display('template.twig', array('layout' => $layout));
    1.2版本更新 你可以传递一个数组,twig会选择第一个存在的模板,来继承。


    {% extends ['layout.html', 'base_layout.html'] %} 
    {% extends ['layout.html', 'base_layout.html'] %}


    条件继承
    这个很简单自己看吧,


    {% extends standalone ? "minimum.html" : "base.html" %} 
    {% extends standalone ? "minimum.html" : "base.html" %}

     

    block标签
    参见 extends标签

     

     

    include标签
    载入一个模板,返回渲染的内容。载入的模板可以使用当前模板的变量{% include 'header.html' %} 
        Body 
    {% include 'footer.html' %} 
    {% include 'header.html' %}
        Body
    {% include 'footer.html' %}

    你可以给模板添加变量


    {# the foo template will have access to the variables from the current context and the foo one #} 
    {% include 'foo' with {'foo': 'bar'} %} 
     
    {% set vars = {'foo': 'bar'} %} 
    {% include 'foo' with vars %} 
    {# the foo template will have access to the variables from the current context and the foo one #}
    {% include 'foo' with {'foo': 'bar'} %}

    {% set vars = {'foo': 'bar'} %}
    {% include 'foo' with vars %}
    你也可以使用 only 关键字 来禁止载入的模板使用当前模板的变量,只能使用include 时with的变量{# only the foo variable will be accessible #} 
    {% include 'foo' with {'foo': 'bar'} only %} 
     
    {# no variable will be accessible #} 
    {% include 'foo' only %} 
    {# only the foo variable will be accessible #}
    {% include 'foo' with {'foo': 'bar'} only %}

    {# no variable will be accessible #}
    {% include 'foo' only %}

    载入的模板名也可以是一个twig表达式


    {% include some_var %} 
    {% include ajax ? 'ajax.html' : 'not_ajax.html' %} 
    {% include some_var %}
    {% include ajax ? 'ajax.html' : 'not_ajax.html' %}
    也可以用twig模板对象


    $template = $twig->loadTemplate('some_template.twig'); 
     
    $twig->loadTemplate('template.twig')->display(array('template' => $template)); 
    $template = $twig->loadTemplate('some_template.twig');

    $twig->loadTemplate('template.twig')->display(array('template' => $template));

    1.2版本新加内容,可以在模板加上 ignore missing 关键字,这样当模板不存在的时候就不会引发错误。

     

     

    {% include "sidebar.html" ignore missing %} 
    {% include "sidebar.html" ignore missing with {'foo': 'bar} %} 
    {% include "sidebar.html" ignore missing only %} 
    {% include "sidebar.html" ignore missing %}
    {% include "sidebar.html" ignore missing with {'foo': 'bar} %}
    {% include "sidebar.html" ignore missing only %}1.2版本新加内容,你可以给include传递一个数组,他会自动载入第一个存在的模板{% include ['page_detailed.html', 'page.html'] %} 
    {% include ['page_detailed.html', 'page.html'] %}

    import 标签


    twig允许把一些常用的代码放入到macros(宏)里,这些macros被不同的模板导入。

    有两种方法导入模板,你可以导入整个模板到一个变量里,或者只导入需要的几个macros

    假如我们有个助手模块,来帮助我们渲染表单(forms.html)


    {% macro input(name, value, type, size) %} 
         
    {% endmacro %} 
     
    {% macro textarea(name, value, rows) %} 
         
    {% endmacro %} 
    {% macro input(name, value, type, size) %}
       
    {% endmacro %}

    {% macro textarea(name, value, rows) %}
       
    {% endmacro %}
    最简单,最灵活的办法就是导入整个模板。(把模板导入到 forms变量里)


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

     
       
    Username
     
       
    {{ forms.input('username') }}
     
       
    Password
     
       
    {{ forms.input('password', null, 'password') }}
     
     

    {{ forms.textarea('comment') }}

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


       
    Username

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

       
    Password

       
    {{ forms.input('password', null, 'password') }}


    {{ forms.textarea('comment') }}


    或者你可以导入模板的名字到当前的名字空间下。 (导入input,textarea 并把input重名为input_field)

     

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

     
       
    Username
     
       
    {{ input_field('username') }}
     
       
    Password
     
       
    {{ input_field('password', '', 'password') }}
     
     

    {{ textarea('comment') }}

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


       
    Username

       
    {{ input_field('username') }}

       
    Password

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


    {{ textarea('comment') }}

    如果是当前模板内定义的macros,那就不必导入了,直接使用特殊变量_self


    {# index.html template #} 
     
    {% macro textarea(name, value, rows) %} 
         
    {% endmacro %} 
     

    {{ _self.textarea('comment') }}

     
    {# index.html template #}

    {% macro textarea(name, value, rows) %}
       
    {% endmacro %}

    {{ _self.textarea('comment') }}


    那么你仍然可以导入_self到一个变量里,尽管这看起来很。。。没用。。


    {# index.html template #} 
     
    {% macro textarea(name, value, rows) %} 
         
    {% endmacro %} 
     
    {% import _self as forms %} 
     

    {{ forms.textarea('comment') }}

     
    {# index.html template #}

    {% macro textarea(name, value, rows) %}
       
    {% endmacro %}

    {% import _self as forms %}

    {{ forms.textarea('comment') }}


    from标签
    参见 import标签

    摘自 jiaochangyun的专栏
     

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/478460.htmlTechArticleset标签 主要是用来给变量赋值的。 {% set foo = foo %} {% set foo = [1, 2] %} {% set foo = {foo: bar} %} {% set foo = foo ~ bar %} {% set foo, bar = foo, bar %} {% set...

    相关文章

    PHP速学教程(入门到精通)
    PHP速学教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    Golang 测试体系与代码质量保障:工程级可靠性建设
    Golang 测试体系与代码质量保障:工程级可靠性建设

    Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

    48

    2026.02.28

    Golang 工程化架构设计:可维护与可演进系统构建
    Golang 工程化架构设计:可维护与可演进系统构建

    Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

    44

    2026.02.28

    Golang 性能分析与运行时机制:构建高性能程序
    Golang 性能分析与运行时机制:构建高性能程序

    Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

    37

    2026.02.28

    Golang 并发编程模型与工程实践:从语言特性到系统性能
    Golang 并发编程模型与工程实践:从语言特性到系统性能

    本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

    22

    2026.02.27

    Golang 高级特性与最佳实践:提升代码艺术
    Golang 高级特性与最佳实践:提升代码艺术

    本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

    19

    2026.02.27

    Golang 测试与调试专题:确保代码可靠性
    Golang 测试与调试专题:确保代码可靠性

    本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

    3

    2026.02.27

    漫蛙app官网链接入口
    漫蛙app官网链接入口

    漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

    268

    2026.02.27

    deepseek在线提问
    deepseek在线提问

    本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

    51

    2026.02.27

    AO3官网直接进入
    AO3官网直接进入

    AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

    430

    2026.02.27

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    CSS3 教程
    CSS3 教程

    共18课时 | 6.4万人学习

    Rust 教程
    Rust 教程

    共28课时 | 6.5万人学习

    PostgreSQL 教程
    PostgreSQL 教程

    共48课时 | 10万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号