shulinqian 2012-02-16 09:52:24 7067次浏览 8条回复 0 0 0

不知道各位在开发中遇到这样的问题没有,经常出现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 这里和我讨论。

  • 回复于 2012-02-16 10:08 举报
    array(
    'name'=>'botName','value'=>'$data->botName==1?"google":$data->botName==1?"baidu":$data->botName==2?"soso":$data->botName?"bing":"Yahoo"',
    ),
    

    value属性支持php表达式,这样就可以解决你的问题

  • 回复于 2012-02-16 10:10 举报

    是三目运算符,跟表情冲突了

  • 回复于 2012-02-16 10:28 举报

    这样做貌似也可以,不过在视图层写这些貌似很悲剧。。。无处不在,添加一个搜索引擎就要修改n多视图文件。

  • 回复于 2012-02-16 11:06 举报

    这个容易,你可以在模型中重写afterFind方法

  • 回复于 2012-02-16 12:22 举报

    亲,这个搞不定哦~~

  • 回复于 2012-02-16 12:50 举报
    public function afterFind(){
        $bots = array(
            1 => 'google',
            2 => 'baidu',
            3 => 'soso',
            4 => 'bing',
            5 => 'Yahoo',
        );
        $this->botName= $bots[$this->botName];
    }
    

    将上面代码放入对应的模型里面就可以了

    当然$bots也可以从数据库中取值

  • 回复于 2012-02-16 13:39 举报

    关键是这个时候就会报错 Property log.botName is not defined 。

  • 回复于 2012-02-16 14:07 举报

    如果botName不是数据库字段,那你自己在模型中定义!

您需要登录后才可以回复。登录 | 立即注册