YII Behavior重用

用behavior的好处是可以通过“插入”的方式来获得新的功能。你当然可以直接把代码写在model里。不过如果类似的代码需要在若干个model里实现,那么behavior就可以让你重用这段代码 。

 

1.CActiveRecordBehavior

yii框架已经提供了一个CTimestampBehavior 行为类,只要设置好createAttribute和updateAttribute两个属性,,它分别对应你数据库表的创建时间和更新时间字段。像创建一篇文章时我们通常都会需要记录创建时间,更新时记录它的更新时间,详细使用,在你的Model类中behaviors 方法中增加下面几行, 将 createAttribute和updateAttribute更改为你数据库对应的时间字段即可:

Java代码  

  1. public function behaviors(){  
  2.     return array(  
  3.         'CTimestampBehavior' => array(  
  4.             'class' => 'zii.behaviors.CTimestampBehavior',  
  5.             'createAttribute' => 'create_time_attribute',  
  6.             'updateAttribute' => 'update_time_attribute',  
  7.         )  
  8.     );  
  9. }  

XSS安全模式类

在这篇文章里,我们将描述一个基于WEB应用下避免不合法的内容注入。

我们要在一个行为里使用htmlpurifier 类,用这种行为可以加强任何模型并表明各属性我们想让它们XSS安全。

我写了以下行为:

Java代码  

  1. <?php  
  2. class CSafeContentBehavior extends CActiveRecordBehavior  
  3. {  
  4.     public $attributes =array();  
  5.     protected $purifier;  
  6.   
  7.     function __construct(){  
  8.         $this->purifier = new CHtmlPurifier;  
  9.     }  
  10.   
  11.     public function beforeSave($event)  
  12.     {  
  13.         foreach($this->attributes as $attribute){  
  14.             $this->getOwner()->{$attribute} = $this->purifier->purify($this->getOwner()->{$attribute});  
  15.         }  
  16.     }  
  17. }  

把这个类放在你的应用程序目录,例如:application/behaviors/CSafeContentBehavior.php。现在你在模型的行为中这样去写:

Java代码  

  1. <?php  
  2. class Post extends CActiveRecord  
  3. {  
  4.     public function behaviors(){  
  5.         return array(  
  6.             'CSafeContentBehavor' => array(   
  7.                 'class' => 'application.behaviors.CSafeContentBehavior',  
  8.                 'attributes' => array('title', 'body'),  
  9.             ),  
  10.         );  
  11.     }  
  12. }  

现在我们可以开始了。我们的post模型在每个保存操作中将净化标题和内容列。

 

保存一条记录后,更新订单号,适合所有订单号

Java代码  

  1. <?php  
  2. class No13Behavior extends CActiveRecordBehavior {  
  3.     public $pk = '';  
  4.     public $orderNo = '';  
  5.     public $prefix = '';  
  6.   
  7.     public function afterSave($event) {  
  8.         if ($this->getOwner()->getIsNewRecord()) {  
  9.             if (empty($this->pk) || empty($this->orderNo) || empty($this->prefix)) {  
  10.                 return false;  
  11.             }  
  12.             $id = $this->getOwner()->{$this->pk};  
  13.             $val = $this->prefix . date('ymd') . str_pad($id, 5, '0', STR_PAD_LEFT);  
  14.             $this->getOwner()->updateByPk($id, array($this->orderNo =>$val) );  
  15.         }  
  16.     }  
  17. }  

 2.CBehavior

自动导入module模块,config/main的modules不需要加对应的module名。可以在数据库中配置

Java代码  

  1. <?php  
  2. /** 
  3.  * ApplicationConfigBehavior is a behavior for the application. 
  4.  * It loads additional config parameters that cannot be statically 
  5.  * written in config/main 
  6.  */  
  7. class ModuleBehavior extends CBehavior {  
  8.     /** 
  9.      * Declares events and the event handler methods 
  10.      * See yii documentation on behavior 
  11.      */  
  12.     public function events() {  
  13.         return array_merge(parent::events(), array(  
  14.             'onBeginRequest' => 'beginRequest',  
  15.         ));  
  16.     }  
  17.   
  18.     /** 
  19.      * Load configuration that cannot be put in config/main 
  20.      */  
  21.     public function beginRequest() {  
  22.         $modules = array();  
  23.         $model = Module::model()->findAll(); // Todo - should be per application  
  24.         foreach ($model as $item) {  
  25.             $modules[$item->name] = array(); // Todo can set parameters here for each module...  
  26.         }  
  27.         //$modules['video'] = array();  
  28.         Yii::app()->setModules($modules);  
  29.     }  
  30. }  
  31. ?>  

Main.php代码  

  1. 'behaviors' => array(  
  2.     'theme' => 'application.components.behaviors.ThemeBehavior',  
  3.     'lang'  => 'application.components.behaviors.LangBehavior',  
  4.     'module'=> 'application.components.behaviors.ModuleBehavior'  
  5. ),  

 上面main也可以替代index.php

Java代码  

  1. $app = Yii::createWebApplication($config);  
  2. $app->attachBehavior('module','application.components.behaviors.ModuleBehavior');  

在protectd/components/behaviors增加2个Behavior:

Java代码  

  1. <?php  
  2. //ThemeBehavior.php  
  3. class ThemeBehavior extends CBehavior {  
  4.     const COOKIE_KEY = '__theme';  
  5.   
  6.     public function events() {  
  7.         return array_merge(parent::events(), array(  
  8.             'onBeginRequest' => 'beginRequest',  
  9.         ));  
  10.     }  
  11.   
  12.     public function beginRequest() {  
  13.         $v = Yii::app()->request->getParam(self::COOKIE_KEY);  
  14.         if (!isset($v)) {  
  15.             $v = Yii::app()->request->cookies[self::COOKIE_KEY];  
  16.             if (!isset($v)) {  
  17.                 $v = Yii::app()->theme->name;  
  18.             } else {  
  19.                 $v = $v->value;  
  20.             }  
  21.         }  
  22.         Yii::app()->theme = $v;  
  23.         Yii::app()->request->cookies[self::COOKIE_KEY] = new CHttpCookie(self::COOKIE_KEY, $v);  
  24.     }  
  25. }  

LangBehavior.php

Java代码  

  1. <?php  
  2. //LangBehavior.php  
  3. class LangBehavior extends CBehavior {  
  4.     const COOKIE_KEY = '__lang';  
  5.   
  6.     public function events() {  
  7.         return array_merge(parent::events(), array(  
  8.             'onBeginRequest' => 'beginRequest',  
  9.         ));  
  10.     }  
  11.   
  12.     public function beginRequest() {  
  13.         $v = Yii::app()->request->getParam(self::COOKIE_KEY);  
  14.         if (!isset($v)) {  
  15.             $v = Yii::app()->request->cookies[self::COOKIE_KEY];  
  16.             if (!isset($v)) {  
  17.                 $v = Yii::app()->language;  
  18.             } else {  
  19.                 $v = $v->value;  
  20.             }  
  21.         }  
  22.         Yii::app()->language = $v;  
  23.         Yii::app()->request->cookies[self::COOKIE_KEY] = new CHttpCookie(self::COOKIE_KEY, $v);  
  24.     }  
  25. }  

  

时间: 2024-09-22 07:15:13

YII Behavior重用的相关文章

Yii 1.1.8发布 基于组件的高性能PHP框架

Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.在WEB开发中Yii可以最大限度的实现代码重用,极大的提高开发的速度.名字Yii(读音是Yee or [ji:],应该就是"易"的读音 )代表的是容易(easy),高效(effcient)和可扩展(extensible) Yii一开始就精心设计,以适应复杂的WEB应用开发.他不是一些项目的副产品或者第三方集成.而是融合了作者丰富的 Web 应用开发经验和其它热门 Web 框架和应用的优秀思想的结晶. 最后,但并非不

YII 验证和消息

setFlash(), getFlash()可以完成验证成功后提示 Java代码   <?php   # 成功信息提示   Yii::app()->user->setFlash('success', "Thinks saved success!");   # 错误信息提示   Yii::app()->user->setFlash('error', "here has an Error, Please check that!");   #

使用ASP.NET Atlas开发检测密码强度的自定义Behavior

asp.net 本文源于维生素C.net的一篇文章利用数学方法来大大降低一个逻辑判断实现的难度的例子.检测代码来自THIN的检验密码强度的JS类. Atlas中提供了客户端JavaScript强大的面向对象功能,这几天看到了上述二位的帖子,觉得这个功能需求在日常开发中还是很常见的.晚上闲来无事,将上述功能封装为Atlas中的Behavior,以方便重用.关于Atlas的Behavior,请参考:在ASP.NET Atlas中创建自定义的Behavior. 按照在ASP.NET Atlas中创建自

PHP开发框架Yii Framework教程(6) CComponent组件

在Hangman中定义的GameController使用到一些属性word,可以使用$this->word 的格式来读写这个属性,但实际上在 GameController对应到这个属性的方法为 /** * @return string the word to be guessed. This value is persistent * during the whole game session. */ public function getWord() { return $this->getP

Yii学习总结之安装配置

 本文是Yii学习总结系列文章的第一篇,主要给大家介绍下YII的简单介绍及安装和配置,有需要的小伙伴参考下吧.     之前写过Yii的文章,正好假期没啥事,就结合以前的文章,Yii的官方文档,再加上最近的关于Yii的收获总结一下,写个系列~~ Yii是一个基于组件的高性能PHP框架,用于开发大型Web应用.Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程.从 MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主题化,I18N和L

Yii 自定义Widget Portlet

能够重用的小的代码模块,不涉及业务逻辑的,用在跟视图相关的方面比较多,一般把Sidebar,Navigation,Page,JS控件(上传,日历)封装成Widget,但Portlet生成的html系统会自动套2层div在html外面,改变了页面样式,可能操作页面样式布局js等失效 下面以一个随机广告图片为例说明Yii中Widget的用法 1. 调用Widget Java代码   <?php $this->widget('WidgetName'); ?>    或者 Java代码   &l

Yii 前后台分离 demo

1.首先我把目录结构写下来:     wwwroot/         htdocs  //webroot目录,方便资源文件,和程序文件做Linux权限控制              index.php              admin.php               assets/              images/         protected/             config/                 main.php             compon

使用Yii整合的pjax(pushstate+ajax)实现无刷新加载页面_AJAX相关

Pjax是啥? Pjax = history.pushState + Ajax = history.pushState + Async JS + XML(xhr?) BOM对象history被增强了一波,主要是对历史栈的操作,以前只有 replace , go 之类的,都会跳转并刷新整个页面,现在有了 pushState , replaceState 等等单纯操作历史栈的方法,只是单纯修改历史栈里的内容,没有副作用(页面不会跳转刷新) PJAX效果 通过url可以跟踪ajax的动态加载内容.这种

PHP的Yii框架入门使用教程_php实例

安装 Yii 的安装由如下两步组成: 从 yiiframework.com 下载 Yii 框架. 将 Yii 压缩包解压至一个 Web 可访问的目录. Tip|提示: 安装在 Web 目录不是必须的,每个 Yii 应用都有一个入口脚本,只有它才必须暴露给 Web 用户.其它 PHP 脚本(包括 Yii)应该保护起来不被 Web 访问,因为它们可能会被黑客利用.需求 安装完 Yii 以后你也许想验证一下你的服务器是否满足使用 Yii 的要求,只需浏览器中输入如下网址来访问需求检测脚本: http: