【问题标题】:How to use Yii CArrayDataProvider如何使用 Yii CArrayDataProvider
【发布时间】:2014-03-03 14:45:43
【问题描述】:

我是 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 notice Undefined offset: 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];

我做错了什么?谁能帮帮我?

【问题讨论】:

  • 我也有同样的问题。当我找到解决方案时,我会更新答案

标签: yii cgridview


【解决方案1】:

您不应将数据添加到提供程序,如下所示: $gridDataProvider->setData($model->top_senders);

它在初始化期间添加。一定要确定数组有keyid,否则需要手动指定(必须唯一),如下:

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

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

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

【讨论】:

  • 感谢您的回答。是的,我在示例中看到数组包含行,其中每行的键都是“id”。在我的数组 top_senders 中,主键是电子邮件地址,然后指向姓名、电子邮件和 numberofemails 计数器的记录。如何将我的数组转换为 Yii 所需的数组?我猜只是为了写循环?
  • 你可以像我上面说的那样在你的数组中设置自定义主键。只需指定数组的哪个元素将是键,如下所示:$gridDataProvider = new CArrayDataProvider($model->top_senders, array( 'id'=>'Email', ));
  • 这是错误的。 keyField 指定主键。
【解决方案2】:

如果您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);

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多