leeyee 2012-08-21 10:36:52 4753次浏览 4条回复 0 0 0

刚接触Yii 遇到的问题

我使用的是 CArrayDataProvider。是因为想尽可能的 控制数据的来源,因此用CArrayDataProvider 来自己构造数据 下面是 $userlist

$users = Yii::app()->db->createCommand('select user_id  from tbl_user')->queryAll();
for ($i=0;$i<count($users);$i++)
{
    $useravatar = UserAvatar::model()->find('user_id=?',array($users[$i]['user_id']));
    if (isset($useravatar))
        $userlist[$i] = array_merge($users[$i],$useravatar->attributes);
}
$dataProvider = new CArrayDataProvider($userlist);
$this->render('index',array(
    'dataProvider'=>$dataProvider,
));

下面是view

$this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view',
)); 

下面是itemView

<div class="view">
    <?php echo CHtml::encode($data['user_id']); ?>
    <br />
</div>

结果是 在 CArrayDataProvider.php 中报错 Undefined index: id

        protected function fetchKeys()
097     {
098         if($this->keyField===false)
099             return array_keys($this->rawData);
100         foreach($this->getData() as $i=>$data)
101             $keys[$i]=is_object($data) ? $data->{$this->keyField} : $data[$this->keyField];
102         return $keys;
103     }

显示错误是在 101 处。
  • 回复于 2012-08-21 11:10 举报

    好像感觉是 CArrayDataProvider 的 keyFeild 设置问题。

    直接修改了 CArrayDataProvider 的 fetchKeys()方法

    protected function fetchKeys()
    {
        if($this->keyField===false)
            return array_keys($this->rawData);
        foreach($this->getData() as $i=>$data)
        
        {
            $keys[$i]='user_id';
        }
            //$keys[$i]=is_object($data) ? $data->{$this->keyField} : $data[$this->keyField];
        return $keys;
    }
    

    显示正常了。。。不是很明白 这个keyField 在 CArrayDataProvider的构造函数中 怎么设置。。

    这个CArrayDataProvider要 自己重载???

  • 回复于 2012-08-21 11:31 举报

    yii里面关于CArrayDataProvider的 代码注释

    /**
    * @var string the name of key field. Defaults to 'id'. If it's set to false,
    * keys of $rawData array are used.
    */
    public $keyField='id';
    

    设置keyField 为false 将使用 rawData的数组里的keys。

    修改了 在构造 CArrayDataProvider 处的代码

    $dataProvider = new CArrayDataProvider($userlist,array(
        'keyField'=>false,
    ));
    

    但还是报错。。

  • 回复于 2012-08-21 11:42 举报

    问题解决了

    就是 keyField 设置问题。

    $dataProvider = new CArrayDataProvider($userlist,array(
        'keyField'=>false,
    ));
    

    这样设置就可以了,页面正常显示。

  • 回复于 2012-08-21 14:02 举报
    $dataProvider = new CArrayDataProvider($userlist,array(
        'keyField'=>'user_id',
    ));
    

    这样可以吗?

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