Problema con CJuiDatePicker en CJuiDialog

Hola foro,

Tengo un formulario con un campo de fecha que se llena con CJuiDatePicker, el calendario sale a un lado del campo al poner el cursor sobre el, esto funciona bien si muestro el formulario en el navegador pero quiero que estos datos se llene desde un dialogo con CJuiDialog pero al mostrar el formulario en el dialogo ya no sale el calendario, adjunto imagen.

Por que pasa esto ?, se puede solucionar ?

Gracias.

El código del campo en el formulario es este:




<div class="row">

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

   <?php 

      //echo $form->textField($model,'date'); 

      $this->widget('zii.widgets.jui.CJuiDatePicker',

         array(

            'model'=>'$model',

            'name'=>'Exchange[date]',

            'value'=>$model->date,

            'htmlOptions'=>array('size'=>10, 'style'=>'width:120px !important'),

               'options'=>array(

               'dateFormat'=>Yii::t('app', 'm/d/y'),

               'showButtonPanel'=>true,

               'changeMonth'=>true,                                      

               'changeYear'=>true,

               'closeText'=>'Done',

               'currentText'=>'Today',				 				 

            ),

         )

      );

   ?>

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

</div>



Gracias.

Una pregunta… el contenido del CJuiDialog se llama via ajax o es contenido que ya se encuentra en la pagina (inline) ??

Hola Jack,

En protected/project/admin.php tengo esto:




<!-- Crear modelo con un dialog de JQuery -->

<?php

$this->beginWidget('zii.widgets.jui.CJuiDialog', array( // the dialog

    'id'=>'dialogProject',

    'options'=>array(

        'title'=>Yii::t('default', '').' '.Yii::t('default', 'Project'),

        'autoOpen'=>false,

        'modal'=>true,

        'width'=>680,

        'height'=>400,

    ),

));?>

<div class="divForForm"></div>



Tengo un botón que llama un <script> de esta forma en onclick:




"{addProject(); $('#dialogProject').dialog('open');}"



Este es el <script> que está al final de admin.php:




	// genera el dialogo para agregar un nuevo modelo

	function addProject()

	{

    	<?php echo CHtml::ajax(array(

            'url'=>array('create'),

            'data'=> "js:$(this).serialize()",

            'type'=>'post',

            'dataType'=>'json',

            'success'=>"function(data)

            {

                if (data.status == 'failure')

                {

                    $('#dialogProject div.divForForm').html(data.div);

                    $('#dialogPrime div.divForForm form').submit(addProject);

                }

                else

                {

                    //$('#dialogProject div.divForForm').html(data.div);

		    $.fn.yiiGridView.update('project-grid');

                    //setTimeout(\"$('#dialogProject').dialog('close') \",3000);

                    $('#dialogProject').dialog('close');

                }

 

            } ",

            ))?>;

    	return false; 

 

	}



Me baso en ejemplos que vi por aquí en el foro.

Gracias por tu ayuda y disculpa la demora en contestar.

Saludos.

Haces get via ajax para llamar a la pagina create… Creo que el problema de que no puedas ejecutar el codigo que se retorna de la llamada via ajax es eso… el dataType… Entonces para arreglarlo debes de cambiar ‘dataType’=>‘json’ por ‘dataType’=>‘html’

Si eso no te llegase a funcionar creo que tendrías que ser un poco mas claro con el codigo y escribir explicitamente que quieres que se ejecute cualquier script que se haya retornado en la respuesta… esto lo haces de la siguiente manera:


success: function(data) {

   $('#dialogProject div.divForForm').html(data.div);

   $("#dialogProject div.divForForm").find("script").each(function(i) {

      eval($(this).text());

   });

}

Espero esto te aclaro un poco el porque del error.

Cambie en el script:




	// genera el dialogo para agregar un nuevo modelo

	function addProject()

	{

    	<?php echo CHtml::ajax(array(

            'url'=>array('create'),

            'data'=> "js:$(this).serialize()",

            'type'=>'post',


            'dataType'=>'html',   // <<------- json por html


            'success'=>"function(data)

            {

                if (data.status == 'failure')

                {

                    $('#dialogProject div.divForForm').html(data.div);




                    $('#dialogProject div.divForForm').find('script').each(function(i) {  // <<------ explicito

      					eval($(this).text());

      				});




                    // Here is the trick: on submit-> once again this function!

                    $('#dialogPrime div.divForForm form').submit(addProject);

                }

                else

                {

                    //$('#dialogProject div.divForForm').html(data.div);

		    		$.fn.yiiGridView.update('project-grid');

                    //setTimeout(\"$('#dialogProject').dialog('close') \",3000);

                    $('#dialogProject').dialog('close');

                }

 

            } ",

            ))?>;

    	return false; 

 

	}



Si cambio sólo a html el dialog solo hace un parpadeo y desaparece sin dejarme hacer nada (pantallaso), lo regreso a json y agrego el ‘código explicito’ pero funciona igual, no me muestra el calendario.

Lo estoy poniendo en mal lugar ?

La verdad no entiendo por que el error, tendré que estudiar las diferencias.

Gracias por tu tiempo.

Saludos.

Una pregunta…

Porque quieres retornr html en un objeto json ??

Bueno, viendo el porque no funciona el calendario cuando se llama desde una ventana modal … encuentro que no lo hace porque no se cargan las librerias de jquer y jqueri.ui

Entonces hay una forma algo fea de hacer que funcione bien… y es la siguiente


'success'=>"function(data)

{

    $('#dialogProject div.divForForm').html(data.div);

    jQuery('#publishDate').datepicker({'showAnim':'fold'});

    $('#dialogProject').dialog('open');

}",

Esto esta probado, deberia de funcionarte igual de bien a ti…

Pero esto dónde lo pongo, disculpame pero soy nuevo, se que no tiene mucho que ver con Yii, no entiendo bien lo que pasa y no pasa o como debe pasar.

Gracias.

Por ahi tienes en CHtml::ajax(array(… tienes el ‘success’=> entonces solo intenta ajustar el codig… te digo, hice la prueba y en efecto no funcionaba al inicio… pero luego de un rato se me ocurrio lo que te envie.

Tambien deberias de hecharle un ojo a jQuery.ajax … porque el metodo ajax de la clase CHtml es un wrapper de esa libreria original…