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,
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; } |
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.

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.
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; }
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']) && $_SERVER['HTTPS'] == 'on') ? 's' : '').'://'.$_SERVER['HTTP_HOST'].str_replace('//','/',dirname($_SERVER['SCRIPT_NAME']).'/');
Fuente: Wiki CodeIgniter
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
Screencast 2: Creación y validación de formularios con Codeigniter
Screencast 3: Ajax con Jquery en Codeigniter
Screencast 4: CRUD con scaffolding, rendimiento y unit testing en Codeigniter
Screencast 5 : Hooks y creación de librerías
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.
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".
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.
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";
Personalizando la estructura de carpetas
Luego de haber descargo y descomprimido la última versión del framework CodeIgniter, me gusta personalizar la estructura de carpetas como sigue.
--ci_1.7.2
--application
--assets
----css
----js
----img
La carpeta "application"
La carpeta application es donde estarán aquellos archivos que vayamos creando y codificando, sean estos vistas, controladores, modelos, etc. A mi entender, resulta mucho más práctico move esta carpeta a la raíz del proyecto, al mismo nivel que la carpeta system. De esta forma estamos aislando el proyecto de lo que es el corazón o core de CodeIgniter.
Luego de hacer este cambio, debemos informárselo a CodeIgniter de la siguiente manera. En el archivo index.php que se encuentra en el raíz de la aplicación deberemos actualizar el valor de la variable $application_folder.
$application_folder = "application"; //versión original
$application_folder = "../application"; //mi versión
La carpeta "system"
La carpeta system suelo renombrarla siguiendo el patrón "ci_{numero de versión}". La versión que estoy utilizando de CodeIgniter es la 1.7.2, por lo que la carpeta quedaría con el nombre ci_1.7.2.
Para informar este cambio, debemos editar editar la línea 26 de archivo index.php situado en el directorio raíz del proyecto.
$system_folder = "system"; // versión original
$system_folder = "ci_1.7.2"; // mi versión
Este cambio me permitirá actualizar fácilmente el framework, ni bien vayan apareciendo nuevas versiones del mismo.
La carpeta "assets"
En todas las aplicaciones web siempre precisamos hojas de estilos, librerías jscript, y archivos de imágenes. En lugar de tener varias carpetas distribuidas en el directorio raíz del proyecto, me gusta centralizar todas estas en una carpeta assets que sitúo en el directorio raíz. Dentro de esta podré tener otras carpetas para diferenciar los recursos por tipos, por ejemplo la carpeta css para las hojas de estilo, la carpeta js para los ficheros javascript, y la carpeta img para las imágenes, solo por citar algunos ejemplos.
Bueno espero poder haber contribuido de alguna manera. Espero sus comentarios y nos vemos en el próximo artículo sobre CodeIgniter.