`
zccst
  • 浏览: 3322440 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Yii控制层处理结果返回前端的三种方式(render)

    博客分类:
  • YII
 
阅读更多
Yii控制层处理结果返回前端的三种方式

作者:zccst

批注:render会渲染layout,而renderPartial不会渲染。

一、渲染方式

1,局部渲染renderPartial
public function renderPartial($view,$data=null,$return=false,$processOutput=false)
{
  
   if(($viewFile=$this->getViewFile($view))!==false)
   {
    $output=$this->renderFile($viewFile,$data,true);//getViewFile($view)获得$view的完整路径
    if($processOutput)
     $output=$this->processOutput($output);  // processOutput()作用,比如在head加上css或js脚本等
    if($return)
     return $output;
    else
     echo $output;
   }
   else
    throw new CException(Yii::t('yii','{controller} cannot find the requested view "{view}".',
     array('{controller}'=>get_class($this), '{view}'=>$view)));
}


注解:
(1)getViewFile($view)获得$view的完整路径
(2)如果没有在$config里配置第三方的renderer,renderFile() 里实际是调用了yii自身提供的renderInternal()来render view文件:

public function renderFile($viewFile,$data=null,$return=false)
{
   $widgetCount=count($this->_widgetStack);
   // 如果配置了其他的ViewRenderer
   if(($renderer=Yii::app()->getViewRenderer())!==null)
    $content=$renderer->renderFile($this,$viewFile,$data,$return);
   else
    // yii 自身的render
    $content=$this->renderInternal($viewFile,$data,$return);
   if(count($this->_widgetStack)===$widgetCount)
    return $content;
   else
   {
    $widget=end($this->_widgetStack);
    throw new CException(Yii::t('yii','{controller} contains improperly nested widget tags in its view "{view}". A {widget} widget

does not have an endWidget() call.',
     array('{controller}'=>get_class($this), '{view}'=>$viewFile, '{widget}'=>get_class($widget))));
   }
}


Yii的renderer用的是php本身作为模板系统:

public function renderInternal($_viewFile_,$_data_=null,$_return_=false)
{
   // extract函数将$_data_从数组中将变量导入到当前的符号表
   if(is_array($_data_))
    extract($_data_,EXTR_PREFIX_SAME,'data');
   else
    $data=$_data_;
   if($_return_)
   {
    ob_start();
    ob_implicit_flush(false);
    require($_viewFile_);
    return ob_get_clean();
   }
   else
    require($_viewFile_);
}



2,全局渲染render
render()的实际上是先renderPartial view文件,然后renderFile layoutfile,并将view文件的结果做为$content变量传入。
public function render($view,$data=null,$return=false)
{
   $output=$this->renderPartial($view,$data,true);
   if(($layoutFile=$this->getLayoutFile($this->layout))!==false)
    $output=$this->renderFile($layoutFile,array('content'=>$output),true);

   $output=$this->processOutput($output);

   if($return)
    return $output;
   else
    echo $output;
}

processOutput将render的结果再做处理,比如在head加上css或js脚本等。
public function processOutput ($output)
{
   Yii::app()->getClientScript()->render($output);

   // if using page caching, we should delay dynamic output replacement
   if($this->_dynamicOutput!==null && $this->isCachingStackEmpty())
    $output=$this->processDynamicOutput($output);

   if($this->_pageStates===null)
    $this->_pageStates=$this->loadPageStates();
   if(!empty($this->_pageStates))
    $this->savePageStates($this->_pageStates,$output);

   return $output;
}


区别:
render会把需要的js,css等嵌入
renderPartial可以通过把最后一个参数设置成true完成一样的功能 $this->renderPartial('partial_view', $params, false, true);

实例:
在../controllers/XXController.php中
$this->render('update',array('model'=>$model));
在../views/ControllerID/update.php中
<?php echo $this->renderPartial('_form', array('model'=>$model)); ?>


二、暴力跳转模式——适合form表单提交

$this->redirect(array('view','id'=>$model->id));


三、返回值方式——适合异步调用
//写法1:
public function response($data, $type="application/json"){
    print json_encode($data);
    Yii::app()->end();
}

//写法2:
$this->layout = false;
header('Content-type: application/json');
echo json_encode($arr);
Yii::app()->end();  //执行该行,已经将layout设为了false


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
评论

相关推荐

    yii 三级联动 省市区

    1. **模型(Model)**:在 Yii 中,数据模型是 MVC(模型-视图-控制器)架构的一部分,负责处理业务逻辑和数据操作。在这个场景中,可能需要创建一个或多个模型类来存储省市区的数据,如 `Province`, `City`, `...

    Yii 2文件下载

    - **路由和控制器**:定义URL到处理程序的映射,控制器处理请求并返回响应。 - **视图**:负责渲染数据。 - **身份验证和授权**:提供多种安全机制,如登录、权限控制、CSRF防护。 - **缓存**:支持多种缓存策略,如...

    yii框架中文文档、yii中文手册教程

    文档通常会涵盖框架的基础知识,如MVC(模型-视图-控制器)架构、数据库操作、表单处理、安全特性、缓存策略、用户认证和授权等。CHM文件是一种常见的Windows帮助文件格式,方便用户离线查阅。 “yii框架中文手册...

    yii的控制器

    集成控制器

    Yii权威指南思维导图

    视图在Yii中通过CView类实现,它负责渲染模板并输出结果。Yii支持视图助手(Helper),如CHtml,提供了许多方便的HTML生成方法。同时,Yii的布局功能使得页面的头部、底部等公共部分可以被有效地重用。 控制器(C...

    yii-1.0.4.r920

    1. MVC(模型-视图-控制器)架构模式:Yii 遵循 MVC 设计模式,将应用程序逻辑分为三个主要部分:模型(处理数据和业务逻辑),视图(负责展示数据),以及控制器(协调模型和视图)。这种分离有助于代码组织和可...

    yii2图片裁剪插件

    4. **后端处理**:在Yii2的控制器中接收前端发送的数据,根据这些信息裁剪原始图片,并保存裁剪后的图片到服务器上。Yii2提供了方便的文件操作API,可以轻松地完成这项任务。 5. **集成**:通过Composer安装并配置...

    yii框架商城

    在这个商城项目中,模型层负责业务逻辑和数据处理,视图层负责页面展示,控制器层协调模型和视图,接收用户请求并转发给相应的模型进行处理,最后将结果返回给视图渲染输出。 此外,Yii的Gii工具是快速开发的利器,...

    Yii面试题摸底测试教学考前摸底

    7. **视图渲染:** 控制器操作完成后,视图层负责展示结果。 8. **事件触发:** 在特定的时间点触发事件,如控制器操作前后。 9. **响应发送:** 最终的响应被发送给用户浏览器,完成整个请求处理流程。 #### 四、...

    yii框架中文手册教程和YII模板

    Active Record则简化了数据库操作,允许开发者通过面向对象的方式来处理数据。 在“yii-1.1.8.r3324.tar.gz”文件中,包含的是Yii框架的1.1.8版本源码,这是一个相对稳定的版本。解压后,开发者可以查看源代码,...

    yii简易后台基础模板

    9. **前端资源管理**:Yii提供了Asset Manager来管理CSS、JavaScript等前端资源,确保它们正确地被引用和压缩,提高页面加载速度。 10. **单元测试与代码质量**:Yii支持 PHPUnit 进行单元测试,确保代码的质量和...

    yii2.0中文完全手册

    Yii 2.0 提供了统一的错误处理和日志记录机制,帮助开发者调试和优化应用,同时提供了一套优雅的方式显示错误信息。 十一、部署与性能优化 手册还会介绍如何将开发完成的应用部署到生产环境,以及如何进行性能优化...

    新下载的yii2,yii framework

    5. **vendor**:Composer依赖管理器自动下载的第三方库和Yii框架本身都存放在这里。 6. **runtime**:运行时目录,框架在此生成临时文件,如日志、缓存等。 7. **web**:Web应用的入口点,包含`index.php`,它是Web...

    Yii 2.0.9 advanced zip

    Yii 2.0.9 advanced模板提供了预配置的前端和后端应用结构,每个应用都有自己的独立入口文件、模型、视图和控制器,这有助于开发者专注于各自的应用逻辑,而不是基础架构。 此外,Yii 2.0.9 还支持MVC(Model-View-...

    yii2 通用后台系统

    "yii2 通用后台系统"是一个基于Yii2框架构建的企业级后台管理系统,旨在提供一套全面、高效的后台管理解决方案,包括用户管理、权限控制、数据统计等功能,帮助开发者快速搭建稳定且功能丰富的后台应用。 在Yii2...

    yii2swoole让yii2运行在swoole上

    将Yii2与Swoole结合,可以极大地提升Yii2应用的性能,特别是对于处理高并发、低延迟的场景,如实时聊天、游戏服务器、API接口等。 标题"yii2swoole让yii2运行在swoole上"指出的核心知识点是: 1. **Yii2框架与...

    yii2初学者

    1. MVC架构:Yii2遵循模型-视图-控制器(MVC)设计模式,它有助于分离应用程序逻辑、用户界面和控制层。这种分离确保了代码的可维护性和可重用性。 2. 活跃记录(Active Record):Yii2的活跃记录模式允许开发者用...

    Yii中render和renderPartial的区别

    在Yii框架中,`render` 和 `renderPartial` 是两个非常关键的方法,它们用于视图渲染,帮助开发者构建动态Web应用程序。理解它们的区别是优化页面性能和管理客户端脚本的关键。 1. `render` `render` 方法主要用于...

    Yii框架快速入门

    3. Controller:控制器处理用户请求,调用模型进行业务处理,并将结果传递给视图进行展示。 四、路由与控制器 Yii的路由系统灵活,允许你自定义URL格式。通过控制器,你可以定义不同的操作(actions),处理不同的...

Global site tag (gtag.js) - Google Analytics