Juan Rabadan

13Sep/111

Autocomplete for CodeIgniter 2.x en NetBeans

Para los que trabajamos con NetBeans y Codeigniter esta función es la solución al problema de Autocomple del código.

Al ejecutarla, nos descargamos un archivo autocomplete.php que debemos incluir dentro de nuestro proyecto.
Despues de hacer esto,  hacemos un restart de NetBeans (cerrarlo y volverlo a abrir) y ya tenemos el autocompleter funcionando para todas nuestras librerias, modelos y CodeIgniter Base Classes

function generate_nb_autocompletion($with_declared_classes = FALSE) {

$CI = & get_instance();

$CI->load->helper("file");
$CI->load->helper("download");

$classes = array();
if ((bool) $with_declared_classes === TRUE) {
$declared = get_declared_classes();

foreach ($declared as $class) {
if (strpos($class, "CI_") === 0) {
$classes[str_replace("CI_", FALSE, $class)] = $class;
}
}
}

$libs = get_filenames(APPPATH . "libraries/", FALSE, TRUE);
foreach ($libs as $file) {
$file = str_replace(".php", FALSE, $file);
$classes[str_replace("MY_", FALSE, $file)] = $file;
}

$core_libs = get_filenames(APPPATH . "core/", FALSE, TRUE);
foreach ($core_libs as $file) {
$file = str_replace(".php", FALSE, $file);
$classes[str_replace("MY_", FALSE, $file)] = $file;
}

$files = get_filenames(APPPATH . "models/", FALSE, TRUE);
foreach ($files as $file) {
$file = str_replace(".php", FALSE, $file);
$classes[str_replace("MY_", FALSE, $file)] = $file;
}

$class_property = " /**\n";
$class_property.= "  *\n";
foreach ($classes as $key => $value) {
$class_property.= "  * @property {$key} \${$value}\n";
}
$class_property.= "  */\n";

$declaration = $class_property . "Class CI_Model{}\n";
$declaration .= $class_property . "Class CI_Controller{}\n";

foreach ($libs as $file) {
$lib = str_replace(".php", FALSE, str_replace("MY_", FALSE, $file));
$declaration .= $class_property . "Class {$lib}{}\n";
}

foreach ($core_libs as $file) {
$lib = str_replace(".php", FALSE, str_replace("MY_", FALSE, $file));
$declaration .= $class_property . "Class {$lib}{}\n";
}

force_download("autocomplete.php", "<?php \n{$declaration}\n?>");
}

Saludos,

12Sep/110

SEO: Redirigir trafico no-www al dominio www

Si queremos redirigir todo el tráfico no-www de nuestro sitio a nuestro dominio principal con www tenemos que escribir en el archivo .htaccess las siguientes lineas

# Redirect non-www traffic to www

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^juanrabadan.com.ar [NC]
RewriteRule ^(.*)$ http://www.juanrabadan.com.ar/$1 [L,R=301]

5May/104

Funciones para extender el date helper en CodeIgniter

Hola a todos quiero compartir con ustedes estas funciones que utilizo a diario en mis proyectos de CodeIgniter. Las mismas están referidas a la manipulación de fechas y es muy buena idea extender el date helper de codeigniter con las mismas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* Agregar a una fecha dias, meses o años */
function date_add($givendate,$day=0,$mth=0,$yr=0)
{
    $cd = strtotime($givendate);
    return date('Y-m-d', mktime(date('h',$cd), date('i',$cd), date('s',$cd), date('m',$cd)+$mth,  date('d',$cd)+$day, date('Y',$cd)+$yr));
}
 
/* calcular la diferencia entre dos fechas */
function date_diff($start_date,$end_date,$format = 'd')
{
    $start_date = strtotime($start_date);
    $end_date = strtotime($end_date);
 
    switch ($format)
    {
       //seconds
       case "s":
           return floor(($end_date-$start_date));
       //minutes
       case "i":
            return floor(($end_date-$start_date)/60);
       //hours
       case "h":
            return floor(($end_date-$start_date)/3600);
       //days
       case "d":
            return floor(($end_date-$start_date)/86400);
       //months
       case "m":
            return floor(($end_date-$start_date)/2628000);
       //years
       case "y":
            return floor(($end_date-$start_date)/31536000);
       //days
       default:
            return floor(($end_date-$start_date)/86400);
       }
}
 
/* conocer la hora exacta de un determinado timezone */
function get_date($timezone = 'America/New_York', $full_date_time = false)
{
      date_default_timezone_set($timezone);
      $date = ($full_date_time) ? date('D,F j, Y, h:i:s A') : date('Y-m-d');
      date_default_timezone_set('UTC');
      return $date;
}
18Mar/100

Que son los hooks en CodeIgniter

Los hooks o ganchos que vienen con CodeIgniter nos permiten pinchar el framework sin la necesidad de hackear los archivos del core. Cuando CodeIgniter se inicia se ejecutan una serie de procesos, cuyo diagrama puede verse en el siguiente gráfico del flujo de la aplicación.

Flujo de la aplicación :: CodeIgniter

Algunas veces precisamos ejecutar ciertos procedimientos en determinados momentos del flujo de una aplicación. Por ejemplo queremos ejecutar un determinado script antes de que se cargue el controlador o justo despues.

Por suerte CodeIgniter nos trae de la mano una buena herramienta llamada ‘Hooks’ o ganchos, que simplemente nos permite hacer esto, ejecutar determinadas funciones en un determinado momento.

El “determinado momento”, básicamente puede ser:

  • pre_system: al principio de la ejecución del sistema, sin haber cargado básicamente nada.
  • pre_controller: ejecutar antes de cargar el controlador, una vez cargadas las librerías y todo el systema básico.
  • post_controller_constructor: justo se ejecutar tras el constructor del controlador pero antes de cualquier función.
  • post_controller: se ejecutará una vez lo haya hecho el controlador.
  • display_override: esto es para sobrescribir la función que nos muestra la pagina finalizada en el navegador.
  • cache_override: lo mismo pero para la función de cache, nos permite sobreescrivirla.
  • scaffolding_override: para crear nuestro propio scaffolding.
  • post_system: ejecutará el código al final de todos los procedimientos.

Prometo venir con un ejemplo en breve de como utilizar hooks.

Saludos a todos mis lectores.

12Mar/103

Funciones para incluir en nuestros helpers de codeigniter

Estimados usuarios, hace un par de meses que estoy investigando y desarrollando una aplicación con CodeIgniter. En esta oportunidad quiero compartir con ustedes algunas funciones muy útiles para incluir en nuestros helpers o plugins.

Object2Array

Con esta funcion podremos pasar un objeto a un array de tipo asociativo.

function object2array($object)
{
    if (is_object($object))
    {
        foreach ($object as $key => $value)
        {
            $array[$key] = $value;
        }
    }
    else
    {
        $array = $object;
    }
    return $array;
}

Array2Object

Esta función es la inversa de la anterior. Nos permite convertir un array asociativo en un objeto con propiedades.

function array2object($array) 
{
	if (is_array($array))
	{
		$obj = new StdClass();
		foreach ($array as $key => $val)
		{
			$obj->$key = $val;
		}
	}
	else 
	{ 
		$obj = $array; 
	}
	return $obj;
}

Normalizar un String
Una función esencial para los desarrolladores web. Para mejorar la visibilidad de nuestro sitio en los motores de búsqueda, se utiliza la reescritura de URL. Lo que permite que las URL sean más ricas a nivel de SEO. Con este propósito siempre es bueno tener una función para normalizar strings para que contengan caracteres válidos para nuestras url. Con esta función, aporte de mi amigo Angel, resuelves este problema.

function normalize($text, $separator = "-")
{
    $isUTF8 = (mb_detect_encoding($text." ",'UTF-8,ISO-8859-1') == 'UTF-8');
 
    $text = ($isUTF8) ? utf8_decode($text) : $text;
    $text = trim($text);
 
    $_a = utf8_decode("ÁÀãâàá");
    $_e = utf8_decode("ÉÈéè");
    $_i = utf8_decode("ÍÌíì");
    $_o = utf8_decode("ÓÒóò");
    $_u = utf8_decode("ÚÙúù");
    $_n = utf8_decode("Ññ");
    $_c = utf8_decode("Çç");
    $_b = utf8_decode("ß");
    $_dash = "\.,_ ";
    $text = ereg_replace("[$_a]", "a", $text );
    $text = ereg_replace("[$_e]", "e", $text );
    $text = ereg_replace("[$_i]", "i", $text );
    $text = ereg_replace("[$_o]", "o", $text );
    $text = ereg_replace("[$_u]", "u", $text );
    $text = ereg_replace("[$_n]", "n", $text );
    $text = ereg_replace("[$_c]", "c", $text );
    $text = ereg_replace("[$_b]", "ss", $text );
 
    $text = ereg_replace("[$_dash]", $separator, $text );
    $text = ereg_replace("[^a-zA-Z0-9\-]", "", $text );
    $text = strtolower($text);
 
    return ($isUTF8) ? utf8_encode($text) : $text;
}
5Feb/100

El archivo config.php

Leyendo un poco más sobre este framework di con un artículo en donde te explican una manera de hacer que el parámetro base_url definido en el archivo /config/config.php se escriba dinámicamente utilizando variables de servidor.

$config['base_url'] = 'http' . ((isset($_SERVER['HTTPS']) &amp;&amp; $_SERVER['HTTPS'] == 'on') ? 's' : '').'://'.$_SERVER['HTTP_HOST'].str_replace('//','/',dirname($_SERVER['SCRIPT_NAME']).'/');

Fuente: Wiki CodeIgniter

Filed under: CodeIgniter No Comments
21Jan/101

Colección de screencast sobre CodeIgniter

Navegando por Internet en busca de artículos sobre CodeIgniter, encontré el blog de David Rojas, un estudiante de la carrera de ingeniería en telecomunicación de la Universidad Miguel Hernández de Elche (España).

Estos cinco screencast son recomendables para aquellos que se están iniciando en el mundo de este framework. Como dicen los españoles: "Enhorabuena David, excelente material!".

Screencast 1: Introducción a CodeIgniter

Descargar código fuente

Screencast 2: Creación y validación de formularios con Codeigniter

Descargar código fuente

Screencast 3: Ajax con Jquery en Codeigniter

Descargar código fuente

Screencast 4: CRUD con scaffolding, rendimiento y unit testing en Codeigniter

Descargar código fuente

Screencast 5 : Hooks y creación de librerías

Descargar código fuente

Todos estos screencast han sido extraídos del Blog de David Rojas, a quien quiero agradecer por haberme permitido compartir estos videos con los usuarios de mi blog. Les recomiendo echen un vistazo al blog de David www.davidrojas.net en donde encontrarán los screencast originales como así también otros muy buenos para los desarrolladores web.

Espero que disfruten y aprendan con este material. Nos vemos en el próximo artículo.

20Jan/102

Sitio offline por mantenimiento

Algunas veces necesitamos hacer tareas de mantenimiento en alguno de nuestros sitios que están en producción y mientras estas tareas transcurren no queremos que los usuarios ingresen al sitio.

En el siguiente artículo intentaré explicarles como pueden hacer esto con CodeIgniter utilizando hooks.

Paso 1

Debemos habilitar los hooks en el archivo de configuración de la aplicación, situado en /application/config/config.php

$config['enable_hooks'] = TRUE;

Paso 2

Al final de nuestro archivo application.php incluimos el siguiente bloque

/*
|------------------------------------------------------------------
| Sitio en mantenimiento
|------------------------------------------------------------------
| Muchas veces necesitamos poner nuestro website offline.
| Asignando el valor TRUE a al parámetro de configuración
| $config['is_offline'] el sitio mostrará un cartel de
| mantenimiento a todos aquellos ips que no se encuentren
| definidos en el parametro $config['offline_allowed_ips']
|
| $config['is_offline'] = TRUE; // sitio offline
| $config['is_offline'] = FALSE; // sitio online
| $config['offline_allowed_ips'] = array('xxx.xxx.xxx.xxx') // ips permitidos
*/
 
$config['is_offline'] = FALSE;
$config['offline_allowed_ips'] = array('127.0.0.1');

Paso 3

Para configurar el hook en el sistema debemos editar el archivo hooks.php ubicado en la carpeta application/config. Allí insertamos el siguientes código:

$hook['pre_system'][] = array(
'class'   => 'site_offline_hook',
'function' => 'is_offline',
'filename' => 'site_offline_hook.php',
'filepath' => 'hooks'
);

Paso 4

Ahora solo nos resta crear el archivo para el hook. Creamos un nuevo archivo llamado site_offline_hook.php dentro de la carpeta /application/hooks/.

Si la carpeta no existe, entonces deberemos crearla.

Luego pegamos dentro del archivo recientemente creado, el siguiente bloque de código:

< ?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
/**
 * Check whether the site is offline or not.
 *
 */
class site_offline_hook {
 
    public function __construct() {
        log_message('debug','Accessing site_offline hook!');
    }
 
    public function is_offline() {
        if(file_exists(APPPATH.'config/application.php')) {
            include(APPPATH.'config/application.php');
 
            if(isset($config['is_offline']) && $config['is_offline']===TRUE) {
                if(isset($config['offline_allowed_ips']) && in_array($_SERVER['REMOTE_ADDR'],$config['offline_allowed_ips'])===FALSE) {
                    $this->show_site_offline();
                    exit;
                }
            }
        }
    }
 
    private function show_site_offline() {
        echo '<html><body>Sitio en mantenimiento.</body></html>';
    }
 
}
/* Location: ./system/application/hooks/site_offline_hook.php */

Con esto ya tenemos nuestro hook para poner nuestro sitio offline a todo el mundo cuando queramos. Solo debemos cambiar los parametros en el archivo application.php y listo.

Este fue mi cuarto artículo espero que les haya servido. Espero sus comentarios y sugerencias. Nos vemos en mi próximo artículo de la serie "Desarrollando aplicaciones web con CodeIgniter".

19Jan/109

El archivo application.php

El archivo application.php es un archivo de configuración personalizada propio de la aplicación web que estemos desarrollando.

Suelo almacenar en él parámetros de configuración que no vengan declarados en config.php.

La ubicación de este archivo es en la carpeta /application/config/

Por citar algunas de los parámetros que se setean en este archivo, podemos mencionar, el nombre de la aplicación, la versión de la aplicación, la versión del core de codeigniter, si habilitamos el modo profiling, y muchas otras.

Para que la aplicación cargar esta configuración debemos hacer referencia a la misma en el archivo autoload.php en la seccion de config, generalmente línea 82.

Debería quedar una línea como la que sigue

$autoload['config'] = array('application');

Cabe mencionar un detalle más sobre uno de los parámetros de este archivo respecto a parámetro config['debug'] que es el que activa o desactiva el modo depuración.

Si en el archivo autoload.php precargamos la librería profiler que viene con el core de CodeIgniter y dentro del constructor de cada uno de los controladores ponemos una línea como la que sigue:

$this->output->enable_profiler($this->config->item('debug'));

Estaríamos activando o desactivando con la variable debug el modo depuración que nos muestra información útil para depurar nuestro código.  La información que se muestra aparece dividida en las siguientes secciones:

  • URI STRING
  • CLASS/METHOD
  • MEMORY USAGE
  • BENCHMARKS
  • GET DATA
  • POST DATA
  • QUERIES

Bueno llegamos con esto al final de mi tercer artículo de la colección "Desarrollando aplicaciones web con CodeIgniter". Espero sus dudas y comentarios y nos vemos en el próximo artículo.

19Jan/100

Entornos de configuración dinámica

Cuando comenzamos a desarrollar un proyecto web por lo general lo hacemos en nuestros servidores de desarrollo, luego hacemos algunas pruebas en el servidor del cliente (estado conocido como staging) y por último ponemos la aplicación online en el servidor de producción.

La idea de este artículo es comentarles como podemos configurar de manera dinámica estos tres escenarios.

Suponiendo que el servidor de desarrollo será http://app1.servidoruno.com.ar, el servidor de staging será http://pruebas.app1.com y por último el servidor de producción será http://www.app1.com.

Lo primero que haremos será definir dos variables estáticas en el archivo de configuración config.php, el que se encuentra dentro de /{application}/config/

Allí pondremos el siguiente código

define('DEV_SERVER_NAME', 'http://app1.servidoruno.com.ar');
define('STA_SERVER_NAME', 'http://pruebas.app1.com');

Luego agregaremos un bloque switch para definir la variable base_url de cada uno de los escenarios.

switch ($_SERVER['SERVER_NAME']) {
case DEV_SERVER_NAME:
//servidor de desarrollo
$config['base_url'] = "http://app1.servidoruno.com.ar/";
break;
case STA_SERVER_NAME:
// servidor de staging
$config['base_url'] = "http://pruebas.app1.com";
break;
default:
// servidor de producción
$config['base_url']    = "http://www.app1.com";
break;
}

Ahora haremos algo similar pero relacionado con las diferentes configuraciones de las bases de datos de los 3 escenarios.

Dentro de la carpeta /{application}/config/ hay un archivo database.php en el que agregaremos un bloque switch para definir cual será el "active_group"

switch ($_SERVER['SERVER_NAME']) {
case DEV_SERVER_NAME:
// servidor de desarrollo
$active_group = "dev";
break;
case STAG_SERVER_NAME:
// servidor de staging
$active_group = "sta";
break;
default:
// servidor de producción
$active_group = "pro";
break;
}

Luego crearemos los tres bloques para cada escenario con cada uno de los parámetros necesarios.
$db['dev']['hostname'] = "localhost";
$db['dev']['username'] = "DEV_USERNAME";
$db['dev']['password'] = "DEV_PASSWORD";
$db['dev']['database'] = "DEV_DATABASENAME";
$db['dev']['dbdriver'] = "mysql";
$db['dev']['dbprefix'] = "";
$db['dev']['pconnect'] = FALSE;
$db['dev']['db_debug'] = TRUE;
$db['dev']['cache_on'] = FALSE;
$db['dev']['cachedir'] = "";
$db['dev']['char_set'] = "utf8";
$db['dev']['dbcollat'] = "utf8_general_ci";
$db['sta']['hostname'] = "localhost";
$db['sta']['username'] = "STG_USERNAME";
$db['sta']['password'] = "STG_PASSWORD";
$db['sta']['database'] = "STG_DATABASENAME";
$db['sta']['dbdriver'] = "mysql";
$db['sta']['dbprefix'] = "";
$db['sta']['pconnect'] = FALSE;
$db['sta']['db_debug'] = TRUE;
$db['sta']['cache_on'] = FALSE;
$db['sta']['cachedir'] = "";
$db['sta']['char_set'] = "utf8";
$db['sta']['dbcollat'] = "utf8_general_ci";
$db['pro']['hostname'] = "localhost";
$db['pro']['username'] = "LIVE_USERNAME";
$db['pro']['password'] = "LIVE_PASSWORD";
$db['pro']['database'] = "LIVE_DATABASENAME";
$db['pro']['dbdriver'] = "mysql";
$db['pro']['dbprefix'] = "";
$db['pro']['pconnect'] = FALSE;
$db['pro']['db_debug'] = TRUE;
$db['pro']['cache_on'] = FALSE;
$db['pro']['cachedir'] = "";
$db['pro']['char_set'] = "utf8";
$db['pro']['dbcollat'] = "utf8_general_ci";