Trabalhando Com Dois Bancos De Dados

Ola galera,

Estou fazendo um sistema que cadastra veiculos. Mas no momento do cadastro preciso que busque informações vindas de um outro banco de dados contendo informações como modelo, marca e outros. Vou buscar estas informações por meio de um código que cada modelo de veiculo já tem. Trata-se de algo parecido com busca automática de CEP.

Alguém sabe como posso fazer isso de modo prático com yii? Tem algum modelo que possa me ajudar?

Dê uma olhada nesses dois wikis :

http://www.yiiframework.com/wiki/123/multiple-database-support-in-yii

http://www.yiiframework.com/wiki/78/multiple-databases-and-multiple-domains

depois de configurar os bancos, por exemplo, você pode fazer os comandos SQL dessa forma:




$select = Yii::app()->dbSeuDB->createCommand()

             ->select('*')

             ->from('tabela')

             ->where('condição')

             ->queryAll();

ou


$query = 'INSERT INTO 'db' VALUES (1, 2, null)';

Yii::app()->dbSeuDb->createCommand($query)->query();

abs

Obrigado, valeu! Dei uma lida e já consegui configurar os dois bancos e montar dropdown com dados do banco. Agora já fiz várias pesquisas e não consegui fazer funcionar o preenchimentos dos campos do formulário com os dados encontrados no banco. Tem como dar alguma luz por favor?

Abaixo a forma como estou tentando atualmente, mas que infelizmente ainda não está dando certo. Estou precisando clicar em algum codigo do meu dropdown e ao clicar nele, preencher automaticamente dois campos texfield com valores vindos do banco.

_form


<div class="column">

		<?php echo $form->labelEx($model,'fipe'); ?>

                

                <?php 

                $select = Yii::app()->dbfipe->createCommand()

                        ->select('*')

                        ->from('modelo')

                        ->where('1')

                        ->queryAll(); 

                $codfipe = CHtml::listData($select,'id','id'); 


                      echo $form->dropDownList($model, 'fipe', $codfipe, array('empty'=>'Selecione'),array(


                          'ajax'=>  array(

                                          'type'=>'POST',

                                          'dataType'=>'json',

                                          'url'=>Yii::app()->createUrl('veiculo/list'),

                                          'update'=>'#veiculo_marca',

                                          'data' => array('fipe' => 'js:$(this).val()')


                       ))); ?> 

	</div>


	<div class="column">

		<?php echo $form->labelEx($model,'marca'); ?>

		<?php echo $form->textField($model,'marca',array('size'=>25,'maxlength'=>25, 'class'=>'span2')); ?>

		<?php echo $form->error($model,'marca'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'modelo'); ?>

		<?php echo $form->textField($model,'modelo',array('size'=>25,'maxlength'=>25, 'class'=>'span2')); ?>

		<?php echo $form->error($model,'modelo'); ?>

	</div>



Controller


public function actionList()

        {

            print_r($_POST);

          $id_fipe = $_POST['veiculo']['fipe'];

          echo $id_fipe;

          $data = Yii::app()->dbfipe->createCommand("SELECT nome FROM modelo WHERE id='$id_fipe'")->queryRow(false);

          

          echo CJSON::encode(array('marca'=>$data[0]));

        }

Se alguem puder me ajudar por favor, estou precisando muito…Valeu!

Ricardo,

Não está retornando nada no print_r($_POST);?

Usa o firebug para debugar.

Ola Newerton,

Usei o firebug. Quando seleciono algum codigo e clico em outro campo ele passa o codigo correto para POST, mas simplesmente não preenche campo nenhum. Dê uma olhada por favor na imagem abaixo do firebug, talvez possa ajudar…

Ricardo,

Vamos fazer outro passo dos testes.

Dentro do seu actionList(), faz assim e depois me mostra como retorno o array.




public function actionList()

{

	$id_fipe = $_POST['veiculo']['fipe'];

	echo $id_fipe;

	$data = Yii::app()->dbfipe->createCommand("SELECT nome FROM modelo WHERE id='$id_fipe'")->queryRow(false);

	print_r($data);

	exit();

	echo CJSON::encode(array('marca'=>$data[0]));

}



Assim sabemos como está retornando os dados, por que se não me engano, no lugar de $data[0] poderia ser usado $data->name;

Mais retorna o array todo, ai finalizamos já.

Newerton,

Muito estranho porque não retorna nada. A ActionList não está sendo chamada. Fiz um teste simples colocando simplesmente “echo ‘ola’; exit();” nesta Action e não retorna nada. Já conferi o código e não encontrei nada. Será que tem a ver com ajax não estar funcionando?

Faz assim,

Cria o Model da tabela ‘modelo’, e vamos mudar o actionList();




class VeiculoController extends Controller {

...

	public function actionList()

	{

		$id = $_POST['veiculo']['fipe'];

		$data = Modelo::model()->findByPk($id);

		echo CJSON::encode(array('marca'=>$data->nome));

	}

...

}



Este actionList precisa está dentro do VeiculoController, assim [‘url’=>Yii::app()->createUrl(‘veiculo/list’)] vai funcionar corretamente.

Caso não funcione ainda, coloca um print_r() ou var_dump() depois da váriavel $data do actionList() junto com o exit(), e veja na aba [Resposta] do firebug, se ele retorno um array.

Uma outra coisa, veja na aba Console do firebug, elimina os erros de CSS e JS, assim não irá funciona o ajax.

Fiz exatamente como você disse, criei Model da tabela modelo e alterei o actionList. Apenas um detalhe, a tabela modelo está num outro banco de dados que já configurei no main.php. Sendo assim "$data = Modelo::model()->findByPk($id);" vai funcionar?(me desculpe se tiver falando besteira…rsrs)

De qualquer modo tentei das duas maneiras($data = Yii::app()->dbfipe->createCommand(“SELECT nome FROM modelo WHERE id=’$id_fipe’”)->queryRow(false);), mas infelizmente continua não retornando nada, nem colocando o print_r().

Abaixo imagem do firebug.

Ricardo,

Não está chamando o veiculo/list, essas resposta e da validação do formulário, o dropdown não está funcionando.

A URL correta no Console do Firebug é:

http://localhost/associacao_yii/index.php?r=veiculo/list

Newerton,

Realmente tinha percebido que não está chamando veiculo/list, inclusive fiz o teste que falei na resposta #8 e não retornou nada. Quando acesso direto a URL "http://localhost/associacao_yii/index.php?r=veiculo/list" ele apresenta erro por não receber valor do $_POST. E minha dificuldade é justamente em fazer o dropdown funcionar. Se li vários fóruns e fiz várias alterações e não funciona.

Ricardo,

Veja se na hora de selecionar o valor no dropdown, se está dando erro de javascript, abaixo vou postar um dropdown que fiz ontem para um site.


<?php echo $form->dropDownList($model, 'categoria', $lista, array(

                            'ajax' => array(

                                'type' => 'POST',

                                'dataType' => 'json',

                                'url' => Yii::app()->createUrl('index/buscaproduto'),

                                'success' => 'function(data){

                                    alert(data);

                                }',

                                'data' => array('id' => 'js:$(this).val()')


                            ))); ?>

Eu copiei o mesmo dropdown, e mudei o:


'update'=>'#veiculo_marca',

para:


'success' => 'function(data){alert(data);}',

Se estiver retornando ‘data’ no alert(), é somente colocar no input.

Newerton,

Começou a clarear(rsrsrs…). Mudei o:


echo $form->dropDownList($model, 'fipe', $codfipe, array('empty'=>'Selecione'),array(

para:


echo $form->dropDownList($model, 'fipe', $codfipe, array(

e chamou o veiculo/list. O parâmetro do "Selecione" estava impedindo. Agora veja o que esta ocorrendo. Ele consulta corretamente no banco o que seleciono pelo dropdown e retorna valor correto, mas não atualiza no campo que preciso.

3256

firebug4.png

Agora está da seguinte forma.

_form


<div class="column">

		<?php echo $form->labelEx($model,'fipe'); ?>

                

                <?php 

                $select = Yii::app()->dbfipe->createCommand()

                        ->select('*')

                        ->from('modelo')

                        ->where('1')

                        ->queryAll(); 

                $codfipe = CHtml::listData($select,'id','id'); 

                <?php echo $form->dropDownList($model, 'fipe', $codfipe, array(

                            'ajax' => array(

                                'type' => 'POST',

                                'dataType' => 'json',

                                'url' => Yii::app()->createUrl('veiculo/list'),

                                'update'=>'#veiculo_marca',

                                'data' => array('fipe' => 'js:$(this).val()')


                            ))); ?>       

                

	</div>


	<div class="column">

		<?php echo $form->labelEx($model,'marca'); ?>

		<?php echo $form->textField($model,'marca',array('size'=>25,'maxlength'=>25, 'class'=>'span2')); ?>

		<?php echo $form->error($model,'marca'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'modelo');?>

		<?php echo $form->textField($model,'modelo',array('size'=>25,'maxlength'=>25, 'class'=>'span2')); ?>

		<?php echo $form->error($model,'modelo'); ?>

	</div>



_Controller


public function actionList()

        {

          $id = $_POST['fipe'];

          $data = Yii::app()->dbfipe->createCommand("SELECT nome FROM modelo WHERE id='$id'")->queryRow(false);

          echo CJSON::encode(array('marca'=>$data[0]));

        }

Se tiver mais alguma ideia do que possa ser feito agradeço muito. Estou pesquisando em vários lugares e realmente não consegui ainda encontrar a solução.

Ricardo,

Pode manter o empty:


echo $form->dropDownList($model, 'fipe', $codfipe, array('empty'=>'Selecione',

Sobre atualizar o campo, vai a dica:

Altera o:


'update'=>'#veiculo_marca',

para:


'success' => 'function(data){\$("input#veiculo_marca").val(data.marca);}',

Se deseja manter o ‘update’.

Altera no actionList() a resposta.

De:


echo CJSON::encode(array('marca'=>$data[0]));

Para:


echo $data[0];

Perfeito Newerton, funcionou!!! Muitissimo obrigado pela paciência e ajuda. Apenas mais um detalhe. Os campos de modelo e marca estão sendo atualizados. Porém preciso também que ao clicar no codigo fipe seja montado um dropdown com os anos de fabricação do veiculo escolhido(tenho estes valores no banco de dados a serem exibidos de acordo com codigo fipe).

Tem como fazer isso utilizando o mesmo mesmo action ou preciso criar um novo? Qual melhor maneira de fazer isso?

Ricardo,

Você pode usar o mesmo actionList().

Mais ao invez de usar o


'update'=>'#veiculo_marca'

você vai usar o


'success' => 'function(data){\$("input#veiculo_marca").val(data.marca);}',

Ai no actionList(), você vai usar o:


echo CJSON::encode(array('marca'=>$data[0]));

Exemplo:


$marca = Yii::app()->dbfipe->createCommand("SELECT id, nome FROM modelo WHERE id='$id'")->queryRow(false);


$anos = Fipeanos::model()->findAll(array('condition' => 'id_fipe = :id_fipe', 'params' => array(':id_fipe' => $marca[0])));

$anos = CHtml::listData($anos, 'ano', 'ano');


$drop[] = CHtml::tag('option', array('value' => ''), CHtml::encode('Selecione'), true);

foreach ($anos as $value => $name) {

    $drop[] = CHtml::tag('option', array('value' => $value), CHtml::encode($name), true);

}


echo CJSON::encode(array('marca'=>$marca[1],'anos'=>$drop));

No javascript do dropdown faz assim:


'success' => 'function(data){

    $("input#veiculo_marca").val(data.marca);

    $("select#veiculo_ano").html(data.anos);

}',

Foi só um exemplo, não sei se vai funcionar desta maneira!

Oi Newerton, mais uma vez muito obrigado pelas dicas.

Tentei fazer da forma sugerida e pelo firebug esta dando resposta correta, mas parece que deu um erro na montagem do css.

3268

firebug6.png

Consegui fazer de uma outra forma. Criei mais um método no Controller para pesquisa inicialmente apenas do ano modelo e depois ele carrega marca e modelo. Seria melhor se fizesse de uma só vez todos os campos, mas de qualquer modo já resolveu e acho que vai ficar funcional. Vou postar, talvez possa ser útil para alguém futuramente. Não é a melhor forma…mas talvez pode ser útil.


public function actionAnomodel()

        {

          $id = $_POST['veiculo']['fipe'];

          $anomod = Yii::app()->dbfipe->createCommand("SELECT nome FROM ano_modelo WHERE modelo='$id'")->queryAll();

          $anover = CHtml::listData($anomod,'nome', 'nome'); //cria lista com valores vindos do banco

                 foreach($anover as $id => $value)

            {

                     echo CHtml::tag('option',array('value' => $id),CHtml::encode($value),true);

            }

        }

        

        /**

         *Pega FIPE e anomodelo de acordo com valores escolhidos pelo usuário e faz consulta no banco para atualização dos campos marca, modelo e valor 

         */

        public function actionList()

        {

          $id = $_POST['veiculo']['fipe'];

          $idano = $_POST['veiculo']['anomodelo'];

          

          $data = Yii::app()->dbfipe->createCommand("SELECT nome, marca FROM modelo WHERE id='$id'")->queryRow(false);

          $marca = Yii::app()->dbfipe->createCommand("SELECT nome FROM marca WHERE id='$data[1]'")->queryRow(false);

          $valor = Yii::app()->dbfipe->createCommand("SELECT valor FROM ano_modelo WHERE modelo='$id' AND nome='$idano'")->queryRow(false);

          

          echo CJSON::encode(array('marca'=>$marca[0], 'modelo'=>$data[0], 'valor'=>$valor[0]));

          

        }

Agradeço muito pela ajuda.

Ricardo,

O erro que deu foi somente no ‘anomodelo’, ele não conseguiu converter o que veio do JSON.

No select#anomodelo, você usou no javascript .val(data.anomodelo) ou .html(data.anomodelo).

Nos <select> usa-se sempre .html() para preencher ele.

Só vai usar o .val(data) nos inputs, pode-se usar .val() nos <select> mais somente para resgatar qal <option> está selecionado.

jQuery e extenso mais é gostoso de trabalhar com ele, por que ele é pratico e reduz muito o desenvolvimento.

Sob o que você fez deixa assim, se está funcionando pode deixar, com o tempo você vai testando outras formas, mais é assim que e começa.

Newerton,

Tentei das duas formas no javascript .val(data.anomodelo) e .html(data.anomodelo).

O erro que postei foi justamente usando o html(). Usando o val() ele não apresenta erro no firebug, mas não monta o dropdown do anomodelo.

Mas, realmente parece o jquery já percebi que é muito bom de trabalhar. Vou continuar correndo atrás. Que bom que temos ajudas estas que recebi para nos salvar. Valeu!