JsCalendar Helper para CakePHP

Necesitaba incluir el JsCalendar y me puse a buscar si estaba implementado el Helper, pero no. Lo más parecido era un controlador que se puede ver en este link.

No está nada mal, pero me resultaba un poco molesto tener que usarlo como controlador. Además el propio Pierpaolo invita a que lo mejoremos.

Yo decidí encararlo como Helper y que a la hora de imprimir el calendario en la vista sea lo más general posible.

El primer problema que se me presentó fue el de incluir los archivos .js y .css. Como estoy trabajando con 1.1.16.5421 necesitaba incluirlos en el layout. Googleando encontré que alguien ya había hecho algo para resolver este problema aquí. Hay que tocar el layout pero esto provee un Helper bastante bonito para lo que necesitaba.

Resuelto esto ya podía armar el Helper.

Tomé la clase PHP que viene con la distribución del JsCalendar. adapté el constructor al esquema de CakePHP. Desde el constructor se selecciona el look, el idioma, el directorio relativo a js, css e img de CakePHP. A su vez se setean otras opciones por defecto. Además tuve que agregar dos parámetros. Uno ‘align’=>”, porque con MSIE salía por cualquier lado. El otro es ‘width’=>’240px’ porque el ancho iba hasta el borde derecho de la pantalla.

El método de carga de los scripts fue modificado para trabajar con HeadHelper.

Por último modifiqué “make_input_field” para que funcione con un input, una image y un link del HtmlHelper. También valida que no se haya invocado el método de carga mediante una variable de instancia. Con eso ya tenía el calendario funcionando como un helper.

¿Cómo lo uso? Cargo el helper en el controlador con la variable $helpers.

<?php
echo $jsCalendar->make_input_field( 'Proyecto/inicio', #tagName del input
array(), #opciones del calendario(*)
array(
'name'=>'data[Proyecto][inicio]', #campo
'value'=>$html->tagValue('Proyecto/inicio' ) #valor inicial
); ?>

(*) se puede ver la documentación del jsCalendar.

No hace falta usar tantas líneas, la idea es usarlo como cualquier otro widget de Html.

Los scripts js del calendario se deben poner en webroot/js/calendar/. Los css en webroot/css/calendar/ y las imágenes en webroot/img/calendar/. En caso de usar Skins deben estar los archivos distribuidos en los directorios de los css y las imágenes.

Se puede descargar el helper con el esquema de directorios.

Bueno, espero que sea útil como me resultó a mí y si quieren mejorarlo, bienvenidos sean.

Etiquetas: , , , ,

30 comentarios to “JsCalendar Helper para CakePHP”

  1. German Says:

    Lo instalé, pero no me crea el helper dentro de la vista.
    Saben de alguna solución?

  2. German Says:

    Error mío. Intentaba usar JsCalendar en vez de jsCalendar. Sorry.

  3. Miguel Carboni Says:

    Menos mal, a mí también me pasó alguna vez.
    Cualquier duda o idea para mejorarlo, bienvenido sea!

  4. Carlos Says:

    Tengo un incoveniente, lo único que veo es una pequeña imagen “img.gif”. Pero no paso de ahi. Cuando quiero hacer click me aparece en la url el /controlador/evento”#”. Espero haber sido claro

  5. Miguel Carboni Says:

    Carlos:
    ¿podés pasar el código donde invocás el helper?

  6. Carlos Says:

    make_input_field( ‘Cursada/fecha_inicio’, array(), array(‘name’=>’data[Cursada][fecha_inicio]’, ‘value’=>$html->tagValue(‘Cursada/fecha_inicio’ ) );
    ?>

    Fecha Final:
    input(‘Cursada/fecha_final’, array(‘size’ => ‘100’))?>

  7. Carlos Says:

    Al codigo anterior le esta faltando un parentesis, pero igual sigue sin andar.

  8. Miguel Carboni Says:

    Bien. Dos preguntas más:
    – ¿qué versión de CakePHP tenés?
    – ¿Reporta algún error de javascript? ¿Se cargan los archivos .js? Eso lo ves en el código de la página.

  9. Carlos Says:

    La version es : 1.1.17.5612

    Ese talvez sea el problema, no he puesto en el layout para que se carguen los archivos .js. Mi pregunta es que debo poner alli ?, si me podrias escribir que debo agregar te lo agradeceria.

    Desde ya gracias, por tus repuestas.

  10. Miguel Carboni Says:

    Sí, me parece que ese es el problema. El calendario está hecho en javascript. Si no tiene cargado los archivos con el código .js no anda.

    En el layout defualt.thtml (ruta /app/views/layouts/ dentro de la etiqueta <head> del html tenés que agregar, antes de la de cierre:

    <? if (isset($head)) echo $head->print_registered(); ?>

    Lo que hace esto es cargar los archivos de javascript necesarios para que el calendario funcione. También te permite usar de manera completa el Helper para cargar .js, css, etc.

    Podés leer en link del que hizo el helper de carga de archivos para el Header: http://rossoft.wordpress.com/2006/03/28/register-head-tags-from-helpers-2/

    Esto en realidad es para CakePHP 1.1.x.x. Cuando salga la versión estable de 1.2.x.x planeo portar el helper(y mis cosas jeje). Se supone que en CakePHP 1.2.x.x ya no haría falta el helper para registrar tags en head.

    De nada, gracias a vos por probarlo.

  11. Carlos Says:

    Gracias Miguel, ha funcionado!!. Cuanta conmigo para seguir mejorando a todo lo que respecta a CakePHP, ya que me he comenzado a obtener buenos resultados con la herramienta.

    Saludos, Carlos.

  12. Alvaro Says:

    echo $head->print_registered(); no me produce ninguna salida😦

  13. Alvaro Says:

    Lo que sucede es que no puedo utilizarlo desde un Element, al
    parecer el head del layout se procesa antes de que el helper entre
    en acción.

    Saludos
    Alvaro

  14. Miguel Carboni Says:

    Álvaro:
    Disculpá la tardanza pero estoy medio ocupado últimamente. Decime donde colocaste el print_registered.
    ¿En el archivo views/layouts/nombre_layout.html colocaste el
    echo $head->print_registered();?

  15. Efrain Says:

    Me da este error y no se como cogerlo:
    Fatal error: Cannot redeclare JsCalendarHelper::$calendar_lib_path in C:\wamp\www\SistemaGobierno\app\views\helpers\js_calendar.php on line 22
    gracias por la ayuda.

  16. Efrain Says:

    disculpa era que no habia leido bien……

  17. Mayor Says:

    Me da el mismo error a que a Efrain, pero no encuentro la causa. A que se puede deber?

  18. Miguel Carboni Says:

    Mayor:
    Lo que está pasando ahí es que se está cargando dos veces la definición.
    ¿cómo declarás y donde invocás el helper?

  19. Mayor Says:

    Muchas gracias por contestar.

    Veras, en primer lugar he descomprimido el zip en el directorio de trabajo, poniendo cada fichero en su directorio correspondiente. Depues, en el layout default (views/layouts) he puesto:

    print_registered(); ?>

    Y por ultimo, en el controlador he puesto:

    var $helpers=array(‘Html’, ‘JsCalendar’);
    (si no pongo esto ultimo me da otro error: Undefined variable jsCalendar)

    A la hora de usarlo, en la vista pongo:

    echo $jsCalendar->make_input_field(‘Usuario/fecha_nac’,
    array(),
    array(
    ‘name’=>’data[Usuario][fecha_nac]’,
    ‘value’=>$html->tagValue(‘Usuario/fecha_nac’)));

  20. Luis Says:

    Si revisan el JsCalendarHelper veran que la variable $calendar_lib_path esta reptida dos veces, solo eliminen una de ellas.

  21. Mayor Says:

    Cierto, era eso. Muchas gracias Luis, ahora si me funciona.

  22. Miguel Carboni Says:

    ¡Muchas gracias, Luis! Esto es lo que me gusta del open source y de publicar. Uno arma algo que es de todos y entre todos lo hacemos funcionar.
    Suerte Mayor, gracias Luis.

  23. Mariano Says:

    Hola!, les comento lo que hice para ver si pueden ayudarme con el siguiente problemita.

    Primero descomprimi todo tal cual va, puse en una vista la siguiente linea.

    make_input_field(‘Users/created’,array(),array(‘name’=>’data[Users][created]’,’value’=>$html->tagValue(‘Users/created’))); ?>

    Esta linea la puse en el index de Users (created, es la fecha de creación del usuario en la db).

    Saque el $calendar_lib_path que esta repetido.

    me da el siguiente error, me muestra un textbox vacío y la imagen del calendario chiquitita y el linck es (/Users#)

    Method input() is deprecated in HtmlHelper: see FormHelper::input or FormHelper::text [CORE\cake\libs\view\helpers\html.php, line 759
    Method tagValue() is deprecated in HtmlHelper: see Helper::value [CORE\cake\libs\view\helpers\html.php, line 780

    Estoy usando la ver. 1.2.0.7125 RC1

    Al margen de este error creo que no estoy poniendo vien la fecha..

    Lo que necesito es que muestre el calendario con la fecha de hoy.. así de simple..

    Bueno espero una manito!..
    si quieren me encuentran en gmail, en el chat.

    chapperon@gmail.com

    Saludos!

    y Gracias!

  24. Mariano Says:

    Aclaracíon!, en el mensaje anterior escribi “vien”, realmente le chingue al tipear!..

    Bien🙂

    Abrazo;)

  25. Pablo Ramírez Says:

    Muchachos, me extraña que a ninguno de ustedes les haya pasado, pero no me funcionaba (me salia un calendario feo mas un error de javascript indicando un archivo css que no viene dentro del paquete) y despues de cabezear un buen rato llegue a que el problema era la linea 36 del helper js_calendar.php:

    $theme = ‘skins/aqua/theme’,

    la solucion consta de cambiar ese path por el nombre del archivo css que quieres usar como theme y que se encuentran en el directorio css/calendar.

    Saludos!!

  26. Pablo Ramírez Says:

    PROBLEMON!!!! … alguien a intentado incluir este datepicker en una cuadro ajax, es decir desde la vista principal usar un $ajax->link y en el metodo del controlador usar $this->layout = ‘ajax’, y en la vista *thtm que hace el render usar el helper propuesto. NOO FUNCIONAA!!! 😦

    ¿Alguien sabe como podria solucionar esto?

    Saludos!

  27. yoxs Says:

    hola soy principiante, y necesito poner un codigo javascript para actualizar la pagina automaticamente, tengo el codigo pero como exactemente lo incluyo en cakephp?

    gracias

    • Miguel Says:

      ¿qué versión estás usando?

      Si es la 1.2, en la cabecera del archivo layout tenés que tener la variable $scripts_for_layout.



      Y en algún lado de la vista:
      echo $javascript->link('some_file_without_extension', false);

      Con eso estaría bien.

  28. yoxs Says:

    hola de nuevo ya lo solucione, ahora queria ayuda para hacer una de banners que muestren el codigo html y como es el codigo que va par que los demas lo copien.

  29. yoxs Says:

    hola de nuevo ya lo solucione, ahora queria ayuda para hacer una de banners que muestren el codigo html y como es el codigo para que los demas lo copien.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: