Instalación básica de Kohana 3

Introducción.

Kohana es un framework de PHP que siempre me ha parecido interesante por su simplicidad y claridad.  Inicialmente se originó como un fork de Codeigniter y posteriormente fue refinándose y alejándose un poco de este.  En lo personal me gusta mas Kohana que CI porque a pesar de ser mas jóven, me parece que han logrado consolidar mejor los recursos y la comunidad de este framework haciendo que se sienta mas sólido y mas robusto, especialmente me parece superior en su mejor orientación a objetos, soporte a PHP5 (la premisa de CI es soportar PHP4 también) y algunos módulos de core (CI tiene versiones análogas como adendos).

Tuve la oportunidad de desarrollar un proyecto con la versión 2.2 con muy buenos resultados.  A mediados del mes pasado se realizó la primera liberación estable de Kohana 3.0 que es la consolidación de la experiencia obtenida durante la serie 2.x y se constituye como una reescritura desde cero del framework.

Aún no estoy del todo seguro si me es conveniente utilizar en este momento esta nueva versión y si por el contrario permanezco con la 2.3.4 y la 2.4 próximamente.  La nueva versión difiere bastante de la existente por lo cual su API no tiene compatibilidad hacía atrás haciendo que los cambios para la actualización sean extensos y probablemente inviables.

De cualquier manera hoy me picó el gusanito de la curiosidad y ya que la documentación no será basada en un Wiki como estabamos acostumbrados sino que se generará de la documentación inline del mismo framework, acabo de instalarlo y de activar el módulo respectivo para consultarla.

La idea es instalar el framework (system/ y modules/) en un directorio por fuera del árbol público (/home/www/kohana/3.0_dev) y sólo instalar en él lo realmente relacionado con la aplicación (/home/www/public/kohana/application).

Procedimiento.

La versión convencional de este procedimiento inicia descargando la versión .ZIP de la distribución desde el repositorio del proyecto, sin embargo como mi interés primordial es el de consultar la documentación, prefiero descargar la versión mas fresca posible y esto se realiza a través del GIT del proyecto.

Descargar la distribución mas reciente de Kohana 3.

$ cd /home/www/public

$ git clone git://github.com/kohana/kohana.git

$ cd kohana

$ git submodule init

$ git submodule update

Ubicación del framework en el directorio no público.

$ mkdir -p /home/www/kohana/3.0_dev

$ mv system/ modules/ /home/www/kohana/3.0_dev

Establecer los permisos requeridos para la aplicación.

$ chmod 777 application/logs/

$ chmod 777 application/cache/

Realizar la configuración general.

$ vi index.php

$application = ‘application’;
$modules     = ‘/home/www/kohana/3.0_dev/modules’;
$system      = ‘/home/www/kohana/3.0_dev/system’;

Realizar la revisión general de requisitos.

Consultar el URL correspondiente a  http://localhost/kohana/index.php.  Si los requisitos se cumplen proceda con el siguiente paso, de lo contrario soluciónelos y vuelva a ejecutar la revisión.

$ rm install.php

Realizar la configuración general (segunda parte).

$ vi application/bootstrap.php

// Establecer la zona horaria por defecto, mas información en http://php.net/timezones.
date_default_timezone_set('America/Bogota');

// Establecer el URL base de la aplicación, por defecto es kohana donde se recupera el GIT.
Kohana::init(array('base_url' => '/kohana/'));

// Activar los módulos necesarios.  userguide es la documentación.
Kohana::modules(array(
 // 'auth'       => MODPATH.'auth',       // Basic authentication
 // 'codebench'  => MODPATH.'codebench',  // Benchmarking tool
 // 'database'   => MODPATH.'database',   // Database access
 // 'image'      => MODPATH.'image',      // Image manipulation
 // 'orm'        => MODPATH.'orm',        // Object Relationship Mapping
 // 'pagination' => MODPATH.'pagination', // Paging of results
    'userguide'  => MODPATH.'userguide',  // User guide and API documentation
 ));

// Establece el estilo de ruta y el controlador/acción por defecto.
Route::set('default', '(<controller>(/<action>(/<id>)))')
  ->defaults(array(
              'controller' => 'main',
              'action'     => 'index',
   ));

Consultar la documentación del framework.

Acceder a la URL correspondiente a la siguiente de acuerdo a las rutas exactas de instalación.

http://localhost/kohana/index.php/guide

Enlaces.

Luchando contra el tipo fecha de SQL Server

Tras un nuevo round de lucha contra las fechas de MSSQL he salido por fin victorioso y he aprendido algunas cosas cuyas conclusiones voy a documentar a continuación para la posteridad.

MSSQL apesta.  Le faltan muchas cosas que acostumbra uno a utilizar con bases de datos mas sencillas como MySQL.  Por ejemplo: cómo hago un ENUM ?  como hago un DATETIME ? como hago …?

La arquitectura de la conexión es un cuento un poco mas largo.  El servidor de base de datos es un Windows XP con un MSSQL 7.0 mientras que el servidor web es un Linux OpenSuse que conecta el PHP5 al motor de base de datos a través de FreeTDS.

Desde hace unos días para acá el formato de fecha se modificó mágicamente, ya no aparecía 13/02/2009 13:13:31 (DMY) sino feb 13 2009 13:13.  Este también fue el primer problema que tuve alguna vez con MSSQL al rededor del 2002.  En esa época lo solucioné con el modificador SET DATEFORMAT, sin embargo esta vez no fue suficiente.

Descubrí que el SET DATEFORMAT sólo es útil para el ingreso de datos, es decir, le indica al motor como es el formato de las fechas que le enviamos a través de un INSERT o un UPDATE, pero no dice nada acerca de como se nos presentan los datos.  Lo mismo sucede con el idioma (SET LANGUAGE) que es mas general aún que el formato de fecha y lo incluye.

Después de muchos experimentos y pruebas encontré que la presentación de las fechas podía ser manipulada desde el servidor Linux, que en este caso actua como cliente de la base de datos mediante la configureción del FreeTDS.

El el archivo /usr/local/freetds/etc/locales.conf es necesario modificar la sección [default] para incluír la siguiente línea especificando el formato de las fechas.

date format = %d/%m/%Y %H:%M:%S

El formato de los campos es el mismo de strftime.  Con el formato propuesto la fecha aparece como DD/MM/AAAA HH:MM:SS utilizando el horario militar.  Es necesario reiniciar Apache para que el cambio sea tomado en cuenta.

$ sudo service apache2 restart

Como mencioné anteriormente, la modificación del DATEFORMAT o en su defecto del LANGUAGE, nos permiten garantizar que la aplicación reciba correctamente los datos tipos fecha de manera independiente a como fue instalado el MSSQL o se haya realizado la configuración regional del servidor.  Para esto terminé agregando las siguientes líneas al constructor de la superclase de los controladores de Kohana, es decir, en un sitio donde se pueda garantizar que siempre se ejecuta antes que cualquier otro código del sistema suceptible de acceder a la base de datos.

$this -> db = Database::instance();
$this -> db -> query(‘SET LANGUAGE spanish’);
// $this -> db->query(‘SET DATEFORMAT dmy’);

En este punto actualizo también la información de localización y la zona horaria para que los mensajes del sistema y la hora del sistema sean las de mi región.  Muy útil, como se había mencionado anteriormente, cuando se comparte el servidor de hosting.

setlocale(LC_ALL, “es_CO”);
putenv(“TZ=America/Bogota”);

Transacciones de base de datos con Kohana

Aparentemente la versión actual de Kohana (2.2) aún no cuenta con soporte para transacciones en su clase Database.

Buscando entre los foros encontré una solución sencilla, rápida y elegante, sin embargo me preocupa que, a pesar de que utiliza la sintaxis de CodeIgniter, no vaya a ser compatible con la siguiente liberación de Kohana de la cual no encontré documentación.

Así que por ahora voy a establecer las transacciones de manera manual y -espero- compatible con las bases de datos y futuras liberaciones de Kohana.

Iniciar la transacción.

$this -> db -> query('SET AUTOCOMMIT=0');
$this -> db -> query('BEGIN');

Aceptar/ejecutar la transacción.

$this -> db -> query('COMMIT');
$this -> db -> query('SET AUTOCOMMIT=1');

Cancelar/devolver la transacción.

$this -> db -> query('ROLLBACK');
$this -> db -> query('SET AUTOCOMMIT=1');

Nota: para Microsoft SQL Server los comandos deberán ser BEGIN TRANSACTION, COMMIT TRANSACTION y ROLLBACK TRANSACTION. Las modificaciones al AUTOCOMMIT no son válidas para este motor de base de datos.

Enlaces: