Archive for 30 agosto 2007

interface: widgets para jQuery

agosto 30, 2007

Estoy haciendo un sitio institucional estático para un vivero, muy básico. Puro HTML y trabajo en javascript.

La diseñadora gráfica armó un esquema muy lindo, aunque que muy “à la Flash”. Así que estoy haciendo magia con CSS y javascript para que quede lindo como en el bosquejo que me mandaron.

El problema era un ScrollBar no estándar muy bonito que por más que se presione al CSS, se ponía poco menos que imposible.

Había que apelar a algún widget en javascript y encontré el Slider de la biblioteca Interface para jQuery.

La única observación es que no funciona en Internet Explorer con jQuery 1.1.3 o 1.1.4, pero funciona de pelos con jQuery 1.1.2 que es la que podés descargar del sitio de Interface.

El problema era que en total toda la biblioteca pesa 80KB + 21KB de jQuery es pesadito. Interface también ofrece una solución para esto: se puede seleccionar los widgets que queremos y nos genera la biblioteca con lo que usás y nada más. Para el Slider necesitaba Drag&Drop y el propio Slider, peso del interface personalizado: 24KB + 21KB de jQuery.

Con eso conseguí el bloquecito de texto, y me quedó bastante bien el layout.

¡Hasta la próxima!

JsCalendar Helper para CakePHP

agosto 26, 2007

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.

Problema con acentos, ñs y CakePHP

agosto 17, 2007

Haciendo pruebas con una aplicación que tengo para proyectos, encontré que cuando cargo acentos, ñs u otros caracteres latinos CakePHP me cortaba las cadenas a partir de la primer ocurrencia del caracter “malo”.

¡Oh no! ¡Problemas de charset! Como estoy con la versión 1.1.16.x no tengo soporte de internacionalización, ni nada.

Googlear fue inútil. No encontré nada. La cuestión es que me fije la codificación del navegador y era la fatídica “Europa Occidental (Windows)”.

CakePHP usa utf-8 para comunicarse con la base de datos. A su vez presupone que se le pasan datos utf-8. Cuando el navegador mandaba los datos los mandaba en latin-1, CakePHP los procesaba como si fueran utf-8 y ahí venía el problema.

Esto pasa porque el servidor está andando sobre Windows y por defecto envía las páginas como iso-8859-1. Basta con corregir esto para que vuelva a funcionar.

¿Cómo eludir el problema sin tener que modificar el código del núcleo ni la configuración del servidor (recordar que esto no siempre está al alcance de uno)?

Agregando en el <head> de la aplicación (dir_aplicacion)/views/layouts/defaults.thtml el siguiente tag:

<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />

Con eso se arregló y ya tengo mis acentos!

Saludos, y hasta la próxima.

PHP 4 se discontinúa

agosto 5, 2007

Según el sitio de PHP la versión 4 se discontinúa a fin de año, después de más de 7 años de buen y leal servicio. Se seguirán haciendo fixes críticos hasta el 08/08/08.

Para empezar a ponerse en tema acá hay una guía de migración a la versión 5.

Por lo que pude ver de la versión 5, además del modelo de objetos mejorado, la inclusión de iteradores, SQLite, manejo de excepciones, trae mejoras en las funciones del tratamiento de strings y unicode. Si bien esto no se anuncia con bombos y platillos, es muy util para nosotros, que estamos fuera del charset ASCII.

Las aplicaciones que se ven más afectadas son aquellas que hacen uso del -tan vapuleado- modelo de objetos de PHP4. La ventaja es que el modelo actual es muy parecido al de java, permitiendonos aprovechar nuestra experiencia en el lenguaje de Sun. Sin embargo hay una directiva para mantener la compatibilidad con el modelo anterior.

Así las cosas, habrá que ponerse a actualizar y revisar lo programados.

Saludos!

Instalando CakePHP en public_html

agosto 3, 2007

Bueno, estoy haciendo una aplicación en CakePHP y quiero subirla a un sitio que tengo hosteado en Allytech. Como estoy teniendo problemas de configuración con ese servidor (¡no puedo acceder por SSH!) tuve que hacer mil piruetas (un script que hace el tar xvzf del archivo, después moverlos mediante el soft de control) hasta tener un orden de carpetas:

/
   /miapp               -> aplicación cake
   /cake                -> distribución cake
   /public_html         -> raíz del sitio

Según la documentación de CakePHP debía hacer los siguientes cambios en la versión 1.1.16.5421 (cambiando las cosas para mi estructura de carpetas):

//archivo: public_html/misitio/index.php
if (!defined('ROOT'))
{
define('ROOT', DS.'www'.DS.'doc'.DS.'miweb.com.ar');
}

if (!defined('APP_DIR'))
{
define ('APP_DIR', 'miapp');
}

if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
define('CAKE_CORE_INCLUDE_PATH',
DS.'www'.DS.'doc'.DS.'miweb.com.ar'.DS.'cake');
}

Esto funcionaba, pero me mostraba un warning:

Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. File(/www/docs/miweb.com.ar/lib//cake/libs/view/templates/errors/home.thtml) is not within the allowed path(s): (/www/docs/miweb.com.ar/) in /www/docs/miweb.com.ar/cake/cake/basics.php on line 1077

¡Me quiero volver chango!

Busqué en google y por errores similares recomendaban apagar los warning. Lujo que no me podía dar porque estaba en desarrollo.

El problema surgía de buscar en el directorio /www/docs/miweb.com.ar/lib/, que era el ‘include_path’ configurado por el hosting. Entonces me dije, saquemos eso y veamos qué pasa. ¡El warning desapareció!

Pero había que tocar el código, cosa que me parecía monstruosa. Además, ¿qué pasaba si yo usaba ese directorio para guardar bibliotecas de mi sitio?

Lo volví a poner, pero en otro orden. De vuelta el warning.

Me puse a hacer otra cosa y se me pasó el día. Después de unas horas vuelvo. Esta vez pruebo crear un directorio /www/docs/miweb.com.ar/lib/. ¡El warning ya no está más!

La moraleja es que si estamos instalando CakePHP y en “include_path” tenemos una ruta que no existe(en este caso la referenciamos “gracias” al hosting) mejor que la volemos porque vamos a tener ese bonito warning. Y si no la podemos volar, ya que yo no tengo acceso al php.ini, creemos el directorio y todos contentos.

Curioso lo sensible que se puede poner esto. Ahora voy a seguir con mi pequeña aplicación.

Gracias, vuelvan prontos