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.
Septiembre 21, 2007 a las 5:32 pm
Lo instalé, pero no me crea el helper dentro de la vista.
Saben de alguna solución?
Septiembre 21, 2007 a las 5:48 pm
Error mío. Intentaba usar JsCalendar en vez de jsCalendar. Sorry.
Septiembre 21, 2007 a las 5:53 pm
Menos mal, a mí también me pasó alguna vez.
Cualquier duda o idea para mejorarlo, bienvenido sea!
Octubre 9, 2007 a las 6:38 pm
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
Octubre 9, 2007 a las 9:43 pm
Carlos:
¿podés pasar el código donde invocás el helper?
Octubre 11, 2007 a las 4:43 pm
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′))?>
Octubre 11, 2007 a las 4:47 pm
Al codigo anterior le esta faltando un parentesis, pero igual sigue sin andar.
Octubre 12, 2007 a las 12:30 am
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.
Octubre 12, 2007 a las 2:21 pm
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.
Octubre 12, 2007 a las 4:40 pm
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.
Octubre 16, 2007 a las 4:11 pm
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.
Octubre 22, 2007 a las 2:38 pm
echo $head->print_registered(); no me produce ninguna salida
Octubre 22, 2007 a las 3:16 pm
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
Octubre 26, 2007 a las 12:08 pm
Á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();?
Noviembre 20, 2007 a las 2:22 pm
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.
Noviembre 20, 2007 a las 2:24 pm
disculpa era que no habia leido bien……
Diciembre 13, 2007 a las 6:35 am
Me da el mismo error a que a Efrain, pero no encuentro la causa. A que se puede deber?
Diciembre 13, 2007 a las 8:16 am
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?
Diciembre 14, 2007 a las 6:19 am
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’)));
Diciembre 21, 2007 a las 1:23 am
Si revisan el JsCalendarHelper veran que la variable $calendar_lib_path esta reptida dos veces, solo eliminen una de ellas.
Diciembre 22, 2007 a las 7:31 am
Cierto, era eso. Muchas gracias Luis, ahora si me funciona.
Diciembre 22, 2007 a las 11:34 am
¡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.
Junio 10, 2008 a las 3:51 pm
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!
Junio 10, 2008 a las 3:52 pm
Aclaracíon!, en el mensaje anterior escribi “vien”, realmente le chingue al tipear!..
Bien
Abrazo