Phalcon#基本功能#視圖

視圖層負(fù)責(zé)把數(shù)據(jù)展示給瀏覽器或其他工具,Phalcon 中通過(guò) Phalcon\Mvc\View 來(lái)管理視圖層??刂破髦幸呀?jīng)集成了視圖,默認(rèn)情況下當(dāng)訪問一個(gè)路由時(shí),視圖目錄下的控制器目錄下的方法名視圖文件將被渲染。如:訪問 http://127.0.0.1/blog/article/show/2,Phalcon 將按下面的方式解析 url:
Server Address: 127.0.0.1
Phalcon Directory: blog
Controller: article
Action: show
Parameter: 2
調(diào)度程序?qū)?huì)尋找 ArticleController 控制器中的 showAction,如:

<?php
 
use Phalcon\Mvc\Controller;
 
class ArticleController extends Controller
{
    public function showAction($id)
    {
        // 把參數(shù)$id傳給視圖
        $this->view->id = $id;
    }
}

最后視圖文件 app\views\article\show.phtml 將會(huì)被渲染,默認(rèn)情況下使用 php 本身作為模板引擎,視圖文件后綴為 .phtml。

自定義視圖目錄

Phalcon 中可以自定義視圖層目錄位置:

<?php

$view = new Phalcon\Mvc\View();
$view->setViewsDir('../app/views/');

一般都會(huì)在 di 中注冊(cè)視圖服務(wù),并初始化應(yīng)用程序:

$di->set('view', function () {
    $view = new Phalcon\Mvc\View();
    $view->setViewsDir('../app/views/');
    return $view;
});
$application = new Phalcon\Mvc\Application($di);
分配變量

控制器中傳遞變量到視圖層:

<?php

// 直接傳遞單個(gè)參數(shù)
$this->view->paramName = value; 
 
// 傳遞單個(gè)參數(shù)
$this->view->setVar('paramName', 'value'); 
 
// 傳遞多個(gè)參數(shù)
$this->view->setVars([
    'param1' => 'value1',
    'param2' => 'value2'
]);
使用布局

使用布局,實(shí)現(xiàn)頁(yè)面共用。首先定義布局文件目錄:

<?php

$di->set('view', function () {
    $view = new View();
    $view->setViewsDir('../app/views/'); // 定義視圖層目錄
    $view->setLayoutsDir('common/');     // 定義布局文件目錄
    $view->setTemplateAfter('main');     // 定義布局文件名,main.phtml 將被視作模板文件
    return $view;
});

控制器:

<?php
 
use Phalcon\Mvc\Controller;
 
class ArticleController extends Controller
{
    public function showAction($id)
    {
        $this->view->pick('article/show')->setVar('id', $id);
    }
}

模板文件(/app/views/common/main.phtml):

<!DOCTYPE html>
<html>
<head>
     <title></title>
</head>
     <body>
          測(cè)試布局
          <?php echo $this->getContent(); ?>
     </body>
</html>

模板文件(/app/views/article/show.phtml):

<div>
     <h3>文章id:<?php echo $id; ?></h3>
</div>

最后瀏覽器將輸出:

<!DOCTYPE html>
<html><head>
    <title></title>
</head>
<body>
測(cè)試布局
<div>
    <h3>文章id:44</h3>
</div>
</body>
</html>
渲染局部視圖

展示頁(yè)面時(shí)通常會(huì)將常用的頁(yè)面,抽出成共用的模板,這時(shí)在布局中就可以使用局部渲染。如:

//===========================
// app/views/common/nav.phtml
//===========================
<div>
     <h3>這是一個(gè)導(dǎo)航頁(yè)</h3>
     <ul>
          <li>菜單1</li>
          <li>菜單2</li>
     </ul>
</div>
 
//============
// 引入這個(gè)導(dǎo)航:
//============
<!DOCTYPE html>
<html>
<head>
     <title></title>
</head>
     <body>
          測(cè)試布局
          <?php echo $this->view->getPartial('common/nav'); ?>
          <hr/>
          <?php echo $this->getContent(); ?>
     </body>
</html>

渲染后的結(jié)果則為:

<html>
<head>
    <title></title>
</head>
<body>
測(cè)試布局
<div>
    <h3>這是一個(gè)導(dǎo)航頁(yè)</h3>
    <ul>
        <li>菜單1</li>
        <li>菜單2</li>
    </ul>
</div>
<hr>
<div>
    <h3>文章id:44</h3>
</div>
</body>
</html>
渲染級(jí)別

Phalcon 中渲染級(jí)別可以控制視圖具體顯示的層級(jí),級(jí)別分為以下幾種:

類常量 解釋 順序
LEVEL_NO_RENDER 表明要避免產(chǎn)生任何形式的顯示。
LEVEL_ACTION_VIEW 生成顯示到視圖關(guān)聯(lián)的動(dòng)作。 1
LEVEL_BEFORE_TEMPLATE 生成顯示到控制器模板布局之前。 2
LEVEL_LAYOUT 生成顯示到控制器布局。 3
LEVEL_AFTER_TEMPLATE 生成顯示到控制器模板布局后。 4
LEVEL_MAIN_LAYOUT 生成顯示到主布局。 5

當(dāng)設(shè)置渲染級(jí)別為 LEVEL_ACTION_VIEW 時(shí)將不加載布局文件 app/views/common/main.phtml

<?php
 
use Phalcon\Mvc\Controller;
 
class ArticleController extends Controller
{
    public function showAction($id)
    {
        $this->view->setVar('id', $id)->setRenderLevel(View::LEVEL_ACTION_VIEW);
    }
}

最后將只輸出控制器頁(yè)面:

<div>
    <h3>文章id:44</h3>
</div>

關(guān)閉渲染級(jí)別:

use Phalcon\Mvc\View;
 
$view = new View();
$view->disableLevel([
    View::LEVEL_LAYOUT => true,
    View::LEVEL_MAIN_LAYOUT => true
]);
選擇視圖

如果在控制器中想要自定義視圖顯示文件,可以使用 Phalcon\Mvc\View::pick() 方法。

<?php
 
use Phalcon\Mvc\Controller;
 
class ArticleController extends Controller
{
    public function listAction()
    {
        // 顯示"viewsDir/article/search"視圖文件
        $this->view->pick('article/search');
        // 顯示"viewsDir/news/list"視圖文件
        $this->view->pick(['news']); 
           
        // 顯示"viewsDir/article/search"視圖文件
        $this->view->pick([1 => 'search']); // 如果參數(shù)是數(shù)組的話,數(shù)組第0位置的參數(shù)為控制器,第1參數(shù)的位置為方法命名
    }
}
關(guān)閉視圖

控制器中關(guān)閉視圖功能:

<?php
 
use Phalcon\Mvc\Controller;
 
class ArticleController extends Controller
{
    public function showAction($id)
    {
        // 關(guān)閉視圖功能
        $this->view->disable();
    }
}

注冊(cè)服務(wù)容器 DI 時(shí)關(guān)閉視圖功能:

<?php
 
$di->set('view', function () {
    return (new Phalcon\Mvc\View)->disable();
});
渲染視圖

簡(jiǎn)單渲染 Phalcon\Mvc\View\SimplePhalcon\Mvc\View 的組成部分,沒有文件的層次結(jié)構(gòu)是與 Phalcon\Mvc\View 的主要區(qū)別。該組件也允許自定義視圖所在位置。
使用該組件必須替換服務(wù)容器:

<?php
 
use Phalcon\Mvc\View\Simple;
 
$di->set('view', function(){
    $view = new Simple();
    $view->setViewsDir('../app/views/');
    return $view;
});

禁用自動(dòng)渲染功能:

<?php
 
use Phalcon\Mvc\Application;
 
try {
    $application = new Application($di);
    $application->useImplicitView(false);
    echo $application->handle()->getContent();
} catch (\Exception $e) {
    echo $e->getMessage();
}

渲染視圖:

<?php
 
use Phalcon\Mvc\Controller;
 
class ArticleController extends Controller
{
    public function showAction($id)
    {
        // 渲染 viewsDir/index.phtml 文件
        echo $this->view->render('index');
                
        // 渲染 viewsDir/article/show.phtml 文件
        echo $this->view->render('article/show', ['id' => $id]);  
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評(píng)論 25 708
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,653評(píng)論 30 472
  • 娘酒雞具有暖身,驅(qū)寒,補(bǔ)血之功效,所以客家人對(duì)娘酒雞頗為鐘愛。在客家人中,產(chǎn)婦一般都是用吃娘酒雞來(lái)進(jìn)補(bǔ)。在冬至?xí)r,...
    米思辰閱讀 1,029評(píng)論 0 1
  • 沒有偷懶的理由和借口,自己才是自己的依靠,事業(yè)至上!愛自己愛父母。給26歲的我警醒!過(guò)好每一天。
    Annalbeibei閱讀 196評(píng)論 0 0

友情鏈接更多精彩內(nèi)容