已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Symfony2 模板使用我们知道,controller负责处理每一个进入Symfony2应用程序的请求。实际上,controller把大部分的繁重工作都委托给了其它地方,以使代码能够被测试和重用。当一个controller需要生成HTML,CSS或者其他内容时,它把这些工作给了一个模板化引擎。模板:一个模板仅仅是一个文本文件,它能生成任意的文本格式(HTML,XML,CSV,LaTex.)。最著名的模板类型就是PHP模板了,可以被PHP解析的文本文件,它混合了文本和PHP代码。复制代码 Welcome to Symfony! a href=getHref() ? getCaption() ? 复制代码但是Symfony2包中拥有一种更加强大的模板化语言叫Twig。 它允许你写简洁,可读法模板语言。对页面设计师更友好,在许多方面比PHP模板更加强大。复制代码 Welcome to Symfony! page_title % for item in navigation % item.caption % endfor % 复制代码在这个Twig文件中,定义了三个类型的特别语法. : 说某些事“, 打印一个变量或者一个表达式的值到模板。%.% : 做某些事”,控制模板逻辑的标签,它用于执行比如for循环语句等。# 这是一个注释 #, 注释“。Twig也包含filters,在渲染之前修改内容。下面的语句显示把title变量全部渲染为大型。 title|upper Twig默认情况下有一大群的标签(tags)和过滤器(filters)可以使用。当然你也可以根据需要添加扩展。注册一个Twig扩展非常容易,创建一个新服务并把它标记为Twig.extension 标签。就跟你看到的一样,Twig也支持功能和新功能的添加。比如,下面使用一个标准的for标签和cycle功能函数来打印10个div 标签,用odd,even 类代替。% for i in 0.10 % emdfor % Twig模板缓存Twig很快。 每个Twig模板被编译到原生的PHP类,它将在运行时被渲染。编译过的类被保存在app/cache/environment/twig 目录下并在某些情况下,对整个调试非常有用。当debug模式可用时,一个twig模板如果发生改变将会被自动重新编译。这就意味着你可以在开发过程中随意的修改模板,而不必担心需要去清除内存了。当debug模式被关闭时,你必须手动的清除Twig缓存目录,以便能够重新生成Twig模板。 模板继承和布局大多数的时候,模板在项目中用来共享通用的元素,比如header,footer,sidebar等等。在Symfony2中,我们将采用不同的思考角度来对待这个问题。一个模板可以被另外的模板装饰。这个的工作原理跟PHP类非常像,模板继承让你可以创建一个基础”layout模板,它包含你的站点的所有通用元素并被定义成blocks。这里的block可以类比为PHP基类的方法。 一个字模板可以继承基础layout模板并重写它任何一个block。现在首先创建一个base layout文件:Twig:复制代码# app/Resources/views/base.html.twig # % block title %Test Application% endblock % % block sidebar % Home Blog % endblock % % block body % endblock % 复制代码PHP代码格式:复制代码 output(title, Test Application) ? has(sidebar): ? output(sidebar) ? Home Blog output(body) ? 复制代码这个模板定义了基本的HTML初始文档是一个简单的两列式页面。在这个页面中有三处% block %定义,分别定义了title,sidebar和body。每个block都可以被继承它的子模板重写或者保留它现在的默认实现。该模板也能被直接渲染,只不过只是显示基础模板的定义内容。下面定义一个子模板:Twig格式:复制代码# src/Acme/BlogBundle/Resources/views/Blog/index.html.twig #% extends :base.html.twig % block title %My cool blog posts% endblock % block body % % for entry in blog_entries % entry.title entry.body % endfor % endblock %复制代码PHP代码格式:复制代码extend(:base.html.php) ?set(title, My cool blog posts) ?start(body) ? getTitle() ? getBody() ? stop() ?复制代码父模板被一个特殊的字符串语法表示 :base.html.twig ,它表示该模板在项目的 app/Resources/views 目录下。模板继承的关键字 % extends %标签。 该标签告诉模板化引擎首先评估父模板,它会设置布局和定义多个blocks。然后是子模板,上例中父模板中定义的title和body 两个blocks将会被子模板中的定义所取代。依靠blog_entries的值,输出的内容如下:复制代码 My cool blog posts Home Blog My first post The body of the first post. Another post The body of the second post. 复制代码在此我们注意到,因为子模板中没有定义sidebar这个block,所以来自父模板的内容被显示出来,而没有被子模板替代。位于父模板中的% block %标签是默认值,如果没有被子模板重写覆盖,它将作为默认值使用。你可以根据你的需要进行多层继承。 Symfony2项目中一般使用一种三层继承模式来组织模板和页面。当我们使用模板继承时,需要注意:如果在模板中使用% extends %,那么它必须是模板的第一个标签。你基础模板中% block %越多越好,记住,子模板不必等一父模板中所有的block。你父模板中block定义的越多,你的布局就越灵活。如果你发现在多个模板中有重复的内容,这可能就意味着你需要为该内容在父模板中定义一个% block %。有些时候更好的解决方案可能是把这些内容放到一个新模板中,然后在该模板中include它。如果你需要从父模板中获取一个block的内容,你可以使用 parent() 函数。% block sidebar % Table of Contents . parent() % endblock % 模板的命名和存储位置默认情况下,模板可以被保存到两个位置:app/Resources/views 目录下,可以存放整个应用程序级的基础模板以及那些重写bundle模板的模板。path/to/bundle/Resources/views 目录下,每个bundle自己的模板。Symfony2使用bundle:controller:template 字符串语法表示模板。这可以表示许多不同类型的模板,每种都存放在特定的路径下:AcmeBlogBundle:Blog:index.html.twig 用于指定一个特定页面的模板。AcmeBlogBundle 表示bundle,说明模板位于AcmeBlogBundle,比如src/Acme/BlogBundle。Blog 表示BlogController,指定模板位于Resourcs/views的Blog子目录中,index.html.twig为模板名字。假设AcmeBlogBundle位于src/Acme/BlogBundle, 最终的路径将是:src/Acme/BlogBundle/Resources/views/Blog/index.html.twigAcmeBlogBundle:layout.html.twig 该表示法指向AcmeBlogBundle的基模板。没有controller部分,所以模板应该位于AcmeBlogBundle的Resources/views/layout.html.twig:base.html.twig 表示一个应用程序级的基模板或者布局文件。注意,该语句两个冒号开头,意味着没有bundle和controller部分,这说明该文件不在某个bundle中,而是位于根目录下 app/Resources/views在重写Bundle模板一节,你将发现位于AcmeBlogBundle的模板是如何被位于app/Resources/AcmeBlogBundle/views/目录下的所有模板同名重写的,这种方式给了我们一个有力的途径来重写供应商提供的bundle的模板。模板后缀(suffix)bundle:controller:template 句法说明了每个模板文件的存放位置。每个模板名字也有两个扩展名来指定格式和模板引擎。AcmeBlogBundle:Blog:index.html.twig HTML格式,Twig引擎AcmeBlogBundle:Blog:index.html.php HTML格式,PHP引擎AcmeBlogBundle:Blog:index.css.twig CSS格式,Twig引擎默认情况下,Symfony2的任何模板都可以被写成Twig或者PHP引擎的,它由后缀决定。其中后缀的前一部分(.html,.css)表示最终生成的格式。标签和助手类你已经基本了解了模板,它们如何命名如何使用模板继承等。最难理解的部分已经过去。接下来我们将了解大量的可用工具来帮助我们执行最通用的模板任务比如包含另外一个模板,链接一个页面或者包含一个图片等。Symfony2 中包含了血多序列化的Twig标签和功能函数来帮助设计者更容易的完成工作。在PHP中,模板系统提供了一个可扩展的helper系统,它可以在模板上下文中提供许多有用的内容。我们已经看过一些内建的Twig标签,比如% block % extends %等,还有PHP 助手$viewslots。包含其它模板:你可能经常想在多个不同的页面中包含同一个模板或者代码片段。比如一个应用程序中有“新闻文章”,模板代码在显示一片文章时可能用到文章详细页面,一个现实最流行文章的页面,或者一个最新文章的列表页面等。当你需要重用一些PHP代码,你通常都是把这些代码放到一个PHP类或者函数中。同样在模板中你也可以这么做。通过把可重用的代码放到一个它自己的模板中,然后把这个模板包含到其他模板中。比如我们创建一个可重用模板如下:Twig格式:复制代码# src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.twig # article.title by article.authorName article.body 复制代码PHP代码格式:复制代码getTitle() ?by getAuthorName() ? getBody() ?复制代码然后我们把它包含到其它模板定义中:Twig格式:复制代码# src/Acme/ArticleBundle/Resources/Article/list.html.twig #% extends AcmeArticleBundle:layout.html.twig % block body % Recent Articles % for article in articles % % include AcmeArticleBundle:Article:articleDetails.html.twig with article: article % % endfor % endblock %复制代码PHP代码格式:复制代码extend(AcmeArticleBundle:layout.html.php) ?start(body) ? Recent Articles render(AcmeArticleBundle:Article:articleDetails.html.php, array(article = $article) ? stop() ?复制代码模板的包含使用% include %标签。模板的名称要使用通用方式。在articleDetails.html.twig模板中使用article变量,这里通过在list.html.twig模板中使用with命令传入。article:article语法是标准Twig哈希映射的写法。如果我们需要传递多个元素,可以写成foo: foo, bar: bar。嵌入Controllers有些情况下,你需要比包含简单模板做到更多。假设你有一个菜单栏sidebar在你的布局文件中来显示最新的文章。获取三篇最新文章可能需要查询数据库或者执行其它包含很多逻辑的操作,这样就不能在一个模板中进行了。这种情况的解决方案是简答键入一个完整的controller到你的模板。首先创建一个controller来渲染特定数量的最近文章:复制代码/src/Acme/ArticleBundle/Controller/ArticleController.phpclass ArticleController extends Controller public function recentArticlesAction($max = 3) /生成一个数据库调用或者其它逻辑来获取$max个最新文章的代码 $articles = .; return $this-render(AcmeArticleBundle:Article:recentList.html.twig,array(articles=articles); 复制代码而recentList模板则相当简单:Twig格式:# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #% for article in articles % article.title % endfor %PHP代码格式: a href=/article/getSlug() ? getTitle() ? 为了能包含controller,你需要使用一个标准的字符语法来表示controller,格式类似bundle:controller:actionTwig格式:# app/Resources/views/base.html.twig #. % render AcmeArticleBundle:Article:recentArticles with max: 3 %PHP代码格式:. render(AcmeArticleBundle:Article:recentArticles, array(max = 3) ?无论什么时候,你需要一个变量或者一些列信息时,你不必在模板中访问,而是考虑渲染一个controller。因为Controller能够更快的执行并且很好的提高了代码的组织和重用。链接到页面:在你的应用程序中创建一个链接到其它页面对于一个模板来说是再普通不过的事情了。我们采用path Twig函数基于路由配置来生成URL而非在模板中硬编码URL。以后如果你想修改一个特定页面的URL,你只需要改变路由配置即可,模板将自动生成新的URL。比如我们打算链接到_welcome页面,首先定义其路由配置:YAML格式:_welcome: pattern: / defaults: _controller: AcmeDemoBundle:Welcome:index XML格式: AcmeDemoBundle:Welcome:indexPHP代码格式:$collection = new RouteCollection();$collection-add(_welcome, new Route(/, array( _controller = AcmeDemoBundle:Welcome:index,);return $collection;我们可以在模板中使用Twig函数 path来引用这个路由链接该页面。Twig格式:HomePHP代码格式:a href=generate(_welcome) ?Home上面的内容会生成一个URL /我们看另一个复杂一些的路由定义:YAML格式:article_show: pattern: /article/slug defaults: _controller: AcmeArticleBundle:Article:show XML格式: AcmeArticleBundle:Article:showPHP代码格式:$collection = new RouteCollection();$collection-add(article_show, new Route(/article/slug, array( _controller = AcmeArticleBundle:Article:show,);return $collection;这种情况下你需要指定路由名称(article_show)还要一个参数值slug。现在让我们再来看上面的recentList模板 ,我们修改以前的硬编码而使用path来链接正确的文章。Twig格式:# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #% for article in articles % article.title % endfor %PHP代码格式: a href=generate(article_show, array(slug = $article-getSlug() ? getTitle() ? 你也可以通过url Twig函数来生成一个绝对路径的URL:Home在PHP代码模板中,你需要给generate()方法传入第三个参数true 来实现生成绝对路径URLa href=generate(_welcome, array(), true) ?Home 链接到资源模板通常也需要一些图片,Javascript,样式文件和其它资产。当然你可以硬编码它们的路径。比如/images/logo.png。 但是Symfony2 提供了一个更加动态的Twig函数 asset()。Twig格式:PHP代码格式:img src=getUrl(images/logo.png) ? alt=Symfony! /link href=getUrl(css/blog.css) ? rel=stylesheet type=text/css /asset函数的主要墨笔是让你的应用程序更加轻便。如果你的应用程序在你的主机根目录下(比如:),那么它会渲染出的路径为 /images/logo.png 。但是如果你的应用程序位于一个子目录中(比如:/my_app),这时它会为你渲染出的路径变为 /my_app/images/logo.png 。asset函数能够根据你的应用程序来生成正确的路径。另外,如果你使用asset函数,symfony可以自动追加一个查询字符串到你的资产,以保证被更新的静态资源不会在部署时被缓存。比如:/images/logo.png 可能看起来是 /images/logo.png?v2 。 包含样式表和Javascript文件到Twig模板:每个网站中都不可能缺少了样式表和javascript文件。在Symfony中,这些内容可以通过模板继承很好的进行包含处理。Symfony打包了另外一个类库叫做Assetic, 它允许你对这些资源做更多的有趣操作。首先在你的基模板中添加两个blocks来保存你的资源,一个叫stylesheets,放在head标签里,另一个叫javascript,放在body结束标签上面一行。这些blocks将包含你整个站点所需要的所有stylesheets和javascripts。复制代码# app/Resources/views/base.html.twig # # . # % block stylesheets % % endblock % # . # % block javascripts % % endblock % 复制代码这太简单了!但如果你想从子模板中包含一个额外的stylesheet或者javascript怎么办呢?比如假设你有一个联系页面需要包含一个contact.css样式表只用于该页面。在你的contact页面模板内部,你可以这样实现:复制代码# src/Acme/DemoBundle/Resources/views/Contact/contact.html.twig #% extends :base.html.twig % block stylesheets % parent() % endblock %# . #复制代码在子模板中你只需要重写stylesheets block并把你新的样式表标签放到该块里。当然因为你想添加到父模板该块内容中,而不是替代它们所以你需要在此之前先使用parent()函数来获取父模板中的所有stylesheets。你也可以包含资源位置到你的bundle的Resources/public 文件夹。你需要执行如下命令行:$php app/console assets:install target -symlink它会把文件移动到正确的位置,默认情况下的目标位置是web文件夹。上面代码最终结果是页面会包含main.css和contact.css样式表。全局模板变量在每个请求中,Symfony2 将会在Twig引擎和PHP引擎默认设置一个全局模板变量app。该app变量是一个GlobalVariables实例,它将让你自动访问到应用程序一些特定能够的变量。比如:app.security 安全上下文app.user 当前用户对象app.request 当前Request对象app.session Session对象app.environment 当前应用程序的环境(dev,prod等)app.debug 如果是true说明是调试模式,false则不是。当然,你也可以向其添加你自己的全局模板变量。其应用示例:Twig格式:Username: app.user.username % if app.debug % Request method: app.request.method Application Environment: app.environment % endif %PHP代码格式:Username: getUser()-getUsername() ?get Debug(): ? Request method: getRequest()-getMethod() ? Application Environment: getEnvironment() ? 配置和使用templating 服务Symfony2模板系统的核心是模板化引擎。这个特殊的对象负责渲染模板并返回他们正确的内容。当你在controller中渲染一个模板时,其实你是使用了模板化引擎服务,比如:return $this-render(AcmeArticleBundle:Article:index.html.twig);其实相当于:$engine = $this-container-get(templating); $content = $engine-render(AcmeArticleBundle:Article:index.html.twig);return $response = new Response($content);该模板化引擎服务在Symfony2内部是预先配置好自动工作的。当然它也可以在应用程序的配置文件中进行配置。比如:YAML格式:# app/config/config.ymlframework: # . templating: engines: twig XML格式: PHP代码格式:复制代码/ app/config/config.php$container-loadFromExtension(framework, array( / . templating = array( engines = array(twig), ),);复制代码 重写Bundle模板:Symfony2社群现在正为他们创建和维护了很多不同内容的高质量的Bundle而感到骄傲,一旦你使用第三方的bundle你可能想重写或者个性化它们的一个或者多个模板。假设你已经包含了开源AcmeBlogBundle到你的项目中,比如目录是src/Acme/BlogBundle,你想重写blog列表(list)页面来按照你自己的应用程序风格个性化它。我们打开AcmeBlogBundle的Blog controller,可以发现如下内容:public function indexAction() $blogs = / some logic to retrieve the blogs $this-render(AcmeBlogBundle:Blog:index.html.twig, array(blogs = $blogs);当AcmeBlogBundle:Blog:index.html.twig被渲染时,Symfony2 会查找两个位置来定位模板:1. app/Resources/AcmeBlogBundle/views/Blog/index.html.twig2. src/Acme/BlogBundle/Resources/views/Blog/index.html.twig要重写该bundle的模板,仅仅从bundle中拷贝index.html.twig 模板到app/Resources/AcmeBlogBundle/views/Blog/index.html.twig。注意,如果app/Resources/AcmeBlogBundle目录不存在,可以手工建立。之后你就可以随心所欲的个性化处理该模板了。该逻辑同样适用于基bundle模板,假设AcmeBlogBundle中每个模板都是继承于基模板AcmeBlogBundle:layout.html.twig。Symfony2 将从下面两个地方寻找模板:1.app/Resources/AcmeBlogBundle/vews/layout.html.twig2.src/Acme/BlogBundle/Resources/views/layout.html.twig同样的,如果要重写该模板,你仅仅需要从bundle中拷贝到app/Resources/AcmeBlogBundle/views/layout.html.twig 就可以轻松个性化它了。你也可以通过bundle继承来从bundle内部重写模版。重写核心模板:因为Symfony2 框架本身就是一个bundle,所以其核心模板也可以按照同样的方式进行重写。比如,核心模板TwigBundle包含很多不同”execption和“error 的模板,你可以通过从Resources/views/Exception 目录下每一项到app/Resources/TwigBundle/Views/Exception 目录下 。三级继承:Symfony2中一般采用三级继承来完成模板创建。它使用三种不同类型的模板:首先,创建一个app/Resources/views/base.html.twig 文件,它包含你应用程序主
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宁德地区卫生系统招聘流程解析
- 2026年信阳职业技术学院单招职业倾向性考试必刷测试卷及答案解析(名师系列)
- 2026年安徽卫生健康职业学院单招职业适应性考试题库附答案解析
- 2026年云南工贸职业技术学院单招职业倾向性测试必刷测试卷带答案解析
- 2026年上海政法学院单招职业技能考试必刷测试卷及答案解析(名师系列)
- 2026年云南省玉溪市单招职业适应性测试必刷测试卷及答案解析(名师系列)
- 2026年云南水利水电职业学院单招职业技能测试题库附答案解析
- 2026年沙洲职业工学院单招职业倾向性测试必刷测试卷附答案解析
- 2026年山东工程职业技术大学单招职业技能测试必刷测试卷及答案解析(夺冠系列)
- 2026年安徽水利水电职业技术学院单招职业适应性测试必刷测试卷及答案解析(名师系列)
- 2025年中国农业银行基础运营人员(供柜面经理及大堂经理岗位)考试题库及答案
- 2025江西吉安永丰县自然资源局招聘编外工作人员4人考试笔试备考题库及答案解析
- 大件运输护送协议书
- 2025年考研法学理论专项训练试卷(含答案)
- 制程质量管理培训
- 《城市轨道交通概论》试题库15套
- 教师招聘考试教育法律法规试题库及答案
- 敲门礼仪培训课件
- 2025年急救专业面试题库和答案
- 大型体育馆音响设备吊装细则
- 员工绩效考核存在的问题及分析
评论
0/150
提交评论