Quantcast
Channel: Yii Framework Forum
Viewing all articles
Browse latest Browse all 18717

Ordenar Coluna Personalizada Em Cgridview

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

Viewing all articles
Browse latest Browse all 18717

Trending Articles