Mostrando entradas con la etiqueta php. Mostrar todas las entradas
Mostrando entradas con la etiqueta php. 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...

martes, 23 de junio de 2015

Joomla cargar un modulo dentro de un componente

Dejo una función para cargar un modulo dentro de un componente en joomla, despues nada más tienes que invocarla con el nombre de la posición y listo.

function load_module_position( $position, $style = 'xhtml')
{
   switch($style)
   {
      case 'table':
         $style = 1;
         break;
      case 'horz':
         $style = 1;
         break;
      case 'none':
         $style = -1;
         break;
      case 'xhtml':
         $style = -2;
         break;
      case 'rounded':
         $style = -3;
         break;
      default:
         $style = -2;
         break;
   }

   $document   = &JFactory::getDocument();
   $renderer   = $document->loadRenderer('module');
   $params      = array('style'=>$style);

   $contents = '';
   foreach (JModuleHelper::getModules($position) as $mod)  {
      $contents .= $renderer->render($mod, $params);
   }
   return $contents;
}

viernes, 16 de noviembre de 2012

Tutorial JqGrid + PHP + MYSQL

Siguiendo los cursos de JqGrid, ahora voy a mostrarles como hacer para montar el lado del servidor con PHP y MYSQL.

JqGrid es un sistema muy poderoso pero tiene la limitante que en modo data local máximo puede contener mil registros por las limitantes de Javascript, pero conectado directamente con un servidor que se encargue de todos los procesos, puede contener el numero de registros que necesitemos. Lo cual nos permite almacenar tranquilamente 20.000 filas de elementos sin ningún problema.

En este tutorial explicamos como conectar JqGrid con mysql, para cargar los datos JqGrid requiere para poder realizar la consulta ajax, que el archivo este en formato json o xml, en este tutorial vamos a explicar como se usa JqGrid en formato json, para cargar la data desde un servidor en php.



Formato de la solicitud AJAX
La solicitud ajax echa por JqGrid al servidor tiene estos parámetros:

  • nd: es simplemente la hora en la que se hizo la solicitud.
  • rows: el numero de lineas que se va a mostrar al usuario.
  • page: la pagina que se va a consultar en el momento.
  • sidx: el elemento por el cual se va a ordenar la consulta.
  • sord: el tipo de orden de la tabla asc o desc.
  • _search: esto es un bolleano que contiene false o true en el caso de que se se use la barra de filtros y se este buscando algo en especifico.
  • Listas de elementos: cada uno de los index de los elementos que usemos en la búsqueda van a salir de la filter toolbar también serán enviados como parámetros.


Formato del archivo JSON
El archivo json por el servidor debe contener los siguientes atributos:

  • page: La pagina actual que esta mostrando.
  • records: el numero de registros que hay en total en la tabla.
  • rows: las filas que vamos a devolver actualmente al sistema
  • total: el numero de paginas en total que hay en el sistema.
Conectando JqGrid con PHP y Mysql.
El proceso para hacer el puente de la información es:
  1. Primero hacemos lo normal y nos conectamos a la base de datos. 
  2. Después guardamos en un array todos los elementos de la solicitud que hace JqGrid.
  3. Construimos la consulta de filtrado para la barra de búsqueda. para construir la consulte lo dividi en dos partes el area de los like y el área de los equal, porque hay campos como los nombres que la búsqueda se puede parecer y hay campos como un total que tienen que ser exactos, pero ya cada uno podrá elegir como prefiera.
  4. Hacemos una consulta a la base de datos para saber el numero de filas que hay en total. 
  5. Calculamos el numero de paginas que hay, y averiguamos si la pagina es la correcta.
  6. Construimos la consulta añadiéndole los filter, los search y el orden.
  7. Hacemos la consulta para traernos los resultados que necesitamos en especifico.
  8. Por ultimo le devolvemos los datos al JqGrid.
Aquí esta el código explicado:
(isset($_REQUEST['rows']))?$_REQUEST['rows']:'',
  'page'=>(isset($_REQUEST['page']))?$_REQUEST['page']:'',
  'orderby'=>(isset($_REQUEST['sidx']))?$_REQUEST['sidx']:'',
  'orden'=>(isset($_REQUEST['sord']))?$_REQUEST['sord']:'',
  'search'=>(isset($_REQUEST['_search']))?$_REQUEST['_search']:'',
 );
 $se ="";
 //creamos la consulta de busqueda. 
 if($post['search'] == 'true'){
  $b = array();
  //Usamos la funci{on elements para crear un arreglo con los datos que van a ser para buscar por like
  $search['like']=elements(array('total','nota'),$_REQUEST);
  //haciendo un recorrido sobre ellos vamos creando al consulta.
  foreach($search['like'] as $key => $value){
   if($value != false) $b[]="$key like '%$value%'";
  }
  //Usamos la funci{on elements para crear un arreglo con los datos que van a ser para buscar por like
  $search['where']=elements(array('fecha','cantidad','taza','cliente'),$_REQUEST);
  //haciendo un recorrido sobre ellos vamos creando al consulta.
  foreach($search['where'] as $key => $value){
   if($value != false) $b[]="$key = '$value'";
  }
  //Creamos la consulta where
  $se=" where ".implode(' and ',$b );  
 }
 //Realizamos la consulta para saber el numero de filas que hay en la tabla con los filtros
 $query = mysql_query("select count(*) as t from inventario".$se);
 if(!$query)
  echo mysql_error();
 $count = mysql_result($query,0);

 if( $count > 0 && $post['limit'] > 0) {
  //Calculamos el numero de paginas que tiene el sistema
  $total_pages = ceil($count/$post['limit']);
  if ($post['page'] > $total_pages) $post['page']=$total_pages;
  //calculamos el offset para la consulta mysql.
  $post['offset']=$post['limit']*$post['page'] - $post['limit'];
 } else {
  $total_pages = 0;
  $post['page']=0;
  $post['offset']=0;
 }
 //Creamos la consulta que va a ser enviada de una ves con la parte de filtrado
 $sql = "select id, fecha, cliente, cantidad, taza, total, nota from inventario  ".$se;
 if( !empty($post['orden']) && !empty($post['orderby']))
  //Añadimos de una ves la parte de la consulta para ordenar el resultado
  $sql .= " ORDER BY $post[orderby] $post[orden] ";
 if($post['limit'] && $post['offset']) $sql.=" limit $post[offset], $post[limit]";
  //añadimos el limite para solamente sacar las filas de la apgina actual que el sistema esta consultando
  elseif($post['limit']) $sql .=" limit 0,$post[limit]";
 
  
 $query = mysql_query($sql);
 if(!$query)
  echo mysql_error();
 $result = array();
 $i = 0;
 while($row = mysql_fetch_object($query)){
   $result[$i]['id']=$row->id;
  $result[$i]['cell']=array($row->id,$row->fecha,$row->cliente,$row->cantidad,$row->taza,$row->total,$row->nota);
  $i++;
  
 }
 //Asignamos todo esto en variables de json, para enviarlo al navegador.
 
 $json = new stdClass();
 $json->rows=$result;
 $json->total=$total_pages;
 $json->page=$post['page'];

 $json->records=$count;
 echo json_encode($json);
 
 mysql_close($link);
 
 function elements($items, $array, $default = FALSE)
 {
  $return = array();
  if ( ! is_array($items)){
   $items = array($items);
  }
  foreach ($items as $item){
   if (isset($array[$item])){
    $return[$item] = $array[$item];
   }else{
    $return[$item] = $default;
   }
  }
  return $return;
 }
?>
Este es el resultado final: http://bomba1990.pythonanywhere.com/sosinformatico/js/JqGrid_Basico4
Codigo Github: https://github.com/bomba1990/JqGrid-Ejemplos/blob/master/JqGrid-Basico-4-DB.html
https://github.com/bomba1990/JqGrid-Ejemplos/blob/master/ajax.php

Suerte y espero que les sea de utilidad a todos los que lo solicitaron.

lunes, 15 de agosto de 2011

PHP: Como averiguar si un usuario existe o no en twitter

Después de tratar fallida mente con jquery de averiguar si NO EXISTE un usuario en twitter pues ahora lo hice con php, con php déjenme decirles que si se puede lograr si existe o no un usuario en twitter, ya en http://sosinformatico.blogspot.com/2011/08/como-averiguar-si-un-usuario-existe-o.html puse algunos datos básicos, aquí voy a poner el script con el ejemplo ya echo:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"  "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> 
<html>
<head>
	<script type="text/javascript" src="jquery.min.js"></script>
	<title>Twitter application</title>

</head>
<body>
	<form action='' >
	<input type='text' name='twitter'>
	<input type='submit'>
	</form>
	<?php
	if(isset($_GET['twitter']))
	{
		$var = @fopen("http://api.twitter.com/1/users/show.json?screen_name=".$_GET['twitter'],'rb');
		if($var)
		{
			echo "<p>usuario existe</p>";
			echo "<pre>";
			var_dump(json_decode(stream_get_contents($var)));
			echo "</pre>";
			fclose($var);
		}
		else
		{
			echo "usuario no existe";
		}
	}

	?>
</body>
</html>

martes, 9 de agosto de 2011

Libreria GD, Crear imagenes con transparencia.



En php para crear imágenes con php como ya e comentado como hace con la librería GD en estos dos tutoriales:

http://sosinformatico.blogspot.com/2011/02/tutorial-creando-un-bonito-y-estilizado.html
http://sosinformatico.blogspot.com/2011/02/tutorial-creando-un-bonito-y-estilizado_24.html

Ahora les voy a mostrar como manejar los colores con transparencia y crear imágenes con transparencias.

Cuando creamos una imagen con gd pues por defecto esta tiene color negro y no esta preparada para usar transparencias  para poder usar las transparencias hay que primero activarlas como tal en la imagen para después poderlas usar, las funciones que se necesitan para trabajar con imagenes se usan las siguientes funciones:

imagecolorallocatealpha
Imagecolortransparent
imagealphablending
imagesavealpha

Lo primero que debemos saber es que se necesita tener instalado la version 2 de la libreria db, si ya la tenemos instalada podemos continuar tranquilamente, lo segundo que hay que denotar es que solo podemos trabajar con imágenes gif y png, ya que estas son los unicos dos formatos que soportan canales alfa. La primera función que vamos a analizar es:

Imagecolortransparent

Con esta función definimos un color en una imagen como transparente, para que puede funcionar las imagenes deben haber sido creadas con imagecopymerge() o imagecreatetruecolor(), y lo que hace es especificar un color como transparente en el la imagen, por ejemplo:

<?php
// Crear una imagen de 100x100
$im = imagecreatetruecolor(100, 100);
$rojo = imagecolorallocate($im, 255, 0, 0);
$negro = imagecolorallocate($im, 0, 0, 0);

// Hacer el fondo transparente
imagecolortransparent($im, $negro);

// Dibujar un rectángulo rojo
imagefilledrectangle($im, 4, 4, 50, 25, $rojo);
header('Content-type: image/png');
// Guardar la imagen
imagepng($im);
imagedestroy($im);
exit();
?>

si hacemos esto y lo guardamos con png o gif, pues guarda una imagen con un cuadrado rojo y el fondo transparente, si cambiamos el color transparente de $negro a $rojo veremos que el fondo sale negro y el rectángulo rojo, eso funciona y windows y los navegadores agarran la transparencia de las imágenes png pero photoshop no, photoshop se da cuenta y lo dibuja con el color como es. Por eso recomiendo hacerlo de la siguiente manera:


Imagealphablending y Imagesavealpha


Imagealphablending especifica en que modo serán mezclado los colores a la hora de dibujar una imagen, cuando se establece en true pues al dibujar colores el canal alpha que sea establecido para dibujar sera tomado como la cantidad que va a brillar el color subyacente a través de colores de la imagen, y cuando se establece en false pues se guarda de verdad el canal alpha en la imagen.

A la hora de crear imagenes el uso de estas funciones depende de en que formato lo vamos a guardar si es gif con la función imagealphablending es suficiente pero si vamos a crear una imagen png debemos usar la función imagesavealpha para especificar la bandera de que se debe guardar toda la imagen alpha. 

Imagecolorallocatealpha

Ahora bien para poder dibujar un color transparente o semi trasnparente en una imagen, pues debemos usar la función imagecolorallocatealpha, y que es casi la misma que imagecolorallocate lo unico es que agrega un parametro que es el nivel de alfa que va a tener ese colo que el rango es de 0 a 127 siendo 127 el trasnparente absoluto.


Aqui esta el mismo ejemplo anterior pero acomodado para png:

<?php
// Crear una imagen de 100x100
$im = imagecreatetruecolor(100, 100);
imagealphablending($im, false);
imagesavealpha($im, true);
$rojo = imagecolorallocate($im, 255, 0, 0);
$negro = imagecolorallocatealpha($im, 0, 0, 0,127);

// Dibujar el fondo transparente
imagefilledrectangle($im, 0, 0, 100, 100, $negro);
// Dibujar un rectángulo rojo
imagefilledrectangle($im, 4, 4, 50, 25, $rojo);
header('Content-type: image/png');
// Guardar la imagen

imagepng($im);
imagedestroy($im);
exit();
?>
Resultado final:

Ahora aparte les dejo dos ejemplos de imágenes con transparencia:


1. 3 círculos semitransparentes con fondo transparente:

<?php
$tamaño = 300;
$imagen=imagecreatetruecolor($tamaño, $tamaño);
imagealphablending($imagen, false);
imagesavealpha($imagen, true);
// algo para obtener un fondo transparente
$fondo = imagecolorallocatealpha($imagen, 255, 255, 255,127);
imagefilledrectangle($imagen, 0, 0, $tamaño, $tamaño, $fondo);

$amarillo_x = 100;
$amarillo_y = 75;
$rojo_x     = 120;
$rojo_y     = 165;
$azul_x     = 187;
$azul_y     = 125;
$radio      = 150;
// asignar colores con valores alfa
$amarillo = imagecolorallocatealpha($imagen, 255, 255, 0, 75);
$rojo     = imagecolorallocatealpha($imagen, 255, 0, 0, 75);
$azul     = imagecolorallocatealpha($imagen, 0, 0, 255, 75);
// dibujar 3 círculos solapados
imagefilledellipse($imagen, $amarillo_x, $amarillo_y, $radio, $radio, $amarillo);
imagefilledellipse($imagen, $rojo_x, $rojo_y, $radio, $radio, $rojo);
imagefilledellipse($imagen, $azul_x, $azul_y, $radio, $radio, $azul);
// ¡no olvide imprimir la cabecera correcta!
header('Content-type: image/png');
// y finalmente, imprimir el resultado
imagepng($imagen);
imagedestroy($imagen);
?>
Resultado final:
http://courch7642.webcindario.com/blog/gd3.php


2. Este codigo genera fondos semitransparentes muy útiles a la hora de diseñar una pagina web. y lo mejor es que podemos especificar que color queremos.

<?php
if(isset($_GET['hex']))
{
	$hex=$_GET['hex'];
	header('Content-Transfer-Encoding: binary');
	header('Content-type: image/png');
	//creo imagen
	if(strlen($hex)==6)
	{
		$hcnt=strlen($hex)/3;
		$color['red']=hexdec(substr($hex,0,$hcnt));
		$color['green']=hexdec(substr($hex,$hcnt,$hcnt));
		$color['blue']=hexdec(substr($hex,$hcnt*2));
	}
	else
	{
		$color['red']=0;
		$color['green']=0;
		$color['blue']=0;
	}
	$fondo = imagecreatetruecolor(10,10);
	imagealphablending($fondo, false);
	imagesavealpha($fondo, true);
	$color['img']=imagecolorallocatealpha($fondo, $color['red'], $color['green'], $color['blue'],75);
	imagefilledrectangle($fondo, 0, 0, 10, 10, imagecolorallocatealpha($fondo, 255, 255, 255,0));
	imagefilledrectangle($fondo, 0, 0, 10, 10, $color['img']);

	imagepng($fondo);
	imagedestroy($fondo);
}
?>

Resultado final:
http://courch7642.webcindario.com/blog/gd.php?hex=ff0000

http://courch7642.webcindario.com/blog/gd.php?hex=79B7E7



lunes, 8 de agosto de 2011

PHP: Modificar la codificación de un texto.

Para modificar la codificación de caracteres con php se hace con la funcion iconv, esta funcion nos permite cambiar la codificación de caracteres de un texto puede ser a utf-8 o iso-8859-1, aqui les dejo un ejemplo donde pasamos caracteres de utf-8 a iso-8859-1:

<?php
$text = "Este es el símbolo del euro: '€'.";
echo 'Original : ', $text, PHP_EOL;
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo 'Plain    : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;
?>

Si se añade el string //TRANSLIT la codificación de salida, se activa la transliteración. Esto significa que cuando un caracter no puede ser representado en el set de caracteres final, se puede aproximar a uno o varios caracteres parecidos. Si se añade el string //IGNORE, los caracteres que no puedan ser representados en el set de caracteres final son descartados sin generar error. Sino especificamos ninguno de los dos lo más probable es que nos de un error.

Tambien existen las siguientes funciones que sirven para trabajar con cabeceras de mensajes:

iconv_mime_encode
iconv_mime_decode
iconv_mime_decode_headers

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);

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.

viernes, 25 de febrero de 2011

Tutorial: Creando un bonito y estilizado contador con php y GD library.(parte 2)

Ahora si vamos a por el script


Paso 1: Comenzando con el desarrollo.

Primero vamos a necesitar un fondo para nuestra imagen. Yo les proporciono este con el logo de Codeigniter para probar, tiene un tamaño de 400x60 a este fondo le vamos a poner ‘fondo.jpg’ ustedes pueden usar el que prefieran.



Ahora vamos a crear un archivo que se llame contador.php y vamos a colocar lo siguiente


<?php 
Header("Content-type: image/png"); 
$im = imagecreatefromjpeg("fondo.jpg"); 
imagepng($im); 
imagedestroy($im); 
?> 

Vamos a utilizar la función header para especificar que esto va a ser una imagen png, hago esto de esta manera para que se den cuenta que aunque creemos una imagen a partir de una en jpeg podemos crear una en formato png o gif como queramos. Veremos que al ejecutar nuestro script veremos la misma imagen que tenemos en la carpeta y también si revisamos la información de la imagen veremos que dice imagen png.


Paso 2: Imprimiendo el numero en la imagen.


Vamos a necesitar ahora una fuente TrueType, en San google podremos conseguir cualquier cantidad de fuentes, yo les proporciono en el archivo final una para este ejercicio que se llama 'Broken Poster Tour.ttf', para poder usar esta letra vamos a requerir primero crear un color para nuestra letra así que vamos a añadir los comandos antes vistos Imagettftext y Imagecolorallocate. Nuestro código nos va a ir quedando así:

<?php 
$numero=5;
Header("Content-type: image/png"); 
$im = imagecreatefromjpeg("fondo.jpg"); 
$col = imagecolorallocate($im, 255, 255, 255); 
imagettftext ($im, 35, 0, 90, 50, $col, 'Broken Poster Tour.ttf',$numero); 
imagepng($im); 
imagedestroy($im); 
?>

Si vamos bien hasta ahora debemos tener de salida algo así:


Nota: si nos sale un error en FireFox que diga así:


No se puede Mostrar la siguiente imagen “xx” porque contiene errores


Debemos primero comentar con ‘//’ la función header, guardar y volver a ejecutar para poder ver cual es el error que tenemos.


Paso 3: Dándole un formato acorde al numero.


A partir de este paso ya no tiene nada que ver con la creación de imágenes sino mas bien con mejorar nuestro script, en este paso vamos a dar formato al texto para que tenga una longitud siempre igual y con delimitador de miles, para ello vamos a usar estas dos funciones: number_format y str_pad.


Number_format: esta función nos va a dar formato el número con separador de miles. Así va a ir quedando nuestro número:

$numero = number_format($numero, 0, '', '.'); 

Str_pad: rellena un texto a cierto tamaño con una cadena. Después le agregamos esta función y nos queda así:

$numero = str_pad(number_format($numero, 0, '', '.'),8,'0', STR_PAD_LEFT); 

Con esto ya tenemos un número de longitud con su respectivo separador de miles con punto. El código nos debe ir quedando así:

<?php 
$numero=5; 
$numero = str_pad(number_format($numero, 0, '', '.'),8,'0', STR_PAD_LEFT); 
Header("Content-type: image/png"); 
$im = imagecreatefromjpeg("fondo.jpg"); 
$col = imagecolorallocate($im, 255, 255, 255); 
imagettftext ($im, 35, 0, 90, 50, $col, 'Broken Poster Tour.ttf',$numero); 
imagepng($im); 
imagedestroy($im); 
?> 

Paso 4: Almacenando el numero.

Ahora ya tenemos una script en php que genera contador nos falta es un lugar donde guardar el numero para que cada ves que alguien visite nuestra pagina se aumente en uno, en este ejemplo vamos a almacenar el numero en un archivo que vamos a llamar ‘contador.dat’.

Primero abrimos el archivo con Fopen donde tenemos que especificar la ruta del archivo y el modo, el modo que vamos a poner es ‘r+’, porque así vamos a poder leer y escribir a la ves nuestro archivo, eso si nuestro archivo debe existir si nos dará error.


Después leemos con fread(), devolvemos el puntero al inicio del archivo con rewind(), escribimos el nuevo total con fwrite() y cerramos la conexión fclose(). Al final nuestro script quedaría de la siguiente forma:

<?php
$archivo = "contador.dat";   
$abre = Fopen($archivo, "r+"); 
$numero = fread($abre, Filesize($archivo)); 
rewind($abre); 
Fwrite($abre, ++$numero); 
Fclose($abre); 

$numero = str_pad(number_format($numero, 0, '', '.'),8,'0', STR_PAD_LEFT); 
Header("Content-type: image/png"); 
$im = imagecreatefromjpeg("fondo.jpg"); 
$col = imagecolorallocate($im, 255, 255, 255); 
imagettftext ($im, 35, 0, 90, 50, $col, 'Broken Poster Tour.ttf',$numero); 
imagepng($im); 
imagedestroy($im); 

?> 



Paso 5: Evitando contar números de más.


Ya tenemos nuestro contador listo y operativo, pero ahora nos surge un problema, el contador se va a actualizar cada ves que yo refresque la pagina ¿Pero de verdad quiero yo eso? Si yo quiero saber realmente el número de personas que visiten mi página, no me va a interesar que se cambie la cantidad de visitas cada ves que cargue la página sino cuando entre una persona diferente diariamente. Para hacer esto vamos a utilizar las cookies, vamos a almacenar con la función setcookie una variable en el navegador del visitante con un tiempo de vida de 24 horas, para que así tengamos un contador más realista. Agregaremos este código:

if (!isset($_COOKIE['visita'])) //comprobamos que la cookie NO este ya puesta
{
// aqui editaremos el archivo y guardaremos el numero
setcookie("visita", "lo que sea", time()+86400); //estableceremos la cookie con una caducidad de 24h = 86400seg
} 

Y el código a la final nos quedaria asi.

<?php 
    $archivo = "contador.dat"; 
    $abre = Fopen($archivo, "r+");
    $numero = fread($abre, Filesize($archivo));
    if (!isset($_COOKIE['visita'])) 
    {
        rewind($abre);
        Fwrite($abre, ++$numero);
        setcookie("visita", "lo que sea" , time()+86400);
    }
    Fclose($abre);

    $numero = str_pad(number_format($numero, 0, '', '.'),8,'0', STR_PAD_LEFT);
    
    Header("Content-type: image/png");
    $im = imagecreatefromjpeg("fondo.jpg");
    $col = imagecolorallocate($im, 255, 255, 255);
    imagettftext ($im, 35, 0, 90, 50, $col, 'Broken Poster Tour.ttf',$numero);
    imagepng($im);
    imagedestroy($im);
    setcookie("TestCookie", $value);
?> 
 
Aqui esta el archivo completo con fuentes y todo.
http://www.megaupload.com/?d=ED5CV7UD

miércoles, 23 de febrero de 2011

Manipulando las cabeceras HTTP con php

¿Qué es HTTP?

HTTP es el protocolo de transmisión de datos que le da vida a la gran telaraña mundial de la Web, es lo que permite que hoy cree un blog y tú lo puedas leer, este protocolo se basa en transacciones independientes una de otra y sigue el esquema petición respuesta entre cliente-servidor, cada transacción consta de una línea de petición, cabecera general, cabecera de solicitud o respuesta, cabecera de entidad y cuerpo de entidad.

Este protocolo NO guarda la información sobre conexiones anteriores. Para el desarrollo de aplicaciones Web dinámicas se requiere mantener alguna información y para ello se instaura la noción de sesiones del lado del servidor y también se pueden guardar pequeñas cantidades de información en las en el navegador, ha esta información que se guarda en el navegador se le llaman cookies.

Para profundizar más sobre el protocolo pueden visitar:

http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol

¿Como manipular las cabeceras HTTP con php?

Php tiene la función header() que le permite al programador manejar esas cabeceras de respuesta que se envían de el servidor al cliente dándole mayor poder a nuestros códigos. Esta función se debe utilizar por ejemplo cuando vamos a mostrar una imagen o un documento xml, cuando vamos a redirigir la pagina actual y esto lo vamos a hacer con php. Otra función importante también es setcookie() que se encarga de enviar guardar cookies en el navegador.

Aquí les dejo unos ejemplos de la funcion header y setcookie:

Header("Content-type: image/png"); // esta cabecera le indica al navegador el mime type
header("Location: http://www.google.com.ve"); // le dice al navegador que cambia la url a google
header("HTTP/1.0 404 Not Found"); // manda el error 404 al navegador
setcookie("TestCookie", 'valor de la cookie'); //manda la cookie al navegador.
Header("Content-disposition: attachment; filename=photo.jpg");//forza la descarga de un archive


Las cabeceras deben ser enviadas antes de cualquier salto de línea, letra o lo que sea, sino nos dará un error como el siguiente:

Warning: Cannot modify header information - headers already sent by (output started at  xxxx:17) in xxxxx  on line 19


Si nos sale este error es porque ya a habido una salida y no se pueden modificar las cabeceras, por eso también debemos estar pendientes de cualquier espacio o salto de línea antes de iniciar nuestras etiquetas.

Tutorial: Creando un bonito y estilizado contador con php y GD library.(parte 1)

Esta entrada del blog la voy a utilizar para mostrar como podemos crear nuestro propio contador, sencillo y personalizado para nuestra pagina Web con php y la librería gd. Pero primero un poco de explicación.

PHP aunque sea una sorpresa para algunos no sirve solo para generar documentos html y conectarse con la base de datos, php es un lenguaje muy poderoso que nos permite también generar y manipular imágenes, con esta librería podemos hacer muchas cosas desde crear una imagen sencilla hasta complejas graficas, lo cual puede llegar a ser muy útil para nuestros proyectos.

La librería GD es una librería escrita en c de código abierto para permitir a los programadores la creación de imágenes. Se pueden trabajar con imágenes de tipo png, jpg, gif y algunos otros formatos, pero los más importantes para la Web son los tres que nombre. Funciones gd

Para leer este tutorial les recomiendo empezar leyendo primero sobre manejo de archivos y headers para seguir mejor el curso.

Primero les voy a hacer una pequeña descripción de las funciones de la librería GD que vamos a usar, si ya saben para que sirven se lo pueden saltar:

Imagecreatefromjpeg($filename)
Imagecreatefromgif($filename)
Imagecreatefrompng($filename)


$filename = Dirección de la imagen del archivo. Tipo texto.

Estas tres funciones crean identificadores de imágenes representando la imagen obtenida del archivo especificado, dependiendo del tipo de imagen que usemos debemos usar la correspondiente.

Imagecolorallocate($im, $red, $green, $blue)


$im= Identificador de imagen.
$red = Cantidad de color rojo, tipo numero (0 a 255)
$green = Cantidad de color verde, tipo numero (0 a 255)
$blue = Cantidad de color azul, tipo numero (0 a 255)

Crea un identificador de color para una imagen específico basado en colores RGB.

Imagettftext( $im, $size, $angle, $x, $y, $color, $fontfile, $text )


$im = Identificador de imagen.
$size = Tamaño de la letra, tipo numero.
$angle = angulo de la imagen, tipo numero
$x = cordenadas x donde se va a ubicar el texto
$y = cordenadas y donde se va a ubicar el texto
$color = identificador de color para esta imagen(define el color del texto)
$fontfile = dirección de una fuente TrueType.
$text = Texto que se va a escribir en la imagen.

Este comando escribe en nuestra imagen con el tipo de fuente que le hayamos especificado.

Imagepng ($image, $filename, $quality, $filters)  
Imagejpeg ($image, $filename, $quality)  
Imagegif ($image, $filename)


$image= identificador de la imagen
$filename = (opcional) dirección donde se guardara la imagen
$quality = (opcional) calidad de la imagen. Por defecto es 75
$filters = (opcional) Permite la reduccion de el tamaño de la imagen png

Todos estos comandos generan la imagen como tal en cada uno de los diferentes formatos. Si especificamos la variable $filename se guardara en un archivo sino se generara y se mostrara por el explorador.

Imagedestroy($image)


$image=identificador de imagen.

Libera la memoria que ocupo la imagen.


Esta es la primera parte, despues publico el tutorial en si de como crear el script.