Problema No Cgridview

Pessoal, boa tarde!

Tenho a seguinte situação : tenho três filtros no cgrid view, e ao fazer um filtro em um deles, o valor das colunas embaixo do outro desaparece.

Ex:

Ao selecionar um usuário, as colunas abaixo do filtro de outro campo aparecem vazias. Aparentemente a busca funciona porém o campo não é exibido. Tentei de diversas maneiras, inclusive não consegui exibir a query da busca usando o Yii::trace() para entender o que está ocorrendo.

Mudei os filtros para usando activeDropDownList, conforme esse tópico filtering-related-tables

Segue o código.

admin.php




<?php 


$tabelas = array('sch_scspm.tb_usuario'=>'Usuário', 'sch_scspm.tb_tp_num_sequencial'=>'Tipo de Receita', 'sch_scspm.tb_num_sequencial'=>'Faixa', 'sch_scspm.tb_especialidade_medica'=>'Especialidade', 'sch_scspm.tb_medico'=>'Prescritor',  'sch_scspm.tb_clinica'=>'Estabelecimento',  'sch_scspm.tb_medico_clinica'=>'PrescClinc',  'sch_scspm.tb_grafica'=>'Gráfica',  'sch_scspm.tb_requisicao'=>'Requisição');

$acoes = array('CADASTRAR'=>'CADASTRAR', 'ALTERAR'=>'ALTERAR', 'DELETAR'=>'DELETAR',  'CANCELADA TOTAL'=>'CANCELADA TOTAL', 'CANCELADA&nbsp;PARCIAL'=>'CANCELADA PARCIAL');


$this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'log-grid',

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

	'filter'=>$model,

    	'columns'=>array(

           

              array(

                    'name'=>'nome_tabela',

                    'value'=>$model->nome_tabela,

                    'filter'=> CHtml::activeDropDownList($model, 'nome_tabela', $tabelas, array('empty'=>'Escolha')),

                 ),

	

	    array(

                    

                    'name'=>'acao_log',

                    'value'=>$model->acao_log,

                    'filter' => CHtml::activeDropDownList($model, 'acao_log', $acoes, array('empty'=>'Escolha')),

                    

                 ),

		'dt_log',

		'hr_log',

        

            array(

                        'name'=>'id_usuario',

                        'value'=>'Usuario::Model()->FindByPk($data->id_usuario)->nome',

                        'filter' =>CHtml::activeDropDownList($model, 'id_usuario', CHtml::listData(Usuario::model()->findAll(array('order'=>'nome')), 'id_usuario', 'nome'), array('empty'=>'Escolha')),

                       

                ),


                'ip_usuario',

		array(

			'class'=>'CButtonColumn',

                        'template'=>'{view}',

                    

                    

		),

	),

)); ?>




Log.php




   public function relations() {

        // NOTE: you may need to adjust the relation name and the related

        // class name for the relations automatically generated below.

        return array(

        'usuarios' => array(self::BELONGS_TO, 'Usuario', 'id_usuario'),

        );

    }

...


 public function search() {

       

     

        $criteria = new CDbCriteria;

        $criteria->compare('id_log', $this->id_log);

        $criteria->compare('nome_tabela', $this->nome_tabela);

        $criteria->compare('id_tabela', $this->id_tabela);

        $criteria->compare('acao_log', $this->acao_log);

        //Yii::trace($this->acao_log );

        

        $criteria->compare('informacao', $this->informacao);   

        

        

        if ($this->dt_log != NULL) {


            $this->dt_log = Yii::app()->dateFormatter->format('yyyy-MM-dd', CDateTimeParser::parse($this->dt_log, 'dd/MM/yyyy'));

        }

        $criteria->compare('dt_log', $this->dt_log);

        $criteria->compare('hr_log', $this->hr_log);

        $criteria->compare('id_usuario', $this->id_usuario);

        $criteria->order = 'id_log DESC';

      

        

        return new CActiveDataProvider($this, array(

            'criteria' => $criteria,

        ));

        ;

    }






Obs: se eu retirar o


 array('empty'=>'Escolha')

Funciona, entretanto os combos ficam com valores fixados o que não é ideal para se eu quiser buscar apenas os logs dos usuários por exemplo.

Obs2: Quando utilizo todo os filtros dos combos os valores correspondentes aparecem nas colunas do grid corretamente.

Alguém teria alguma ideia do que pode estar ocorrendo?

Obrigado, desde já!

Ninguém poderia me dar uma ideia? Já tentei trocar os activeDropdown para somente Dropdown e não adiantou.

samjf,

  1. Os filtros que fica nas colunas do grid, funciona normal?

Quando você tiver usando os filtros que criou fora do grid, faz assim para mostra a query:

Adiciona:


'ajaxUpdate' => false,

Na sua grid, assim ele retorna os dados na query, podendo assim você ver a query executada.

Ref.: http://www.yiiframework.com/doc/api/1.1/CGridView#ajaxUpdate-detail

Está buscando corretamente porém, só exibe os dados abaixo dos filtros se eu buscar usando os três filtros.

Ou seja ele busca só não exibe os dados, acredito que ele esta tratando os demais como vazios.

Não sei se tem relação com os índices que criei dos filtros como string, pois no banco está string.

Não consegui ver a consulta corretamente mesmo usando ‘ajaxUpdate’ => false, estou usando debugbar.

Quando aparecem as querys, estão complexas já inclusas o anti SqlInjection.

Queria exibir a query (sem o antisqlinjection) a cada momento que eu filtrar para entender o que ele monta .

Segue meu arquivo main.php




 'log'=>array(

    'class'=>'CLogRouter',

      'routes'=>array(

        array(

          'class'=>'CFileLogRoute',

          'levels'=>'error, warning, trace',

          'categories'=>'system.db.CDbCommand',

        ),

        array( // configuration for the toolbar

          'class'=>'XWebDebugRouter',

          'config'=>'alignLeft, opaque, runInDebug, fixedPos, collapsed, yamlStyle',

          'levels'=>'error, warning, trace, profile, info',

          'allowedIPs'=>array('10.0.198.121','::1','172.20.21.191','192\.168\.1[0-5]\.[0-9]{3}'),

        ),

      ),

  ),

  ),






samjf,

Primeiro configura o config/main.php para esse tipo de log:


array(

    'class' => 'CWebLogRoute',

    'enabled' => true

),

Esse log mostra na tela, o que está sendo executado.

Vamos fazer por parte então!

  1. Na coluna "nome_tabela" está salvo o que? Por que eu vi aqui no seu array() da variável $tabelas, que você colocou o relacionamento como valor no filtro.

Agora apareceu o log, me parece que a consulta está sendo executada corretamente o problema então deve ser relacionado a forma que montei os combos dentro do cgridview ( ele não exibe os dados dos outros filtros quando seleciono somente um combo).

Segue um exemplo do log:

SELECT * FROM "sch_scspm"."tb_log" "t" WHERE (acao_log LIKE

‘%ALTERAR%’) AND (id_usuario=‘29’) ORDER BY id_log DESC LIMIT 10

Os resultados apresentados fazendo um teste diretamente no banco funcionaram.

Vou explicar como funciona a minha tabela log, tenho os seguintes campos:

id_log -> chave primária auto incremento

nome_tabela -> gravo o nome da tabela completo.No caso estou usando esquema no postgres ai o nome fica: sch_scspm(nome do esquema) . o da tabela ex: sch_scspm.tb_usuario, sch_scspm.tb_clinica …

Só que no filtro para o usuário eu exibo o nome comum Usuário, Clínica… com o valor correspondente no banco a string completa seguindo o exemplo anterior.

id_tabela -> é o código que foi inserido, alterado ou deletado na tabela.

acao_log -> é onde eu gravo qual foi a ação : "CADASTRAR" OU "ALTERAR OU "DELETAR" OU "ALTERAR-ACESSO" ou "CANCELADA TOTAL" OU "CANCELADA PARCIAL"

informacao -> a informação completa ("stringão") com serialize

dt_log -> data de manipulação dos dados;

hr_log -> hora de manipulação dos dados;

id_usuario-> usuario que manipulou os dados (relacionamento com a tb_usuario)

ip_usuario -> ip do usuario que manipulou os dados

Toda vez que faço operações de crud em uma outra tabela grava nessa de log.

O log é apenas uma tela de consulta dos dados com uma view.

Me alonguei, mas espero que fique compreendido.

Entendi.

Vamos por parte então, vamos fazer funcionar a primeira coluna o que corresponde ao ‘nome_tabela’.

Sua coluna está assim:


array(

     'name'=>'nome_tabela',

     'value'=>$model->nome_tabela,

     'filter'=> CHtml::activeDropDownList($model, 'nome_tabela', $tabelas, array('empty'=>'Escolha')),

),

Altera para:


array(

     'name'=>'nome_tabela',

     'filter'=> $tabelas,

),

Comenta o filtro das outras colunas, e testa esta coluna ‘nome_tabela’.

Funcionou cara, já arrumei todos os filtros.

Fiz algumas modificações retirando dados do array estáticos e colocando métodos para tratar essa questão.

Segue código

Log.php (model)




 

    

    public function buscaAcoes(){

        

        $sql = "SELECT DISTINCT acao_log from sch_scspm.tb_log ORDER BY acao_log ASC";

        

        $sql = Yii::app()->db->createCommand($sql)->query();

        

        while($data = $sql->read()){

            $acoes[$data['acao_log']] = $data['acao_log'];

           

        }

       

        return $acoes;

        

    }

    

    public function buscaTabelas(){

        

        $sqltabelas = "SELECT schemaname AS esquema, tablename AS tabela

                FROM pg_catalog.pg_tables

                WHERE schemaname IN ('sch_scspm')

                ORDER BY  tablename";

        

        $sqltabelas = Yii::app()->db->createCommand($sqltabelas)->query();

        

         $i=1;

         while($data = $sqltabelas->read()){

             

            $tabelaconvertida =  ucfirst(str_replace ('tb_', '', $data['tabela']));

               

            $tabelas[$data['esquema'].".".$data['tabela']] = $tabelaconvertida;

            $i++;

        }

        

        return $tabelas;

        

        

    }




admin.php




$this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'log-grid',

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

	'filter'=>$model,

       	'columns'=>array(

           

		//'id_log',

        	array(

                        'name'=>'nome_tabela',

                     //   'type'=>'raw',

                        'filter'=> $model->buscaTabelas(),

                        //'value'=> $model->converteNomeTabela($model->nome_tabela),

                       //'value'=>Log::Model()->converteNomeTabela($model->nome_tabela),

                     // 'value'=>array($model->nome_tabela,'converteNomeTabela'), 

                     

                ),

                array(

                    

                    'name'=>'acao_log',

                    'filter'=> $model->buscaAcoes(),

              

                 ),

		'dt_log',

		'hr_log',

                   array(

                        'name'=>'id_usuario',

                        'value'=>'Usuario::Model()->FindByPk($data->id_usuario)->nome',

                        'filter' =>CHtml::activeDropDownList($model, 'id_usuario', CHtml::listData(Usuario::model()->findAll(array('order'=>'nome')), 'id_usuario', 'nome'), array('empty'=>'Escolha')),

                       

                ),

                'ip_usuario',

		array(

			'class'=>'CButtonColumn',

                        'template'=>'{view}',

                    

                    

		),

	),

)); 



Só falta uma questão que não estou conseguindo preciso abaixo do filtro "nome_tabela" o nome mais claro para o usuário (atualmente está esquema.nome_tabela).

Criei uma função para isso no model:




...

 public static  function converteNomeTabela($nometabela){

         $tabelaconvertida =  ucfirst(str_replace ('tb_', '', $data['tabela']));

         

         return $tabelaconvertida;

    }

...



Queria exibir no ‘value’ da coluna desse gridview campo : nome_tabela

Tentei das formas que estão acima no código do admin.php e não obtive êxito, o que estou errando?

Descobri erra erro na função:




public   function converteNomeTabela($nometabela){

         $tabelaconvertida =  ucfirst(str_replace ('sch_scspm.tb_', '', $nometabela));

       

         return $tabelaconvertida;

    }