twig模板的進一步學習以及在symfony當中的使用

首先,twig能夠理解爲用於輸出html代碼的,雖然用PHP等其餘語言也能夠輸出,可是twig更爲簡潔高效,同時twig模板被編譯成原生的php類緩存起來,因此纔會這麼快,php

其實twig跟php類差很少我感受,能夠進行繼承重寫,建立一個基類模板,以後的模板均可以繼承他而且重寫他的任何一個blockcss

twig模板能夠和for,if語句完美結合,好比下面這個例子,以無序方式循環輸出用戶名,同時根據用戶名是否存在進行不一樣的操做 ,注意以{% endfor %}來結束for語句html

<ul> {% for user in users if user.active %} <li>{{ user.username }}</li> {% else %} <li>No users found</li> {% endfor %} </ul>

下面以一個例子來講明twig其中的繼承關係,能夠看到base模板當中,定義了三個block,title,sidebar,body塊,這裏用{%block 塊名%}  {%endblock%}來定義一個塊web

title輸出該頁面的標題,sidebar是旁邊的選項,body是文章的具體內容,這裏能夠看作是讓其餘模板繼承並重寫的,數組

{# app/Resources/views/base.html.twig #}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Test Application{% endblock %}</title>
    </head>
    <body>
        <div id="sidebar"> {% block sidebar %} <ul>
                    <li><a href="/">Home</a></li>
                    <li><a href="/blog">Blog</a></li>
                </ul> {% endblock %} </div>
 
        <div id="content"> {% block body %}{% endblock %} </div>
    </body>
</html

 接下來咱們以一個字模板來進行說明,好比如今有一篇文章,當進入該文章頁面時,須要顯示文章具體內容,文章頁面和主頁是差很少的,只是基類twig當中的body塊是不同的,緩存

因此只須要重寫基類當中的body塊就好了,就能夠在原頁面的基礎上,只更改文章的內容而其餘地方都是不變的。注意在此以前使用extends繼承基類模板,就會自動顯示基類模板session

當中的內容app

{# app/Resources/views/blog/index.html.twig #}
{% extends 'base.html.twig' %} {% block title %}My cool blog posts{% endblock %} {% block body %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2>
        <p>{{ entry.body }}</p> {% endfor %} {% endblock %}

說到底twig模板就是將各個頁面之間的共性提取出來,寫入到基類模板當中去,基類模板的block越多越好,這樣頁面更爲靈活ide

若是要在子類模板當中在基類模板的某一塊的基礎上添加內容,而不是徹底重寫,只須要將  {{ parent() }}放在所須要的塊中便可,  函數

對於模板存放位置的說明。

基類模板通常存放在App/Resourses/views當中,能夠繼承第三方bundle當中的模板,注意若是你想要讓基類繼承其餘的twig,須要放在bundle當中

對於繼承路徑的說明,

全部目錄都是相對於app/resources/views目錄的,好比你要繼承views/blog的twig模板,須要使用 extends blog/模板名,

對於在一個模板當中引入其餘模板的說明

好比如今有一個模板article.html.twig

{# app/Resources/views/article/article_details.html.twig #}
<h2>{{ article.title }}</h2>
<h3 class="byline">by {{ article.authorName }}</h3>
 
<p> {{ article.body }} </p>

而後若是要在一個list.html.twig模板當中使用他的話,

{# app/Resources/views/article/list.html.twig #}
{% extends 'layout.html.twig' %} {% block body %} <h1>Recent Articles<h1> {% for article in articles %} {{ include('article/article_details.html.twig', { 'article': article }) }} {% endfor %} {% endblock %

使用include 包含這個模板進來,路徑規則和以前的類似,一樣若是須要傳入參數的話,{}括起來就行,和數組方式差很少

若是要使用twig跳轉到另外一個界面的話,使用path函數便可,好比如今有一個路由article,slug爲傳入的參數

/** * @Route("/article/{slug}", name="article_show") */

跳轉時,使用{{ path('路由名稱',{參數列表來實現}) }}  ,注意你能夠寫死他們的url,可是使用路由名更爲靈活

{% for article in articles %} <a href="{{ path('article_show', {'slug': article.slug}) }}"> {{ article.title }} </a> {% endfor %}

對於輸出圖片的說明

使用asset進行載入,這裏的rel參數規定了指定link和當前連接的關係,具體看文檔,這裏的文檔路徑是相對於主機路徑的即web目錄路徑,通常都會存放在web/bundles/scourgenWeb/css/js/png.......

<img src="{{ asset('images/logo.png') }}" alt="Symfony!" />
 
<link href="{{ asset('css/blog.css') }}" rel="stylesheet" />

 

最後再對twig模板當中訪問一個用戶的各類信息的方式

symfony在php,twig引擎當中默認設置一個全局變量APP,能夠經過它來訪問一個user的信息,這個user能夠是一個UserInteface對象,有ToString() 方法的對象,或者常規字符串

app.user   

app.session  當前用戶的session,

app.request  當前請求對象,目前也不太瞭解

再說明一下如何對一個控制器進行渲染,在twig之中訪問該控制器時,能夠獲取到相應的值,好比咱們在recentArticle當中,用render方法返回文章的信息,注意這裏render的第一個參數是須要渲染的twig模板的路徑(相對於views目錄)

// src/AppBundle/Controller/ArticleController.php
namespace AppBundle\Controller; // ...
 
class ArticleController extends Controller { public function recentArticlesAction($max = 3) { // make a database call or other logic // to get the "$max" most recent articles
        $articles = ...; return $this->render( 'article/recent_list.html.twig',
            array('articles' => $articles) ); } }

在twig當中訪問這個Action時,直接使用article變量就好了

{# app/Resources/views/article/recent_list.html.twig #}
{% for article in articles %} <a href="/article/{{ article.slug }}"> {{ article.title }} </a> {% endfor %}

 twig使用某個js/css文件,{{ assert('文件名') }}

相關文章
相關標籤/搜索