Ordenar Coluna Personalizada Em Cgridview

Olá, tenho uma problema que não consigo resolver. Tenho um model chamado Cliente, ele possui os atributos tipo_cliente(‘required’), razao_social,nome_fantasia. Em meu formulário de cadastro eu defini: Se o tipo for 0=> Pessoa física, o atributo nome_fantasia é required, se o tipo for 1=> Pessoa jurídica, o atributo razao-social é required. Para tentar resolver o problema eu criei um atributo virtual no model:


public $nFantasia_rSocial;

Na minha gridview eu penso em unir os dois atributos razao_social e nome_fantasia e mostra-los na coluna $nFantasia_rSocial já que, ou razao_social ou nome_fantasia deverá conter o nome do cliente. Para descobrir em qual atributo está o nome do cliente eu fiz esse método:


public function retornaNome($data, $row) {//usaddo para mostrar o nome ou razão social na gridview da view admin

        // ... generate the output for a full address

        // Params:

        // $data ... the current row data   

        // $row ... the row index  

        if ($data->tipo_cliente == 1) {

            return $data->razao_social;

        } else {

            return $data->nome_fantasia;

        }

    }

Na view o método ‘retornaNome’ traz a informação para ser mostrada na coluna:


<?php

$this->widget('bootstrap.widgets.TbGridView', array(

    'filter' => $model,

    'id' => 'cliente-grid',

    'dataProvider' => $model->search(),

    'columns' => array(

        array(

            'name' => 'nFantasia_rSocial',

            'value' => array($model, 'retornaNome')

        ),        

    ),

));

?>

O que eu tentei fazer para resolver o problema foi baseado nesse post: How to have a sortable virtual attribute in a Grid


    public function search() {

        // Warning: Please modify the following code to remove attributes that

        // should not be searched.


        $criteria = new CDbCriteria;


        $criteria->compare('t.razao_social', $this->nFantasia_rSocial, true, 'OR');

        $criteria->compare('t.nome_fantasia', $this->nFantasia_rSocial, true, 'OR');      


        $sort = new CSort();

        $sort->attributes = array(

            'nFantasia_rSocial' => array(

                'asc' => 'razao_social ASC, nome_fantasia ASC',

                'desc' => 'razao_social DESC, nome_fantasia DESC',

                ));


        return new CActiveDataProvider($this, array(

                    'criteria' => $criteria,

                    'sort' => $sort

                ));

    }

O resultado dessa tentativa foi que agora o header da coluna virou um link e a ordenação funciona porém não como eu preciso, da forma que está ele vai ordenando aos poucos quando o atributo troca para nome_fantasia a sequencia quebra A B C D E A B C F G H. Eu preciso que a ordenação seja em ordem alfabética independente do atributo. Alguma dica?

Olá,

Interessante sua dúvia e também gostaria de saber como resolver isso.

Tenho duas dicas pra você tentar aí:

  1. Usar o parâmetro DefaultOrder no Sort:



return new CActiveDataProvider(get_class($this), array(

	'criteria'=>$this->getSearchCriteria(),

	'pagination'=>array('pageSize'=>$pageSize),

	'sort'=>array('defaultOrder'=>'data ASC',),



  1. Usar o Order ao invés do Sort:



$params = array('criteria' => array('order' => 'categpai, categoria',

            			'sort'=>false,

            			'pagination'=>array('pageSize'=>10),

            );

$dataProvider=new CActiveDataProvider('Categoria', $params);



São apenas 2 centavos de contribuição, mas veja aí se te ajuda.

Abs,

Amigo talvez você possa fazer uma consulta SQL dentro do seach(), tenta assim:




public $nFantasia_rSocial;






function search{

        $criteria CDbCriteria;

        $criteria->select='*, IF(tipo_cliente==1, CONCAT(nomecliente," - ", razao_social), CONCAT(nomecliente," - ",nome_fantasia)) AS nFantasia_rSocial';

        $criteria->compare('razao_social',$this->nFantasia_rSocial,true);

return new CActiveDataProvider ($this, array(

 		'criteria'=> $criteria,

));

} 	






<?php

$this->widget('bootstrap.widgets.TbGridView',array(

	'filter' => $model,

	'id' => 'cliente-grid',

	'dataProvider' => $model->search(),

	'columns' => array(

    	array(

        	'name' => 'nFantasia_rSocial',

    	),    	

	),

));

?>




Vê se assim você consegue resolver