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?