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.

24 comentarios para “JsCalendar Helper para CakePHP”

  1. German Dice:

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

  2. German Dice:

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

  3. Miguel Carboni Dice:

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

  4. Carlos Dice:

    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 Dice:

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

  6. Carlos Dice:

    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 Dice:

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

  8. Miguel Carboni Dice:

    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 Dice:

    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 Dice:

    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 Dice:

    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 Dice:

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

  13. Alvaro Dice:

    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 Dice:

    Á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 Dice:

    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 Dice:

    disculpa era que no habia leido bien……

  17. Mayor Dice:

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

  18. Miguel Carboni Dice:

    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 Dice:

    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 Dice:

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

  21. Mayor Dice:

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

  22. Miguel Carboni Dice:

    ¡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 Dice:

    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 Dice:

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

    Bien :)

    Abrazo ;)

Escribe un comentario