CodeIgniter de un vistazo

Extracto

Ver algunas de las funcionalidades de CodeIgniter junto con sus características principales.

CodeIgniter es un framework de aplicación

CI es un conjunto de herramientas para construir aplicaciones web usando PHP. Su objetivo es permitir desarrollar proyectos más rápido de lo que lo harías si empezaras de cero. CI provee un rico conjunto de librerías para las tareas más comunes, como también, una interfaz y estructura lógica para acceder sin limitaciones a esas librerías. CI te permite focalizar tu esfuerzo en el desarrollo de tu aplicación minimizando el código necesario para ello. CI es libre y publicado bajo la licencia Apache/BSD-style de Código Abierto, por lo que puedes usarlo dónde y para lo que te plazca.

CodeIgniter es Ligero

Realmente ligero. El core requiere sólo un par de pequeñas librerías. Esto contrasta con otros frameworks que necesitan significativamente más recursos. Adicionalmente las librerías son cargadas dinámicamente según requerimiento, basado en tus necesidades y dependiendo de tus procesos. En su web retan a encontrar otro framework más rápido… Aunque yo no quiero entrar en eso.

CodeIgniter usa el modelo M-V-C

CI usa el enfoque Modelo-Vista-Controlador, que permite una auténtica y verdadera separación entre la lógica de nuestra aplicación y su presentación. Esto es especialmente importante para proyectos que son acometidos entre desarrolladores y diseñadores. Más adelante describiré Modelo-Vista-Controlador con todo lujo de detalles.

CodeIgniter genera URL limpias (amigables)

Las URLs generadas por CI son limpias y amigables para los motores de búsqueda. Mejor dicho, usa el estándard “query string” para la sintaxis de su URL y sus procesos simétricos en el sistema.
Por ejemplo:
mi_servidor.com/cliente/pedido/345

Paquetes de una sola tacada

CI viene con una importante cantidad de librerías, que son comúnmente necesarias, como abstracción de acceso a bases de datos, envío de mails, validación de formularios, mantenimiento de sesiones, manipulación de imágenes, trabajo con datos XML-RPC y más…

CodeIgniter es extensible

El sistema es fácilmente extensible por el programador para usar sus propias librerías. Trataremos esto más adelante.

CodeIgniter no requiere un motor de plantillas

Aunque CI trae un sistema de plantillas para la interpretación de variables y bucles, el framework no te fuerza a usarlas. Haciendo que las vistas sean a su vez ficheros php y aprovechando la potencia de todo el lenguaje. Generalmente esto no es necesario ya que podemos afirmar que con la correcta arquitectura de programación PHP ya viene de fábrica con su propio motor de plantillas. Como veremos más adelante.
Por ejemplo:
<ul>
<?php foreach ($addressbook as $name):?>
<li><?=$name?></li>
<?php endforeach; ?>
</ul>

y compáralo con

<ul>
{foreach from=$addressbook item="name"}
<li>{$name}</li>
{/foreach}
</ul>

Instalación de CodeIgniter

Extracto

CodeIgniter es un fantástico framework PHP para el desarrollo de aplicaciones sobre tecnología web. Permite desarrollar mucho más rápido nuestros proyectos proporcionándote un entorno de trabajo muy probado y aportando un soporte que preferirás al empezar tú todo desde cero.
  • Su ejecución es excepcionalmente rápida.
  • Áltamente configurable.
  • No requiere que uses la línea de comandos.
  • No tienes por qué aprender un lenguaje de plantillas (aunque está disponible si así lo deseas).
  • Evitas la complejidad ofreciendo soluciones simples y modulares a problemas más complejos que se irán ensamblando con su clara arquitectura.

Historia, pero muy rápidamente

CodeIgniter ha sido propiedad de EllisLab que abandonó el desarrollo del proyecto por tenerlo ya amortizado. Ahora el proyecto de desarrollo está en manos de British Columbia Institute of Technology, quien está en fase de desarrollo de la versión 3.x, a la que no acudiré hasta que se dé por terminada esta release.

Descarga de la versión 2.2.0 (estable)

Esta es la actual versión estable del framework. La primera 2.x fue publicada en enero de 2011, sufrió una importante actualización en otoño de 2011 y será abandonada por parte de EllisLab en julio de 2014, pero como he comentado en la historia toma el testigo la BCIT.

Instalación

  1. Desempaqueta el archivo zip. Si tu servidor te permite mediante el panel de control desempaquetar archivos zip, no lo desempaquetes, lo subes a tu servidor comprimido y lo descomprimes en tu carpeta remota.
  2. Sube los archivos y carpetas del contenido del zip a tu servidor o lo desempaquetas arriba como he descrito en el apartado anterior.
  3. Con un editor de textos abre el archivo application/config/config.php. Aquí pondremos la base URL, lo describo con más detalle más bajo.
  4. Si necesitas usar una base de datos, abre el archivo application/config/database.php con un editor de textos para la configuración de la base de datos. Lo describo con más detalle más abajo.

application/config/config.php

Muestro mi propio archivo de configuración. Más adelante explicaré la traducción a los distintos idiomas de momento me quedo con inglés.
Importante:
  • linea 17 base_url.
  • línea 227 encription_key. Te recomiendo que no la cambies una vez establecida.
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
| http://example.com/
|
| If this is not set then CodeIgniter will guess the protocol, domain and
| path to your installation.
|
*/
$config['base_url'] = 'http://ladirecciondemiservidor.com';

/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = 'index.php';

/*
|--------------------------------------------------------------------------
| URI PROTOCOL
|--------------------------------------------------------------------------
|
| This item determines which server global should be used to retrieve the
| URI string.  The default setting of 'AUTO' works for most servers.
| If your links do not seem to work, try one of the other delicious flavors:
|
| 'AUTO'   Default - auto detects
| 'PATH_INFO'  Uses the PATH_INFO
| 'QUERY_STRING' Uses the QUERY_STRING
| 'REQUEST_URI'  Uses the REQUEST_URI
| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO
|
*/
$config['uri_protocol'] = 'AUTO';

/*
|--------------------------------------------------------------------------
| URL suffix
|--------------------------------------------------------------------------
|
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
| For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/urls.html
*/

$config['url_suffix'] = '';

/*
|--------------------------------------------------------------------------
| Default Language
|--------------------------------------------------------------------------
|
| This determines which set of language files should be used. Make sure
| there is an available translation if you intend to use something other
| than english.
|
*/
$config['language'] = 'english';

/*
|--------------------------------------------------------------------------
| Default Character Set
|--------------------------------------------------------------------------
|
| This determines which character set is used by default in various methods
| that require a character set to be provided.
|
*/
$config['charset'] = 'UTF-8';

/*
|--------------------------------------------------------------------------
| Enable/Disable System Hooks
|--------------------------------------------------------------------------
|
| If you would like to use the 'hooks' feature you must enable it by
| setting this variable to TRUE (boolean).  See the user guide for details.
|
*/
$config['enable_hooks'] = FALSE;


/*
|--------------------------------------------------------------------------
| Class Extension Prefix
|--------------------------------------------------------------------------
|
| This item allows you to set the filename/classname prefix when extending
| native libraries.  For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/core_classes.html
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';


/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify with a regular expression which characters are permitted
| within your URLs.  When someone tries to submit a URL with disallowed
| characters they will get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';


/*
|--------------------------------------------------------------------------
| Enable Query Strings
|--------------------------------------------------------------------------
|
| By default CodeIgniter uses search-engine friendly segment based URLs:
| example.com/who/what/where/
|
| By default CodeIgniter enables access to the $_GET array.  If for some
| reason you would like to disable it, set 'allow_get_array' to FALSE.
|
| You can optionally enable standard query string based URLs:
| example.com?who=me&what=something&where=here
|
| Options are: TRUE or FALSE (boolean)
|
| The other items let you set the query string 'words' that will
| invoke your controllers and its functions:
| example.com/index.php?c=controller&m=function
|
| Please note that some of the helpers won't work as expected when
| this feature is enabled, since CodeIgniter is designed primarily to
| use segment based URLs.
|
*/
$config['allow_get_array']  = TRUE;
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger']  = 'm';
$config['directory_trigger'] = 'd'; // experimental not currently in use

/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|--------------------------------------------------------------------------
|
| If you have enabled error logging, you can set an error threshold to
| determine what gets logged. Threshold options are:
| You can enable error logging by setting a threshold over zero. The
| threshold determines what gets logged. Threshold options are:
|
| 0 = Disables logging, Error logging TURNED OFF
| 1 = Error Messages (including PHP errors)
| 2 = Debug Messages
| 3 = Informational Messages
| 4 = All Messages
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
| your log files will fill up very fast.
|
*/
$config['log_threshold'] = 0;

/*
|--------------------------------------------------------------------------
| Error Logging Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/logs/ folder. Use a full server path with trailing slash.
|
*/
$config['log_path'] = '';

/*
|--------------------------------------------------------------------------
| Date Format for Logs
|--------------------------------------------------------------------------
|
| Each item that is logged has an associated date. You can use PHP date
| codes to set your own date formatting
|
*/
$config['log_date_format'] = 'Y-m-d H:i:s';

/*
|--------------------------------------------------------------------------
| Cache Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| system/cache/ folder.  Use a full server path with trailing slash.
|
*/
$config['cache_path'] = '';

/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class or the Session class you
| MUST set an encryption key.  See the user guide for info.
|
*/
$config['encryption_key'] = 'frase super secreta muy secreta secretísima';

/*
|--------------------------------------------------------------------------
| Session Variables
|--------------------------------------------------------------------------
|
| 'sess_cookie_name'  = the name you want for the cookie
| 'sess_expiration'   = the number of SECONDS you want the session to last.
|   by default sessions last 7200 seconds (two hours).  Set to zero for no expiration.
| 'sess_expire_on_close' = Whether to cause the session to expire automatically
|   when the browser window is closed
| 'sess_encrypt_cookie'  = Whether to encrypt the cookie
| 'sess_use_database'  = Whether to save the session data to a database
| 'sess_table_name'   = The name of the session database table
| 'sess_match_ip'   = Whether to match the user's IP address when reading the session data
| 'sess_match_useragent' = Whether to match the User Agent when reading the session data
| 'sess_time_to_update'  = how many seconds between CI refreshing Session Information
|
*/
$config['sess_cookie_name']  = 'ci_session';
$config['sess_expiration']  = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = FALSE;
$config['sess_table_name']  = 'ci_sessions';
$config['sess_match_ip']  = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300;

/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path'   =  Typically will be a forward slash
| 'cookie_secure' =  Cookies will only be set if a secure HTTPS connection exists.
|
*/
$config['cookie_prefix'] = "";
$config['cookie_domain'] = "";
$config['cookie_path']  = "/";
$config['cookie_secure'] = FALSE;

/*
|--------------------------------------------------------------------------
| Global XSS Filtering
|--------------------------------------------------------------------------
|
| Determines whether the XSS filter is always active when GET, POST or
| COOKIE data is encountered
|
*/
$config['global_xss_filtering'] = FALSE;

/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
*/
$config['csrf_protection'] = FALSE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;

/*
|--------------------------------------------------------------------------
| Output Compression
|--------------------------------------------------------------------------
|
| Enables Gzip output compression for faster page loads.  When enabled,
| the output class will test whether your server supports Gzip.
| Even if it does, however, not all browsers support compression
| so enable only if you are reasonably sure your visitors can handle it.
|
| VERY IMPORTANT:  If you are getting a blank page when compression is enabled it
| means you are prematurely outputting something to your browser. It could
| even be a line of whitespace at the end of one of your scripts.  For
| compression to work, nothing can be sent before the output buffer is called
| by the output class.  Do not 'echo' any values with compression enabled.
|
*/
$config['compress_output'] = FALSE;

/*
|--------------------------------------------------------------------------
| Master Time Reference
|--------------------------------------------------------------------------
|
| Options are 'local' or 'gmt'.  This pref tells the system whether to use
| your server's local time as the master 'now' reference, or convert it to
| GMT.  See the 'date helper' page of the user guide for information
| regarding date handling.
|
*/
$config['time_reference'] = 'local';


/*
|--------------------------------------------------------------------------
| Rewrite PHP Short Tags
|--------------------------------------------------------------------------
|
| If your PHP installation does not have short tag support enabled CI
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
| in your view files.  Options are TRUE or FALSE (boolean)
|
*/
$config['rewrite_short_tags'] = FALSE;


/*
|--------------------------------------------------------------------------
| Reverse Proxy IPs
|--------------------------------------------------------------------------
|
| If your server is behind a reverse proxy, you must whitelist the proxy IP
| addresses from which CodeIgniter should trust the HTTP_X_FORWARDED_FOR
| header in order to properly identify the visitor's IP address.
| Comma-delimited, e.g. '10.0.1.200,10.0.1.201'
|
*/
$config['proxy_ips'] = '';


/* End of file config.php */
/* Location: ./application/config/config.php */

application/config/database.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the 'Database Connection'
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
|
| ['hostname'] The hostname of your database server.
| ['username'] The username used to connect to the database
| ['password'] The password used to connect to the database
| ['database'] The name of the database you want to connect to
| ['dbdriver'] The database type. ie: mysql.  Currently supported:
     mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
| ['dbprefix'] You can add an optional prefix, which will be added
|     to the table name when using the  Active Record class
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
| ['cachedir'] The path to the folder where cache files should be stored
| ['char_set'] The character set used in communicating with the database
| ['dbcollat'] The character collation used in communicating with the database
|     NOTE: For MySQL and MySQLi databases, this setting is only used
|      as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
|     (and in table creation queries made with DB Forge).
|      There is an incompatibility in PHP with mysql_real_escape_string() which
|      can make your site vulnerable to SQL injection if you are using a
|      multi-byte character set and are running versions lower than these.
|      Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
| ['swap_pre'] A default table prefix that should be swapped with the dbprefix
| ['autoinit'] Whether or not to automatically initialize the database.
| ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
|       - good for ensuring strict SQL while developing
|
| The $active_group variable lets you choose which connection group to
| make active.  By default there is only one group (the 'default' group).
|
| The $active_record variables lets you determine whether or not to load
| the active record class
*/

$active_group = 'default';
$active_record = TRUE;

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'nombre_de_usuario';
$db['default']['password'] = 'shhhh calla calla';
$db['default']['database'] = 'Nombredelabasededatos';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;


/* End of file database.php */
/* Location: ./application/config/database.php */

Trabajar con botones de Bootstrap

Extracto

Existen docenas de componentes en Bootstrap para ayudar al programador a mostrar elementos ya preestablecidos. La eficacia de este framework a la hora de usar estos componentes es altísima, y además, no requiere ninguna instalación especial pues forman parte del core. Comprender el funcionamiento de estos componentes es fundamental para realizar luego funciones en PHP que lo generen de forma automática.

Botones

Buenas prácticas

Es recomendable usar los botones bajo las siguientes prácticas:
  • Usa siempre el mismo elemento individual de botones, o pero no los mezcles.
  • No mezcles botones de direrente color.
  • Usa texto y/o iconos pero asegúrate de incluir texto de título y alt donde creas apropiado. Este medida ayuda a los buscadores a enlazar tu links.

Ejemplo de botones

<![CDATA[

1 2 3

]]>

Ejemplo de toolbar

<![CDATA[

1 2 3
4 5 6

]]>

Otros casos

Existen otros casos como el checkbox y radio que también funcionan como botones, como solo un botón puede estar activo, o las casillas de verificación donde cualquier número de botones puede estar activo.

BootStrap, un producto de Twitter

Extracto

BootStrap es un producto de Twitter desarrollado en 2011. La necesidad de trabajar de forma homogenizada sobre un proyecto donde concurren múltiples derarrolladores en el presente y en el futuro, justifica la estructura y el producto de Bootstrap.

Composición

Los elementos de Bootstrap están compuestos por una combinación de HTML, CSS y JavaScript, que gracias a la liberación por parte de Twitter como OpenSource, sufre una constante modificación -mejora- de sus elementos, creándose, incluso, ediciones particulares, muchas de ellas muy espectaculares.
Descarga de Bootstrap en http://getbootstrap.com/, en esta página nos encontramos tres distribuciones, de las cuales nos ocuparemos de dos Bootstrap compiled y Bootstrap sourcecode.

Bootstrap compiled

Quizá la más cómoda para trabajar desde un principio, aunque se te puede quedar corta en cuanto empieces a trabajar con ella. Su árbol de dependencias es este:

bootstrap/
├── css/
│ ├── bootstrap.css
│ ├── bootstrap.min.css
│ ├── bootstrap-theme.css
│ └── bootstrap-theme.min.css
├── js/
│ ├── bootstrap.js
│ └── bootstrap.min.js
└── fonts/
├── glyphicons-halflings-regular.eot
├── glyphicons-halflings-regular.svg
├── glyphicons-halflings-regular.ttf
└── glyphicons-halflings-regular.woff

Bootstrap sourcecode

Toda la distribución entera, su árbol de dependencias es el siguiente.
bootstrap/
├── less/
├── js/
├── fonts/
├── dist/
│ ├── css/
│ ├── js/
│ └── fonts/
└── docs/
└── examples/

Compilar nuestro Bootstrap

Mediante el comando grunt que podemos instalar así:
  1. Instalar grunt-cli globalmente con npm install -g grunt-cli
  2. Navegar al directorio root de /bootstrap, y allí ejecutar npm install. Npm verá el archivo package.json y automáticamente instalará las dependencias necesarias.

Comandos disponibles de grunt

  • grunt dist, Compila CSS y JavaScript
  • grunt watch. Mira en el directorio less y automáticamente recompila en CSS cualquier cambio que se haya producido en ese directorio.
  • grunt test, Ejecuta JSHint y corre las pruebas QUnit en PhantomJS.
  • grunt docs, Construye y pruebas de CSS, JavaScript y otros activos que se utilizan cuando se ejecuta la documentación a nivel local a través de Jekyll server.
  • grunt, lo recompila absolutamente todo.
Podríamos tener problemas con la instalación de las dependencias o ejecutando los comandos de grunt. Si esto ocurre primero borra el directorio /node_modules/ generado por rpm y entonces re-ejecuta npm install.