Question

I have created an advanced search form that will search the model using OR or IN condition. However it fails to update CGridView because it returns an array for the attribute of a model. if i remove these columns from the gridview then it will work, but i need these column to be visible on the gridview.

Model

public function weeklystatus($arr = array())
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria=new CDbCriteria;

        //$criteria->compare('id',$this->id);
        $criteria->compare('PROJECT',$this->PROJECT,true);
        if(!empty($arr) && isset($arr['PROJCODE'])){
            $str = '';
            foreach($arr['PROJCODE'] as $value) {
                $str .= "PROJCODE = '$value' || ";
            }           
            $criteria->addCondition(substr($str, 0, -3));
        }else
            $criteria->compare('PROJCODE',$this->PROJCODE,true);
        $criteria->compare('PROJID',$this->PROJID);
        $criteria->mergeWith($this->dateRangeSearchCriteria('StartDATE', $this->StartDATE));        
        $criteria->mergeWith($this->dateRangeSearchCriteria('ProjectEndDate', $this->ProjectEndDate));
        $criteria->mergeWith($this->dateRangeSearchCriteria('ActualEndDate', $this->ActualEndDate));
        $criteria->compare('PROCESSOR',$this->PROCESSOR,true);
        $criteria->compare('OFFICE',$this->OFFICE,true);
        $criteria->compare('DEPTCODE',$this->DEPTCODE,true);
        //$criteria->compare('PERCENT',$this->PERCENT,true);        
        $criteria->compare('PERCENTPlanned',$this->PERCENTPlanned,true);
        $criteria->compare('KM',$this->KM,true);
        $criteria->compare('KMPlanned',$this->KMPlanned,true);
        if(!empty($arr) && isset($arr['MC'])){
            $str = '';
            foreach($arr['MC'] as $value) {
                $str .= "MC = '$value'";
            }
            $criteria->addCondition($str);
        }else{
            $criteria->compare('MC',$this->MC,true);
        }
        $criteria->compare('MCSALE',$this->MCSALE);
        $criteria->compare('CATEGORY',$this->CATEGORY,true);
        $criteria->compare('AREA',$this->AREA,true);
        $criteria->compare('COUNTRY',$this->COUNTRY,true);
        $criteria->compare('PROJINFO',$this->PROJINFO,true);
        $criteria->compare('REGION',$this->REGION,true);
        $criteria->compare('ASAAREA',$this->ASAAREA,true);
        $criteria->compare('LORM',$this->LORM,true);

        $date = date('Y-m-d',strtotime("-2 week"));
        $criteria->addCondition("StartDATE > '2013-01-01'"); 
        $criteria->addCondition("StartDATE < '$date' AND PERCENT <100 || StartDATE > '$date' AND PERCENT =100 ");
                /*AND (StartDATE < '$date' AND PERCENT <100)
                || (StartDATE > '$date' AND PERCENT =100) ");*/
        //$criteria->addCondition("PERCENT < 100 AND StartDATE < '$date'");
        //$criteria->addCondition('StartDATE > '.$date . ' AND PERCENT >  -1' );

        $criteria->order = 'ASAAREA';


        return new CActiveDataProvider($this, array(
                'criteria'=>$criteria,
                'pagination'=>array(
                        'pageSize'=>25,
                ),
        ));
    }

Controller

public function actionWeeklystatus(){       
        $model=new ViewWebprojectreport('weeklystatus');
        $model->unsetAttributes();  // clear any default values
        $globalController = new GlobalController;

        if(isset($_GET['ViewWebprojectreport'])){

            $model->attributes=$_GET['ViewWebprojectreport'];
        }

        //print_r($model->attributes);
        //exit();

        $processorList = $globalController->getProcessorList();
        $projCodeList = $globalController->getProjectcodeList();
        $asaarea = Yii::app()->db->createCommand("SELECT DISTINCT
                (   view_webprojectreport.ASAAREA   )
                FROM
                view_webprojectreport
                ORDER BY
                view_webprojectreport.ASAAREA ASC")->queryAll();
        $asaareaList = CHtml::listData($asaarea, 'ASAAREA','ASAAREA');
        $officeList = $globalController->getOfficeList();
        $deptCode = $this->getDepartmentCode();
        $deptCodeList = CHtml::listData($deptCode, 'Code','Code');
        $categoryList = $globalController->getCategoryList(array("condition"=>"category_id < 8 || (category_id>8 && category_id < 14) || category_id > 31"));
        $countryList = $globalController->getCountryList();
        $region =Yii::app()->db->createCommand("SELECT DISTINCT
                (   view_webprojectreport.REGION    )
                FROM
                view_webprojectreport
                ORDER BY
                view_webprojectreport.REGION ASC")->queryAll();
        $regionList = CHtml::listData($region, 'REGION','REGION');
        $mcList = array('MC' => "MC","P"=>"Propietary");

        Yii::app()->user->setState('exportModel',$model); //this can be any other storage

        $this->render("weekly_status",array(
                "model"=>$model,    
                'processorList'=>$processorList,
                'asaareaList'=>$asaareaList,
                'projCodeList'=>$projCodeList,
                'officeList'=>$officeList,
                'deptCodeList'=>$deptCodeList,
                'categoryList'=>$categoryList,
                'countryList'=>$countryList,
                'regionList'=>$regionList,
                'mcList'=>$mcList
                ));
    }

View

<?php 
Yii::app()->clientScript->registerScript('search', "
$('.search-button').click(function(){
    $('.search-form').toggle();
    return false;
});

$('.search-form form').submit(function(){
    $.fn.yiiGridView.update('view-weekly-status-grid', {
        data: $(this).serialize(),
    });
    return false;
});

",CClientScript::POS_LOAD);
?>
</head>

<h1>Weekly Status Report</h1>

<div style="font-size: 12pt;">
    <?php //echo CHtml::link('<img src="images/pdficon.gif"/>',array("ViewWebprojectreport/exportToPdf","report"=>"weeklystatus")); ?>
    <?php  echo $this->widget('zii.widgets.jui.CJuiButton', array(       
          'buttonType'=>'link',
          'name'=>'btnDownloadWeeklyStatus',
          'caption'=>'Download Weekly Status',
          'options'=>array('icons'=>'js:{primary:"ui-icon-document"}'),
            "url"=>"index.php?r=ViewWebprojectreport/exportToPdf&report=weeklystatus",
        'htmlOptions'=>array('style'=>"font-size: 12px;height: 30px;"),
            'themeUrl'=>Yii::app()->baseUrl.'/themes',//url of your themes for JUI
        'theme'=>'redmond', //theme name the above url should have a folder named by the theme name specified here eg. /protected/extensions/jui/jquery/css/redmond/
        'cssFile'=>'jquery-ui-1.10.3.custom.min.css', // the css file in the theme folder
         ),true); ?>
</div>


<div id="weekly_status_graph" style="height:800px;display:none;width: 1120px;">

</div>



<?php echo CHtml::link('Advanced Search','#',array('class'=>'search-button')); ?>
<div class="search-form" style="display:none">
<?php  $this->renderPartial('_search',array(
    'model'=>$model,
    'processorList'=>$processorList,
    'asaareaList'=>$asaareaList,
    'projCodeList'=>$projCodeList,
    'officeList'=>$officeList,
    'deptCodeList'=>$deptCodeList,
    'categoryList'=>$categoryList,
    'countryList'=>$countryList,
    'regionList'=>$regionList,
    'mcList'=>$mcList
)); ?>
</div><!-- search-form -->


<?php $this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'view-weekly-status-grid',
        'dataProvider'=>$model->weeklystatus(),
        'filter'=>$model,
        'rowCssClassExpression'=>'($data->PERCENT == 100)? "yellow" : ($row%2?"even":"odd")',
        //'ajaxUpdate' => TRUE,
        'afterAjaxUpdate'=>'function(id, data){
            $.ajax({
                url: "index.php?r=ViewWebprojectreport/weeklystatusgraph",
                dataType: "json",
                type: "get",
                success: function(data) {
                        if(data.totalprojects>40){
                            $("#weekly_status_graph").css("width","1900px");
                            $("#weekly_status_graph").css("margin-left","-390px");

                        }else if(data.totalprojects>20){        
                            $("#weekly_status_graph").css("width","1250px");
                            $("#weekly_status_graph").css("margin-left","-50px");
                        }else{
                            $("#weekly_status_graph").css("width","1120px");
                            $("#weekly_status_graph").css("margin-left","-0px");
                        }

                        $("#weekly_status_graph").show();
                        buildColumnGraph(data);

                }
            })
        }',
        'columns'=>array(       
                //'MC',
                array(
                        "name"=>"MC",
                        "header"=>"MC/P",
                        "htmlOptions"=>array(
                                "width"=>"20px"
                        )
                ),
                //'OFFICE',
                array(
                        "name"=>"PROJCODE",
                        "header"=>"Center",
                        "htmlOptions"=>array(
                                "width"=>"15px"
                        )
                ),
                //'ASAAREA',
                array(
                        "name"=>"ASAAREA",
                        "header"=>"Region",
                        "htmlOptions"=>array(
                                "width"=>"80px"
                        )
                ),
                //'PROJECT',
                array(
                        "name"=>"PROJECT",
                        "htmlOptions"=>array(
                                "width"=>"150px"
                        )
                ),
                //'LORM',
                array(
                    "name"=>"LORM",
                    "htmlOptions"=>array(
                        "width"=>"20px"
                    )
                ),
                'CATEGORY',
                //'KM',
                array(
                        "name"=>"KM",
                        "header"=>"KM/KM<sup>2</sup>"
                        /*"htmlOptions"=>array(
                                "width"=>"20px"
                        )*/
                ),
                //PROC TYPE
                //'StartDATE',
                array(
                    "name"=>"StartDATE",
                    "htmlOptions"=>array(
                        "width"=>"65px"
                    )
                ),
                //'ProjectEndDate',
                array(
                    "name"=>"ProjectEndDate",
                    "htmlOptions"=>array(
                        "width"=>"65px"
                    )
                ),
                //current date
                /*array(
                    "header"=>"Current date",
                    "value"=>$date
                ),*/
                // planned poc
                // actiaul poc
                //expected
                //'ActualEndDate',
                array(
                    "name"=>"ActualEndDate",
                    "htmlOptions"=>array(
                        "width"=>"65px"
                    )
                ),
                array(
                    "name"=>"PROJINFO",
                    'type'=>'raw',  
                    "value"=>'( strlen($data->PROJINFO) > 200 ) ? CHtml::tag("span", array("title"=>$data->PROJINFO), CHtml::encode(substr($data->PROJINFO, 0, 200)) . "..") : CHtml::encode($data->PROJINFO)',
//                      '$data->GetTruncatedPROJINFO()' ,
                    "htmlOptions"=>array(
                        //"width"=>"300px"
                    )
                ),
                array(
                    'class'=>'CButtonColumn',
                    'template'=>'{view}',
                    'htmlOptions' => array('style'=>'width:5px'),
        ),
    ),
)); ?>

Say ASAAREA I created a check box so i can search the model using 2 condition on 1 column. it returns the results but fails rendering page because I am displaying ASAAREA on CGridView. How can I resolve this issue?

If I comment out //'filter'=>$model, on the view it works fine. But i do not want to do this.

It will produce stack trace if i leave the filter uncommented

Error 500: <h1>PHP Error [2]</h1>
<p>htmlspecialchars() expects parameter 1 to be string, array given (/opt/yii-1.1.14.f0fee9/framework/web/helpers/CHtml.php:103)</p>
<pre>#0 unknown(0): CWebApplication->handleError()
#1 /opt/yii-1.1.14.f0fee9/framework/web/helpers/CHtml.php(103): htmlspecialchars()
#2 /opt/yii-1.1.14.f0fee9/framework/web/helpers/CHtml.php(2610): encode()
#3 /opt/yii-1.1.14.f0fee9/framework/web/helpers/CHtml.php(158): renderAttributes()
#4 /opt/yii-1.1.14.f0fee9/framework/web/helpers/CHtml.php(2255): tag()
#5 /opt/yii-1.1.14.f0fee9/framework/web/helpers/CHtml.php(1434): activeInputField()
#6 /opt/yii-1.1.14.f0fee9/framework/zii/widgets/grid/CDataColumn.php(103): activeTextField()
#7 /opt/yii-1.1.14.f0fee9/framework/zii/widgets/grid/CGridColumn.php(116): CDataColumn->renderFilterCellContent()
#8 /opt/yii-1.1.14.f0fee9/framework/zii/widgets/grid/CGridView.php(532): CDataColumn->renderFilterCell()
#9 /opt/yii-1.1.14.f0fee9/framework/zii/widgets/grid/CGridView.php(510): CGridView->renderFilter()
#10 /opt/yii-1.1.14.f0fee9/framework/zii/widgets/grid/CGridView.php(480): CGridView->renderTableHeader()
#11 /opt/yii-1.1.14.f0fee9/framework/zii/widgets/CBaseListView.php(167): CGridView->renderItems()
#12 unknown(0): CGridView->renderSection()
#13 /opt/yii-1.1.14.f0fee9/framework/zii/widgets/CBaseListView.php(150): preg_replace_callback()
#14 /opt/yii-1.1.14.f0fee9/framework/zii/widgets/CBaseListView.php(135): CGridView->renderContent()
#15 /opt/yii-1.1.14.f0fee9/framework/web/CBaseController.php(173): CGridView->run()
#16 /opt/paradox/protected/views/viewWebprojectreport/weekly_status.php(314): ViewWebprojectreportController->widget()
#17 /opt/yii-1.1.14.f0fee9/framework/web/CBaseController.php(126): require()
#18 /opt/yii-1.1.14.f0fee9/framework/web/CBaseController.php(95): ViewWebprojectreportController->renderInternal()
#19 /opt/yii-1.1.14.f0fee9/framework/web/CController.php(869): ViewWebprojectreportController->renderFile()
#20 /opt/yii-1.1.14.f0fee9/framework/web/CController.php(782): ViewWebprojectreportController->renderPartial()
#21 /opt/paradox/protected/controllers/ViewWebprojectreportController.php(970): ViewWebprojectreportController->render()
#22 /opt/yii-1.1.14.f0fee9/framework/web/actions/CInlineAction.php(49): ViewWebprojectreportController->actionWeeklystatus()
#23 /opt/yii-1.1.14.f0fee9/framework/web/CController.php(308): CInlineAction->runWithParams()
#24 /opt/yii-1.1.14.f0fee9/framework/web/filters/CFilterChain.php(133): ViewWebprojectreportController->runAction()
#25 /opt/yii-1.1.14.f0fee9/framework/web/CController.php(291): CFilterChain->run()
#26 /opt/yii-1.1.14.f0fee9/framework/web/CController.php(265): ViewWebprojectreportController->runActionWithFilters()
#27 /opt/yii-1.1.14.f0fee9/framework/web/CWebApplication.php(282): ViewWebprojectreportController->run()
#28 /opt/yii-1.1.14.f0fee9/framework/web/CWebApplication.php(141): CWebApplication->runController()
#29 /opt/yii-1.1.14.f0fee9/framework/base/CApplication.php(180): CWebApplication->processRequest()
#30 /opt/paradox/index.php(31): CWebApplication->run()
</pre>

No correct solution

OTHER TIPS

If you need to display an attribuite of the model that is an array and For example you want to display all the Value in a cell of the grid take into account using clistview. Your Advanced Search Will still work and you ll be able to Write Your custom html For each cell.

another Solution is to render in the cgridview a Virtual variable that serialize Your array attribute

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top