如何使用Yii CArrayDataProvider

时间:2014-03-03 14:45:43

标签: yii cgridview

我是php和Yii的新手,需要一些关于在网页中显示数组的帮助。

在控制器中,我打开我的电子邮件收件箱并遍历收件箱中的电子邮件并构建阵列,每个电子邮件地址都是具有值的键

if (array_key_exists($fromemail,$senders)) 
{ $senders[$fromemail]['rcount']++; }
else {
      $senders[$fromemail]['e-mail'] = $fromemail;
      $senders[$fromemail]['Name'] = $fromname;
      $senders[$fromemail]['rcount'] = 1;
     }
$model->top_senders = $senders;
$this->render('Step2',array('model'=>$model,)); 

然后在Step2的视图文件中,我想在CGridview中显示数据

if (isset($model->top_senders))
{
$gridDataProvider = new CArrayDataProvider($model->top_senders);
$gridDataProvider->setData($model->top_senders);
$gridColumns = array(
    array('name'=>'e-mail', 'header'=>'E-mail','value' =>'$data->e-mail'),
    array('name'=>'rcount', 'header'=>'# of mails','value'=>'$data->rcount'),);

$this->widget('bootstrap.widgets.TbGridView',array('dataProvider' => $gridDataProvider,'template' => "{items}",'columns'=>$gridColumns));
}

但是在呈现表格时我会收到错误: PHP通知未定义的偏移量:0

    /**
125      * Renders a data cell.
126      * @param integer $row the row number (zero-based)
127      */
128     public function renderDataCell($row)
129     {
130         $data=$this->grid->dataProvider->data[$row];

我做错了什么?任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

您不应该按如下方式向提供者添加数据: $gridDataProvider->setData($model->top_senders);

它在初始化期间添加。您必须确保该数组具有键id,否则您需要手动指定它(它必须是唯一的),如下所示:

$gridDataProvider = new CArrayDataProvider($model->top_senders, array(
    'id'=>'Name',
));

您还需要确保数组$model->top_senders具有以下结构:

array(
    '0'=>array(...user data here),
    '1'=>array(...user data here),
    ...
);

答案 1 :(得分:0)

如果你var_dump($gridDataProvider->data),你会注意到数组中第0个索引没有值。当您在阵列上运行某个过滤器函数时会发生这种情况。假设过滤后的数组中有5个值,那么在var_dump' d时,过滤后的数组看起来就像这样。

array(5) {
    [1] => Object (Mailer) {…},
    [2] => Object (Mailer) {…},
    [4] => Object (Mailer) {…},
    [8] => Object (Mailer) {…},
    [9] => Object (Mailer) {…},
}

对数组进行过滤操作可以使数组看起来像上面那样。

当CGridView尝试用数据提供视图时,它按顺序执行 - 我发现,这是Yii中的一个缺点,应该引发问题。

为了解决这个问题,请使用PHP's array_values(),如此......

$properly_indexed_array = array_values($filtered_array);

这会将已过滤数组的值复制到新数组中。就内存而言,这不是最佳解决方案。到目前为止,除了这一点,我在PHP中看不到任何其他方法。

然后您可以继续将其设置为数据提供者的数据,如此......

$gridDataProvider->setData($properly_indexed_array);