Chtml::button Com Duas Ações

Pessoal, bom dia!

Estive procurando alguma solução para meu problema em outros tópicos, porém não encontrei.

Bem, meu caso é o seguinte:

Tenho um CHtml::button que chama o método no controller, faz a busca no banco de acordo com parâmetros passados e imprime dois valores em campos hidden. Com esses valores eu uso javascript para jogar os dados nos inputs, porém necessito clicar duas vezes no botão para que ele funcione.

Com faria para ao clicar no botão ele ja busque os dados e já utilize o javascript para preencher os inputs sem a necessidade de clicar duas vezes no botão?

Existe alguma forma de vincular o botão ao controller e a um javascript em uma mesma ação? Como seria?

Dessa forma que estou fazendo está correta?

Segue o código até então:

_form.php





 <div class="row">

            <?Php

                Yii::app()->clientScript->registerScript('bt'," 

                 $(document).ready(function() {

               

                 $('#Requisicao_requisicao_terceiro_0').click(function(){

                    $('.requisicao_terceiro').show();

                     

                  })

               

                  $('#Requisicao_requisicao_terceiro_1').click(function(){

                     $('.requisicao_terceiro').hide();

                  })

                  

                   $('#yt0').click(function(){

                   

                      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();

                     

                    

                     

                     if(typeof proximainicial=='undefined'  || typeof proximainicial=='undefined'){

                   

                    

                        var numinicialrequisicao = primeirainicial;

                        var numfinalrequisicao = primeirafinal;

                      

                      }else{

                        

                         var numinicialrequisicao = proximainicial;

                         var numfinalrequisicao = proximafinal;


                      }

        

                      $('#Requisicao_num_requisicao_inicial_medico').val(numinicialrequisicao);

                      $('#Requisicao_num_requisicao_final_medico').val(numfinalrequisicao);

                      $('#Requisicao_id_num_sequencial').val(seriesdisponiveis);

                   

                  })      

                  

                  

                  })",CClientScript::POS_READY); 

                    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('Buscar', array(

                              'ajax' => array(

                                  'type' => 'POST',

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

                                  'update' => '#param_id',

                              

                              )

                          ));

                    

                     

         

                       ?>

     

        </div>

        

        <div id="param_id" 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'];

        

           //   dd($parametro);

       

//        $posts = Requisicao::model()->findBySql("SELECT (MAX(req.num_requisicao_final_medico)+1) as nova_requisicao_inicial, (MAX(req.num_requisicao_final_medico)+:keyword) as nova_requisicao_final

//                                                FROM 

//                                                sch_scspm.tb_num_sequencial ns, sch_scspm.tb_requisicao req

//                                                                WHERE 

//                                                                ns.id_num_sequencial = req.id_num_sequencial

//

//                                                                 AND

//                                                                        ns.id_num_sequencial = :keyword2", array(':keyword' => $parametro, ':keyword2' => $parametro2));

//      

   

        

        $posts = 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

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

        

        // var_dump($posts);

        

      $posts->primeira_requisicao_inicial = (int) $posts->primeira_requisicao_inicial;

    

      $posts->primeira_requisicao_final =  (int) $posts->primeira_requisicao_final;

         

      $posts->proxima_requisicao_inicial = (int) $posts->proxima_requisicao_inicial;

      

      $posts->proxima_requisicao_final = (int) $posts->proxima_requisicao_final;

        

    

      

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

             //não existe nenhuma requisição

             //echo CHtml::label('Faixa Liberada para o Médico', 'primeira_requisicao_inicial');

             echo CHtml::HiddenField('primeira_requisicao_inicial', $posts->primeira_requisicao_inicial,  array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'primeira_requisicao_inicial') );

             echo CHtml::HiddenField('primeira_requisicao_final', $posts->primeira_requisicao_final,  array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'primeira_requisicao_final') );

             echo 'Faixa Calculada!';

            

          

     } else {

            //existe requisicao

            //echo CHtml::label('Faixa Liberada para o Médico', 'proxima_requisicao_inicial');

            echo CHtml::HiddenField('Requisicao[proxima_requisicao_inicial]', $posts->proxima_requisicao_inicial, array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'proxima_requisicao_inicial')) ;

            echo CHtml::HiddenField('Requisicao[proxima_requisicao_final]', $posts->proxima_requisicao_final, array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'proxima_requisicao_final'));

            echo 'Faixa Calculada!';

            

          

            

     }




Desculpem, más ainda estou iniciando no Yii

samjf,

Acho que com a configuração success da função ajax você pode conseguir.

http://api.jquery.com/jQuery.ajax/

Desculpe a ignorância, más como seria esse success?

Inseri como parâmetro do botão e não funcionou.

Poderia me passsar um exemplo?

Fiz assim:





                    echo CHtml::button('Buscar', array(

                              'ajax' => array(

                                  'type' => 'POST',

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

                                  'update' => '#param_id',

                                  'success' =>' $(#yt0).click(function(){

                   

                      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();

                     

                    

                     

                     if(typeof proximainicial==undefined  || typeof proximainicial==undefined){

                   

                    

                        var numinicialrequisicao = primeirainicial;

                        var numfinalrequisicao = primeirafinal;

                      

                      }else{

                        

                         var numinicialrequisicao = proximainicial;

                         var numfinalrequisicao = proximafinal;


                      }

        

                      $(#Requisicao_num_requisicao_inicial_medico).val(numinicialrequisicao);

                      $(#Requisicao_num_requisicao_final_medico).val(numfinalrequisicao);

                      $(#Requisicao_id_num_sequencial).val(seriesdisponiveis);

                   

                  })     '

                              )

                          ));



samjf, tenta jogar o código do success dentro de uma função.

Assim:




echo CHtml::button('Buscar', array(

	'ajax' => array(

		'type' => 'POST',

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

		'update' => '#param_id',

		'success' => 'function() { // Apenas coloquei seu código dentro desta função.

			$(#yt0).click(function(){

				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();


				if(typeof proximainicial==undefined  || typeof proximainicial==undefined){

					var numinicialrequisicao = primeirainicial;

					var numfinalrequisicao = primeirafinal;

	              		} else {

					var numinicialrequisicao = proximainicial;

					var numfinalrequisicao = proximafinal;

				}


				$(#Requisicao_num_requisicao_inicial_medico).val(numinicialrequisicao);

				$(#Requisicao_num_requisicao_final_medico).val(numfinalrequisicao);

				$(#Requisicao_id_num_sequencial).val(seriesdisponiveis);

	           

	          	});     			

		}'

	),

));



Não funcionou cara, como faço para debugar o javascript no Yii?

Pode ter algum erro de sintaxe.

Valeu mesmo!

samjf,

Usa o firebug, e vai usando alert() no javascript para ver se esta a retornando os dados correto!

Isso, usa alert() ou console.log(), particularmente gosto mais de usar o console.log(), mas fica a seu critério.

Mas voltando… Seu problema deve ser o seguinte:




// O código está assim:

$(#Requisicao_num_requisicao_inicial_medico).val(numinicialrequisicao);


// Quando deveria estar assim:

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


// Isso em diversos lugares...



Lothor, obrigado pela dica!

Desculpe a demora para o retorno, tive alguns imprevistos más estou de volta.

Bom, coloquei as aspas, porém só funciona na forma de botões separados:





  echo CHtml::button('Buscar', array(

                              'ajax' => array(

                                  'type' => 'POST',

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

                                  'update' => '#param_id',


                                  

                                  

                              )

                          ));

                    

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

                              'ajax' => array(

                                  'type' => 'POST',

                                  '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("|");

                     

                      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)){

                        

                        var numinicialrequisicao = proximainicial;

                        var numfinalrequisicao = proximafinal;

                      

                      }else{

                       

                         var numinicialrequisicao = primeirainicial;

                         var numfinalrequisicao = primeirafinal;


                      }

        

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

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

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


   

  }'

                            

                              )

                          ));



Se colocar tudo em um botão só não funciona (aparece Nan nos campos texto). Dessa forma:




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

                              'ajax' => array(

                                  'type' => 'POST',

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

                                  'update' => '#param_id',

                                  '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("|");

                     

                      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)){

                        

                        var numinicialrequisicao = proximainicial;

                        var numfinalrequisicao = proximafinal;

                      

                      }else{

                       

                         var numinicialrequisicao = primeirainicial;

                         var numfinalrequisicao = primeirafinal;


                      }

        

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

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

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


   

  }'

                            

                              )

                          ));



Alguém sabe o que poderia gerar esse ‘conflito’?

Obrigado mais uma vez!

Precisamos saber o que está sendo retornado samjf, antes do código abaixo:




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

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

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



Coloca essa linha e informa pra gente a saída dela:




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



Está retornando :

NaN NaN 164

Ou seja, ele não está trazendo os campos dinâmicos do meu método no controller. O engraçado é que em botões separados ele traz, será que o botão não aceita essa estrutura com duas ações?





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

                                  'update' => '#param_id',

                                  'success' => 'function(data) {




Segue o método do Controller que traz os dados.





 public function actionbuscaultimo()

       {

   

       

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

     

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

                

             $posts = 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));

        

                // var_dump($posts);


              $posts->primeira_requisicao_inicial = (int) $posts->primeira_requisicao_inicial;


              $posts->primeira_requisicao_final =  (int) $posts->primeira_requisicao_final;


              $posts->proxima_requisicao_inicial = (int) $posts->proxima_requisicao_inicial;


              $posts->proxima_requisicao_final = (int) $posts->proxima_requisicao_final;


              $posts->quantidade_disponivel = (int) $posts->quantidade_disponivel;


              $posts->quantidade_disponivel_sem_requisicao = (int) $posts->quantidade_disponivel_sem_requisicao;


      

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

                   //echo 'nenhuma requisição';

                   //não existe nenhuma requisição

                   //echo CHtml::label('Faixa Liberada para o Médico', 'primeira_requisicao_inicial');

                   echo CHtml::HiddenField('primeira_requisicao_inicial', $posts->primeira_requisicao_inicial,  array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'primeira_requisicao_inicial') );

                   echo CHtml::HiddenField('primeira_requisicao_final', $posts->primeira_requisicao_final,  array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'primeira_requisicao_final') );

                   echo CHtml::HiddenField('quantidade_disponivel_sem_requisicao', $posts->quantidade_disponivel_sem_requisicao,  array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'quantidade_disponivel_sem_requisicao') );

                   echo 'Faixa Calculada!';


               } else {

                 // echo 'próxima requisição';

                  //existe requisicao

                  //echo CHtml::label('Faixa Liberada para o Médico', 'proxima_requisicao_inicial');

                  echo CHtml::HiddenField('Requisicao[proxima_requisicao_inicial]', $posts->proxima_requisicao_inicial, array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'proxima_requisicao_inicial')) ;

                  echo CHtml::HiddenField('Requisicao[proxima_requisicao_final]', $posts->proxima_requisicao_final, array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'proxima_requisicao_final'));

                  echo CHtml::HiddenField('quantidade_disponivel', $posts->quantidade_disponivel,  array('readonly' => true, 'size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('size' => 8, 'maxlength'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />, array('id' => 'quantidade_disponivel') ); 

                  echo 'Faixa Calculada!';

               }

    

               

               

    }




Me desculpe as dúvidas, estou iniciando. Obrigado pela ajuda desde então.

samjf, não consegui encontrar o erro assim no olho.

Como você está convertendo os valores para int não faz sentido eles estarem retornando NaN, em casa vou olhar com mais calma caso não encontres a solução até lá.

samjf,

Olhei com calma o código aqui, você esta retornando hiddenField() para depois com jquery buscar esses valores nos inputs?

Você vai precisar desses hiddenField() na sumissão do formulário?

Por que há solução de reduzir esse código pela metade sem usar esse hiddenField().

Faz os calculos todos no actionBuscaultimo() e retorna somente os dados que você precisa.

Estou retornando exatamente isso.

O sistema funciona da seguinte forma: O usuário digita a quantidade de receita que ele quer, dai escolhe o tipo de receita ai carrega todas as faixas numéricas daquele tipo com suas respectivas quantidades disponíveis.

ai quando ele seleciona uma faixa numerica busco pelo id e faço o calculo baseado na quantidade requerida e na faixa selecionada

esses valores tenho que jogar em campos do formulario para gravar na tabela numero_inicial, numero_final. Gravo também o id em um hidden, mas acho que não vai precisar de ter esse hidden do id pois ele já existe ateriormente só tira-lo como obrigatório dai no actioncreate pego ele do campo anterior.

Talvez tentando dessa forma nós conseguimos né?

Como faria sem o hidden?

Valeu.

samjf,

Refiz algumas coisas, e achei alguns erros que poderia solucionar o problema, mais vou postar uma solução que pode ajudar também.

Eu adicionei os hiddenField() direto no HTML.




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

<?php

echo CHtml::hiddenField('primeira_requisicao_inicial', '',  array('id' => 'primeira_requisicao_inicial') );

echo CHtml::hiddenField('primeira_requisicao_final', '',  array('id' => 'primeira_requisicao_final') );

echo CHtml::hiddenField('quantidade_disponivel_sem_requisicao', '', array('id' => 'quantidade_disponivel_sem_requisicao') );


echo CHtml::hiddenField('Requisicao[proxima_requisicao_inicial]', '', array('id' => 'proxima_requisicao_inicial')) ;

echo CHtml::hiddenField('Requisicao[proxima_requisicao_final]', '', array('id' => 'proxima_requisicao_final'));

echo CHtml::hiddenField('quantidade_disponivel', '', array('id' => 'quantidade_disponivel') ); 

?>

</div>



Existem 2 parametros no seu actionBuscaultimo() que não recebia valor nenhum, por que não foi adicionado valores de envio na requisição ajax, as duas váriaveis são ($parametro e $parametro2).




<?php

public function actionbuscaultimo() {

 

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


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


	$sql = "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";

	

	$posts = Requisicao::model()->findBySql($sql, array(':keyword' => $parametro, ':keyword2' => $parametro2));


	if (is_null($posts->proxima_requisicao_inicial) || is_null($posts->proxima_requisicao_final)) {

		echo CJSON::encode(array(

			'primeira_requisicao_inicial' => (int) $posts->primeira_requisicao_inicial,

			'primeira_requisicao_final' => (int) $posts->primeira_requisicao_final,

			'quantidade_disponivel_sem_requisicao' => (int) $posts->quantidade_disponivel_sem_requisicao

		));


	} else {

		echo CJSON::encode(array(

			'proxima_requisicao_inicial' => (int) $posts->proxima_requisicao_inicial,

			'proxima_requisicao_final' => (int) $posts->proxima_requisicao_final,

			'quantidade_disponivel' => (int) $posts->quantidade_disponivel

		));

	}               

}



No botão de Exibir Faixa adicionei alguns parametros, com calma avalia o que fiz.




<?php

echo CHtml::button('Exibir Faixa', 

	array(

		'ajax' => array(

			'type' => 'POST',

			'dataType' => 'json',

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

			'data' => array(

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

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

				),

			'success' => 'function(data) {


				var seriesdisponiveis = $("#series_disponiveis option:selected");

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

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

				var quantidadedisponivel2 = seriesdisponiveis.text();

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


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

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

					return false;

				}    


				/* Verifica o retorno desse condição em JSON usando console.log() ou alert()*/

				//DEBUG:

				//console.log(typeof data.primeira_requisicao_inicial);

				//console.log(typeof data.primeira_requisicao_final);

				// Veja qual o tipo de retorno esta vindo dessas váriavels, se será undefined, null, vazio, e só descomentar as duas linhas acimas

				

				if(isNaN(data.primeira_requisicao_inicial) &&  isNaN(data.primeira_requisicao_final)) {


					var numinicialrequisicao = data.proxima_requisicao_inicial;

					var numfinalrequisicao = data.proxima_requisicao_final;


				} else {


					var numinicialrequisicao = data.primeira_requisicao_inicial;

					var numfinalrequisicao = data.primeira_requisicao_final;


				}


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

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

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

				

				/*

				Esses eram os campos que retornava com valores do seu actionBuscaultimo(), 

				não sei se ira usar na submissão do formulário, por isso acrestentei no HTML

				*/

				$("#primeira_requisicao_inicial").val(seriesdisponiveis.val());

				$("#primeira_requisicao_final").val(seriesdisponiveis.val());

				$("#proxima_requisicao_inicial").val(seriesdisponiveis.val());

				$("#proxima_requisicao_final").val(seriesdisponiveis.val());


			}'


		)

	)

);



Obs.: Os 4 hiddenField() que tinha no seu actionBuscaultimo eu não sabia para qual finalidade ia usar, por isso adicionei os 4 campos direto no HTML, assim depois da requisição ajax, eu populei ele com os valores da consulta.

samjf,

Agora nesse post segue algumas linhas que identifiquei alguns erros, caso queira só corrigir seu código.

actionBuscaultimo():


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

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

No botão ‘Exibir Faixa’, não está enviando nenhum das duas váriaveis, assim pode retornar erro na sua consulta.

Solução

Adiciona:




			'data' => array(

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

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

				),



Debaixo do:




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



Assim você vai está enviando as duas váriaveis.

Os hiddenField:


echo CHtml::HiddenField('primeira_requisicao_inicial', $posts->primeira_requisicao_inicial,  array('readonly' => true, 'size' => 8, 'maxlength' => 8 ), array('size' => 8, 'maxlength' => 8 ), array('id' => 'primeira_requisicao_inicial') );

TODOS eles estão renderizando na sua div id="param_id" class="row"> errado.

O hiddenField() e composto por 3 váriaveis na sua função.


public static string hiddenField(string $name, string $value='', array $htmlOptions=array ( ))

Então seu hiddenField() não estava com a ID correta, com a qual você estipulou ser.

Solução

Remove todos:

array(‘readonly’ => true, ‘size’ => 8, ‘maxlength’=>8), array(‘size’ => 8, ‘maxlength’=>8)

Deixando assim:


echo CHtml::hiddenField('primeira_requisicao_inicial', $posts->primeira_requisicao_inicial,  array('id' => 'primeira_requisicao_inicial') );

echo CHtml::hiddenField('primeira_requisicao_final', $posts->primeira_requisicao_final,  array('id' => 'primeira_requisicao_final') );

echo CHtml::hiddenField('quantidade_disponivel_sem_requisicao', $posts->quantidade_disponivel_sem_requisicao, array('id' => 'quantidade_disponivel_sem_requisicao') );


echo CHtml::hiddenField('Requisicao[proxima_requisicao_inicial]', $posts->proxima_requisicao_inicial, array('id' => 'proxima_requisicao_inicial')) ;

echo CHtml::hiddenField('Requisicao[proxima_requisicao_final]', $posts->proxima_requisicao_final, array('id' => 'proxima_requisicao_final'));

echo CHtml::hiddenField('quantidade_disponivel', $posts->quantidade_disponivel, array('id' => 'quantidade_disponivel') ); 

Acho que com essas correções o código atual já deve funcionar.

Certo, adicionei as correções mencionadas.

Acontece que quando coloco:




  'data' => array(

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

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

                                                    ),




parece que mesmo assim ele não envia os dados para o controller ou da algum erro ( tentei dar um var_dump la dentro e nada). Além disso ele não da o alert que colocamos dentro do parametro ‘success’

mudei o campo 'series_disponiveis para pegar o valor(id) para ser usado na busca (como era anteriormente) e não a opção e também não funcionou:

Segue o código:

_form.php




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

                              'ajax' => array(

                                  'type' => 'POST',

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

                                   'data' => array(

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

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

                                                    ),

                                  'update' => '#param_id',

                                  '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("|");

                    

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


   

  }'

                            

                            )

                        )

                          );




Controller:




 public function actionbuscaultimo()

 {

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

            

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

               

             $posts = 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));

        

                // var_dump($posts);


              $posts->primeira_requisicao_inicial = (int) $posts->primeira_requisicao_inicial;


              $posts->primeira_requisicao_final =  (int) $posts->primeira_requisicao_final;


              $posts->proxima_requisicao_inicial = (int) $posts->proxima_requisicao_inicial;


              $posts->proxima_requisicao_final = (int) $posts->proxima_requisicao_final;


              $posts->quantidade_disponivel = (int) $posts->quantidade_disponivel;


              $posts->quantidade_disponivel_sem_requisicao = (int) $posts->quantidade_disponivel_sem_requisicao;


      

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

                   //echo 'nenhuma requisição';

                   //não existe nenhuma requisição

                   //echo CHtml::label('Faixa Liberada para o Médico', 'primeira_requisicao_inicial');

                   echo CHtml::hiddenField('primeira_requisicao_inicial', $posts->primeira_requisicao_inicial,  array('id' => 'primeira_requisicao_inicial') );

                   echo CHtml::hiddenField('primeira_requisicao_final', $posts->primeira_requisicao_final,  array('id' => 'primeira_requisicao_final') );

                   echo CHtml::hiddenField('quantidade_disponivel_sem_requisicao', $posts->quantidade_disponivel_sem_requisicao, array('id' => 'quantidade_disponivel_sem_requisicao') );

                   echo 'Faixa Calculada!';


               } else {

                 // echo 'próxima requisição';

                  //existe requisicao

                  //echo CHtml::label('Faixa Liberada para o Médico', 'proxima_requisicao_inicial');

                 echo CHtml::hiddenField('Requisicao[proxima_requisicao_inicial]', $posts->proxima_requisicao_inicial, array('id' => 'proxima_requisicao_inicial')) ;

                 echo CHtml::hiddenField('Requisicao[proxima_requisicao_final]', $posts->proxima_requisicao_final, array('id' => 'proxima_requisicao_final'));

                 echo CHtml::hiddenField('quantidade_disponivel', $posts->quantidade_disponivel, array('id' => 'quantidade_disponivel') ); 

                 echo 'Faixa Calculada!';

               }

    

        

               

    }



Me parece que ele nen está indo no controller, será que o parametro ‘data’ funciona com ‘success’?

samjf,

Os que é enviado pelo ‘data’ não é retornado pelo function(data), o que pode está dando errado é o ID dos campos que estã enviando.

Se estiver usando o Firefox, usa sempre o Firebug para debugar, e mais fácil de manipular e te mostra o que deve mostrar.

Essa linha aqui:


'data' => array(

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

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

),

Você precisa pegar os ID (#) correto dos <input>, ele só envia esses dados se esses <input> já tiver no HTML. Se ele não existir o botão não vai enviar dado nenhum mesmo.

O retorno dos dados do actionBuscaultimo() está retornando em HTML, então o retorno deve funcionar normal, por que ele retorna os hiddenField() e adiciona na <div id="param_id">

Eu não sei se o ‘update’ e ‘complete’ funciona de forma sincronizada.

Faz assim, remove o ‘update’, e depois coloca um alert(data) debaixo do function(data) {

Bom dia!

Então cara, parece mesmo que nen o parametro ‘data’, nen o ‘update’ funciona com o ‘success’.

Quando retiro-os consigo manipular os dados do botão com o alert(), pois ainda não estou conseguindo trabalhar com o Firebug. Por mais simples que ele seja.

Más sobre o código coloquei o alert(data), depois da função e ele retornou todos os campos com os dados corretamente:

Se for a próxima requisição:




<input id="proxima_requisicao_inicial" type="hidden" value="5431881" name="Requisicao[proxima_requisicao_inicial]" />

<input id="proxima_requisicao_final" type="hidden" value="5431890" name="Requisicao[proxima_requisicao_final]"/><input id="quantidade_disponivel" type="hidden" value="20" name="quantidade_disponivel" />



Se for a primeira:




<input id="primeira_requisicao_inicial" type="hidden" value="80000001" name="primeira_requisicao_inicial"/><input id="primeira_requisicao_final" type="hidden" value="80000010" name="primeira_requisicao_final" />

<input id="quantidade_disponivel_sem_requisicao" type="hidden" value="9999999" name="quantidade_disponivel_sem_requisicao" />



Aí depois os valores vem como Nan no Javascript e não são calculados.




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



Resultado:

Nan, Nan, 164

Ele não pega os valores dos campos hidden, então não faz o cálculo.

Como o data é um valor só uma String, seria o caso de quebra-la ao invés de pegar através do comando.val?

Só que como faria isso a estrutura é um pouco complexa dessa string.

Valeu.

Esses campos hiddenField() você vai só usa ele para pegar os valores? Ou vai usar para salvar no banco de dados?

Foi o que falei anteriormente, se você não for usar os hiddenField() não precisa enviar eles em HTML, ja pode ser enviado somente os valores em JSON.

Sobre o paramêtro ‘data’ você precisa enviar os valores do <input> verifica o ID dos 2 <inputs>, isso se eles existirem em HTML.

Acredito que não precise dos valores em html, pois depois que busco o próprio Jquery que irá adicionar nos demais campos.

Então talvez o JSON, resolveria mesmo. Poderia me exemplificar o que eu teria que mudar, se possível?

Valeu!