Yii Framework Forum: Trabalhando Com Dois Bancos De Dados - Yii Framework Forum

Jump to content

  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

Trabalhando Com Dois Bancos De Dados Rate Topic: -----

#1 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 18 September 2012 - 08:50 AM

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

#2 User is offline   caaiom 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 29-February 12

Posted 18 September 2012 - 09:30 AM

Dê uma olhada nesses dois wikis :

http://www.yiiframew...-support-in-yii
http://www.yiiframew...ultiple-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
0

#3 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 18 September 2012 - 02:29 PM

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

#4 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 19 September 2012 - 11:35 AM

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

#5 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 820
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 20 September 2012 - 07:51 AM

Ricardo,

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

Usa o firebug para debugar.
Newerton Vargas de Araújo
0

#6 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 20 September 2012 - 12:52 PM

View PostNewerton, on 20 September 2012 - 07:51 AM, said:

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...

Attached File(s)

  • Attached File  tela.png (167.5K)
    Number of downloads: 12

0

#7 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 820
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 20 September 2012 - 11:03 PM

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 Vargas de Araújo
0

#8 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 21 September 2012 - 08:19 AM

View PostNewerton, on 20 September 2012 - 11:03 PM, said:

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

#9 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 820
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 21 September 2012 - 09:02 AM

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.
Newerton Vargas de Araújo
0

#10 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 21 September 2012 - 11:56 AM

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.

Attached File(s)


0

#11 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 820
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 21 September 2012 - 04:53 PM

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/ass...?r=veiculo/list
Newerton Vargas de Araújo
0

#12 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 22 September 2012 - 11:41 AM

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.

Attached File(s)


0

#13 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 820
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 23 September 2012 - 11:40 PM

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 Vargas de Araújo
0

#14 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 24 September 2012 - 09:42 AM

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.

Attached File  firebug4.png (213.3K)
Number of downloads: 10

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

#15 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 820
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 24 September 2012 - 10:08 AM

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];

Newerton Vargas de Araújo
0

#16 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 24 September 2012 - 01:16 PM

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

#17 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 820
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 26 September 2012 - 11:58 AM

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!
Newerton Vargas de Araújo
0

#18 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 27 September 2012 - 09:56 AM

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.

Attached File  firebug6.png (189.32K)
Number of downloads: 8

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

#19 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 820
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 27 September 2012 - 06:35 PM

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 Vargas de Araújo
0

#20 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 28 September 2012 - 07:38 AM

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

Share this topic:


  • (2 Pages)
  • +
  • 1
  • 2
  • 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