Yii控制层处理结果返回前端的三种方式
批注: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
- 浏览: 1872183 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wangyudong:
Wisdom RESTClient工具地址更新了哦https: ...
前端模拟POST发送数据-Chrome下的REST Client(接口测试利器) -
wangyudong:
很多REST Client是不支持自动化测试RESTful A ...
前端模拟POST发送数据-Chrome下的REST Client(接口测试利器) -
higkoo:
一个非常棒的系统,要是能支持LDAP等开源认证就完美了。
Cynthia 是个问题管理/BUG管理/任务管理/项目管理系统。 -
寻光之旅:
标签库使用有啥好处呢?
thinkphp 使用标签库的步骤 -
lgdjy123:
Android:TextView属性大全
发表评论
-
Yii2设置时区
2015-07-17 15:09 2807时区这东西,在开发的时候,你说重要吧,也还好,毕竟没它也能正 ... -
http://www.yiiframework.com/doc-2.0/guide-db-migrations.html
2015-04-10 22:22 1044http://www.yiiframework.com/doc ... -
http://www.yiiframework.com/doc-2.0/guide-tutorial-yii-integration.html
2015-04-10 14:23 758http://www.yiiframework.com/doc ... -
http://www.yiiframework.com/forum/index.php/topic/52882-yii2-tips-tricks/
2015-04-10 10:47 1593http://www.yiiframework.com/fo ... -
yii防重复提交
2014-10-14 22:05 926提交后Ccontroler->refresh(); -
Yii防注入攻击笔记
2014-10-14 22:03 1149网站表单有注入漏洞须对所有用户输入的内容进行个过滤和检查 ... -
Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
2014-10-01 02:27 1070public function getMinLimi ... -
Yii使用公共函数
2014-10-01 02:26 996在网站项目中,没必要把公用的函数写成一个工具类,有时候面向过 ... -
php Yii: 出现undefined offset 或者 undefined index解决方案
2014-06-07 12:39 1510在开发Yii 时,在程序中定义了如下方式: ... -
重复保存记录原因记录
2014-01-20 10:04 927因为开启了AJAX验证,只要将AJAX验证取消即可 ... -
yii中给CGridView设置默认的排序根据时间倒序的方法
2013-04-09 15:49 2744public function searchWithRelat ... -
Yii框架中CGridView的使用方法以及详细示例
2013-03-27 09:45 1230CGridView显示一个数据项的列表中的一个表。 表中的 ... -
关于yii 数据库添加新字段之后model类的修改
2013-03-23 00:33 1384rules: array('新字段','safe','on ... -
YII给用户登录加上验证码
2013-03-21 14:05 27681、在SiteController中添加如下代码: ... -
CGridView中实现批量删除
2013-03-28 09:09 13021,CGridView中的columns添加 array ... -
yii 获取控制器名 和方法名
2013-03-20 13:56 12611. 获取控制器名 在控制器中获取控制器名: $name ... -
关于YII的菜单插件 CMenu和面包末breadcrumbs路径管理插件的一些使用问题
2013-03-20 12:14 1546在使用 YIi的路径管理工具时,发现了一个问题。 ... -
Yii全局函数使用
2013-03-20 11:41 1306由于YII致力于完美的整合第三方库,它并没有定义任何全局函数 ... -
yii 修改模块使用的布局文件
2013-03-20 11:36 4653方法一:yii模块默认使用系统当前的主题布局文件,如果在主配 ... -
YII CMenu配置
2013-03-20 11:35 1217Adding id and class names to C ...
相关推荐
- **控制器**:作为 MVC 架构中的控制层,负责处理用户请求并调用模型和视图。 - **模型**:用于处理业务逻辑和数据操作,包括数据验证、CRUD 操作等。 - **视图**:呈现数据给用户的界面层,可以使用布局、小部件等...
6. `vendor/`:这里是Composer管理的第三方依赖库的存放位置,包括Yii框架本身和其他依赖的PHP库。 7. `.gitignore` 和 `composer.json`:`.gitignore` 文件定义了在版本控制中应忽略的文件和目录,而`composer....
- **实现方式**:使用第三方库如OAuth2进行身份验证和数据交互。 ##### 18. 创建面包屑导航组件 - **知识点**:开发自定义的面包屑导航组件。 - **实现方式**:设计一个可以自动根据当前URL生成面包屑链接的组件...
7. **vendor**:第三方库和 Composer 依赖的存放位置。 8. **composer.json**:项目依赖管理文件,定义项目需要的库及其版本。 9. **index.php**:Web 应用的入口文件,处理请求并加载框架。 10. **init**:Yii 的...
Yii2 的核心特性包括 MVC(模型-视图-控制器)架构、数据库抽象层、缓存管理、安全功能、表单处理以及丰富的扩展库。这些特性使得开发者能够快速、高效地构建复杂的应用程序。 在“yii2test-master”这个项目中,...
此外,还有`common`目录存放公共的模型、行为、配置等,`console`用于命令行脚本,`vendor`存放第三方库,`config`存储全局配置,`runtime`则保存运行时生成的文件。 2. **Yii 2.0核心组件**:Yii框架的核心组件...
3. **控制器**:处理具体业务逻辑,接收并处理前端请求,调用模型层执行数据操作,并返回响应结果。 4. **视图文件**:负责展示数据,通常使用PHP模板引擎或直接使用PHP编写,与控制器交互,生成HTML输出。 5. **...
9. **vendor**:如果使用Composer管理依赖,这里会包含第三方库。 10. **logs**:日志文件,记录系统运行情况和错误信息。 11. **scripts**:可能包含自动化脚本,如部署或测试脚本。 深入研究这个源码,开发者可以...
OAuth2或JWT(JSON Web Tokens)可能用于实现第三方登录和权限控制。 9. 安全性:考虑到涉及到用户隐私和交易,网站需要考虑防止SQL注入、XSS攻击等网络安全问题,通过参数化查询、输入验证、安全编码等措施提高...
这个程序的开发涉及多个层次的技术,从后端的服务器处理到前端的用户体验,再到与第三方平台的集成,都是开发者需要掌握的重要技能。通过深入研究这个源码,开发者可以学习到如何构建类似的社交网络应用,并了解如何...
8. **公共文件**:如CSS和JavaScript文件,用于前端表现层。 9. **日志文件**和**错误报告**:帮助调试和优化系统。 10. **许可证文件**和**README**:提供关于软件的许可信息和使用指南。 开发这样一个系统通常...
3. `controllers`:控制层文件,处理HTTP请求,调用模型处理业务逻辑。 4. `models`:模型层文件,负责与数据库交互,处理数据。 5. `views`:视图层文件,包含订单页面的HTML模板。 6. `public`:静态资源文件夹,...
6. **支付集成**:项目可能集成了第三方支付接口,如支付宝、微信支付,通过API调用来处理在线支付过程,确保交易安全和顺利完成。 7. **错误处理与日志记录**:为了调试和监控系统运行情况,项目可能会有完善的...
8. **第三方API集成**:如支付接口、社交媒体分享等,增强网站功能。 9. **SEO优化**:如元标签管理、URL重写,提高网站在搜索引擎中的可见性。 10. **前端资源**:包括HTML、CSS、JavaScript文件,以及可能的前端...
7. **支付集成**:营销型网站可能集成了第三方支付接口,如支付宝、微信支付,实现在线购买功能。 8. **SEO优化**:为了提升搜索引擎排名,网站可能进行了关键词优化、元标签设置、URL结构规划等SEO策略。 9. **...
4. `vendor/`:Composer管理的第三方依赖库。 5. `angular/`:AngularJS的源码或编译后的文件,可能包括模块、服务、指令等。 6. `.git/`:Git版本控制的元数据。 7. `README.md`:项目介绍和使用指南。 8. `...
3. **Controller**: 控制器是模型和视图之间的桥梁,接收用户的请求,调用相应的模型方法处理数据,然后将结果传递给视图进行展示。控制器可以处理复杂的逻辑,如验证用户输入、调用多个模型方法或决定显示哪个视图...
11. **第三方库和框架**:为提高开发效率,开发者可能会使用一些流行的PHP库或框架,如Laravel、Yii、ThinkPHP等。这些库和框架提供了丰富的功能,如路由、依赖注入、自动加载等。 12. **响应式设计**:随着移动...
12. **PHP扩展**:PHP的扩展库丰富,如GD用于图像处理,cURL用于HTTP请求,Memcached或Redis用于缓存,以及各种用于特定任务的第三方扩展。 13. **OOP编程**:面向对象编程在PHP中被广泛使用,包括类、对象、继承、...
9. **模板引擎**:如Twig、Smarty等,允许将业务逻辑和视图层分离,提高代码可维护性。 10. **框架应用**:如Laravel、Symfony、Yii等PHP框架,提供了强大的工具和约定,加速Web应用的开发。 PHP的生态系统还包括...