Yii Framework Forum: Ordenar Coluna Personalizada Em Cgridview - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Ordenar Coluna Personalizada Em Cgridview Rate Topic: -----

#1 User is offline   Deadbody 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 18
  • Joined: 02-October 12

Posted 16 December 2012 - 04:20 PM

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?
0

#2 User is offline   Gustavo Gonçalves 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 40
  • Joined: 02-October 12
  • Location:Belo Horizonte, MG - Brasil

Posted 17 December 2012 - 06:30 AM

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',),



2. 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,
0

#3 User is offline   Adrian Lucas 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 217
  • Joined: 13-October 11
  • Location:João Pessoa - Paraíba

Posted 17 December 2012 - 08:48 AM

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 Posted Image
Adrian Lucas
A fé em Deus nos faz crer no incrível,
ver o invisível e realizar o impossível.

0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users