yii中 Property ** is not defined 的解决办法 [ 新手入门 ]
不知道各位在开发中遇到这样的问题没有,经常出现Property ** is not defined 这样的异常抛出。 简介下我项目中遇到的问题: 我用yii做一个简单的apache日志分析系统,写了脚本统计日志并写入数据库,用yii来展示。 在列表的时候有个bot字段,就是搜索引擎蜘蛛,我用tinyint类型,用1,2,3,4,5.......代表 百度,google,soso,yahoo,bing.....这几个主流搜索引擎。 列表的时候就读出的bot字段 就是1,2,3,4等的数字,很费解。所以想办法自动转换。CActiveRecord 返回的是个对象,也就是模型的一个实例,我想办法在模型中自动进行转换,所以就遇到了这个问题,不论我怎么转换,都出现 Property log.botName is not defined 这样的提示。
实在找不到合适的办法下,我只能去修改yii核心库的 CComponent.php这个文件,把
throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined',
array('{class}'=>get_class($this), '{property}'=>$name)));
这段给注释掉,后面也还有个异常抛出,也注释掉。 然后在model文件中重写__get 方法
public function __get($name){
switch ($name) {
case 'botName':
$bots = array(
1 => 'google',
2 => 'baidu',
3 => 'soso',
4 => 'bing',
5 => 'Yahoo',
);
return $this->botName = isset($bots[$this->bot]) ? $bots[$this->bot] : null;
break;
}
return parent::__get($name);
}
然后在视图中就很easy的直接写$data->botName 就可以得到相应的值,列表的时候用的CGridView,为了排序和查找方便,改写为
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'logranking-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
array(
'name' => 'bot',
'value' => '$data->botName',
),
array(
'class'=>'CButtonColumn',
),
),
));
效果如下: [attach]638[/attach]
但修改核心库并非我所愿,以后升级很麻烦,有更好的解决办法的请回复在下面,不胜感激。也可以到 http://blog.52xiaoqu.com/42.html 这里和我讨论。
共 8 条回复
-
shulinqian 回复于 2012-02-16 10:28 举报
这样做貌似也可以,不过在视图层写这些貌似很悲剧。。。无处不在,添加一个搜索引擎就要修改n多视图文件。
-
shulinqian 回复于 2012-02-16 12:22 举报
亲,这个搞不定哦~~
-
shulinqian 回复于 2012-02-16 13:39 举报
关键是这个时候就会报错 Property log.botName is not defined 。
shulinqian sc
最后登录:1970-01-01
在线时长:0小时0分
- 粉丝0
- 金钱85
- 威望0
- 积分85