亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP的Yii框架中View視圖的使用進階

2020-03-22 17:45:54
字體:
來源:轉載
供稿:網友
視圖名渲染視圖時,可指定一個視圖名或視圖文件路徑/別名,大多數情況下使用前者因為前者簡潔靈活, 我們稱用名字的視圖為 視圖名.視圖名可以依據以下規則到對應的視圖文件路徑:視圖名可省略文件擴展名,這種情況下使用 .php 作為擴展, 視圖名 about 對應到 about.php 文件名;
視圖名以雙斜杠 // 開頭,對應的視圖文件路徑為 @app/views/ViewName, 也就是說視圖文件在 yii/base/Application::viewPath 路徑下找, 例如 //site/about 對應到 @app/views/site/about.php。
視圖名以單斜杠/開始,視圖文件路徑以當前使用模塊 的yii/base/Module::viewPath開始, 如果不存在模塊,使用@app/views/ViewName開始,例如,如果當前模塊為user, /user/create 對應成@app/modules/user/views/user/create.php, 如果不在模塊中,/user/create對應@app/views/user/create.php。
如果 yii/base/View::context 渲染視圖 并且上下文實現了 yii/base/ViewContextInterface, 視圖文件路徑由上下文的 yii/base/ViewContextInterface::getViewPath() 開始, 這種主要用在控制器和小部件中渲染視圖,例如 如果上下文為控制器SiteController,site/about 對應到 @app/views/site/about.php。
如果視圖渲染另一個視圖,包含另一個視圖文件的目錄以當前視圖的文件路徑開始, 例如被視圖@app/views/post/index.php 渲染的 item 對應到 @app/views/post/item。
根據以上規則,在控制器中 app/controllers/PostController 調用 $this- render('view'), 實際上渲染@app/views/post/view.php 視圖文件,當在該視圖文件中調用 $this- render('_overview') 會渲染@app/views/post/_overview.php 視圖文件。視圖中訪問數據在視圖中有兩種方式訪問數據:推送和拉取。推送方式是通過視圖渲染方法的第二個參數傳遞數據,數據格式應為名稱-值的數組, 視圖渲染時,調用PHP extract() 方法將該數組轉換為視圖可訪問的變量。 例如,如下控制器的渲染視圖代碼推送2個變量到 report 視圖:$foo = 1 和 $bar = 2。echo $this- render('report', [ 'foo' = 1, 'bar' = 2,拉取方式可讓視圖從yii/base/View視圖組件或其他對象中主動獲得數據(如Yii::$app), 在視圖中使用如下表達式$this- context可獲取到控制器ID, 可讓你在report視圖中獲取控制器的任意屬性或方法,如以下代碼獲取控制器ID。The controller ID is: = $this- context- id 推送方式讓視圖更少依賴上下文對象,是視圖獲取數據優先使用方式, 缺點是需要手動構建數組,有些繁瑣,在不同地方渲染時容易出錯。視圖間共享數據yii/base/View視圖組件提供yii/base/View::params參數屬性來讓不同視圖共享數據。例如在about視圖中,可使用如下代碼指定當前breadcrumbs的當前部分。$this- params['breadcrumbs'][] = 'About Us';在布局文件(也是一個視圖)中,可使用依次加入到yii/base/View::params數組的值來 生成顯示breadcrumbs: = yii/widgets/Breadcrumbs::widget([ 'links' = isset($this- params['breadcrumbs']) $this- params['breadcrumbs'] : [],布局布局是一種特殊的視圖,代表多個視圖的公共部分,例如,大多數Web應用共享相同的頁頭和頁尾, 在每個視圖中重復相同的頁頭和頁尾,更好的方式是將這些公共放到一個布局中, 渲染內容視圖后在合適的地方嵌入到布局中。創建布局由于布局也是視圖,它可像普通視圖一樣創建,布局默認存儲在@app/views/layouts路徑下, 模塊中使用的布局應存儲在yii/base/Module::basePath模塊目錄 下的views/layouts路徑下,可配置yii/base/Module::layoutPath來自定義應用或模塊的布局默認路徑。如下示例為一個布局大致內容,注意作為示例,簡化了很多代碼, 在實際中,你可能想添加更多內容,如頭部標簽,主菜單等。use yii/helpers/Html;/* @var $this yii/web/View *//* @var $content string 字符串 */ php $this- beginPage() !DOCTYPE html html lang="en" head meta charset="UTF-8"/ = Html::csrfMetaTags() title = Html::encode($this- title) /title php $this- head() /head body php $this- beginBody() header My Company /header = $content footer 2014 by My Company /footer php $this- endBody() /body /html php $this- endPage() 如上所示,布局生成每個頁面通用的HTML標簽,在 body 標簽中,打印$content變量, $content變量代表當yii/base/Controller::render()控制器渲染方法調用時傳遞到布局的內容視圖渲染結果。大多數視圖應調用上述代碼中的如下方法,這些方法觸發關于渲染過程的事件, 這樣其他地方注冊的腳本和標簽會添加到這些方法調用的地方。 yii/base/View::beginPage(): 該方法應在布局的開始處調用, 它觸發表明頁面開始的 yii/base/View::EVENT_BEGIN_PAGE 事件。 yii/base/View::endPage(): 該方法應在布局的結尾處調用, 它觸發表明頁面結尾的 yii/base/View::EVENT_END_PAGE 時間。 yii/web/View::head(): 該方法應在HTML頁面的 head 標簽中調用, 它生成一個占位符,在頁面渲染結束時會被注冊的頭部HTML代碼(如,link標簽, meta標簽)替換。 yii/web/View::beginBody(): 該方法應在 body 標簽的開始處調用, 它觸發 yii/web/View::EVENT_BEGIN_BODY 事件并生成一個占位符, 會被注冊的HTML代碼(如JavaScript)在頁面主體開始處替換。 yii/web/View::endBody(): 該方法應在 body 標簽的結尾處調用, 它觸發 yii/web/View::EVENT_END_BODY 事件并生成一個占位符, 會被注冊的HTML代碼(如JavaScript)在頁面主體結尾處替換。布局中訪問數據在布局中可訪問兩個預定義變量:$this 和 $content,前者對應和普通視圖類似的yii/base/View 視圖組件 后者包含調用yii/base/Controller::render()方法渲染內容視圖的結果。如果想在布局中訪問其他數據,必須使用視圖中訪問數據一節介紹的拉取方式, 如果想從內容視圖中傳遞數據到布局,可使用視圖間共享數據一節中的方法。使用布局如控制器中渲染一節描述,當控制器調用yii/base/Controller::render() 方法渲染視圖時,會同時使用布局到渲染結果中,默認會使用@app/views/layouts/main.php布局文件。可配置yii/base/Application::layout 或 yii/base/Controller::layout 使用其他布局文件, 前者管理所有控制器的布局,后者覆蓋前者來控制單個控制器布局。 例如,如下代碼使 post 控制器渲染視圖時使用 @app/views/layouts/post.php 作為布局文件, 假如layout 屬性沒改變,控制器默認使用 @app/views/layouts/main.php 作為布局文件。namespace app/controllers;use yii/web/Controller;class PostController extends Controller public $layout = 'post'; // ...對于模塊中的控制器,可配置模塊的 yii/base/Module::layout 屬性指定布局文件應用到模塊的所有控制器。由于layout 可在不同層級(控制器、模塊,應用)配置,在幕后Yii使用兩步來決定控制器實際使用的布局。第一步,它決定布局的值和上下文模塊:如果控制器的 yii/base/Controller::layout 屬性不為空null,使用它作為布局的值, 控制器的 yii/base/Controller::module模塊 作為上下文模塊。
如果 yii/base/Controller::layout 為空,從控制器的祖先模塊(包括應用) 開始找 第一個yii/base/Module::layout 屬性不為空的模塊,使用該模塊作為上下文模塊, 并將它的yii/base/Module::layout 的值作為布局的值, 如果都沒有找到,表示不使用布局。
第二步,它決定第一步中布局的值和上下文模塊對應到實際的布局文件,布局的值可為:路徑別名 (如 @app/views/layouts/main).
絕對路徑 (如 /main): 布局的值以斜杠開始,在應用的[[yii/base/Application::layoutPath|layout path] 布局路徑 中查找實際的布局文件,布局路徑默認為 @app/views/layouts。
相對路徑 (如 main): 在上下文模塊的yii/base/Module::layoutPath布局路徑中查找實際的布局文件, 布局路徑默認為yii/base/Module::basePath模塊目錄下的views/layouts 目錄。
布爾值 false: 不使用布局。
布局的值沒有包含文件擴展名,默認使用 .php作為擴展名。嵌套布局有時候你想嵌套一個布局到另一個,例如,在Web站點不同地方,想使用不同的布局, 同時這些布局共享相同的生成全局HTML5頁面結構的基本布局,可以在子布局中調用 yii/base/View::beginContent() 和yii/base/View::endContent() 方法,如下所示: php $this- beginContent('@app/views/layouts/base.php'); ...child layout content here... php $this- endContent(); 如上所示,子布局內容應在 yii/base/View::beginContent() 和 yii/base/View::endContent() 方法之間,傳給 yii/base/View::beginContent() 的參數指定父布局,父布局可為布局文件或別名。使用以上方式可多層嵌套布局。使用數據塊數據塊可以在一個地方指定視圖內容在另一個地方顯示,通常和布局一起使用, 例如,可在內容視圖中定義數據塊在布局中顯示它。調用 yii/base/View::beginBlock() 和 yii/base/View::endBlock() 來定義數據塊, 使用 $view- blocks[$blockID] 訪問該數據塊,其中 $blockID 為定義數據塊時指定的唯一標識ID。如下實例顯示如何在內容視圖中使用數據塊讓布局使用。首先,在內容視圖中定一個或多個數據塊: php $this- beginBlock('block1'); ...content of block1... php $this- endBlock(); php $this- beginBlock('block3'); ...content of block3... php $this- endBlock(); 然后,在布局視圖中,數據塊可用的話會渲染數據塊,如果數據未定義則顯示一些默認內容。 php if (isset($this- blocks['block1'])): = $this- blocks['block1'] php else: ... default content for block1 ... php endif; php if (isset($this- blocks['block2'])): = $this- blocks['block2'] php else: ... default content for block2 ... php endif; php if (isset($this- blocks['block3'])): = $this- blocks['block3'] php else: ... default content for block3 ... php endif; 使用視圖組件yii/base/View視圖組件提供許多視圖相關特性,可創建yii/base/View或它的子類實例來獲取視圖組件, 大多數情況下主要使用 view應用組件,可在應用配置中配置該組件, 如下所示: // ... 'components' = [ 'view' = [ 'class' = 'app/components/View', // ...視圖組件提供如下實用的視圖相關特性,每項詳情會在獨立章節中介紹: 主題: 允許為你的Web站點開發和修改主題; 片段緩存: 允許你在Web頁面中緩存片段; 客戶腳本處理: 支持CSS 和 JavaScript 注冊和渲染; 資源包處理: 支持 資源包的注冊和渲染; 模板引擎: 允許你使用其他模板引擎,如 Twig, Smarty。開發Web頁面時,也可能頻繁使用以下實用的小特性。設置頁面標題每個Web頁面應有一個標題,正常情況下標題的標簽顯示在 布局中, 但是實際上標題大多由內容視圖而不是布局來決定,為解決這個問題, yii/web/View 提供 yii/web/View::title 標題屬性可讓標題信息從內容視圖傳遞到布局中。為利用這個特性,在每個內容視圖中設置頁面標題,如下所示:$this- title = 'My page title';然后在視圖中,確保在 head 段中有如下代碼: title = Html::encode($this- title) /title 注冊Meta元標簽Web頁面通常需要生成各種元標簽提供給不同的瀏覽器,如 head 中的頁面標題,元標簽通常在布局中生成。如果想在內容視圖中生成元標簽,可在內容視圖中調用yii/web/View::registerMetaTag()方法,如下所示:$this- registerMetaTag(['name' = 'keywords', 'content' = 'yii, framework, php']);以上代碼會在視圖組件中注冊一個 "keywords" 元標簽,在布局渲染后會渲染該注冊的元標簽, 然后,如下HTML代碼會插入到布局中調用yii/web/View::head()方法處: meta name="keywords" content="yii, framework, php" 注意如果多次調用 yii/web/View::registerMetaTag() 方法,它會注冊多個元標簽,注冊時不會檢查是否重復。為確保每種元標簽只有一個,可在調用方法時指定鍵作為第二個參數, 例如,如下代碼注冊兩次 "description" 元標簽,但是只會渲染第二個。$this- registerMetaTag(['name' = 'description', 'content' = 'This is my cool website made with Yii!'], 'description');$this- registerMetaTag(['name' = 'description', 'content' = 'This website is about funny raccoons.'], 'description');注冊鏈接標簽和 Meta標簽 類似,鏈接標簽有時很實用,如自定義網站圖標,指定Rss訂閱,或授權OpenID到其他服務器。 可以和元標簽相似的方式調用yii/web/View::registerLinkTag(),例如,在內容視圖中注冊鏈接標簽如下所示:$this- registerLinkTag([ 'title' = 'Live News for Yii', 'rel' = 'alternate', 'type' = 'application/rss+xml', 'href' = 'http://www.yiiframework.com/rss.xml/',上述代碼會轉換成復制代碼 代碼如下: link title="Live News for Yii" rel="alternate" type="application/rss+xml"
和 yii/web/View::registerMetaTag() 類似, 調用yii/web/View::registerLinkTag() 指定鍵來避免生成重復鏈接標簽。視圖事件yii/base/View 視圖組件會在視圖渲染過程中觸發幾個事件, 可以在內容發送給終端用戶前,響應這些事件來添加內容到視圖中或調整渲染結果。 yii/base/View::EVENT_BEFORE_RENDER: 在控制器渲染文件開始時觸發, 該事件可設置 yii/base/ViewEvent::isValid 為 false 取消視圖渲染。 yii/base/View::EVENT_AFTER_RENDER: 在布局中調用 yii/base/View::beginPage() 時觸發, 該事件可獲取yii/base/ViewEvent::output的渲染結果,可修改該屬性來修改渲染結果。 yii/base/View::EVENT_BEGIN_PAGE: 在布局調用 yii/base/View::beginPage() 時觸發; yii/base/View::EVENT_END_PAGE: 在布局調用 yii/base/View::endPage() 是觸發; yii/web/View::EVENT_BEGIN_BODY: 在布局調用 yii/web/View::beginBody() 時觸發; yii/web/View::EVENT_END_BODY: 在布局調用 yii/web/View::endBody() 時觸發。例如,如下代碼將當前日期添加到頁面結尾處:/Yii::$app- view- on(View::EVENT_END_BODY, function () { echo date('Y-m-d');渲染靜態頁面靜態頁面指的是大部分內容為靜態的不需要控制器傳遞動態數據的Web頁面。可將HTML代碼放置在視圖中,在控制器中使用以下代碼輸出靜態頁面:public function actionAbout() return $this- render('about');如果Web站點包含很多靜態頁面,多次重復相似的代碼顯得很繁瑣, 為解決這個問題,可以使用一個在控制器中稱為 yii/web/ViewAction 的獨立操作。 例如:namespace app/controllers;use yii/web/Controller;class SiteController extends Controller public function actions() return [ 'page' = [ 'class' = 'yii/web/ViewAction',現在如果你在@app/views/site/pages目錄下創建名為 about 的視圖, 可通過如下rul顯示該視圖:http://localhost/index.php r=site/page&view=about
GET 中 view 參數告知 yii/web/ViewAction 操作請求哪個視圖,然后操作在 @app/views/site/pages目錄下尋找該視圖,可配置 yii/web/ViewAction::viewPrefix 修改搜索視圖的目錄。最佳實踐視圖負責將模型的數據展示用戶想要的格式,總之,視圖 應主要包含展示代碼,如HTML, 和簡單的PHP代碼來控制、格式化和渲染數據; 不應包含執行數據查詢代碼,這種代碼放在模型中; 應避免直接訪問請求數據,如 $_GET, $_POST,這種應在控制器中執行, 如果需要請求數據,應由控制器推送到視圖。 可讀取模型屬性,但不應修改它們。 為使模型更易于維護,避免創建太復雜或包含太多冗余代碼的視圖,可遵循以下方法達到這個目標: 使用 布局 來展示公共代碼(如,頁面頭部、尾部); 將復雜的視圖分成幾個小視圖,可使用上面描述的渲染方法將這些小視圖渲染并組裝成大視圖; 創建并使用 小部件 作為視圖的數據塊; 創建并使用助手類在視圖中轉換和格式化數據。PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日本精品| 性日韩欧美在线视频| 久久久久久久国产精品视频| 欧洲成人免费视频| 亚洲成人精品久久久| 亚洲成人国产精品| 欧美一区二区影院| 亚洲自拍偷拍色片视频| 国产美女被下药99| 国产精品爱久久久久久久| 欧美大胆在线视频| 成人春色激情网| 精品国产电影一区| 日韩欧美在线观看视频| 国产精品美女免费看| 亚洲第一视频在线观看| 欧美天天综合色影久久精品| 久久天天躁狠狠躁老女人| 亚洲第一福利网| 亚洲色图偷窥自拍| 国产丝袜一区二区三区免费视频| 日韩av在线高清| 国产精品久久9| 动漫精品一区二区| 亚洲小视频在线观看| 国产这里只有精品| 97超碰国产精品女人人人爽| 日韩理论片久久| 欧美性猛交xxxx黑人猛交| 国产一区二区三区欧美| 久久人人爽人人爽人人片av高清| 精品国产户外野外| 性色av一区二区三区免费| 亚洲一区免费网站| 在线一区二区日韩| 精品亚洲男同gayvideo网站| 精品中文字幕在线2019| 成人国内精品久久久久一区| 欧美日韩另类字幕中文| 亚洲精品电影在线| 色婷婷av一区二区三区久久| 国产成人一区三区| 亚洲最大福利视频网站| 午夜精品久久久久久久99黑人| 黑人精品xxx一区| 日韩电影中文 亚洲精品乱码| 国产精品三级久久久久久电影| 精品福利免费观看| 欧美极品第一页| 欧美极品少妇xxxxx| 欧美精品激情blacked18| 国产精品日韩在线观看| 成人黄色午夜影院| 日本成人激情视频| 亚洲美女喷白浆| 亚洲精品一区在线观看香蕉| 91av在线视频观看| 亚洲永久在线观看| 日韩av最新在线观看| 国产精品免费久久久| 欧美激情一级二级| 久久久久久久成人| 黄色成人在线播放| 中文字幕亚洲欧美一区二区三区| 国产精品久久久久久久午夜| 欧美丝袜一区二区三区| 国产精品嫩草视频| 国产精品青青在线观看爽香蕉| 亚洲欧洲国产伦综合| 国产最新精品视频| 91精品国产乱码久久久久久久久| 欧美日韩在线看| 欧美视频在线观看免费网址| 欧美成人免费全部观看天天性色| 亚洲色图综合网| 国产精品美女av| 亚洲网站在线观看| 日韩大陆欧美高清视频区| 欧美日韩国产一中文字不卡| 日韩成人激情视频| 国产精品久久99久久| 久久久www成人免费精品| 欧美日本高清一区| 久久精品91久久香蕉加勒比| 亚洲图片欧美午夜| 国产91精品视频在线观看| 欧美日韩激情视频| 欧洲美女7788成人免费视频| 国产精品揄拍一区二区| 超碰日本道色综合久久综合| 欧美电影免费观看| 国产亚洲aⅴaaaaaa毛片| xx视频.9999.com| 一区二区三区精品99久久| 国产成人免费91av在线| 欧美激情精品在线| 久久久视频免费观看| 国产亚洲aⅴaaaaaa毛片| 日韩欧美一区二区三区久久| 中国日韩欧美久久久久久久久| 色偷偷噜噜噜亚洲男人的天堂| 日韩精品www| 日韩av电影在线播放| 欧洲成人性视频| 日韩精品免费在线播放| 91成人性视频| 亚洲高清久久久久久| 亚洲图片欧洲图片av| 亚洲国产成人精品久久久国产成人一区| 欧美高清自拍一区| 国产精品无av码在线观看| 亚洲伊人久久大香线蕉av| 亚洲第一区中文99精品| 538国产精品一区二区免费视频| 高清视频欧美一级| 永久免费毛片在线播放不卡| 中文字幕日韩欧美| 日韩精品免费在线播放| 日韩欧美精品在线观看| 亚洲欧美日韩久久久久久| 91精品国产网站| 日韩av在线直播| 92版电视剧仙鹤神针在线观看| 亚洲最新在线视频| www.xxxx精品| 96精品久久久久中文字幕| 午夜精品久久久久久久久久久久| 中文字幕av一区中文字幕天堂| 在线视频欧美日韩| 国产午夜一区二区| 在线日韩精品视频| 日韩的一区二区| 91精品综合久久久久久五月天| 亚洲最新在线视频| 欧美视频一区二区三区…| 亚洲欧美日韩网| 国产精品成人一区| 日韩美女在线播放| 亚洲最大av网| 欧美日韩精品在线观看| 在线日韩精品视频| 国产精品伦子伦免费视频| 日韩欧美中文字幕在线观看| 国产精品视频公开费视频| 国产一区二区三区高清在线观看| 国产欧美精品日韩精品| 亚洲综合在线中文字幕| 欧美精品免费看| 久久精品国产96久久久香蕉| 久久久久日韩精品久久久男男| 欧美成人精品h版在线观看| 国产视频999| 成人有码在线播放| 欧美在线视频免费观看| 精品国产欧美一区二区三区成人| 欧美成人久久久| 国产深夜精品福利| 91大神在线播放精品| 欧美激情精品久久久久久久变态| 久久精品视频99| 欧美成人一区二区三区电影| 日本午夜在线亚洲.国产| 欧美成人午夜剧场免费观看| 亚洲肉体裸体xxxx137|