Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP使用Twig

PHP使用Twig

作者头像
用户7657330
发布于 2020-08-14 07:19:37
发布于 2020-08-14 07:19:37
1.8K00
代码可运行
举报
文章被收录于专栏:程序生涯程序生涯
运行总次数:0
代码可运行

在网站开发过程中模版引擎是必不可少的,PHP中用的最多的当属Smarty了。目前公司系统也是用的Smarty,如果要新增一个页面只需把网站的头、尾和左侧公共部分通过Smarty的include方式引入进来,然后主体部分写内容即可,用起来也是相当方便。这也是一种比较通用的做法。但维护一段时间后发现有些凌乱了:

  • 公共部分内容越加越多了,不需要用的js、css在一些页面也被强制引进来了
  • 新页面的css只能写在网页的body内,看起来总让人不爽。
  • 左侧、头部、尾部若有特殊显示,操作起来不方便,只能在公共地方去做判断了。

当然这些页面问题在设计的时候可以通过合理的拆分网页来实现,当然最重要的还在于开发人员,在好的系统也经不起开发人员的折腾,一个项目经过多次转手后,接下来的维护人员那是相当痛苦的。不扯远了, 现在要说的是另一种模版开发思路。

在PHP中CLASS用过很多次了,有一个很有用的特性那就是继承,子类继承父类后可以直接调用父类的方法,也可以对父类的方法进行重写,同样PHP的模版引擎Twig也实现了这一点,模版的书写方式可以更方便。

Twig是开源框架Symfony2的默认模版引擎,主页是http://twig.sensiolabs.org/ 当前版本为Stable: 1.12.1,其他模版引擎能做的它都能做,这里主要整理下使用Twig的BLOCK方式编写模版页面。

以一个常见的排版为例,有三个链接,分别是首页、关于、联系三个页面,然后头部共用,尾部共用,中间部分分成左右两部分,左边共用,右边显示具体内容,貌似很多后台都是这种布局。 先看看首页 twig_index.php , 和Smarty差不多,初始化设置,然后设置变量并显示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
require './Twig-1.12.1/lib/Twig/Autoloader.php';
Twig_Autoloader::register();
 
$loader = new Twig_Loader_Filesystem('./view/twig/templates');
$twig = new Twig_Environment($loader, array(
    'cache' => './view/twig/templates_c',
    'auto_reload' => true
));
 
$twig->display('index.html', array('name' => 'Bobby'));

其他页面的PHP内容除了模版名称不一样外,其他内容完全一样,所以后面的PHP页面就不写了。 那接下来的主要工作就是写模版了,既然支持继承,那应该有一个父类,其他页面来继承这个类。base.html就是模版的父类,其内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{# /view/twig/templates/base.html #}
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Home{% endblock %} - Twig</title>
<style type="text/css">
{% block stylesheet %}
#header, #main, #footer{width:600px; margin:0px auto; border:1px solid #333;}
#main{border:0px;}
#header { height:120px;margin-bottom:10px;}
#footer{ height:80px;clear:both;margin-top:10px;}
#header h1{margin-left:20px;}
#header span{margin-left:20px;}
#leftsider{width:125px; float:left; border:1px solid #333; height:200px;
padding-top:10px;}
#leftsider span{width:100%; height:30px; line-height:30px; clear:both; 
padding-left:15px; display:block;}
#rightsider{width:460px; float:right; border:1px solid #333; height:250px;}
.clear{clear:both;}
{% endblock %}
</style>
</head>
<body>
    <div id="header">
        <h1>Twig Template Test</h1>
        <span><a href="twig_index.php">Home</a></span>
        <span><a href="twig_about.php">About</a></span>
        <span><a href="twig_contact.php">Contact</a></span>
    </div>
    <div id="main">
        <div id="leftsider">
            {% block leftsider %}
            <span>系统模块1</span>
            <span>系统模块2</span>
            {% endblock %}
        </div>
        <div id="rightsider">
            {% block rightsider %}Hello {{name}}{% endblock %}
        </div>
    </div>
    <div class="clear"></div>
    <div id="footer">
        {% block footer %}<h1>Twig Footer</h1>{% endblock %}
    </div>
</body>
</html>

基本的页面框架没太多说的,主要看看中间有5个block - {% block blockname%}{% endblock %} 每个BLOCK代表一个块, 这里的块可以理解成PHP父类中的一个方法。

基本的html框架搭好后,index.html该如何来写呢?首先该继承base页面,然后再考虑是否要重写base页面的内容,先只做继承看看效果。

{# /view/twig/templates/index.html #} {% extends "base.html" %}

第一行为注释部分,可以省去,第二行表示index.html继承base.html, 未重写的情况下将直接使用base.html中的内容进行显示

效果比较简单,但是很神奇,index.html只是继承了base.html,没写其他内容呢?对,不用写了,在未重写父类方法时。子类是可以直接调用父类方法的。

那接着看看about, 假设about页面和index页面除了右边区域不同外,其他部分完全相同,也就是只需要重写rightsider这个BLOCK:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{# /view/twig/templates/about.html #}
{% extends "base.html" %}
{% block title %}About{% endblock %}
{% block rightsider %} {% include 'about_content.html' %} {% endblock %}

标题的内容改成了 About, rightsider的内容从about_content.html文件中读取,其他部分保留原有。也就是除了Hello Bobby的内容不同外,其他部分与首页都是相同的,是不是觉得很方便了?

再来看一下Contact页面怎么写?我么需要在leftsider里增加一个菜单,以及rightsider里显示其他block的内容。看看下面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{# /view/twig/templates/contact.html #}
{% extends "base.html" %}
{% block title %}Contact{% endblock %}
{% block leftsider %}{{ parent() }}<span>系统模块3</span>{% endblock %}
{% block rightsider %} {{ block('footer') }} {% endblock %}

调用parent即可显示基类的内容,通过block(‘footer’)则可获取footer中的Twig Footer内容。

很神奇吧!这种排版方式值得一试,等待机会中…

使用block后子页面不可以按照html的方式在任意地方加html, 也就是在block外写任何内容都会报错,所以需要base里去合理的设置block,block设置的越多就越灵活。具体的还得到实际项目中去尝试。

Twig的具体语法可查看Twig模版语言入门,这种写模版的方式确实很让人喜欢,好像Smarty3也支持该功能了,有时间也看看。

看到Twig后联想到了 lesscss, 动态样式语言,主页http://www.lesscss.net 有兴趣的朋友可以看看。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
django 1.8 官方文档翻译:4-2-1 Django模版语言
本文将介绍Django模版系统的语法。如果您需要更多该系统如何工作的技术细节,以及希望扩展它,请浏览 The Django template language: for Python programmers.
ApacheCN_飞龙
2022/11/27
1.2K0
Django模板结构优化所需要的三个Tag:include,extends,block
一般的网页都有头部(header),底部(footer),然后这些部分通常是不会变的,所以在Django中可以利用include引入模板文件,如我的头部文件是:
SingYi
2022/07/14
4930
Django模板结构优化所需要的三个Tag:include,extends,block
Django用户登录与注册系统
一、创建项目 1.1.创建项目和app django-admin startproject mysite_login python manage.py startapp login 1.2.设置时区和语言 Django默认使用美国时间和英语,在项目的settings文件中,如下所示: LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True 我们把它改为亚洲/上海时间和中文 LAN
zhang_derek
2018/04/11
11.5K0
Django用户登录与注册系统
flask第34篇——测试器、模板继承
http://jinja.pocoo.org/docs/2.10/templates/#list-of-builtin-tests
孟船长
2018/11/23
5140
前端框架AdminLTE
https://github.com/almasaeed2010/AdminLTE/releases
全栈程序员站长
2022/09/18
2.5K0
前端框架AdminLTE
Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)
前言:当我们想在页面上给客户端返回一个当前时间,一些初学者可能会很自然的想到用占位符,字符串拼接来达到我们想要的效果,但是这样做会有一个问题,HTML被直接硬编码在 Python代码之中。 1 2 3 4 def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse
用户1214487
2018/01/24
2.6K0
django-模板之block(四)
base.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{title}}</title> <style> .header { height: 50px; background-color: fuchsia;; } .content{ height:300px;
西西嘛呦
2020/08/26
3280
Flask第36篇——模板项目实战(二)
前面我们利用宏将首页代码进行了第一次优化。如果我们现在还有其他页面,试想一下,首页上面的搜索框
孟船长
2018/11/30
9090
Flask第36篇——模板项目实战(二)
Python Django个人网站搭建19-网站整体优化
作者: zifanwang  发布于2020-06-14
zifan
2021/12/14
6260
Python Django个人网站搭建19-网站整体优化
基于django的个人博客网站建立(四)
今天主要添加了留言与评论在后台的管理和主页文章的分页显示,文章类别的具体展示以及之前预留链接的补充
py3study
2020/01/15
1.9K0
基于django的个人博客网站建立(四)
Django学习_简易博客(四)
由于post_detail的URL比较特别,所以在blog/models.py中添加特殊的处理
zx钟
2019/07/18
3460
Django 模板继承4.2
模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填充 extends继承:继承,写在模板文件的第一行 定义父模板base.html { %block block_name%} 这里可以定义默认值 如果不定义默认值,则表示空字符串 { %endblock%} 定义子模板index.html { % extends "base.html" %} 在子模板中使用bl
Lansonli
2021/10/09
6320
Python进阶28-Django 模板层(Jinja2)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1.9K0
Python进阶28-Django 模板层(Jinja2)
模板标签
if语句和python中的类似,可以使用>,<,<=,>=,==,!=来进行判断,也可以通过and,or,not,in,not in来进行逻辑合并操作
星哥玩云
2022/09/14
6200
Django+Bootstrap+Mysql 搭建个人博客(一)
1.1.环境搭建 (1)虚拟环境 mkvirtualenv website pip install django==1.11.7 (2)创建项目和app:website和blog (3)设置中文se
zhang_derek
2018/05/30
3.2K0
零基础使用Django2.0.1打造在线教育网站(十五):模板继承应用
努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!
啃饼思录
2018/09/06
5640
Django模板层
tips:可以利用{% for obj in list reversed %}反向完成循环
py3study
2020/01/19
1.1K0
第 08 篇:开发博客文章详情页
首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容。现在让我们来开发博客的详情页面,有了前面的基础,开发流程都是一样的了:首先配置 URL,即把相关的 URL 和视图函数绑定在一起,然后实现视图函数,编写模板并让视图函数渲染模板。
HelloGitHub
2021/05/14
4850
Django模板标签
==, !=, >=, <=, >, < and, or, not, in, not in这些操作符都可以在模板中使用
星哥玩云
2022/09/14
1.7K0
带你认识 flask 的模板
在终端会话中设置环境变量FLASK_APP=microblog.py,然后执行flask run命令来运行应用。包含这个应用的Web服务启动之后,你可以通过在Web浏览器的地址栏中键入URL http://localhost:5000/ 来验证。
公众号---人生代码
2019/11/07
1K0
带你认识 flask 的模板
相关推荐
django 1.8 官方文档翻译:4-2-1 Django模版语言
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验