感觉蛮有用的,转过来看看。

  • db 组件 ‘schemaCachingDuration’=>3600, 为什么不起做用? 需要开缓存

  • 如何在页面下边显示 sql 的查询时间

在 log 组件的 routes 中加入

array(
‘class’=>’CProfileLogRoute’,
‘levels’=>’error, warning’,
)

同时在 db 组件中加入

‘enableProfiling’=>true,

同时在这种情况下,可以用 CDbConnection::getStats() 查看执行了多少个语句,用了多少时间

  • 如何知道某一个程序段运行需要的时间

配置好 CProfileLogRoute 后,在需要测试的地方加上

Yii::beginProfile(‘blockID’);
//程序段
Yii::endProfile(‘blockID’);
  • ‘enableParamLogging’=>true,的作用是?

在日志的 bind 的参数后边跟数的值

  • 如何在页面底部显示所有的 db 相关的日志

同上,配置 log 组件的 routes 中加入

array(
‘class’=>’CWebLogRoute’,
‘levels’=>’trace, info, error, warning’,
‘categories’ => ‘system.db.*’,
//’showInFireBug’ => true, 将在firebug中显示日志
),

把日志记录到数据库

array(
‘class’=>’CDbLogRoute’,
‘logTableName’=>’applog’,
‘connectionID’=>’db’,
),

运行时表 applog 会自动生成,如果不能生成,参照 api 自已建立

  • 如何记录$_GET,$_SESSION 等信息

在以上的 routes 中各个配置中加上

‘filter’=>’CLogFilter’,

log 配置中的 level 设置不对,可能会得不到日志信息 另外 level,category 的值可以随便写, 只要在用 yii::Log(“”,”自定义 level”,”自定义的 category”)时对应起来即可

  • 如何记录更详细的信息,能记录 stack

在入口文件中加上

define(‘YII_TRACE_LEVEL’,10);

数字越大,记当的越详细,结果如下

[15:31:57.226][trace][system.db.CDbCommand] Querying SQL: SHOW COLUMNS FROM `Bangdan` in E:\APMServ5.2.6\www\htdocs\dayouhui.com\protected\models\Bangdan.php (21) in E:\APMServ5.2.6\www\htdocs\dayouhui.com\protected\components\HotBangdan.php (21) in E:\APMServ5.2.6

如果在调试时,终止程序运行且看到日志,不能用 die 及 exit; 用 application::end,即Yii::app()->end(),其会触发 onEndRequest 事件,日志就是在这个事件中记录的

  • activeRecord 几个占位方法重写的注意点

必须带 boolean 返回值

  • 如何发布一个资源文件并引用
$css=Yii::app()->getAssetManager()->publish(dirname(FILE).”/aa.css”);
yii::app()->clientScript->registerCssFIle($css);
  • 如果改变 activelable 中默认的标题

重写方法 attributeLabels

  • 过滤不良代码
$purifier=new CHtmlPurifier;
$purifier->options=array(“HTML.Allowed”=>”div”);
$content=$purifier->purify($content);

或者

<?php $this->beginWidget(‘CHtmlPurifier’); ?>
…display user-entered content here…
<?php $this->endWidget(); ?>
  • 如何防止重复提交?

提交后

Ccontroler->refresh();
  • 如何在成功后显示一个提示,用户刷新页时去掉提示
Cwebuser->setFlash();
getFlash();
  • 如何防止重复提交, 并在提交成功后给出提示?

控制器中

Yii::app()->user->setFlash(‘submit’,’thanks’);
$this->refresh();
view中
if(Yii::app()->user->hasFlash(‘submit’)){

echo Yii::app()->user->getFlash(‘submit’);
}

一般我们是跳转到列表页,或用 redirect 跳到编辑页,就不需要了,如果还是要显示当前页 以上就有用了,比如在当前时显示,编辑或添加新的记录

<strong>如何分页</strong>
CPagination代表分页信息,有多少页,每页几条记录等
CLinkPager生成分页的代码,自定义css可以给属性cssFile一个值

$criteria=new CDbCriteria();
$pages=new CPagination(“数据库中的总记录数”);
$pages->pageSize=2;
$pages->applyLimit($criteria);//给$criteria->limit offset等符值
$posts=Post::model()->findAll($criteria);
$this->widget(‘CLinkPager’,array(‘pages’=>$pages));
  • 列表如何排序
$criteria=new CDbCriteria();
$sort = new CSort(‘Post’);
$sort->defaultOrder=” status asc”;
$sort->applyOrder($criteria);
$posts=Post::model()->findAll($criteria);

应用时用

$sort->link(‘字段名’)

实际是生成一个带参数的 url,然后在在 applyOrder 时应用这些参数修改$criteria,得到相应的查寻结果

  • 如何生成并验证验证码

基本用法

<?php $this->widget(‘CCaptcha’); ?>  具体参数查手册

原理 CCaptcha 这个 widget 会在 run 时调用当前控制器的$captchaAction=’captcha’方法,这个方法指到一个类 CCaptchaAction 其会生成验证码图象,并记入到 session 中

  • 如何显示静态页

重写 actions

‘help’=>array(
‘class’=>’CViewAction’,
‘basePath’=>’help’, //指定目录名
‘defaultView’=>’default’,
‘viewParam’=>’help’ //get参数
),

假定当前控制器是 post 那么可以能过/post/help/help/content 访问 help 目录下的 content.php 可以建立子目录比如 help/reigterhelp/content.那可以通过/post/help/help/registerhelp.content 来访问 用 CViewAction 的好处时,可以与其它的 view 共享 layout

  • 关于没有权限访问跳转的 url 相关

当没有权限时调用 CAccessControlFilter 类中的 accessDenied,其调用 CwebUser 中的 loginRequired(),记录当前的 returnurl 后跳转到 CWebUser 配置中的 loginurl,在此处登陆后,可以通过 redirect 跳转到 returnurl(Yii::app()->request->redirect(Yii::app()->user->returnUrl);) 当强制显示登陆表单,比如判断用户是 guest 就一直列出登陆表单,不会调用 loginRequired, 就得不到 returnurl,这时候想跳回去,参见 cookbook 上相关贴子

registerCoreScript 在 framework/web/js/package.php 中列出的才是

  • 多对多关联条件
$criteria->addInCondition(“categorys.id”,$in);
$criteria->addSearchCondition(‘Shop.name’,$keyword);
$shops=Shop::model()->with(array(“categorys”=>array(‘together’=>true)))->findAll($criteria);

同时要在 Shop 模型中加入 alias=”categorys” ,另外 together=true 放在模型的关联中也可

  • YII 中的 RBAC 权限,用数据库存 item

在 system/web/auth 下找到相应的 sql 导放到数据库中配置

’authManager’ => array(
‘class’ => ‘CDbAuthManager’,
‘connectionID’ => ‘db’,
),

如果在 sql 中导入的三个表的表名不是默认的,需要在这上边的配置中配置,具体的看 api

$auth=Yii::app()->authManager;
//$auth->createOperation(“post”,’postpost’);
//$auth->createTask(“post”,”posts”);
$auth->createRole(“post”,”post”);
auth->assign(“post”,’demo’);
if(Yii::app()->user->checkAccess(“post”)){
echo “yes”;
else{
echo “no”;
}

这种情况下三者是一样的

  • 如何获得上一页的 url 以返回
Yii::app()->request->urlReferrer;
  • accessControl 是 Ccontroller 中内置的过滤方法,其它的还有 ajaxOnly postOnly

  • CMaskedTextField 此组件用于限制用户的输入,对应的 jquery 插件http://digitalbush.com/projects/masked-input-plugin/

  • 在一对多,多对多查询时,the eager loading 联合所有的表生成一条语句,如果主表有 limit 的查询选项,那么他将单独执行,然后再执行与关联表有关的语句,返回相关表的数据对象,这就是为什么在做大优惠时,以中间表为查询条件出错的原因,解决办法 with()返回 CActiveFinder 对象,其方法 together(),既使主表中有 LIMIT/OFFSET 也是返回一条 sql;

  • 多对多查询时,分页有时候页中显示的条数不正确,因为有重复的项,加上$criteria->group = true 即可

  • 模型的 rules 中,验证某个字段不能重复,array(‘name’, ‘unique’,’message’ => ‘有重复的名子’),

  • CStatePersister是 yii 的核心组件,提供了基于文件的数据保存方式,可以不在同的请求中使用

  • COutputCache 即是一个组件,又是一个 filter,前者的时候用于在 view 中缓存内容,后者的时候用于在 controller 中缓存

  • COutputCache 即是一个组件,又是一个 filter,前者的时候用于在 view 中缓存内容,后者的时候用于在 controller 中缓存就是说片段缓存,是把 COutputCache 当一个 widget 来用,页面缓存把 COutputCache 当作一个 filter 来用

  • 动态缓存,用 CController 的一个方法 renderDynamic($callback);COutputCache 几个属性,duration,dependency,另外还有几个,可以通称为 Variation, 有什么作用呢?在 beginCache 是要手工指定一个 id,Variation 的作有就是自动给生成这个 id 在布署模式的时候,有错误不会有 stack 样的提示,会显示一个 errorxxx 的错误

  • 如何在程序有错的时候跳到指定的 action

在 components 中设置

‘errorHandler’=>array(
‘errorAction’=>’site/error’,
),

在此 action 中可以能过 Yii::app()->errorHandler->error 获得错误信息

  • CActiveRecord::exits();判断有没有这样的记录,一般用于添加时,判断某字段有没有重复

  • CActiveDataProvider 一个基于 ActiveRecord 的数据提供源

常用的用法

$dataProvider=new CActiveDataProvider(‘Post’, array(
‘criteria’=>array(),
‘pagination’=>array(),
‘sort’=>array(),
));

上如

’sort’=>array(
‘defaultOrder’=>’status, update_time DESC’,
),
  • ClistView同上结合使用,其中的_view 中可以用一个$data 的变量,代表当前的 model 数据

如果 dataProvider 中的 pagination,sort 设为 false,则 CliveView 中对应的部分也无法使用

$this->widget(‘zii.widgets.ClistView’,array(
‘dataProvider’ => $dataprovider,
‘itemView’ => ‘_view’,
‘template’ => ‘{items}{sorter}{pager}’,
‘sortableAttributes’ => array(
),
));
  • CGridView的使用也结合$dataprovider,用的时候主要是对 columns 的配置,主要有 CDataColumn, CLinkColumn, CButtonColumn and CCheckBoxColumn.具体用法看 api,总的说来 CgridView 没有 ClistView 灵活

  • 插入 meta 信息

Yii::app()->clientScript->registerMetaTag(‘keywords’,’关键字’);
Yii::app()->clientScript->registerMetaTag(‘description’,’一些描述’);
  • CMap::mergeArray()比 array_merge 更智能的合并数组,yii 中配置的合并用这个

  • CClipWidget 通过 ob_start ob_getconent 生成一段不显示的内容,可以能过 CController::clips 访问,如$this->beginWidget(‘CClipWidget’,array(‘id’=>’name’,’renderClip’=>true));可以通过$this->clips[‘name’]来显示,其中的 renderClip 如果为 false,则在当前位置不显示内容如果在 Model 一次验证多个属于,显示不同的内容?如下 [后来发现这个不起作用]

return array(
array(‘title, content’, ‘required’,
‘message’=>’Please enter a value for {attribute}.’),
// … other rules
);
  • 获得服务器时间
$_SERVER['REQUEST_TIME']
  • 维护程序时,这样子所有的请求转发到一个地方
‘catchAllRequest’=>array(‘site/all’),
  • 根据二级域名缓存
array(
‘COutputCache + search’,
‘duration’ => 120,
‘varyByParam’ => array(‘q’,’page’),
‘varyByExpression’ => “app()->request->hostInfo”,
),
  • 有多个分站时,同步登陆,基本于 cookie
‘user’=>array(
‘identityCookie’=>array(‘domain’=>’.dayouhui.com’),
‘allowAutoLogin’ => true,
)
  • 如果是基本于 session
‘session’ => array(
‘cookieParams’ => array(‘domain’ => ‘.dayouhui’, ‘lifetime’ => 0),
‘timeout’ => 3600,
),
  • 如何使用 theme

在 main.php 中配置

‘theme’=>’classic’,
  • 如何得到前前使用的主题
Yii::app()->theme

得到名子

Yii::app()->theme->name;

themes 文件夹和 protected 是同级的,其下边某个 theme 的目录结果同 protected/views 下一样

  • 关于 skin

用 theme 改变 view 的外观,skin 是用来改变 widgets 的外观的,skin 是健值对用于初始化一个 widget 的属性要对 widget 使用 skin,需要做以下几步

1.配置

widgetFactory’=>array(
‘enableSkin’=>true,
),

2.在 views 下建立 skins 目录

3.在 skins 目录下建立与 Widget 名子一样的 php 文件,返回数组,即能用于 widget 的初始配置

4.在 php 文件中,如果有 defautl 的配置,会先找这个 skin

5.如果应用了 theme,程序会先去对应的 theme 目录下的 skins 中找配置文件

6.如果只是想给 widget 统一一个 skin,建议用 Customizing Widgets Globally

  • 如果防止 post 跨站攻击
‘request’=>array(
‘enableCsrfValidation’=>true,
),

这时候生成的表单要用 CHtml::form(),其会写一段代码在 cookie 中

  • 防止 Cookie 攻击
‘request’=>array(
‘enableCookieValidation’=>true,
),

同时生成与得到 cookie 是要用 CHttpCookie

  • 如何让表单验证不过的提示为中文

在 main.php 的配置中加上

‘language’ => ‘zh_CN’,
  • 如何实现仿 google 的自动完成功能
<?php $this->widget(‘CAutoComplete’, array(
‘name’=>’xxx’,
‘url’=>array(‘suggestTags’),
‘multiple’=>false,
‘htmlOptions’=>array(‘size’=>50),
)); ?>

转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

本文链接地址: YII 开发小技巧(Tips)(转)

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可