# 9. 插件控制器
## 插件控制器
插件除了基于前臺與后臺外,還可以作為獨立的模塊。創建控制器后即可賦予插件前臺訪問功能。
## 創建控制器
控制器放在`controller`文件夾下,以`demo`插件為例,創建首頁控制器,路徑為:addons/demo/controller/Index.php,如下圖

Index.php 代碼
```
<pre class="calibre16">```
<span class="token"><</span><span class="token">?</span>php
namespace addons\demo\controller<span class="token1">;</span>
use think\addons\Controller<span class="token1">;</span>
class <span class="token6">Index</span> extends <span class="token6">Controller</span>
<span class="token1">{</span>
public <span class="token2">function</span> <span class="token6">index</span><span class="token1">(</span><span class="token1">)</span>
<span class="token1">{</span>
<span class="token2">return</span> <span class="token4">'首頁'</span><span class="token1">;</span>
<span class="token1">}</span>
<span class="token1">}</span>
```
```
瀏覽器訪問地址格式:[http://xxx.com/addons/插件名稱/控制器名/操作方法](http://xxx.com/addons/%E6%8F%92%E4%BB%B6%E5%90%8D%E7%A7%B0/%E6%8E%A7%E5%88%B6%E5%99%A8%E5%90%8D/%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95)
如上`demo`插件,那么首頁控制器訪問如下,沒寫控制器那么訪問的是`Index`控制器,操作方法默認是`index`
<http://xxx.com/addons/demo/index/index>
首頁默認是Index,操作方法index,那么可以省略,如下即可直接訪問到
<http://xxx.com/addons/demo/>
## 基類控制器
創建的控制器繼承`think\addons\Controller`基類,文件位置在:vendor/hkcms/cms-addons/src/addons/Controller.php
繼承之后有以下屬性、方法可以調用,你可根據自己的需要重寫某些屬性、方法
屬性名說明使用說明$error\_tmpl錯誤頁默認是插件視圖根目錄下的error.html,參考app/common/tpl/error.html$success\_tmpl成功頁同上,只有使用error方法或success方法時有效$app容器變量有路由、配置、路由等實例對象,更多了解:[http://www.hmoore.net/manual/thinkphp6\_0/1037489](http://www.hmoore.net/manual/thinkphp6_0/1037489)$request請求對象用于獲取請求的信息,更多了解:[http://www.hmoore.net/manual/thinkphp6\_0/1037518](http://www.hmoore.net/manual/thinkphp6_0/1037518)$name插件標識名稱$addon\_path當前插件根路徑$cache緩存更多了解:[http://www.hmoore.net/manual/thinkphp6\_0/1037634](http://www.hmoore.net/manual/thinkphp6_0/1037634)$site站點配置數組即后臺站點配置,$this-site\['title'\] 獲取網站名稱**控制器方法**
1. `error`方法,輸出錯誤信息,如果是ajax請求則返回的是json數據。如果不是ajax確保視圖目錄下有error.html文件,你可通過$error\_tmpl來指定位置,只能是視圖目錄下。
```
<pre class="calibre16">```
<span class="token5">// 在控制器里面使用</span>
public <span class="token2">function</span> <span class="token6">test</span><span class="token1">(</span><span class="token1">)</span>
<span class="token1">{</span>
$this<span class="token">-</span><span class="token">></span><span class="token6">error</span><span class="token1">(</span><span class="token4">'出錯了'</span><span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
<span class="token5">// $msg 提示信息</span>
<span class="token5">// $url = 跳轉地址</span>
<span class="token5">// $data = 返回的數據</span>
<span class="token5">// $wait = 等待幾秒后跳轉,默認3秒</span>
<span class="token5">// $header = 頭部信息</span>
$this<span class="token">-</span><span class="token">></span><span class="token6">error</span><span class="token1">(</span>$msg<span class="token1">,</span> $url<span class="token1">,</span> $data<span class="token1">,</span>$wait<span class="token1">,</span> $header<span class="token1">)</span>
```
```
2. `success`方法,輸出正確提示信息,同上一樣。
3. `result` 方法返回指定的數據類型,例如json、xml,默認是json,常用于接口。
```
<pre class="calibre16">```
public <span class="token2">function</span> <span class="token6">test</span><span class="token1">(</span><span class="token1">)</span>
<span class="token1">{</span>
$this<span class="token">-</span><span class="token">></span><span class="token6">result</span><span class="token1">(</span><span class="token4">'操作成功'</span><span class="token1">,</span><span class="token1">[</span><span class="token4">'lists'</span><span class="token">=</span><span class="token">></span><span class="token1">[</span><span class="token1">]</span><span class="token1">]</span><span class="token1">,</span><span class="token3">200</span><span class="token1">,</span> <span class="token4">'json'</span><span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
```
```
```
<pre class="calibre16">```
<span class="token5">/**
* $msg 提示信息
* $data 要返回的數據
* $code 返回的code
* $type 返回數據格式
* $header 發送的Header信息
*/</span>
$this<span class="token">-</span><span class="token">></span><span class="token6">result</span><span class="token1">(</span>$msg <span class="token">=</span> <span class="token4">''</span><span class="token1">,</span> $data <span class="token">=</span> <span class="token1">[</span><span class="token1">]</span><span class="token1">,</span> $code <span class="token">=</span> <span class="token3">200</span><span class="token1">,</span> $type <span class="token">=</span> <span class="token4">'json'</span><span class="token1">,</span> array $header <span class="token">=</span> <span class="token1">[</span><span class="token1">]</span><span class="token1">)</span>
```
```
4. `fetch`加載模板頁面方法
如下,參數一填寫模板位置,位置是基于插件視圖為基準,另外如果為空默認以當前控制器/操作方法方式找到模板位置。參數二為模板變量參數
```
<pre class="calibre16">```
<span class="token5">/**
* $template 模板文件名
* $vars 模板輸出變量
*/</span>
$this<span class="token">-</span><span class="token">></span><span class="token6">fetch</span><span class="token1">(</span>$template <span class="token">=</span> <span class="token4">''</span><span class="token1">,</span> $vars <span class="token">=</span> <span class="token1">[</span><span class="token1">]</span><span class="token1">)</span>
```
```
以demo插件為例,以下是Index控制器加載模板,參數沒有填寫那么加載的模板路徑為:addons/demo/view/index/test.html
```
<pre class="calibre16">```
public <span class="token2">function</span> <span class="token6">test</span><span class="token1">(</span><span class="token1">)</span>
<span class="token1">{</span>
<span class="token2">return</span> $this<span class="token">-</span><span class="token">></span><span class="token6">fetch</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
```
```
加載其他模板,路徑為:addons/demo/view/test/index.html
```
<pre class="calibre16">```
public <span class="token2">function</span> <span class="token6">test</span><span class="token1">(</span><span class="token1">)</span>
<span class="token1">{</span>
<span class="token2">return</span> $this<span class="token">-</span><span class="token">></span><span class="token6">fetch</span><span class="token1">(</span><span class="token4">'test/index'</span><span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
```
```
5. `display`渲染模板內容
與fetch方法不同的是,fetch方法時獲取傳入的文件位置,display方法是直接傳入字符串渲染。
```
<pre class="calibre16">```
<span class="token5">/**
* @param string $content 模板內容
* @param array $vars 模板輸出變量
*/</span>
$this<span class="token">-</span><span class="token">></span><span class="token6">display</span><span class="token1">(</span>$content <span class="token">=</span> <span class="token4">''</span><span class="token1">,</span> $vars <span class="token">=</span> <span class="token1">[</span><span class="token1">]</span><span class="token1">)</span>
```
```
示例
```
<pre class="calibre16">```
public <span class="token2">function</span> <span class="token6">test</span><span class="token1">(</span><span class="token1">)</span>
<span class="token1">{</span>
$html <span class="token">=</span> <span class="token4">'<a>{$test}</a>'</span><span class="token1">;</span>
<span class="token2">return</span> $this<span class="token">-</span><span class="token">></span><span class="token6">display</span><span class="token1">(</span>$html<span class="token1">,</span> <span class="token1">[</span><span class="token4">'test'</span><span class="token">=</span><span class="token">></span><span class="token3">111</span><span class="token1">]</span><span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
```
```
6. `assign`模板變量賦值方法
```
<pre class="calibre16">```
<span class="token5">/**
* @param mixed $name 要顯示的模板變量
* @param mixed $value 變量的值
*/</span>
$this<span class="token">-</span><span class="token">></span><span class="token6">assign</span><span class="token1">(</span>$name<span class="token1">,</span> $value <span class="token">=</span> <span class="token4">''</span><span class="token1">)</span>
```
```
示例:如下,這樣定義好后,在模板頁面寫入{$txt}即可。
```
<pre class="calibre16">```
public <span class="token2">function</span> <span class="token6">test</span><span class="token1">(</span><span class="token1">)</span>
<span class="token1">{</span>
$txt <span class="token">=</span> <span class="token4">'測試'</span><span class="token1">;</span>
$this<span class="token">-</span><span class="token">></span><span class="token6">assign</span><span class="token1">(</span><span class="token4">'txt'</span><span class="token1">,</span> $txt<span class="token1">)</span><span class="token1">;</span>
<span class="token2">return</span> $this<span class="token">-</span><span class="token">></span><span class="token6">fetch</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
```
```
7. `getInfo`獲取插件信息
```
<pre class="calibre16">```
public <span class="token2">function</span> <span class="token6">test</span><span class="token1">(</span><span class="token1">)</span>
<span class="token1">{</span>
$ini <span class="token">=</span> $this<span class="token">-</span><span class="token">></span><span class="token6">getInfo</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span>
<span class="token6">dump</span><span class="token1">(</span>$ini<span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
```
```
8. `getConfig`獲取插件配置
true = 獲取完整配置,即返回config.php里面的完整數組,false 僅獲取鍵值。
```
<pre class="calibre16">```
<span class="token5">/**
* @param bool $type 是否獲取完整配置
*/</span>
$this<span class="token">-</span><span class="token">></span><span class="token6">getConfig</span><span class="token1">(</span>$type <span class="token">=</span> <span class="token3">false</span><span class="token1">)</span>
```
```
示例
```
<pre class="calibre16">```
public <span class="token2">function</span> <span class="token6">test</span><span class="token1">(</span><span class="token1">)</span>
<span class="token1">{</span>
$config <span class="token">=</span> $this<span class="token">-</span><span class="token">></span><span class="token6">getConfig</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span>
<span class="token6">dump</span><span class="token1">(</span>$config<span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
```
```
可參考內容:
[插件內置函數](Cha%20Jian%20Nei%20Zhi%20Han%20Shu.html)
- 簡介
- 下載與安裝配置
- 下載
- 虛擬主機安裝
- 百度云虛擬主機
- 創業云虛擬主機
- Linux下寶塔安裝
- 寶塔一鍵部署
- Windows下寶塔安裝
- phpEnv下安裝
- phpStudy下安裝
- 偽靜態(url重寫)
- 安裝系統
- 調試模式與env文件
- 重新安裝與安裝文件說明
- 后臺使用幫助
- 后臺入口文件
- 首頁面板
- 配置中心
- 站點配置
- SEO設置
- SEO設置-靜態生成
- 文檔屬性
- 站點模塊
- V2.2.2版本 -
- V2.2.3版本 +
- 模型管理
- 欄目管理
- 字段類型與組件
- 前言
- 前端組件
- 驗證規則
- text 單行文本
- textarea 多行文本
- radio 單選
- checkbox 復選
- select 下拉列表
- selects下拉列表(多)
- selectpage 動態下拉
- editor編輯器
- image圖片
- images圖片(多)
- number數字
- date日期
- datetime日期和時間
- downfile文件上傳
- downfiles文件上傳(多)
- array 數組(鍵值對)
- 內容管理
- 自定義URL
- 多語言
- 界面多語言
- 內容多語言
- 多語言URL地址
- 附件管理
- 應用中心
- 標簽語法
- 標簽使用必讀
- 列表標簽
- content 內容列表標簽
- contentpage 內容列表分頁
- wfpage 瀑布流分頁
- filter 篩選標簽
- order 排序標簽
- 內容標簽
- guestbook 留言(表單)標簽(廢棄)
- form 表單標簽
- pre 上一篇標簽
- next 下一篇標簽
- prenext 上一篇下一篇(高級)標簽
- fileinfo 獲取附件信息(文件下載)
- 內容分頁
- raw 格式化編輯器文本(即將廢棄)
- 全局標簽
- seo 標簽
- channel 欄目標簽
- arcone 獲取單條文檔
- breadcrumb 面包屑導航標簽
- adv 站點模塊標簽
- date 日期格式化標簽
- substr字符(標題)截取標簽
- volist 循環標簽
- language 獲取語言列表標簽
- query 查詢數據庫內容
- include 導入模板文件標簽
- 原生PHP與php標簽
- map生成位置地圖
- thumb 生成縮略圖
- addons 插件檢測
- 標簽管理
- taglist標簽(獲取標簽列表)
- tagarclist根據標簽獲取文章內容列表
- 導入標簽
- 模板開發
- 1. 創建模板
- 2. 模板目錄結構
- 3. 模板描述文件(重要) info.ini
- 4. 變量輸出格式
- 4. 模板變量
- 5. 獲取站點配置
- 6. 模板界面多語言
- 7. 模板靜態目錄及調用靜態文件
- 8. 模板定義插件事件
- 9. 模板搜索頁
- 10. 模板配置JSON
- 11. 導入演示數據
- 12. 卸載刪除演示數據
- 13. 模板文件打包
- 14. 整站源碼打包
- 插件開發
- 1. 創建插件
- 2. 目錄結構
- 3. 插件名稱類
- 4. 插件信息(info.ini)
- 5. 插件事件
- 6. 配置文件
- 7. install 安裝目錄
- 8. 創建菜單
- 9. 插件控制器
- 10. 插件視圖
- 10-1 插件主題化
- 11. 插件模型
- 12. 模型事件
- 13. 插件內置函數
- 13-1 插件函數庫
- 14. 插件多語言
- 15. 插件中間件
- 16. 插件路由
- 17. 插件驗證器
- 18. 標簽庫
- 19. 第三方類庫
- 20. 數據庫文件導入
- 插件打包
- 后臺前端使用幫助
- 二次開發幫助(更新中)
- 后臺前端開發幫助
- 路由(鏈接地址、訪問規則)
- URL訪問
- 路由定義
- URL生成
- 附錄
- 數據字典
- 助手函數庫