在yii中自定义过滤Cgridview

时间:2014-02-25 12:25:54

标签: yii

我正在使用CGridView来显示postgres函数的结果。 CGridView工作正常。现在我想在模型中使用不同的函数来过滤CGridView。

CGridView的当前代码就像

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'purchase-grid',
    'itemsCssClass'=>'table table-bordered table-condensed table-hover table-striped dataTable',
    'filter'=>$model,
    'dataProvider'=>$model->search(),
        ..............

$ model-> search()函数接受一个id,用于从表中选择行。我使用CSqlDataProvider在$ model-> search()中运行自定义查询并返回dataprovider。如果我使用上面的代码,它将显示CGridView中所有字段的过滤器文本框。但搜索功能使用的是CGridView中未显示的ID。所以过滤不起作用。所以我想使用一个新的过滤功能,它将接受该字段进行过滤。我尝试使用下面的代码

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'purchase-grid',
    'itemsCssClass'=>'table table-bordered table-condensed table-hover table-striped dataTable',
    'filter'=>$model->filter_search(),
    'dataProvider'=>$model->search(),
        ..............

但它显示错误。请帮忙。

提前致谢。

4 个答案:

答案 0 :(得分:0)

filter参数应该接收模型。如果您不想显示特定列应该执行的过滤器:

array(
'name'=>'attributeName',
'value'=>'$data->attributeName',
'filter'=>false,
)

答案 1 :(得分:0)

CGridView中的filter属性应该是CActiveRecord。

您可以像此代码一样更改过滤器输入

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'item-categoria-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    'nombre',
    array(
        'id'=>'tipo_id',
        'header'=>'Tipo',
        'value'=>'$data->tipo->nombre',
        'filter'=>CHtml::activeDropDownList(
            $model,
            "tipo_id",
            CHtml::listData(TipoItem::model()->findAll(), 'id', 'nombre'),
            array(
                'empty'=>'(Seleccione uno)',
            )),
    ),
    'cuentaVenta.descripcion:html:Cuenta de Ventas',

注意:过滤器是CActiveRecord,列中的过滤器是Select

答案 2 :(得分:0)

CgridView自定义过滤器元素:

查看代码:

array(
        'name'=>'status',
        'header'=>'Confirmed',
        'type'=>'raw',
        'value'=>'($data->status==0 ? "No" : "Yes")',
        'filter'=>CHtml::listData($pastEventModel->getYesNoCgridviewFilter(), 'id', 'title'),
    ),

型号代码:

public function getYesNoCgridviewFilter()
{
    return array(
        array('id'=>0, 'title'=>'No'),
        array('id'=>1, 'title'=>'Yes'),
    );
}

CgridView自定义搜索功能:

查看代码:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'events-grid2',
    'dataProvider'=>$pastEventModel->search("past"),
    'filter'=>$pastEventModel,

型号代码:

public function search($when)
{
    $criteria=new CDbCriteria;
    $criteria->compare('mandant_id',$this->mandant_id);

    if($when == "past")
        $criteria->addCondition("start < ". time(), 'AND');
    elseif($when == "upcoming")
        $criteria->addCondition("start >= ". time(), 'AND');

CgridView在同一页面上两次:

查看代码:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'events-grid1',

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'events-grid2',

控制器代码:

public function actionAdmin()
{       
    $pastEventModel=new Events('search');
    $pastEventModel->unsetAttributes();  // clear any default values
    if(isset($_GET['ajax'],$_GET['Events']) && $_GET['ajax']=="events-grid2")
    {
        $pastEventModel->attributes=$_GET['Events'];
        unset($_GET['Events']);
    }
    $upComingEventModel=new Events('search');
    $upComingEventModel->unsetAttributes();  // clear any default values
    if(isset($_GET['ajax'],$_GET['Events']) && $_GET['ajax']=="events-grid1")
    {
        $upComingEventModel->attributes=$_GET['Events'];
        unset($_GET['Events']);
    }
    $this->render('admin',array(
        'pastEventModel'=>$pastEventModel,
        'upComingEventModel'=>$upComingEventModel,
    ));
}

答案 3 :(得分:0)

我已使用下面给出的HtmlOptions隐藏了该列。

<div class="row">
  <div id="left-bar"> here I have an accordion </div>
  <div id="middle-bar"> heve a have my canvas </div>
  <div id="right-bar"> and here I have an editor</div>
</div>

然后我使用相同的$ model-&gt; search()函数进行过滤。