Mostrando entradas con la etiqueta codeigniter. Mostrar todas las entradas
Mostrando entradas con la etiqueta codeigniter. Mostrar todas las entradas

domingo, 2 de octubre de 2016

Nuevas caracterizticas en Codeigniter 3

La última versión estable 3.0.3 fue liberado el 31 de de octubre de 2015 (hace ya algún tiempo), pero no había hablado de ella. Así que quiero dejar mis comentarios. Una de las cuestiones mas importantes es el cambio de la licencia de MIT. Las nuevas versiones de CodeIgniter 3.0 se licenciaban bajo una licencia de BSD Apache . Esto significa que ahora se puede utilizar, combinar, copiar, modificar, publicar, distribuir y sub licenciar. Pero no se puede cambiar algunos de los archivos (* MY_).

Cambio de la versión PHP

Ahora requiere minimo PHP 5.2.4, aunque es recomendado usar PHP 5.4 o más nuevo.

Default driver para la base de datos

Ahora Codeigniter 3 cambio el drives para conectarse a la base de datos por 'mysqli' el antiguo driver quedo deprecado.

Actualizado y mejorado el soporte MIME

La lista es bastante larga de los tipos de archivos que se le a añadido soportate por codeigniter:


  • Añadido soporte para pem, p10, p12, p7a, p7c, p7m, p7r, p7s, crt, crl,rsa, der, kdb,sst, cer, csr Certs en mimes.php.
  • Añadido soporte para pgp, gpg, zsh and cdr archivos en mimes.php.
  • Añadido soporte para 3gp, 3g2, f4v, vlc , mp4, wmv Video archivos en mimes.php
  • Añadido soporte para m4a, xspf, au, aac, m4u, ac3, flac, ogg, wma archivos de audio en mimes.php.
  • Añadido soporte para kmz and kml (Google Earth) files, ics Calendar files, and rar, jar y 7zip archivos en mimes.php.
  • Codeigniter 3 a añadido soporte tambien a xml, xsl, doc, docx, php, zip y csv archivos en mimes.php

Output Minification

Nueva librería Output library tiene la función de minificar Javascript, CSS ae inclusive el HTML. Esta echa para compactar el codigo HTML,incluyendo cualquier linea JavaScript y CSS contenida dentro del archivo ayudando a ahorrar muchos bytes de data y mejorando la velocidad de descargar y analisis del navegador.

Minifying HTML Output

Para remover los espacios inútiles del código HTML, solo debemos modificar la configuración en config.php editamos minify_output, lo colocamos como true y listo.


$config['minify_output'] = TRUE;

Minifying JS/CSS

Para minificar CSS o JAVASCRIPT, solo necesitaras incluir dentro del controlador de Assets, o otra manera de hacerlos es manejar tus assets y mostrarlos no como archivos estáticos. Esto lo puedes hacer por que la clase Output tiene un método minify.

$css = $this->output->minify($style_content, 'text/css')
$scripts = $this->output->minify($script_content, 'text/javascript');

Si la configuración minify_output es TRUE, entonces cualquier contenido mostrado con la clase OUTPUT con alguno de los siguientes MIME sera minificado antes de ser enviado al navegador.
  • text/html
  • text/css
  • text/javascript
  • application/javascript
  • application/x-javascript

Nuevas opciones de routeo.

Hay dos opciones nuevas añadidas al area de routeo.

Callbacks

Si estas usando PHP 5.3 o mayor, tu puedes usar funciones anonimas para manejar las rutas similar a:

$route['pagina/(:any)'] = function ($page_slug) {     get_instance()->load->model     $data = array(         'page'  => get_instance()->page_model->find_by_slug($page_slug)     );     $this->load->view('page_wrapper', $data); };

Metodos HTTP  (GET, PUT, POST, etc)

Ahora puedes usar especificos HTTP-verb en especificas rutas en tu archivos routes.php, sin ningun tipo de caminos verdes. Esto es particularmente util cuando estas ahciendo un API Rest. Tu puedes usar metodos HTTP, propios o estandares, añadiendo el verbo al final de la ruta como un array hacia tu ruta. por ejemplo:

$route['products']['put'] = 'product/insert';

Codeigniter a echo multiples de pequeños cambios para volverse más eficiente y para mejorar la funcionalidad. 


Muchos mejoras en las conexiones a la base de datos a través de los drivers. 
Muchos cambios en las librerías ya existentes, como añadir la nueva librería de encriptación que reemplace todas las funciones inseguras que tenia la vieja. 
hay muchos cambios y actualizaciones en codeigniter si quieren ver la lista completa pueden verla aquí.

Si crees que me falto algo. Escribe lo en los comentarios. Saludos...

jueves, 8 de noviembre de 2012

Sistema echo en Codeigniter + HMVC + Jquery UI + JqGrid

Sistema echo en Codeigniter + HMVC + Jquery UI + JqGrid

Este sistema es un sistema que desarrolle ya hace algún tiempo, donde hago uso de JqGrid, y últimamente me an solicitado que publique una entrada para conectar JqGrid con el servidor, como no e tenido tiempo no e podido sacar un tutorial dedicado a esto, ademas de que es un poco enredado, así que e decidió subir este código y ponerlo a la orden para que puedan ver como es.

Este no es un sistema para producción es solamente un sistema desarrollado para una tesis, espero que le sirva de utilidad a alguien más.

Este sistema cuenta con los siguientes Modulos:
  • Clientes
  • Productos
  • Pedido
  • Historial Medico, como para oftalmologo, pero es sumamente básico.
La parte de la consulta es enredada porque cuando lo desarrolle lo hice de una forma tal que pudiese funcionar con varias columnas sin necesidad de cambiarlo mucho. 

Instalación

Para instalar el sistema, se debe tener ya un servidor con Apache, Window y Linux.
Lo primero que se debe hacer es crear una base de datos para el sistema, importar el archivo eye2000.sql y luego configurar el archivo database.php.
Con eso es suficiente para que el sistema empiece a funcionar

Screenshots

URL EN GITHUB

miércoles, 26 de octubre de 2011

Crear Url dependiendo del lenguaje


Para crear una url dependiendo del idioma, tendríamos que crear MY_url_helper.php, donde extendemos la funcion site_url(), para que cree las url dependiendo del lenguaje. Acepta ahora un segundo parámetro con la abreviación del lenguaje que queremos que cree la url, si vamos a cambiar el lenguaje hay que pone ajuro el lenguaje, pero si la url debe estar en el mismo lenguaje la va a crear.

 function site_url($uri = '', $lang = '')
 {
  $CI =& get_instance();
  $config =& get_config();
  if(!array_key_exists($lang,$config['languages']))
   $lang=array_search($config['language'],$config['languages']);
  return $CI->config->site_url()."/$lang/".trim($uri,"/").$CI->config->item('url_suffix');
 }


Esto es continuacion del articulo: http://sosinformatico.blogspot.com/2011/10/codeigniter-multi-lenguaje-web-por-urls.html

Codeigniter Multilenguaje web, por URLS

Este tutorial se lo voy a dedicar a explicar como se hace para crear un sistema Multilenguaje en Codeigniter, en internet hay varios tutoriales de como hacer esto en nuestro idioma, pero lo hacen usando cookies, y aunque no están mal, no permiten a un buscador almacenar correctamente el contenido de nuestra pagina en los diferentes lenguajes y así atraer a más gente a nuestra pagina Web.
Codeigniter Multilenguaje

Aquí les dejo un articulo sobre SEO y el MULTILINGUAL SEO, por si se quieren documentar un poco más: http://www.searchenginejournal.com/multilingual-seo/19903/

Ahora bien, para empezar deben conocer primero como se trabaja con lenguajes de manera básica con Codeigniter, aqui les dejo un pequeño tutorial que hice: http://sosinformatico.blogspot.com/2011/10/codeigniter-language-class.html

Para hacer que codeigniter sea multilenguaje hay dos maneras que yo conozco, una es a través de hooks y otra extendiendo la clase que lang.php en la carpeta core de nuestra aplicación. En este tutorial voy a explicar la ultima forma, y despues publicara otro con la otra forma.

Configurando el archivo Routes.php

En application/config/routex.php vamos a agregar dos lineas:


$route['(\w{2})/(.*)'] = '$2';

$route['(\w{2})'] = $route['default_controller'];


En el primer array se establece que cualquier ruta que tenga dos caracteres y una barra inclidada y algo mas, sera rederigida a ese algo más, y al segunda estable que cualquier ruta con dos caracteres llamara al controlador por defecto.

Configurando el archivo Config.php

En application/config/config.php, cerca de la configuración de lenguaje vamos a agregar:


$config['languages'] = array("es" => "espanol", "en" => "english");



$config['redirect_urls']=false;


Esto es para definir la configuración de nuestro sistema de lenguajes, y que después solo deba ser modificada desde aquí, si queremos agregar un lenguaje aparte o cualquier cosa. Ademas tambien nos permite definir si queremos usar la redirection de url o no, que sirve para que si alguien entre a "hhttp://nuestrositio.com/" lo redirige automaticamente o no a "hhttp://nuestrositio.com/xx" las dos x significan el idioma que tengamos por defecto.

Extendiendo lang.php

Para extender esta libreria del nucleo de Codeigniter, debemos crear dentro de la carpeta application/core  un archivo que debe empezar con la variable definida $config['subclass_prefix'] en el config.php (por defecto es MY_) y luego lang.php, en mi caso el nombre es MY_Lang.php, y dentro colocamos el siguiente codigo:

<?php (defined('BASEPATH')) OR exit('No direct script access allowed');

class MY_Lang extends CI_Lang
{
 function __construct()
 {
  parent::__construct();  
  $config =& get_config();
  if(isset($config['languages']) && isset($config['redirect_urls']))
  {
   global $URI, $CFG, $IN;
   //var_dump($URI);
   $lang = (isset($URI->segments['1']))?$URI->segments['1']:'';
   $uri=$URI->segments;
   if(strlen($lang) == 2 && array_key_exists($lang,$config['languages']) == true)
   {
    $config['language']=$config['languages'][$lang];
   }
   elseif($config['redirect_urls'] == true || strlen($lang) == 2 && array_key_exists($lang,$config['languages']) == false)
   {
    $url=$config['base_url'];
    $url.=(empty($config['index_page']))?'':$config['index_page'].'/';
    $url.=array_search($config['language'],$config['languages']).'/';
    if(strlen($lang)==2)
    {
     array_shift($uri);
     $url.=implode('/',$uri);
    }else
    {
     $url.=implode('/',$uri);
    }
    header("location: $url");
   }
  }
 }
}


Este código es el que va a dar la funcionalidad de muli lenguaje, es bastante sencillo, lo que hace es comprueba cuales son los primeros caracteres en la url, comprueba que estén definidos en la configuración y si es así cambia al idioma correspondiente, sino redirige al idioma por defecto. SI la variable redirect:url esta en true, el sistema comprobara que la url empieza con los dos caracteres del idioma por defecto y si no es así lo redirige a la url del idioma por defecto, si esta en false esta variable pues no hace nada y deja el idioma por defecto.

Probando el sistema Multilenguaje.

Esto no es un sistema automatizado que va a traducir toda tu aplicación, lo que hace es modificar solamente el idioma que usa la aplicación dependiendo de la url, para verlo funcionando debemos crear una aplicación que tenga varias idiomas ya definidos y esto se encargara del resto.

De todas maneras aquí les dejo una aplicación con el welcome_message en español y ingles, y los links para cambiar de idioma. Y así la prueban y comentan como funciona.






martes, 25 de octubre de 2011

Codeigniter Language CLASS




Este tutorial trata sobre como usar la libreria Language Class de codeigniter y sera el preámbulo par aun tutorial de como crear sus sistema multi lenguaje con codeigniter, primero vamos a empezar por lo básico, como se hace en codeigniter para trabajar con varios lenguajes. Codeigniter posee una Clase dedicada especialmente para trabajar con los lenguajes, (y tambien tiene un helper), lo primero que debemos saber es que hay dos carpetas donde se guardan los diferentes lenguajes en codeigniter, una esta en "system/language" y la otra en "application/language", en la primera se guarda los lenguajes que tienen que ver solamente con el sistema principal, y la segunda guarda los lenguajes de nuestro proyecto Web. 

Dentro de esas carpetas deben tantas carpetas como lenguajes tengamos, y a su ves tantos archivos de lenguajes como necesitemos, eso si, de carpeta a carpeta de lenguaje deben estar exactamente los mismos archivos, con los mismos arrays, la única diferencia es que el lenguaje en el que van a estar escritos los valores de los lenguajes. Como ya en una entrada anterior les deje la traducción de codeigniter al español, aqui!. Que si la revisan con detenimiento es idéntica a la del ingles con la única diferencia que el contenido esta en español, esa traducción como la traducción del sistema va en "system/language",


Creando Archivos de Lenguaje

Para trabajar con varios lenguajes en codeigniter debemos empezar creando los archivos de lenguajes en "application/language/(el lenguaje)/miarchivo_lang.php", todos los archivos de lenguaje deben terminar en _lang.php,  y deberíamos tener uno exactamente igual para cada lenguaje. 

Dentro de nuestro debemos ir colocando lineas que extiendan el array $lang, para ir definiendo nuevos textos en ese lenguaje. las lineas deben seguir este prototipo:

$lang['clave del lenguaje']="contenido para esta clave";

A la hora de crear nuestro archivo de lenguaje es bueno crear y seguir nuestra propia notación para que despues no vayamos a confundirnos. Ejemplo:

$lang['msj_mensaje_borrado']="Su mensaje a sido borrado";
$lang['error_mensaje_borrado"]="Su mensaje no a podido ser borrado";

Cargando un archivo de lenguaje.

Después de tener creado lso archivos de lenguaje, vamos a necesitar cargarlos, esto se hace con :

$this->lang->load('mi archivo','el lenguaje que quiero');

El segundo parámetro es opcional y si no se coloca cargara el lenguaje predeterminado en nuestro archivo de configuración.

También podemos cargar un archivo de lenguaje automaticamente cada ves que nuestra aplicación cargue, definiendo lo en "applicacion/config/autoload.php".

Imprimiendo lineas de el archivo de lenguaje.

El  Languague Class tienen un método line('clave del lenguaje'), que devuelve una linea especifica de lenguaje. Este metodo seguna la documentación oficial, pues ya no se debería a usar más y se debería usar la función lang() de el Langueage helper. 

echo $this->lang->line('msj_mensaje_borrado');
//Salida: Su mensaje a sido borrado
echo lang('msj_mensaje_borrado');
//Salida: Su mensaje a sido borrado
echo lang('msj_mensaje_borrado','id_input_formulario')
//Salida: <label for='id_input_formulario'">Su mensaje a sido borrado</label>

Bueno esto es todo por hoy, Voy a tratar de que al proxima entrada sea de como crear un sistema Multilenguaje con Codeigniter.

Nota: si crean como es debido los archivos de lenguaje en la carpeta de español y ingles, veran como al modificar la variable en el config.php va a cambiar en lenguaje al reabrir la pagina.

domingo, 16 de octubre de 2011

Crear Urls Limpias de acentos con Codeigniter

Esta ves les voy a hablar de la función url_title de el helper url de codeigniter, la cual es muy útil para crear direcciones web validas y limpias de una manera fácil, y ademas también les voy a dejar una versión mejorada de esta función para que también limpien de acentos las url, que es lo único que le hace falta a esta librería.

La función lo que hace es eliminar cualquier carácter extraño de la cadena de texto pasada, utilizando expresiones regulares, dejando solamente los caracteres de la a-z y modificando los espacios a "-" o "_".

La ejemplos de uso de la función url_title().

echo url_title('buen día'); //da como salida "buen-da"

echo url_title("Vas para caracas?? o que?!!!?<{{}"); // da como resultado"Vas-para-carcas??-o-que?!!!?"


Como evitar que url_title() elimine los acentos


Ahora bien, para lograr esto lo primero que debemos hacer es crear nuestra propia version del URL helper, para esto en la carpeta application/helpers creamos un archivo llamado MY_url_helper.php, (OJO usamos MY_ si ese es el prefijo que tenemos establecido en nuestro archivo de configuración) y dentro del archivo colocamos lo siguiente:

function url_title($str, $separator = 'dash', $lowercase = FALSE)
{
  $str=strtr($str,$array=array("À"=> "A","Á"=>"A","Â"=>"A","Ã"=>"A","Ä"=>"A","Å"=>"A","à"=>"a","á"=>"a","â"=>"a","ã"=>"a","ä"=>"a","å"=>"a","Ò"=>"O","Ó"=>"O","Ô"=>"O","Õ"=>"O","Ö"=>"O","Ø"=>"O","ò"=>"o","ó"=>"o","ô"=>"o","õ"=>"o","ö"=>"o","ø"=>"o","È"=>"E","É"=>"E","Ê"=>"E","Ë"=>"E","è"=>"e","é"=>"e","ê"=>"e","ë"=>"e","Ç"=>"C","ç"=>"c","Ì"=>"I","Í"=>"I","Î"=>"I","Ï"=>"I","ì"=>"i","í"=>"i","î"=>"i","ï"=>"i","Ù"=>"U","Ú"=>"U","Û"=>"U","Ü"=>"U","ù"=>"u","ú"=>"u","û"=>"u","ü"=>"u","ÿ"=>"y","Ñ"=>"N","ñ"=>"n"));
  if ($separator == 'dash')
  {
   $search  = '_';
   $replace = '-';
  }
  else
  {
   $search  = '-';
   $replace = '_';
  }

  $trans = array(
      '&\#\d+?;'    => '',
      '&\S+?;'    => '',
      '\s+'     => $replace,
      '[^a-z0-9\-\._]'  => '',
      $replace.'+'   => $replace,
      $replace.'$'   => $replace,
      '^'.$replace   => $replace,
      '\.+$'     => ''
     );

  $str = strip_tags($str);

  foreach ($trans as $key => $val)
  {
   $str = preg_replace("#".$key."#i", $val, $str);
  }

  if ($lowercase === TRUE)
  {
   $str = strtolower($str);
  }
  return trim(stripslashes($str));
 }

Cave destacar que esta función es la misma de codeigniter lo único es que le e agregado una linea para que también reemplace los caracteres que tienen acentos por los normales.

Tambien si quieres pueden agregar esta funcion: que elimina los "-" y los "_" de la caeena que se el pase, más o menos trabaja a la inversa de url_title().

function inv_url_title($str,$lowercase = FALSE)
{
 $str = preg_replace("#[_-]+#i", ' ', $str);
 if ($lowercase === TRUE)
 {
  $str = strtolower($str);
 }
 return $str;
}




lunes, 22 de agosto de 2011

Codeigniter 2.0.3

Acaba de salir codeigniter 2.0.3, en est anueva version an habiado pequeños cambios lo principal es que se cambio de Github a Git, y ahora ademas codeigniter Core ya no se más publicamente mantenido ahora Codeigniter Reactor va a ser Codeigniter, la version mantenida por la comunidad va a ser la que se va a usar como Codeigniter. Un ¡hurra! por Codeigniter.


  • En esta version se an echo algunos cambios en el driver de MYSQL para evitar algunos vectores de ataques
  • Se le hicieron unas mejoras visuales al welcome de codeigniter
  • Se agrego "application/x-csv" a mimes.php
  • Agregaron un tercer parametro a la función heading para poder agregar atributos html a las tags html
  • Se agrego is_unique a la libreria de validación de formularios.

viernes, 19 de agosto de 2011

Manual de codeigniter 2.0.2


Aqui les dejo el manual en español de Codeigniter 2.0.2, esta bajo licencia Creative Commons, y para empezar esta muy buena.

http://www.areadepruebas.com.ar/downloads/CodeIgniter_Guia_Usuario.pdf



Acerca de la Guía de Usuario en Español
La traducción fue realizada en el otoño/invierno austral de 2011, liberándola con la esperanza de serle útil a quien la lea.
Julio de 2011
Fernando “seacat” Velo
seacat.area@gmail.com
Esta Guía se distrubuye con licencia
http://creativecommons.org/licenses/by-sa/3.0/
 

jueves, 30 de junio de 2011

Crear urls de primer nivel perzonalizadas con Codeigniter

Ah la hora de programar con codeigniter, muchas veces hemos tenido la necesidad de que urls al estilo  de midominio.com/articulo/quienesomos  se cambien por midominio.com/quienesomos, para esto hay varias maneras de trabajarlo, una de las mas maneras mas facil es tener un proyecto con hmvc, y en la funcion remap del controlador por defecto, cargar el controlador que necesitemos.

Debemos estar seguros que en application/config/routes.php este configurado un controlador por defecto y que ese sea en el que vamos a trabajar.

Aqui les dejo un ejemplo de como seria el codigo de la funcion remap en el controlador por defecto:

    function _remap($method)
    {
        switch ($method)
        {
            case 'index':
            $this->index();
            break;
            default:
            $this->load->module('articulo');
            $this->articulo->index($method);
        }
    }

Con esta simple manera podemos tener urls de primer nivel perzonalidas en pocos pasos, es un poco paresido a los subdominios perzonalizados.

Si estamos usando hmvc hay que agregar las siguientes lineas en aplication/core/MY_router.php

class MY_Router extends MX_Router {

    function MY_Router()
    {
        parent::__construct();
    }

    function _validate_request($segments)
    {
//echo count($segments)."i";
        // Comprueba que el controlador no existe
     if(count($segments)==1)
     {
     if (!file_exists(APPPATH.'controllers/'.$segments[0].EXT) && !file_exists(APPPATH.'controllers/'.$segments[0]) && !file_exists(APPPATH."modules/$segments[0]/controllers/"))
     {
     $segments = array("inicio", $segments[0]);
     }
     }
        return parent::_validate_request($segments);
    }
}
?>

martes, 28 de junio de 2011

Tutorial: ReCAPTCHA y Codeigniter, sacando a los bots de tus aplicaciones.



En este articulo voy a explicar cómo usar ReCAPTCHA en codeigniter, ReCAPTCHA es un sistema anti-bot ampliamente usado en múltiples páginas web, este sistema también se puede implementar con codeigniter y en este tutorial tratare de explicar cómo se debe usar.

Primero es descargarnos el archivo con la libreria http://www.box.net/shared/hid2ch2i70my9z0vlz5u abajo hay un link donde esta el archivo original, este link tiene el archivo original más la traduccion de la libreria al español.

Les recomiendo que para probar lo agreguen en un proyecto nuevo y despues pues si lo agreguen al que ya tengan echo. 

Después tenemos que entrar en http://www.google.com/recaptcha/whyrecaptcha y solicitar una Api key, te darán dos una privada y una publica, las dos deberemos entrar en application/config/recaptcha.php y hay colocar respectivamente la public y la private key. 

Ya con esto tendremos todo listo para probar nuestro captcha, solo demos entrar en /recaptchademo, y ya veremos como sale nuestra imagen recaptcha y si lo probamos debe funcionar a la perfección.

Si deseamos ponerlo en español y hemos descargado el que esta en box.net solo debemos ir a application/config/config.php y cambiarlo el lenguaje por espanol, español con N, lo hice con n porque la ñ en algunos servidores da problemas. Y también deben buscar la función $this->recaptcha->get_html() y pasar el parametro 'es' ya que con esto tendremos el recaptcha en español.

El recaptcha tiene la posibilidad de configurar el tema posee 4 temas ya configurados (red, white, blackglass y clean) o también podemos crear nuestro propio reCaptcha. aquí están las opciones que podemos cambiar: http://code.google.com/intl/es-ES/apis/recaptcha/docs/customization.html.


Aquí les dejo unos links que pueden resultar importantes.



lunes, 27 de junio de 2011

Subdominios dinamicos con php y codeigniter

Una pregunta muy recurrente en internet y los foros es: ¿Se puede hacer subdominios dinamicos con php?¿Como se hacen estos subdominios dinamicos con php?, en muchas partes la gente pregunta pero pocas veces hay una respuesta clara y contundente, en este tutorial tratare de explicar como se hace, y veran que no es tan complicado como parece.

Lo primero que necesitamos es tener algunos conocimeintos basicos de:

¿Que es un Subdominio?
http://es.wikipedia.org/wiki/Subdominio
¿Que es un Servidor Dns.?
http://es.wikipedia.org/wiki/Domain_Name_System

Sistema de nombres de dominio o DNS: es un sistema que se creo con la finalidad de hacer mas claro el internet para todos, antes para accesar a una pagina web habia que poner la direccion ip del servidor al que nos queriamos conectar, por supuesto esto hacia muy dificil recordar de que era esa pagina e inclusive cual era su ip, para evitar esos problemas se crearon los DNS que son nombres de dominios que estan asociados a una direccio ip y de esta manera se facilita la compresion y uso de las paginas web.

Todos sabesmos que las url de una pagina siempre tienen una estructura parecida a esta:
www.google.com
  • www: subdominio
  • google: nombre de dominio
  • com: dominio de nivel superior
 Ahora bien, si nosotros deseamos crear un subdominio en nuestro servidor apache, debemos modificar el httpd.conf y agregar las siguientes lineas:

<VirtualHost *>
        ServerAdmin webmaster@ejemplo.com
        ServerAlias subdominio.ejemplo.com
        DocumentRoot /var/www/subdominio.ejemplo.com
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/subdominio.ejemplo.com>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
                # Uncomment this directive is you want to see apache2's
                # default start page (in /apache2-default) when you go to /
                #RedirectMatch ^/$ /apache2-default/
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/subdominio.ejemplo.com.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/subdominio.ejemplo.com.log combined
        ServerSignature On

</VirtualHost>

Donde dos cosas importantes para destacar son el ServerAlias y DocumentRoot, con el ServerAlias especificamos el nombre del subdominio y con el DocumentRoot espcificamos la ruta que debe accesar para buscar el subdominio,


Aparte de la configuracion en el apache debemos agregar en nuestro servidor DNS una entrada "A" con la ruta completa del subdominio y la direccion ip de nuestro mismo servidor, con estas dos cosas ya tenemos un subdominio creado en nuestro servidor. Ya si entramos en el subdominio deberia salirnos lo que tenemos en la ruta especificada.

Ahora bien si queremos hacer multiples subdominios con php, debemos seguir los paso anterirores pero con algunas diferencias, la primera es que al agregar el host al pache hay que poner en el Server alias en ves del subdominio poner *, queda asi: ServerAlias *.ejemplo.com

Y en la entrada "A" Del servidor dns en ves de poner  subdominio.ejemplo.com, colocar *.subdominio.ejemplo.com, con esto ya tenemos todos los subdominios de nuestro servidor apuntando a DocumentRoot, ahora bien para manejarlos ya esto queda de parte de php, Podemos crear un nuevo proyecto con codeginiter o dejarlo en con el que ya hemos estado trabajando, lo que hay que hacer es que en el controlador por defecto agregar las siguientes lineas:

    function _remap($method)
    {
        if($_SERVER['SERVER_NAME']!= 'localhost' && $_SERVER['SERVER_NAME'] != '127.0.0.1')
        {
            $array = explode('.',$_SERVER['SERVER_NAME']);
            if($array[0]!='www')
            {
                $method=$array[0];
            }
            elseif($array[0]=='www')
            {
                $method=$array[1];
            }
        }
            switch ($method)
            {
                case 'index':
                $this->index();
                break;
                default:
               $ths->lo que queramos.
            }
        
    }

Lo que hacemso es si es el servidor local carga el metodo tal cual como esta escrito si no es el servidor local pues estrae el subdominio y lo pasa como metodo, ya despues nosotros dentro del swicth podemos crear diferentes metodos a nuestor antojo y de esa maneja generar los subdominios dinamicos como queramos.

Si trabajamos con hmvc pues se nos hace la vida un poco mas facil ya que no tenemos que crear el metodo dnetro de el archivo del controlador sinoq ue lo hacemos aparte con lo cual nuestro codigo es mas facil de entender y todo se encuentra mejor organizado, solo deberiamso agregar:

$this->load->module('empresa');
 $this->empresa->index($method);

domingo, 8 de mayo de 2011

Tutorial: Codeigniter y AJAX, manejando solicitudes.

A la hora de trabajar en codeigniter con eventos o llamadas AJAX pues el framework tiene herramientas muy precarias para trabajar con este tipo de solicitudes, trabajar con ello,  por ello nosotros tenemos que hacer nuestras propias funciones que nos ayuden a trabajar con este tipo de peticiones.(Eso es lo que a mi me gusta de este framework, que te ayuda en muchas cosas pero hay muchas otras que tu tienes que aprender, y que si ya lo tuvieras echo pues no aprenderías)

¿Como reconocer una llamada AJAX?

Lo primero que tenemos que estar claro es que una solicitud AJAX es casi igual que una solicitud normal, pero a la hora de programar es de suma importancia saber si es AJAX o no, porque de acuerdo al tipo de solicitud debemos retornar algo completamente diferente, lo cual si no se hace correctamente pues nos va a dar tronco de errores que nos puede costar hasta el trabajo, para solucionar esto hay varias opciones:
  • Enviar una variable en las solicitudes AJAX: a esto me refiero a que cuando hagamos una solicitud AJAX mandemos una variable más, y después en el código reconozcamos  si se envia o no.
  • Crear un método aparte solo para las llamadas AJAX:(la primera que use) una solución es crear un método aparte dentro del controlador para la llamada AJAX, es buena pero genera mas código innecesario y en ciertos casos repetir mucho código.
  • Utilizar HTTP_X_REQUESTED_WITH para saber si es AJAX o no:(la que uso actualmente) desde el javascript se envía una cabecera que se llama HTTP_X_REQUESTED_WITH que tiene como valor XMLHttpRequest, que permite del lado del servidor saber que esa es una llamada AJAX.

Ahora bien, yo comenzé con la segunda opción, la cual es una buena idea pero me genero muchos problemas porque a veces cuando hay algún problema con los datos enviados re-direcciono al inicio y muestro un mensaje de error, pero al hacer esto me mostraba la ventana de inicio completa, y eso no era lo que quería(eso me costo perder un trabajo). Pero después averiguando descubrí que en los últimos años a habido una estandarización en lo que se refiere a las llamadas AJAX en la mayoría de los framework donde envian una cabecera que se llama HTTP_X_REQUESTED_WITH y que con esta cabecera se puede averiguar fácilmente si es o no una llamada AJAX. Entonces con simplemte poner 1 linea de codigo averiguo si es o no una llamada AJAX:

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')

Por supuesto como no vamos a andar pegando todo ese poco de lineas en todos los lugares donde los necesitemos podemos crear una librería o helper donde pongamos una función que nos devuelva el valor y así facilitarnos la vida, vamos a crear la librería ajax.php y pegamos este código:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Ajax{
 function isAjax()
 {
  return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
 }
}
Con eso en nuestro controlador solo debemos poner: $this->ajax->isAjax() y ya nos dira si es o no una solicitud ajax. Bueno asta aquí este tutorial, espero que les sea de utilidad y lo implementen en sus proyectos, me despido hasta la próxima.

domingo, 10 de abril de 2011

Tutorial: de codeigniter agregando Form Validation Class al Chat.

Por petición de uno de los usuarios e decidió hacer este tutorial que es muy sencillo, lo que vamos a hacer es usar el form validation class para validar el nombre introducido por el usuario en el login del chat que hicimos en el tutorial pasado.

Para ello, primero les voy a explicar como opera el form validation class:

Todo comienza cuando el usuario entra a la pagina de login, php comprueba si previamente se a corrido la validación de formulario, despues si no se a corrido la inicia y renderiza la vista con el formulario, el formulario que esta apuntando al mismo controlador y metodo, el formulario es rellenado por el usuario y enviado, otra ves php vuelve a comprobar si la validaciond del formulario ya a sido iniciada previamente, si es asi, con las reglas establecidas previamente empieza a comprobar que todos los parametros cumplan las reglas, si no las cumplen te devuelve al login y muestra los errores, si efectivamente cumplen las reglas los envia a una pagina donde se muestre nuestro mensaje de exito o formulario enviado.

Primer paso: Ahora vamos al chat.

Ya no vamos a necesitar la función submit porque todo se va a hacer dentro de la misma función index, tenemos que precargar la librería de form_validation($this->load->library('form_validation');) la funcion para comprobar que la validacion del formulario ya inicio con anterioridad o el formulario enviado cumple todas las reglas es: $this->form_validation->run(), si la respuesta es false mostramos el formulario, y si la respuesta es true registramos la sesion y lo mandamos al chat. A la final nos debe quedar asi:

    function index()
    {
        $this->load->helper('form');
        $this->load->library('form_validation');

        if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('header');
            $this->load->view('login');
            $this->load->view('footer');
        }
        else
        {
            $this->session->set_userdata('name',$this->input->post('name'));
            redirect('/chat');
        }
    }

Cabe destacar que para que esto empieze a funcionar pues debemos en el formulario modificar la ruta del formulario a solo login, si lo ejecutamos ahorita veremos que el formulario solo se va a recargar y no va a hacer nada mas, porque no hemos establecido reglas de validacion.

Paso 2: Estableciendo las reglas de validación.

Para poner las reglas de validacion se usa esta funcion: $this->form_validation->set_rules();, la cual acepta tres parametros,
  1. El nombre exacto de el campo.
  2. El nombre humano, o como queremos que salga cuando s emuestren los errores.
  3. Las respectivas reglas de validación.
Como tenemos un solo campo pues va a ser mas sencillo, solo vamos a poner unas pocas reglas, estas deben estar separadas por "|" :
  1. required: Campo requerido
  2. min_length: Minima cantidad de caracteres
  3. max_length: Maxima cantidad de caracteres.
Solo deberiamos agregar: $this->form_validation->set_rules('name', 'Seudonimo', 'required|min_length[5]|max_length[32]');

Al ejecutarlo si no metemos nombre, o menor a 5 o mayor a 32 pues nos devolvera y no nos dara ningun error, sino es asi nos enviara al chat.

Paso 3: Mostrando los errores en el formulario.

Para mostrar los errores hay dos maneras, una mostrandolos todos a la ves y la otra que los muestra dependiendo del campo, la primera es con la funcion  validation_errors(); , la  segunda es con form_error('name'); en nuestro caso cualquiera de las dos opciones nos van a servir. Pueden ponerlo donde quieran.

Por defecto el error viene delimitado con una <p>, pero si deseamos cambiarlo podemos en el controlador poner $this->form_validation->set_error_delimiters('<div class="error">', '</div>');, individualmente form_error('name', '<div class="error">', '</div>'); o grupal validation_errors('<div class="error">', '</div>'); cualquiera de las tres opciones esta bien, seria bueno que añadieran al css esto:

.error{ display: block; margin-top: 10px; border: 1px solid #cd0a0a; background: #fef1ec; color: #cd0a0a; padding: 8px 10px 8px 10px; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px;}

Y si deseamos que los errores salgan en español pues debemos descargar de  http://sosinformatico.blogspot.com/2011/02/el-espanol-llego-codeigniter-20.html las librerias en español.


Paso 4: Rellenando el formulario.

Una de las cosas más fastidiosas que hay en internet es rellenar un formulario, creo que estaran de acuerdo conmigo que hay gente que se pasa de exagerado que para poder registrarte te piden mas datos que en el acta de nacimiento, y entonces imaginate llenaste los 50 campos que tiene el santo formulario y cuando le das enviar te equivocaste en el segundo campo porque se te olvido poner de que pais eres, y entonces tienes que rellenar todoooo el formulario de nuevo porque al programador le dio flojera de ayudarte un poco y poner que volvieran a slair los datos que ya tu habias introducido, pues bueno nuestra libreria ya trae funciones para todo eso, la funcion se llama set_value('name');, simplemente en el formulario agregamos un <?php echo set_value('name'); ?>, en el atributo value de nuestro input. La linea del input debe quedar asi:

<input type="text" name="name" id="name" value='<?php echo set_value('name'); ?>' />

Paso 5: Callback, nuestra propia regla de validación.

El form Validation class nos permite tambien crear nuestras propias reglas de validación, esto lo voy a hacer no porque el chat lo amerite, sino para que aprendan como se hace y que esto existe, la funcion sera solo para saber si el usuario solo introdujo caracteres permitidos,

Agregamos otra regla de validacion callback_caracteres, tambien en el controlador debemos crear una funcion llamada caracteres que va a recibir un parametro, y va a hacer una comprobacion de que el seudonimo comience con letras. si es asi retornara true, sino devolvera false se cancelara el envio del formulario y se mostrar el error que especifiquemos.

Con la funcion $this->form_validation->set_message('caracteres', 'El %s debe comenzar con letras.'); establecemos cual es el mensaje de error para nuestra funcion propia de validacion.

Asi queda el codigo al final:

    function index()
    {
        $this->load->helper('form');
        $this->load->library('form_validation');
        $this->form_validation->set_rules('name', 'Seudonimo', 'required|min_length[5]|max_length[32]|callback_caracteres');
        $this->form_validation->set_error_delimiters('<div class="error">', '</div>');
        if ($this->form_validation->run() == FALSE)
        {
            echo $this->form_validation->run();
            $this->load->view('header');
            $this->load->view('login');
            $this->load->view('footer');
        }
        else
        {
            $this->session->set_userdata('name',$this->input->post('name'));
            redirect('/chat');
        }
    }
    function caracteres($str)
    {
        if (preg_match("/^[a-zA-Z]/i", $str))
        {
            return TRUE;
        }
        else
        {
            $this->form_validation->set_message('caracteres', 'El %s debe comenzar con letras.');
            return FALSE;
        }
    }



Bueno hasta aqui el tutorial por hoy, espero que le haya gustado y les sirva, aqui esta el link con el chat como lo llevamos hasta ahora. http://www.box.net/shared/xssugse5qe

sábado, 9 de abril de 2011

Tutorial: Crea tu aplicacion de chat con codeigniter(php) y jquery ajax

 En el desarrollo web con codeigniter y jquery una de las primeras dudas que siempre surgen es como usar el jquery ajax con codeigniter, es uper sencillo y aquí les muestro un tutorial de como crear un chat con codeigniter y jquery ajax, este tutorial es inspirado en este tutorial, lo e echo también para que puedan hacer una comparación entre programar solo con php o programar con un framework. El chat que vamos a crear es muy sencillo y no trabaja con base de datos, pero para empezar a aprender sera muy util, después lo mejorare e ire publicando.



Introduccion:

Primero vamos a definir como va a ser la lógica de nuestro chat, el usuario entra a nuestro chat, el cual le va a mostrar un formulario para hacer login, cuando el usuario envie el formulario el sistema comprobara que halla especificado un nombre y después establecera una variable de sesión con el nombre del usuario lo enviara a el chat, el cual ara la comprobacion de que este establecido la variable de sesión con el nombre del usuario y mostrara el chat, el chat debe tener además de la función principal dos funciones mas una para mostrar el historial del chat y otra para agregar los mensajes que el usuario envié. Todo el historial se guardara en un solo archivo el cual sera que se le muestre al usuario.

Primer paso: Creando las vistas.

Aunque este tutoríal es muy sencillo, vamos a crear 4 vistas, 2 vistas serán el template, y las otras dos serán una para el login y la otra para el chat como tal.

Aquí les dejo los códigos de cada una de las vistas:

header.php

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN" “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Codeignier chat</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
</head>
<body>


footer.php

</body>
</html>

El footer y el header van a ser iguales tanto en el login como en el chat, estos dos solo incluyen la estructura del html y la referencia a el script de jquery.

login.php

<div id="loginform">
<form>
<p>Por favor introdusca su nombre para continuar:</p>
<label for="name">Nombre: </label>
<input type="text" name="name" id="name" />
<input type="submit" name="enter" id="enter" value="Enter" />
</form>
</div>
<style>
*{margin:0;padding:0; text-align:center;}
#loginform {
margin:0 auto;
padding-bottom:25px;
background:#EBF4FB;
border:1px solid #ACD8F0; }

#loginform { padding-top:18px; }

#loginform p { margin: 5px; }
</style>

En el formulario de login el usuario especificara cual es el nombre de usuario que desea usar.

chat.php

<style>
    /* CSS Document */
    body {
    font:12px arial;
    color: #222;
    text-align:center;
    padding:35px; }

    form, p, span {
    margin:0;
    padding:0; }

    input { font:12px arial; }

    a {
    color:#0000FF;
    text-decoration:none; }

    a:hover { text-decoration:underline; }

    #wrapper {
    margin:0 auto;
    padding-bottom:25px;
    background:#EBF4FB;
    width:504px;
    border:1px solid #ACD8F0; }
    #chatbox {
    text-align:left;
    margin:0 auto;
    margin-bottom:25px;
    padding:10px;
    background:#fff;
    height:270px;
    width:430px;
    border:1px solid #ACD8F0;
    overflow:auto; }

    #usermsg {
    width:395px;
    border:1px solid #ACD8F0; }

    #submit { width: 60px; }

    .error { color: #ff0000; }

    #menu { padding:12.5px 25px 12.5px 25px; }

    .welcome { float:left; }

    .logout { float:right; }

    .msgln { margin:0 0 2px 0; }
</style>
<div id="wrapper">
<div id="menu">
<p class="welcome">Bienvenido, xxxx<b></b></p>
<p class="logout"></p>
<div style="clear:both"></div>
</div>
<div id="chatbox"></div>
<input name="usermsg" type="text" id="usermsg" size="63" />
<input name="submitmsg" type="button"  id="submitmsg" value="Enviar" />
</div>

Este es el chat, ya de una ves con el estilo, en <p class='welcome'> bienvenido </p> es donde ira el nombre del usuario, en <p class="logout"></p> es donde ira el link para salir de la aplicacion, ya al final dos input uno tipo text, para que el usuario especifique el mensaje que desea enviar y el otro un boton simple para enviar el texto.

Paso 2:  Creando el login.

Bueno lo primero sera crear un controlador llamado login.php, y modificar en /application/config/routes.php y poner como controlador pre establecido($route['default_controller']) en login. De acuerdo a la lógica de lo que hay que hacer, debemos primero crear nuestra función index, y empezar cargando la libreria de sesión($this->load->library('session');) y el helper form ($this->load->helper('form');), despues continuamos cargando nuestra vista($this->load->view('login')), por supuesto tenemos que cargar las tres vistas header, login y footer, al usar la función $this->load->view se envían directamente como salida al navegador. la función index debería quedarnos así:

function index()
{
    $this->load->library('session');
    $this->load->helper('form');

    $this->load->view('header');
    $this->load->view('login');
    $this->load->view('footer');
}

También debemos crear una función más en nuestro controlador una llamada submit, donde se registra el nombre del usuario y se redireccionara a el chat.  Para comenzar nuestra función debemos meter en una variable el parametro enviado por post, con la libreria input que ya esta pre-cargada por defecto en codeigniter usando la funcion $this->input->post(), despues comprobar que no este vacio, y si esta vacia redireccionar al formulario de login, sino, establecer la variable de sesion($this->session->set_userdata();) con el nombre elegido por el usuario y redireccionamos al chat. Para redireccionar vamos a usar la función redirect() que pertenece a la url helper,

function submit()
{
        $name = $this->input->post('name');
        if(!empty($name))
        {
            $this->session->set_userdata('name',$name);
            redirect('/chat');
        }
        else
        {
            redirect('/login');
        }
}

Para no tener que estar cargando en cada funcion las diferentes librerias y helpers que vamos a necesitar, vamos a crear la funcion contructora y de hay los cagaremos:

    function __construct()
    {
        parent::__construct();
        $this->load->library('session');
        $this->load->helper('url');
        $this->load->helper('form');
    }

Paso 3: Estructurando el chat.

En el chat ya tenemos dispuesto un area donde vamos imprimir el nombre que el usuario eligio, con esta simple linea de codigo imprimiremos el nombre del usuario <?php echo $this->session->userdata('name'); ?>.

Tambien dispusimos un area donde esta el link de salida del chat donde crearemos el link con la funcion anchor que proviene de el helper url, pondremos <?php echo anchor('/chat/logout', 'Salir del chat.', "id='exit'") ?>, el primer parametro es a donde va a estar dirigido el enlace, el segundo es el texto que va a mostrar y el tercer parametro permite especificar atributos a el enlace, el atributo id  lo agregamos para crear una funcion para que parescar un cuadro de dialogo de confirmacion para salir del chat, para crear esta funcion debemos crear la etiqueta script y adentro colocar:

$(document).ready(function(){ 
    $('#exit').click(function(event){ 
        var exit = confirm('Esta seguro que deseas salir?');
        // con esta funcion aparecera un cuadro de confirmacion
        if(exit==false){return false;}
        // si la persona marco cancelar, la funcion devolvera false y se cancelara.
    });
});

Paso 4: Dandole vida al chat.

Ahora debemos darle vida a nuestro chat, para trabajar con archivos vamos a usar el helper file que trae codeigniter, primero debimos crear una carpeta en la ruta principal que la vamos a llamar chat y adentro crearemos un archivo llamado chat.html, completamente vacio hay guardaremos el historial del chat. De el helper file vamos a usar mas que todo estas dos funciones, read_file('./chat/chat.html') para leer el contenido del archivo y write_file('./chat/chat.html','lo que se le va a agregar al archivo','a'); para escribir al archivo, lo importante de destacar de esta funcion es que en el tercer parametro definimos el modo en que se va a escribir el archivo, el modo a simplemente agregara el texto al final del archivo, para mas informacion sobre lo modos aqui!.

Entonces en la vista agregaremos la funcion para leer el archivo dentro de <div id="chatbox"></div>.

Ahora si creamos el controlador chat, donde crearemos para empezar dos funciones el contructor y el index, en el contructor comprobaremos que este definido la variable de sesion con el nombre sino redirecionaremos al login, y en el index simplemente mostramos el chat.

    function __construct()
    {
        parent::__construct();
        $this->load->library('session');
        $this->load->helper('url');
        $this->load->helper('file');
        if(empty($this->session->userdata('name')))
        {
            redirect('/login');
        }
    }

    function index()
    {
        $this->load->view('header');
        $this->load->view('chat');
        $this->load->view('footer');
    }

Y la funcion actualizar donde el chat recibira el historial del chat.

function actualizar()
{
    echo read_file('./chat/chat.html');
}

Paso 5: Manejando las entradas del usuario.

Una vez que el usuario escriba el mensaje, deseamos tomar su entrada y escribirla en nuestro log de chat. Para lograr esto, debemos usar jQuery y codeigniter para sincronizar por ajax la informacion del lado del cliente y del servidor.

Jquery

En la vista del chat debemos agregar la funcion para que al hacer click en enviar se envie el contenido del input de usermsg a nuestro controlador y haci se agrege la entrada, esto se basara en la funcion post de jquery.

     $('#submitmsg').click(function(event){
        event.preventDefault(); //previene cualquier otro evento del boton.
        var clientmsg = $('#usermsg').val(); //obtiene el valor del input
        $.post('<?php echo site_url('/chat/agregar');?>', {mensaje: clientmsg});
       //hace la llamada ajax a el controlador, y envia  por post el mensaje
        $('#usermsg').attr('value', '');//limpia el input.
    });

Codeigniter

Para manejar las entradas del usuario debemos crear en el controlador de chat la funcion agregar.
Donde se agregara a nuestro chat el mensaje que el usuario escribio.

function agregar()
{
    $mensaje = "<div class='msgln'>(".date("g:i A").")  <b>".$this->session->userdata('name')."</b>:  ".$this->input->post('mensaje')."<br></div>";
    write_file('./chat/chat.html', $mensaje, 'a');
}

Paso 6: Mostrando el historial del chat

Después que se agrega el mensaje del usuario al historial del chat ahora ahi que poder mostrarlo al usuario, esto se hace también con una llamada ajas de jquery y una función en nuestro controlador de codeigniter


Solicitud por ajax del historial.

Esta solicitud es lo principal de nuestro sistema ya que esta le mostrara que es lo que a escrito el y lo que an escrito los demás usuarios, que es la base de cualquier chat.

En esta petición haremos la solicitud con la función ajax de jquery y pondremos el resultado en el div chatbox, esta funcion la vamos a enmarcar dentro de otra, la función nos quedaría así:

 $.ajax({
    type: "post",
    url: "<?php echo site_url('/chat/actualizar');?>",
    success: function(msg){
        $('#chatbox').html(msg);
    }
});

Auto-scrolling.

Como puede que hayan visto en otras aplicaciones de chat, el contenido automáticamente hace scroll hacia abajo si el contenedor del log de chat (#chatbox) se llena. Nosotros implementaremos una función simple y similar, que comparará la altura del scroll del contenedor antes y después de que hagamos la petición Ajax. Si la altura del scroll es mayor después de la petición, usaremos un efecto animado jQuery para hacer scroll en el div #chatbox.

    function loadLog(){
        var oldscrollHeight = $('#chatbox').attr('scrollHeight') - 20;
        $.ajax({
            type: "POST",
            url: "<?php echo site_url('/chat/actualizar');?>",
            success: function(msg){
                $('#chatbox').html(msg);
                var newscrollHeight = $('#chatbox').attr('scrollHeight') - 20; //La altura del scroll después del pedido
                if(newscrollHeight > oldscrollHeight){
                    $('#chatbox').animate({ scrollTop: newscrollHeight }, 'normal'); //Autoscroll hacia el fondo del div
                }
            }
        });
    } 

Primero almacenamos la pocisión del scroll antes de la solicitud, después de la solicitud almacenamos la nueva pocisión y si la nueva pocision es mayor que la vieja con la función animate hará una animación para bajar la pocisión de la ventana al final de la misma.

Ahora para actualizar constantemente el contenido del chat debemos usar la funcion setInterval, la cual cada cierto tiempo ejecutara la funcion loadLog, el segundo parametro especificara cada cuanto tiempo cargara la función.




Aqui esta el archivo completo: http://www.box.net/shared/q3hrklaca1.

Pd: Para evitar ataques xss, es bueno que activen el filtro xss general. Poniendo la variable $config['global_xss_filtering'] en true en el archivo /application/config/config.php.

lunes, 28 de marzo de 2011

Tutorial: Jquery UI autocomplete y Codeigniter

Después de un buen tiempo sin escribir por exceso de trabajo, vuelvo con el tutorial prometido de como usar jquery UI autocomplete con codeigniter, es muy sencillo. Para comenzar vamos a necesitar tener las librerías de jquery ui que se pueden descargar de la pagina oficial: aqui!, podemos descargar un tema si queremos(yo descargue darkhide) , y por supuesto tener codeigniter.

Paso 1: Preparando el terreno.

Primero tenemos que crear un controlador que yo le voy a llamar autocomplete, una vista con el mismo nombre y una base de datos de usuarios que se van a mostrar.

En el código del controlador debemos por ahora agregar la carga de nuestra vista y la carga de el driver para base de datos y el  uri helper que nos ayudara.

Código de controlador inicial:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Autocomplete extends CI_Controller {
    function __construct()
    {
        parent::__construct();
        $this->load->database();
        $this->load->helper('url');
    }
    public function index()
    {
        $this->load->view('autocomplete');
    }
}

/* End of file welcome.php */
/* Location: ./application/controllers/autocomplete.php */

En el código de vista solo debemos poner el enlace a el css y js de jquery ui, para facilitarnos la vida nos ayudaremos con la función base_uri que nos permitirá darle una ruta absoluta.

Código vista:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>jQuery UI Autocomplete Ejemplo</title>
        <link type="text/css" href="<?php echo base_url(); ?>css/dark-hive/jquery-ui-1.8.10.custom.css" rel="stylesheet" />    
        <script type="text/javascript" src="<?php echo base_url(); ?>js/jquery-1.4.4.min.js"></script>
        <script type="text/javascript" src="<?php echo base_url(); ?>js/jquery-ui-1.8.10.custom.min.js"></script>
        <script type="text/javascript">
        </script>
    </head>
    <body>
    
    </body>
</html>

Y por ultimo crearemos una pequeña Base de datos de usuarios con solo un id y nombre de usuario, así:

CREATE TABLE `autocomplete`.`usuarios` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user` VARCHAR( 80 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
);


INSERT INTO `usuarios` (`id`, `user`) VALUES
(1, 'mariano'),
(2, 'jose'),
(3, 'juan eduardo'),
(4, 'juan pedro'),
(5, 'no se uqe'),
(6, 'no se uqe mas'); 


Lo ultimo de este paso es configurar nuestra base de datos y ya debería cargar una pagina en blanco.

Paso 2: Configurando nuestra vista con autocomplete.

Ahora debemos configurar en la vista el autocomplete, solamente debemos agregar en el cuerpo un input text, y dentro de las etiquetas script la configuracion del autocomplete que va a ser referencia a una función que despues crearemos en nuestro controlador que se llamara ajax. Asi nos debería ir quedando la vista:
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>jQuery UI Autocomplete Ejemplo</title>
        <link type="text/css" href="<?php echo base_url(); ?>css/dark-hive/jquery-ui-1.8.10.custom.css" rel="stylesheet" />    
        <script type="text/javascript" src="<?php echo base_url(); ?>js/jquery-1.4.4.min.js"></script>
        <script type="text/javascript" src="<?php echo base_url(); ?>js/jquery-ui-1.8.10.custom.min.js"></script>
        <script type="text/javascript">
        $(document).ready(function(){
            $('#autocomplete').autocomplete({source:'<?php echo site_url('autocomplete/ajax'); ?>'});
        });
        </script>
    </head>
    <body>
    <p><label for='autocomplete'>Nombre de Usuario: </label><input type='text' id='autocomplete'></p>
    </body>
</html>
Paso 3: Empezando con el controlador.(Input Class)

En el controlador debemos crear una función llamada ajax que sera la encargada de enviar en formato json los datos para el autocomplete, para esto vamos a usar el Active Record Class de Codeigniter y el input class.

El codeigniter trae una clase ya echa y precargada para lo que son los input, esta libreria incluye funciones muy utiles:
  1. Pre-procesa todas las variables de entrada por seguridad.
  2. Provee algunas funciones para procesar las variables enviadas y pre-procesarlas.
Esta libreria nos provee una función que se llama $this->input->get(), esta función permite dos parametros el primero es para saber que variable de $_GET requerimos y el segundo establecer el filtrado en true(activado) o false(desactivado). La otra ventaja de esta función es que no nos va a dar error si nuestra variable no fue definida, ya que si la variable no fue definida devuelve un false. en nuestro caso agregariamos lo siguiente al código:
if($buscar=$this->input->get('term'))
{ 
} 
Paso 4: Usando Active Record Class para buscar en la base de datos.

Continuamos con el active record class, esta clase trae funciones para seleccionar, insertar, eliminar y modificar ya predefinidas que nos pueden ahorrar muchas lineas de código ademas de que con estas funciones ya todo va pre-filtrado contra posibles ataques.

lo primero es ver la función basica de select, $query=$this->db->get('usuarios') esta función haria simplemente un "select * from usuarios" y devuelve un objeto en $query. Como queremos buscar dentro de user los usuarios que tengan un nombre parecido a el termino de busqueda, debemos usar la función $this->db->like(), que recibe dos parametros, en uno la columna en la que deseamos buscar y el otro lo que deseamos buscar. Y por ultimo usaremos la funcion $this->db->select(), para poder especificar que columnas queremos y como las queremos: a la final nuestra funcion nos quedaria asi:

        $this->db->select('id, user as value');
        $this->db->like('user', $buscar); 
        $query=$this->db->get('usuarios');

Que generaria algo asi "SELECT `id`, `user` as value FROM (`usuarios`) WHERE user` LIKE '%$buscar%'"

Ahora solo debemos verificar que la respuestasea mayor que 0, pero en ves de usar el clasico mysql_num_rows usaremos $query->num_rows() > 0, y  para listar los resultados en ves de while ($row = mysql_fetch_array($result) ) usaremos foreach ($query->result_array() as $row). y por ultimo usamos la funcion json_encode para pasar nuestro array al formato json.

Condigo de la funcion ajax():
function ajax()
    {
        if($buscar = $this->input->get('term'))
        {
            $this->db->select('id, user as value');
            $this->db->like('user', $buscar); 
            $query=$this->db->get('usuarios');
            if($query->num_rows() > 0)
            {
                foreach ($query->result_array() as $row)
                {
                    $result[]= $row;
                }
            }
            echo json_encode($result);
        }
    } 

Con esto ya queda listo nuestro autocomplete solo queda probarlo.

Nota:
  • Si usan php 5 pueden usar el Method Chaining que les permite hacer los select en una sola linea.
  • Es buena idea limitar el numero de filas que vamos a devolver con agregar $this->db->limit(10); es suficiente.
  • Este metodo devulve el id de el usuario a el autocomplete, podemos agregar al autocomplete el siguiente codigo para usar en algo esa info:

    select: function( event, ui ) {
    alert(ui.item ?
    "Selected: " + ui.item.id :
    "Nothing selected, input was " + this.value );
    }


El resultado final esta en esta dirreccion: http://www.box.net/shared/agnursjr8n

domingo, 20 de febrero de 2011

Que es Codeigniter y porque usarlo como framework de desarrollo.

Codeigniter es simplemente un framework para el desarrollo de aplicaciones escritas en php que utiliza el MVC, que permite a los desarrolladores Web mejorar la forma de trabajar y también agregar mayor velocidad a la hora de crear una pagina Web. Codeigniter no es el único framework del mercado, también están zend, cakephp, symphony, entre otros. Pero CI (Codeigniter) se diferencia al resto por lo rápido, lo extensible, lo sencillo de aprender y lo poderoso que puede llegar a ser si lo sabemos usar bien. Codeigniter fue desarrollado por EllisLab y hasta la versión 1.7.3 soportaba php 4, ya para la versión 2.0 solo soporta php 5.







Que es el MVC??

El MVC es el acrónimo de Modelo Vista Controlador, que es un patrón para el desarrollo de software que separa la lógica de control, la interfaz del usuario y los datos del sistema. En este tipo de arquitectura del software existe un sistema central o controlador que controla las entradas y salida del sistema, un o unos modelo que se encargan de buscar los datos e información que sea necesaria y unas interfaz grafica que son lo muestran que es lo que al final va a ver un usuario.

El MVC es muy usado en el desarrollo Web porque a diferencia de la creación de programas locales donde se usa por lo general un mismo lenguaje para desarrollar toda un aplicación en el desarrollo Web se requiere por lo menos usar 2 lenguajes(html y php) para crear una pagina simple, y todo esto en una sola pagina aunado a las consultas en la base de datos que son imprescindibles pues crean hasta paginas de 300 líneas que después para depurar, mejorar o saber donde nos estamos equivocando es un poco difícil. A continuación una explicación un poco más detallada del model, vista y controlador:

  • Modelo: es el que se encarga de la gestión de la base de datos y toda la lógica del negocio, el modelo permite abstraer al resto de la aplicación de como se obtienen o gestionan los datos. Lo cual nos da una ventaja ya que si después se requiere migrar la base de datos o cambiar algo, no va a ser necesario modificar ni la vista ni los controladores, lo cual nos facilita el trabajo. Otra cosa importante de destacar es que el modelo permite la reutilización de código ya que varios controladores pueden usar el mismo modelo sin que eso afecte en nada a los otros controladores y se evita tener que crear un modelo para cada controlador.
  • Controlador: es el centro de control de nuestra aplicación, se encarga de recibir la información del usuario procesarla, validarla, sacar o introducir la información lo que sea necesario con la ayuda de los modelos y renderizar una nueva vista acorde a las necesidad del usuario.
  • Vista: como ya dije anteriormente la vista va a ser la interfaz para nuestro usuario, en nuestro sistema siempre vamos a tener diversidad de vistas que deberán ser cargadas por el control de acuerdo a las necesidades, en desarrollo Web para crear una vista se requiere de html y php, sin contar con que se puede agregar css y javascript para darle mas dinámica a nuestro sitio y mejor apariencia. En la vista va a seguir existiendo código php, pero esta ves pequeños códigos solo para hacer repeticiones o mostrar uno que otro dato importante.

Codeigniter usa este patrón y además agrega librerías, ayudantes y drivers para ayudarnos a simplificar las tareas en el desarrollo de nuestro sistema, con funciones ya predefinidas que nos facilitan el trabajo.

En codeigniter se sigue el siguiente flujo, que después explicare mejor pero para que lo vayan viendo:



En resumen codeigniter, es un útil framework sencillo de aprender, útil para programar, poderoso y nos permite trabajar entre varios programadores al mismo tiempo.

jueves, 10 de febrero de 2011

El español llego a Codeigniter 2.0

Muchos de nosotros hemos usado las librerias y clases que trae el codeigniter y debimos habernos fijados muchas veces como los mensajes de error o cualquier otro mensaje siempre sale en ingles, aqui les traigo actualizado a CI 2.0.0 el lenguaje español listo para usar en nuestros proyectos, aqui les dejo el enlace:

Box.net: CI español(7kb)

Como usarlo?? pues es simple, solo nos vamos a la carpeta /system/language, hay creamos una carpeta que le podemos llamar español y dentro de esa carpeta extraemos los archivos. Despues si queremos usar este idioma tenemos que ir a /application/config/config.php  y modificar donde en la variable language la modificamos de english a español y nos deberia quedar asi:
$config['language']='español';