美文网首页phalcon
Phalcon#基本功能#视图

Phalcon#基本功能#视图

作者: 野尘lxw | 来源:发表于2016-09-17 00:25 被阅读0次

    视图层负责把数据展示给浏览器或其他工具,Phalcon 中通过 Phalcon\Mvc\View 来管理视图层。控制器中已经集成了视图,默认情况下当访问一个路由时,视图目录下的控制器目录下的方法名视图文件将被渲染。如:访问 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
    调度程序将会寻找 ArticleController 控制器中的 showAction,如:

    <?php
     
    use Phalcon\Mvc\Controller;
     
    class ArticleController extends Controller
    {
        public function showAction($id)
        {
            // 把参数$id传给视图
            $this->view->id = $id;
        }
    }
    

    最后视图文件 app\views\article\show.phtml 将会被渲染,默认情况下使用 php 本身作为模板引擎,视图文件后缀为 .phtml

    自定义视图目录

    Phalcon 中可以自定义视图层目录位置:

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

    一般都会在 di 中注册视图服务,并初始化应用程序:

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

    控制器中传递变量到视图层:

    <?php
    
    // 直接传递单个参数
    $this->view->paramName = value; 
     
    // 传递单个参数
    $this->view->setVar('paramName', 'value'); 
     
    // 传递多个参数
    $this->view->setVars([
        'param1' => 'value1',
        'param2' => 'value2'
    ]);
    
    使用布局

    使用布局,实现页面共用。首先定义布局文件目录:

    <?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>
              测试布局
              <?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>
    测试布局
    <div>
        <h3>文章id:44</h3>
    </div>
    </body>
    </html>
    
    渲染局部视图

    展示页面时通常会将常用的页面,抽出成共用的模板,这时在布局中就可以使用局部渲染。如:

    //===========================
    // app/views/common/nav.phtml
    //===========================
    <div>
         <h3>这是一个导航页</h3>
         <ul>
              <li>菜单1</li>
              <li>菜单2</li>
         </ul>
    </div>
     
    //============
    // 引入这个导航:
    //============
    <!DOCTYPE html>
    <html>
    <head>
         <title></title>
    </head>
         <body>
              测试布局
              <?php echo $this->view->getPartial('common/nav'); ?>
              <hr/>
              <?php echo $this->getContent(); ?>
         </body>
    </html>
    

    渲染后的结果则为:

    <html>
    <head>
        <title></title>
    </head>
    <body>
    测试布局
    <div>
        <h3>这是一个导航页</h3>
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
        </ul>
    </div>
    <hr>
    <div>
        <h3>文章id:44</h3>
    </div>
    </body>
    </html>
    
    渲染级别

    Phalcon 中渲染级别可以控制视图具体显示的层级,级别分为以下几种:

    类常量 解释 顺序
    LEVEL_NO_RENDER 表明要避免产生任何形式的显示。
    LEVEL_ACTION_VIEW 生成显示到视图关联的动作。 1
    LEVEL_BEFORE_TEMPLATE 生成显示到控制器模板布局之前。 2
    LEVEL_LAYOUT 生成显示到控制器布局。 3
    LEVEL_AFTER_TEMPLATE 生成显示到控制器模板布局后。 4
    LEVEL_MAIN_LAYOUT 生成显示到主布局。 5

    当设置渲染级别为 LEVEL_ACTION_VIEW 时将不加载布局文件 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);
        }
    }
    

    最后将只输出控制器页面:

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

    关闭渲染级别:

    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']); // 如果参数是数组的话,数组第0位置的参数为控制器,第1参数的位置为方法命名
        }
    }
    
    关闭视图

    控制器中关闭视图功能:

    <?php
     
    use Phalcon\Mvc\Controller;
     
    class ArticleController extends Controller
    {
        public function showAction($id)
        {
            // 关闭视图功能
            $this->view->disable();
        }
    }
    

    注册服务容器 DI 时关闭视图功能:

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

    简单渲染 Phalcon\Mvc\View\SimplePhalcon\Mvc\View 的组成部分,没有文件的层次结构是与 Phalcon\Mvc\View 的主要区别。该组件也允许自定义视图所在位置。
    使用该组件必须替换服务容器:

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

    禁用自动渲染功能:

    <?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]);  
        }
    }
    

    相关文章

      网友评论

        本文标题:Phalcon#基本功能#视图

        本文链接:https://www.haomeiwen.com/subject/wcbiettx.html