> ## 模板布局
> 開啟模板布局之后,渲染模板之前會先渲染布局模板layout
### 第一種方式:全局配置方式(適合全站采用同一布局)
```
// 1.首先應該在配置文件這樣配置
'template' => [
'layout_on' => true, // 開啟模板布局
,默認是false
'layout_name' => 'layout/layoutname', // 布局入口文件,默認是layout,布局文件在模塊的view目錄下
'layout_item' => '{__REPLACE__}', // 內容輸出替換變量:默認是__CONTENT__
]
// 2.一個簡單的layout.html實例(__CONTENT__是特定的模板輸出替換變量,視圖文件會替換到這個變量的位置)
{include file="public/header" /}
{__CONTENT__}
{include file="public/footer" /}
// 3.如果某些頁面不需要使用布局模板功能,可以在模板文件開頭加上 {__NOLAYOUT__} 字符串。
```
### 第二種方式:模板標簽方式(不需要在配置文件進行修改和開啟layout_on,layout_on必須為默認的關閉狀態)
```
// 只需要在視圖文件的開頭加入下面標簽,replace用來指定布局文件中用來代表該視圖文件位置的變量
{layout name="Layout/newlayout" replace="[__REPLACE__]" /}
// 沒有寫layout標簽即代表不使用模板布局
```
### 第三種方式:使用layout控制模板布局(也不需要在配置文件修改和開啟layout_on)
```
class User extends Controller
{
public function add()
{
// 開啟模板布局,并且采用默認的layout布局文件
$this->view->engine->layout(true);
// 動態指定布局文件的名稱
$this->view->engine->layout('Layout/newlayout');
// 臨時關閉布局模板
$this->view->engine->layout(false);
return $this->fetch('add');
}
}
```
> ## 模板繼承{extend name="base" /}
> ### 1.基礎模板有很多block區塊標簽,然后繼承于這個模板的子模板根據基礎模板的name屬性分別替換這些區塊
> ### 2. block標簽內部可以有任意標簽和變量,甚至可以在區塊引入其他文件,如下
> `{block name="include"}{include file="Public:header" /}{/block}`
```
// 一個基礎模板實例:base.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{block name="title"}標題{/block}</title>
</head>
<body>
{block name="menu"}菜單{/block}
{block name="left"}左邊分欄{/block}
{block name="main"}主內容{/block}
{block name="right"}右邊分欄{/block}
{block name="footer"}底部{/block}
</body>
</html>
// 子模板中繼承示例
{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
<a href="/" >首頁</a>
<a href="/info/" >資訊</a>
<a href="/bbs/" >論壇</a>
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
<a href="/new/{$vo.id}">{$vo.title}</a><br/>
{$vo.content}
{/volist}
{/block}
{block name="right"}
最新資訊:
{volist name="news" id="new"}
<a href="/new/{$new.id}">{$new.title}</a><br/>
{/volist}
{/block}
{block name="footer"}
{__block__}
@ThinkPHP 版權所有
{/block}
```
### 模板繼承規則:
### 1.在子模板中使用extend標簽來繼承base模板,當前子模板中,只能定義基礎模板中已經定義的區塊而不能定義其他的模板內容,否則將會直接忽略。
### 2.在子模板中可以對基礎模板的區塊進行重載,如果沒有重新定義,代表沿用基礎模板的定義,可以多級繼承,但是子模板中的區塊必須都在基礎模板中進行定義
### 3.如果子模板定義了一個空的區塊,代表刪除基礎模板中對應name的區塊
### 4.將基礎模板內容與子模板定義內容合并
```
// 如下子模板中的{__block__}會自動替換為基礎模板中footer區塊定義的內容
{block name="footer"}
{__block__}@ThinkPHP 版權所有
{/block}
```
### 5.extend標簽也可以像include一樣加載其他模板
```
// 繼承view/public/base.html
{extend name="Public:base" /}
// 完整路徑引入
{extend name="./Template/Public/base.html" /}
```
- 運行環境需求
- tp5目錄結構
- 命令行生成代碼
- 路由
- 請求
- 獲取請求信息
- 超全局變量獲取
- 更改請求變量的值
- 判斷是否為某種請求類型
- 偽裝表單請求類型
- HTTP頭部信息
- 偽靜態
- 向請求對象中注入自定義的屬性和方法
- 簡單的傳參可以使用參數綁定
- 依賴注入(將對象注入方法作為參數)
- 將請求的數據進行緩存
- 控制器
- 一個控制器代碼示例
- 空控制器
- 資源控制器
- 模型
- 一個模型代碼示例
- 模型的四種調用方法
- 控制器中調用模型添加數據
- 控制器中調用模型更新數據
- 控制器中調用模型刪除數據
- 控制器中調用模型查詢數據
- 模型中使用聚合函數
- 獲取器
- 修改器
- 自動寫入時間戳
- 只讀字段
- 軟刪除
- 自動類型轉換
- 數據自動完成
- 查詢范圍
- 數組方式訪問和轉換為數組
- json序列化
- 模型的事件
- 關聯模型
- 一對一關聯
- 一對多關聯
- 遠程一對多(跨表關聯)
- 多對多關聯
- 多態關聯
- 關聯預載入N+1次查詢變2次
- 延遲預載入
- 關聯統計
- 視圖與模板
- 模板引擎配置
- 分配數據到模板
- 輸出替換
- 模板中輸出變量
- 模板中輸出系統變量(配置常量超全局)
- 模板中輸出請求信息
- 模板中使用php函數
- 輸出到模板中的變量指定默認值
- 模板中進行運算
- 原樣輸出代碼不解析
- 模版中注釋
- 模板布局與繼承
- 文件包含
- 內置標簽
- 循環輸出標簽
- 比較標簽
- 條件判斷標簽
- 引入資源文件(js-css)
- 使用原生php
- 在模板中定義變量和常量
- 助手函數
- 常用功能
- 表單驗證
- 驗證器的定義
- 自定義驗證規則
- 速查表
- 系統默認根命名空間
- 系統路徑常量
- 請求變量
- URL請求和信息方法