Chtml::button Com Duas Ações

Mais primeiramente, você tem que resolver o problema do:


'data' => array(

        'qtde_folhas_requisicao' => 'js:$("#Requisicao_qtde_folhas_requisicao").val()',

        'series_disponiveis' => 'js:$("select#series_disponiveis option:selected").val()',

),

Você precisa enviar esses 2 valores para inserir na consulta.

Para usa JSON, segue o post deste tópico.

http://www.yiiframework.com/forum/index.php/topic/36250-chtmlbutton-com-duas-acoes/page__view__findpost__p__178298

Newerton, boa tarde!

Modifiquei o código usando JSON, conforme você sugeriu.

Utilizei a extensão:

CarJson

O código busca os valores corretamente e exibe na div.

Necessito agora, joga-los para os campos inputs do formulário ( num_requisicao_inicial_medico e num_requisicao_final_medico) e estou com dificuldades. Esses campos sim fazem parte do formulário e vão ser gravados no banco.

O parametro ‘data’ está comentando pois com ele habilitado para de aparecer os dados buscados na div

O código atualmente está:

_form.php




 <div class="row">

            <?Php

                        

                    echo CHtml::label('Faixas | Séries | Quantidades Disponíveis', 'series_disponiveis');

                    //empty since it will be filled by the other dropdown

                    echo CHtml::dropDownList('series_disponiveis','', array('empty' => 'Escolha um Tipo de Receita', 

                    ));

                    echo CHtml::button('Exibir Faixa', array(

                              'ajax' => array(

                                  'type' => 'POST',

                                  'url' => CController::createUrl('Requisicao/buscaultimo'),

//                                   'data' => array(

//                                                    'quantidadefolhas' => 'js:$("#Requisicao_qtde_folhas_requisicao").val()',

//                                                    'seriesdisponiveis' => 'js:$("select#series_disponiveis option:selected").val()',

//

//                                                    ),

                                 'update' => '#req_dados_dinamicos',

//                                  'success' => 'function(data) {

//                                                    var primeirainicial = 0+$("#primeira_requisicao_inicial").val();

//                                                    var primeirafinal =   0+$("#primeira_requisicao_final").val();

//                                                    var proximainicial =  0+$("#Requisicao_proxima_requisicao_inicial").val();

//                                                    var proximafinal =    0+$("#Requisicao_proxima_requisicao_final").val();

//                                                    var seriesdisponiveis = $("#series_disponiveis").val();

//                                                   

//                                                    var quantidadefolhas =  $("#Requisicao_qtde_folhas_requisicao").val();

//                                                    var quantidadedisponivel =  $("#quantidadedisponivel").val();

//                                                    var quantidadedisponivel2= series_disponiveis.options[series_disponiveis.selectedIndex].text;

//                                                    var quebra=quantidadedisponivel2.split("|");

//                      alert("Primeira inicial: "+primeirainicial+ "Primeira final: "+primeirafinal+ "Proxima inicial: "+proximainicial+ "Proxima final: "+proximafinal);

//                      if(parseInt(quantidadefolhas)>parseInt(quebra[2])+1){

//                        alert("Quantidade de folhas requisitada"+quantidadefolhas+" deve ser menor ou igual a quantidade disponível"+quebra[2]);

//                      }    

//                    

//                     if(isNaN(primeirainicial) &&  isNaN(primeirafinal)){

//                        alert("primeira requisicao");

//                        var numinicialrequisicao = proximainicial;

//                        var numfinalrequisicao = proximafinal;

//                      

//                      }else{

//                        

//                         var numinicialrequisicao = primeirainicial;

//                         var numfinalrequisicao = primeirafinal;

//

//                      }

//                      alert(numinicialrequisicao + " " + numfinalrequisicao + " " + seriesdisponiveis);

//                      $("#Requisicao_num_requisicao_inicial_medico").val(numinicialrequisicao);

//                      $("#Requisicao_num_requisicao_final_medico").val(numfinalrequisicao);

//                      $("#Requisicao_id_num_sequencial").val(seriesdisponiveis);                                      

//

//

//  }

//  '

                            

                            )

                        )

                          );

           

                       ?>

     

        </div>

        

        <div id="req_dados_dinamicos" class="row">


        </div>


 <div class="row">

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

		<?php echo $form->textField($model,'num_requisicao_inicial_medico',   array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />); ?>

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

	</div>


	<div class="row">

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

		<?php echo $form->textField($model,'num_requisicao_final_medico', array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />); ?>

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

	</div>




RequisicaoController.php





 public function actionbuscaultimo()

       {

             $parametro = ((int) $_POST['Requisicao']['qtde_folhas_requisicao']);

            

             $parametro2 = (int)$_POST['series_disponiveis'];

              

          

             Yii::import('application.extensions.json.CArJSON');

             $requisicoes = Requisicao::model()->findBySql("SELECT (MAX(req.num_requisicao_final_medico)+1) as proxima_requisicao_inicial, (MAX(req.num_requisicao_final_medico)+:keyword) as proxima_requisicao_final,

                                                            ns.num_sequencial_inicial as primeira_requisicao_inicial, ns.num_sequencial_inicial+:keyword-1 as primeira_requisicao_final,

                                                                    MAX(ns.num_sequencial_final) - MAX(req.num_requisicao_final_medico) as quantidade_disponivel,

                                                                    ns.num_sequencial_final - ns.num_sequencial_inicial as quantidade_disponivel_sem_requisicao

                                                                                                            FROM 

                                                                                                            sch_scspm.tb_num_sequencial ns

                                                                                                            LEFT JOIN sch_scspm.tb_requisicao req

                                                                                                                            ON 

                                                                                                                            (ns.id_num_sequencial = req.id_num_sequencial)


                                                                                                                             WHERE

                                                                                                                                    ns.id_num_sequencial = :keyword2

                                                                                                                    GROUP BY ns.num_sequencial_inicial, ns.num_sequencial_final", array(':keyword' => $parametro, ':keyword2' => $parametro2));


            $json = new CArJSON();

            // Define which relations do you want to load

            $relations = array('medico', 'clinica', 'grafica');

            // Define which attributes, foreach relations do you want to load

            // root denote attributes for the main model

             if ($requisicoes->proxima_requisicao_inicial ==  NULL || $requisicoes->proxima_requisicao_final ==  NULL) {

                 $attributes = array(

                     'root' => array('primeira_requisicao_inicial','primeira_requisicao_final')

                  );


             }  else {

                 $attributes = array(

                    'root' => array('proxima_requisicao_inicial', 'proxima_requisicao_final'),

                );

             }


            echo $json->toJSON($requisicoes, $relations, $attributes);

               

    }



Na div é exibido resultado da seguinte forma:

[{"attributes":{"proxima_requisicao_inicial":5431881,"proxima_requisicao_final":5431890},"relations":{"medico":null,"clinica":null,"grafica":null}}]

samjf,

O ‘update’ que usou, e para retorno em HTML, se quizer usar o JSON, usa o ‘success’


'success' => 'function(data) {

console.log(data.attributes.proxima_requisicao_inicial);

console.log(data.attributes.proxima_requisicao_final);

}

Se estiver retornando os valores (5431881 e 5431890_ no console do firebug, ai é somente colocar esse valores dentro do $(’#IDseuinput’).val(data.attributes.*)

Newerton, obrigado mais uma vez!

Acontece que eu realmente não tenho muita afinidade com Javascript.

Consegui debugar o console e deu erro:

TypeError: data.attributes is undefined

Quando mando imprimir o data o resultado é o mesmo que aparecia na div anteriormente:

[{"attributes":{"proxima_requisicao_inicial":5431881,"proxima_requisicao_final":5431890},"relations":{"medico":null,"clinica":null,"grafica":null}}]

Tentei mudar para imprimir apenas com o nome do campo :

proxima_requisicao_inicial e proxima_requisicao_final e não consegui.

Teria que mudar algo no método controller? Na documentação do carjson não encontrei muita coisa referente a esse método. Me parece que ele sempre tem que retornar os valores dessa forma model + relações + atributos pelo menos nesse método toJSON.

Não estou sabendo qual sintaxe poderia pegar cada campo.

Mas estou continuando a tentar aqui.

Me parece que tenho não posso acessar o campo direto, tenho que percorrer antes.

Referência

samjf,

Achei meu erro hehe

O array em JSON que retorna:

[{"attributes":{"proxima_requisicao_inicial":5431881,"proxima_requisicao_final":5431890},"relations":{"medico":null,"clinica":null,"grafica":null}}]

A variável attributes é um array, não me atentei a isso.

Faz assim:


console.log(data.attributes[0].proxima_requisicao_inicial);

console.log(data.attributes[0].proxima_requisicao_final);

Uma outra coisa que tem que adicionar é:

Debaixo do:


'type' => 'POST',

Adiciona:


'dataType' => 'json',

Senão a leitura de retorno será HTML (Somente texto),

Depois de ver tudo, não consigo entender uma coisa.

Como consegue esses valores?


$parametro = ((int) $_POST['Requisicao']['qtde_folhas_requisicao']);

$parametro2 = (int)$_POST['series_disponiveis'];

Eles não está sendo enviado ao clicar o botão.

O erro permanece, só que agora está retornando como objeto.

Não teria que fazer tipo um foreach nesse caso? Existe essa possibilidade no jS?

Sobre os parametros eles são enviados sim, caso contrário a consulta que retorna os dados não iria funcionar.

Acredito que eles são enviados nesse momento:

‘url’ => CController::createUrl(‘Requisicao/buscaultimo’),

Aí no controller pego os dados via $_POST.

Tentei dessa forma para percorrer:




           echo CHtml::button('Exibir Faixa', array(

                              'ajax' => array(

                                  'type' => 'POST',

                                  'dataType' => 'json',

                                  'url' => CController::createUrl('Requisicao/buscaultimo'),

                                  'update' => '#req_dados_dinamicos',

                                  'success' => "function(data) {

                                                  for (var i in data) {

                                                       console.log('Nome: ' + i + ' / Valor: ' + data[i]);

                                                  }

                                          }"                                         


      )

                        )

                          );



Resultado:

Nome: 0 / Valor: [object Object]

Alguém tem alguma idéia de alguma solução para essa questão?

Estou usando paleativamente dois botões

Obrigado!




	echo CHtml::AjaxButton('Exibir Faixa', array('Requisicao/buscaultimo'), 

 		array(                                  'type' => 'POST',

         	'dataType' => 'json',

         	'data' => array( 

                 'quantidadefolhas' => 'js:$("#Requisicao_qtde_folhas_requisicao").val()',

                 'seriesdisponiveis' => 'js:$("select#series_disponiveis option:selected").val()', 

         	), 

         	'success' => "function(data) { 

                 $('#campo').val(data.campo);

					.... 

                 }" 

         	) 

 		);




Controller:




public function actionbuscaultimo()

   	{

     		$parametro = ((int) $_POST['quantidadefolhas']);

            

     		$parametro2 = ((int)$_POST['series_disponiveis']);

              

          

     		$requisicoes = Requisicao::model()->findBySql("SELECT (MAX(req.num_requisicao_final_medico)+1) as proxima_requisicao_inicial, (MAX(req.num_requisicao_final_medico)+:keyword) as proxima_requisicao_final,

                                                            ns.num_sequencial_inicial as primeira_requisicao_inicial, ns.num_sequencial_inicial+:keyword-1 as primeira_requisicao_final,

                                                                    MAX(ns.num_sequencial_final) - MAX(req.num_requisicao_final_medico) as quantidade_disponivel,

                                                                    ns.num_sequencial_final - ns.num_sequencial_inicial as quantidade_disponivel_sem_requisicao

                                                                                                            FROM 

                                                                                                            sch_scspm.tb_num_sequencial ns

                                                                                                            LEFT JOIN sch_scspm.tb_requisicao req

                                                                                                                            ON 

                                                                                                                            (ns.id_num_sequencial = req.id_num_sequencial)


                                                                                                                     		WHERE

                                                                                                                                    ns.id_num_sequencial = :keyword2

                                                                                                                    GROUP BY ns.num_sequencial_inicial, ns.num_sequencial_final", array(':keyword' => $parametro, ':keyword2' => $parametro2));


		if($requisicoes != null){

			echo CJSON::encode($requisicoes->attributes);

		}


	die;


}

	



Ricardo, deu erro!

<h1>PHP Error [8]</h1>

<p>Undefined index: Requisicao (/var/www/scspm-yii/protected/controllers/RequisicaoController.php:243

samjf, já resolveu o seu problema?

Sobre sua pergunta mais acima, é sim possível fazer um foreach no javascript, neste caso, seria um for in.

Segue aqui um exemplo de utilização: for in.

Onde no PHP temos:




foreach($objects as $key => $object) {...}



No JavaScript temos:




for($key in $objects) {

    // Para acessar o objeto se faz:

    console.log($objects[$key]);

}



Ele pode usar o $.each() do jquery para percorrer os dados.

Exemplo:


$.each(data, function(index, value){

    console.log(index + ' => ' + value);

});