Delirios de un Informático

Code Igniter Reactor 2.0.0 y la línea de comandos

Una de las novedades de Code Igniter 2.0 es la incorporación de compatibilidad para su uso a través de la línea de comandos (antes había que recurrir a chapuzas). Se añade un intérprete que permite llamar a los métodos de los controladores a través de los parámetros de un script. Para eso, hay que definir el siguiente elemento en la configuración:

$config['uri_protocol'] = 'CLI';.

De este modo podremos realizar una llamada del tipo ./cli.php controlador parametro1 parametro2, lo que equivaldría a una dirección web como http://host/controlador/parametro1/parametro2. Mi recomendación es que el script ejecutado sea una copia del index.php en donde se añada la citada configuración (utilizando la nueva variable $assign_to_config), así como un #!/usr/bin/php -q en la primera línea para facilitar la ejecución directa.

Una vez dentro del código puede detectarse si la ejecución se realiza a través de línea de comandos simplemente determinando si se ha definido la constante STDIN, así como con la comprobación del elemento uri_protocol de la configuración de Code Igniter.

Por otro lado, puede ser necesario determinar quién está ejecutando el script para otorgar o no privilegios. Eso puede hacerse gracias a la variable superglobal $_ENV, en donde se define el elemento USERNAME. Por ejemplo, para comprobar si el script se ejecuta con privilegios de administrador (bien siendo root o mediante sudo) basta con el siguiente codigo:

$auth = (getenv('USERNAME') == 'root');

Actualizando a Code Igniter Reactor 2.0.0

Hace poco que se lanzó Code Igniter Reactor 2.0.0 con importantes novedades. Los chicos de EllisLab han publicado un changelog completo pero hay algunos detalles que no han agregado al proceso de migración:

  • Core libraries: si habías extendido las librerías CI_Loader o CI_Output deberás crear una carpeta llamada core y moverlas ahí, ya que en esta nueva versión estas librerías se separan de las librerías estándar
  • Ordenación de resultados en Active Record: se han cargado el método orderby() de Active Record para sustituirlo por order_by(), por lo que habrá que realizar el cambio para que funcionen las consultas (Regexxer es una excelente herramienta para estas tareas)
  • Traducciones: podían haber aprovechado para indicar que se ha creado un repositorio de traducciones de donde se pueden descargar ya

El resto de cambios están documentados y no suponen demasiado problema, por eso me encanta Code Igniter :).

Cómo añadir nuevas reglas de validación en Code Igniter

Code Igniter trae de serie una sencilla pero potente librería para la validación de formularios, con una serie de reglas de validación predefinidas. Es posible añadir nuevas reglas externas a la librería creando nuevos métodos en el controlador, pero si esas reglas han de reutilizarse en más de un controlador el principio DRY no se cumple.

La solución pasa por extender la librería nativa añadiendo nuevos métodos que equilvaldrán a nuevas reglas. Por ejemplo, para poder realizar una comprobación con la nueva regla valid_url se extendería la clase nativa del siguiente modo:

<?php

class MY_Form_validation extends CI_Form_validation
    {
    function valid_url($url)
        {
        return (bool) preg_match('/^http:\/\/', $url);
        }
    }

Después, la comprobación se realizaría así:

$this->form_validation->set_rules('url', 'lang:url_incorrecta', 'valid_url');

En caso de ser necesario, puede utilizarse $ci =& get_instance(); para obtener una instancia del controlador y poder utilizar así otras librerías o modelos que puedan ser necesarios. Por supuesto, este truco también sirve para sustituir las reglas de validación nativas 🙂

Actualización: esto puede resultar particularmente útil para crear una regla que permita comprobar la existencia de un elemento en la base de datos cuando un campo que el usuario debe introducir es UNIQUE.