miércoles, 23 de mayo de 2007

Redimensionar Imágenes

A continuación mostraremos cómo redimensionar imágenes automáticamente utilizando la librería GD de PHP.
Para que todo funcione correctamente, necesitamos tener instalada en nuestro servidor la versión 2.0.1 o superior de dicha librería, que puede descargarse gratuitamente desde http://www.boutell.com Analizar página web.
Primero crearemos un archivo al que llamaremos redimensionar.php, que contendrá el siguiente código:

000
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
=180;
$hmax=180;
$nombre=basename($_GET['imagen']);
$datos = getimagesize($nombre);
if(
$datos[2]==1){$img = @imagecreatefromgif($nombre);}
if(
$datos[2]==2){$img = @imagecreatefromjpeg($nombre);}
if(
$datos[2]==3){$img = @imagecreatefrompng($nombre);}
$ratio = ($datos[0] / $anchura);
$altura = ($datos[1] / $ratio);
if(
$altura>$hmax){$anchura2=$hmax*$anchura/$altura;$altura=$hmax;$anchura=$anchura2;}
$thumb = imagecreatetruecolor($anchura,$altura);
imagecopyresampled($thumb, $img, 0, 0, 0, 0, $anchura, $altura, $datos[0], $datos[1]);
if(
$datos[2]==1){header("Content-type: image/gif"); imagegif($thumb);}
if(
$datos[2]==2){header("Content-type: image/jpeg");imagejpeg($thumb);}
if(
$datos[2]==3){header("Content-type: image/png");imagepng($thumb); }
imagedestroy($thumb);
?>



$anchura y $hmax son respectivamente el ancho y el alto máximo que definimos para la imagen que queremos mostrar.
La función getimagesize genera, al ser invocada, un array que contiene en cada uno de sus índices los siguientes datos de la imagen que recibe como parámetro:
[0]=ancho
[1]=alto
[2]=tipo de imagen (1:gif,2:jpg,3:png)
Las funciones imagecreatefromjpeg,imagecreatefromgif,imagecreatefrompng devuelven un identificador de imagen que representa la imagen obtenida desde el nombre de archivo pasado por parámetro.
La función imagecreatetruecolor crea una imagen nueva en color real (true color) y devuelve un identificador de imagen representando una imagen en blanco de tamaño anchura por altura.
Por último, imagecopyresampled() copia una porción rectangular de una imagen sobre otra, suavizando los valores de los píxeles mediante interpolación, de forma que al reducir el tamaño de una imagen aún mantiene una buena claridad. imagecopyresampled debe incluir –dentro del paréntesis– estos parámetros (en este orden):
$thumb que es el identificador de la imagen destino, es decir el papel fotográfico que hemos creado con imagecreatetruecolor.
$img que es el identificador de la imagen original (negativo) obtenido con imagecreatefromjpeg o imagecreatefromgif o imagecreatefrompng.
Xd e Yd son las coordenadas de un punto situado en la esquina superior izquierda del papel a partir del que queremos que se impresione la imagen. Si queremos una imagen sin márgenes pondremos 0,0 y, si queremos dejar márgenes en blanco, habrá que poner los anchos de esos márgenes (izquierdo y superior) respectivamente.
Xf e Yf nos servirán para reencuadrar la foto original recortando por la izquiera y por arriba, respectivamente, los anchos que se indiquen aquí en pixels.
$anchura y $altura, como dijimos antes, son respectivamente el ancho y el alto máximo que definimos para la imagen que queremos mostrar.
Fx e Fy indican el ancho y el alto de la porción del original que tratamos de reproducir.
Con header("Content-type: image/gif") e imagegif($thumb) (o jpeg o png, según sea el caso) mostramos la imagen y con imagedestroy($thumb)liberamos la memoria asociada a la imagen.

Para utilizar la imagen, deberemos llamarla de la siguiente manera:


img src='redimensionar.php?imagen=tu_imagen_origunal.jpg'


Leer XML con SimpleXML

PHP5 nos facilita la interpretacion de documentos XML con la introduccion de SimpleXML, en este artículo veremos cómo la funcion simplexml_load_file nos permitirá leer e interpretar un archivo XML.

La forma en la que trabaja la funcion es sencilla, convierte el documento XML pasado en el parámetro de la funcion en un objeto de la clase simplexml_element si no presenta errores, vamos a ver un ejemplo:
000
001
002
003
004
005
006
$noticias = simplexml_load_file('rss.xml');
foreach (
$noticias->item as $noticia) {
echo
"$noticia->title: ";
echo
"$noticia->description

\n"
;
}
?>


Este sería un ejemplo muy sencillo de como leer e interpretar un fichero de noticias RSS, pero vamos a complicarlo un poco teniendo en cuenta los errores que pueden surgir:
000
001
002
003
004
005
006
007
008
009
010
011
$archivo = 'rss.xml';
if (
file_exists($archivo)) {
$noticias = simplexml_load_file($archivo);
if(
$noticias){
foreach (
$noticias->item as $noticia) {
echo
"$noticia->title: ";
echo
"$noticia->description

\n"
;
}
} else echo
"Sintaxi XML inválida";
} else echo
"Error abriendo rss.xml";
?>


Bueno, hemos visto que ahora el codigo es un poco mas completo en cuanto al reporte de errores.

martes, 22 de mayo de 2007

Forzar un download

Imaginemos que tenemos una web de una tienda que tiene una base de datos con los productos y su precio, y queremos que nuestros usuarios se puedan descargar una lista de precios (por ejemplo tista.txt) a su ordenador y que esta lista que se genere a partir de la base de datos.

Para hacer esto, debemos descargar un archivo que no existe, cuyo contenido podamos especificar a nuestra voluntad, de esta manera, tenemos que crear una página download.php que se encargará de simular el archivo a descargar, en la que pondremos el siguiente código:
000
001
002
003
004
005
006
$nombre = 'precios.txt'; // Nombre del archivo
$contenido = 'Texto del archivo'; // Contenido del archivo
header( "Content-Type: application/octet-stream");
header( "Content-Disposition: attachment; filename=".$nombre."");
print(
$contenido);
?>


Notese que en $contenido, debería haber el resultado de la consulta a la base de datos.

Fuente: http://www.programacionweb.net/

Listar contenido de un directorio

Vamos a ver cómo podemos conseguir una lista de los archivos y directórios contenidos en un directório de nuestro servidor.

Para esto, abriremos un descriptor de fichero para el directório usando la función opendir, luego leeremos los nombres de los archivos con la función readdir y finalmente eliminaremos el descriptor con closedir.

Veamos cómo sería:
000
001
002
003
004
005
006
007
=opendir($dir);
echo
"Directorio actual:
$dir
"
;
echo
"Archivos:
"
;
while (
$archivo = readdir($directorio))
echo
"$archivo
"
;
closedir($directorio);
?>


Pero vamos a mejorarlo un poco, gracias a la funcion is_dir podremos saber si tratamos con un archivo, y con esto y un poco de cuidado con los casos de directorios especiales ( . y .. ), podremos navegar por los directórios con un código cómo el siguiente:
000
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
= (isset($_GET['dir']))?$_GET['dir']:"/";
$directorio=opendir($dir);
echo
"Directorio actual:
$dir
"
;
echo
"Archivos:
"
;
while (
$archivo = readdir($directorio)) {
if(
$archivo == '.')
echo
"$archivo
"
;
elseif(
$archivo == '..'){
if(
$dir != '.'){
$carpetas = split("/",$dir);
array_pop($carpetas);
$dir2 = join("/",$carpetas);
echo
"$archivo
"
;
}
}
elseif(
is_dir("$dir/$archivo"))
echo
"$archivo
"
;
else echo
"$archivo
"
;
}
closedir($directorio);
?>


Listar archivos ordenados por fecha
En la página anterior os explicaba cómo podíamos listar los archivos de un directorio de nuestro servidor usando PHP, pues ahora vamos a ver cómo podemos ordenar estos archivos por su fecha de creación.

Para hacer esto, almacenaremos los nombres de los archivos en un vector, que luego ordenaremos usando usort y una función que llamaremos ordenar y que usa filemtime:
000
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
$directorio = '/';
function
ordenar($a,$b){
global
$directorio;
$a = filemtime($directorio.$a);
$b = filemtime($directorio.$b);
if (
$a == $b) {
return
0;
}
return (
$a < $b) ? -1 : 1;
}
$dir=opendir($directorio);
echo
"Directorio actual:
$directorio
"
;
echo
"Archivos:
"
;
while(
$arch=readdir($dir))$ars[]=$arch;
closedir($dir);
usort($ars, "ordenar");
foreach(
$ars as $ar)echo "$ar
"
;
?>


Una vez hemos leido los archivos como se explicaba en la página anterior, los ordenamos con usort y la función ordenar.

Esta función binaria, compara los dos archivos y devuelve 1, -1 según que archivo es mas nuevo o 0 si tienen la misma fecha.

fuente: http://www.programacionweb.net

jueves, 17 de mayo de 2007

Programacion de Juegos Java para celulares

Este es un muy buen tutorial para introducirse en el mundo de aplicaciones y juegos Java para celulares y Palm.

Dejo el link para que se lo puedan bajar en formato pdf.

Descargar Tutorial J2ME
Fuente: www.programacion.com

martes, 15 de mayo de 2007

¿Que es Smarty?

Smarty es un motor de plantillas para PHP. Mas especificamente, esta herramienta facilita la manera de separar la aplicación lógica y el contenido en la presentación. La mejor descripción esta en una situación donde la aplicación del programador y la plantilla del diseñador juegan diferentes roles, o en la mayoria de los casos no la misma persona.

Separar la aplicación lógica y el contenido en la presentación
Este es el punto mas fuerte y es por el cual paso este articulo a mc. La proxima generación de aplicaciones webs que comencemos a desarrollar creo firmemente que deben seguir este esquema, dejar te tener el codigo PHP y HTML en un mismo archivo. ¿Porque? para que la actualisaciones de version entre paginas sea algo mas rapido y estable, no tengamos que reprogramar todo a base que se cambio un diseño (ej: páginas webs de anime en general).

Es dejar de hacer esto
Codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<div id="wrap">

if(isset(
$_GET['mcscript']))
{
include(
'mcscript.php');
}
else if(isset(
$_GET['webdev']))
{
include(
'webdev.php');
}


if(
$show_side)
{

<
div id="content">

if(!isset(
$_GET['seccion'])) {
<
div id="rss">
<
img src="/site_images/rss.gif" width="32" height="31" style="float:right; margin-top:-12px; margin-right:-12px;" />
echo
initTekkMc::siteRss();
div>
?>


Y pasar algo mucho mas simple de trabajar

Por ejemplo: Digamos que usted crea una pagina web, es decir, despliega el articulo de un diario. El encabezado del articulo, el rotulo, el autor y el cuerpo son elementos del contenido, estos no contiene información de como quieren ser presentados. Estos son pasados por la aplicación Smarty, donde el diseñador edita la plantilla, y usa una combinación de etiquetas HTML y etiquetas de plantilla para formatear la presentación de estos elementos (HTML, tablas, color de fondo, tamaño de letras, hojas de estilo, etc...). Un día el programador necesita cambiar la manera de recuperar el contenido del articulo(un cambio en la aplicación lógica.). Este cambio no afectara al diseñador de la plantilla, el contenido llegara a la plantilla exactamente igual. De la misma manera, si el diseñador de la plantilla quiere rediseñarla en su totalidad, estos cambios no afectaran la aplicación lógica. Por lo tanto, el programador puede hacer cambios en la aplicación lógica sin que sea necesario restructurar la plantilla. Y el diseñador de la plantilla puede hacer cambios sin que haya rompimiento con la aplicación lógica.

One design goal of Smarty is the separation of business logic and presentation logic. This means templates can certainly contain logic under the condition that it is for presentation only. Things such as including other templates, altering table row colors, upper-casing a variable, looping over an array of data and displaying it, etc. are all examples of presentation logic. This does not mean that Smarty forces a separation of business and presentation logic. Smarty has no knowledge of which is which, so placing business logic in the template is your own doing. Also, if you desire no logic in your templates you certainly can do so by boiling the content down to text and variables only.

Ahora un pequeño resumen sobre que no hace Smarty. Smarty no intenta separar completamente la lógica de la plantilla. No hay problema entre la lógica y su plantilla bajo la condición que esta lógica sea estrictamente para presentación. Un consejo: mantener la aplicación lógica fuera de la plantilla, y la presentación fuera de la aplicación lógica. Esto tiene como finalidad tener un objeto mas manipulable y escalable para un futuro proximo.

Un único aspecto acerca de Smarty es la compilación de la plantilla. De esta manera Smarty lee la plantilla y crea los scripts de PHP. Una vez creados, son executados sobre él. Por consiguiente no existe ningún costo por analizar gramaticalmente cada archivo de template por cada requisición, y cada template puede llevar toda la ventaja del compilador de cache de PHP tal como Zend Accelerator (http://www.zend.com/) o PHP Accelerator (http://www.php-accelerator.co.uk).

Algunas de las características de Smarty:

* Es extremamente rápido.
* Es eficiente ya que puede interpretar el trabajo mas sucio.
* No analiza gramaticalmente desde arriba el template, solo compila una vez.
* El esta atento para solo recompilar los archivos de plantilla que fueron cambiados.
* Usted puede crear funciones habituales y modificadores de variables customizados, de modo que el lenguaje de la platilla es altamente extensible.
* Sintaxis de etiquetas delimitadoras para configuración de la plantilla, así lo puede usar {}, {{}}, , etc.
* Los construtoress if/elseif/else/endif son pasados por el interpretador de PHP, así la sintaxis de la expresión {if ...} puede ser compleja o simple de la forma que usted quiera.
* Permite un anidamiento ilimitado de sections, ifs, etc.
* Es posible incrustar directamente codigo PHP en los archivos de plantilla, aunque esto puede no ser necesario(no recomendado) dado que la herramienta se puede ajustar.
* Soporte de caching incrustado
* Fuentes de Plantilla absoluto
* Funciones habituales de manipulación de cache
* Arquitectura de Plugin

No todo es smarty, simplemente es una buena herramienta para dar entender lo que es la separacion de logica y presentación

Nota: En el proximo tutorial veremos como instalarlo y crear una pequeña aplicación.

Fuente: http://www.mctekk.com/

lunes, 14 de mayo de 2007

Como escribir Hojas de Excel desde PHP.

Para este pequeño HOW-TO se utiliza la librería Spreadsheet Excel Writer
del framework PEAR para php.
Esta librería nos permite crear hojas de Excel de forma rápida y sencilla,
con la ventaja de no tener que necesitar los objetos COM, es decir puede
funcionar desde LINUX :), soporta, formulas, imágenes y una gran cantidad
de formatos para celdas y texto.

Spreadsheet Excel Writer puede ser instalado con el siguiente comando:

$ pear install OLE;  Dependencia necesaria para SpreadSheet
$ pear install Spreadsheet_Excel_Writer;

O bien puedes descargarlo desde la siguiente dirección:
http://pear.php.net/package/Spreadsheet_Excel_Writer/download
Ahora vamos a generar una Hoja de Prueba:

require_once 'Spreadsheet/Excel/Writer.php';

// Creamos un libro de excel que sirve como nuestro espacio de trabajo.
$libro = new Spreadsheet_Excel_Writer();

// Estableceremos nuestro formato Negrita para usarlo en el documento
$negrita =& $libro->addFormat();
$negrita->setBold();

// Necesitamos una hoja en la cual poner nuestros datos
$hoja =& $libro->addWorksheet(‘Hoja1’);

// Verificamos que la hoja se haya generado correctamente
if (PEAR::isError($hoja)) {
die($hoja->getMessage());
}

// Este es el titulo
$hoja->write(0, 0, "Escribir hojas en excel", $negrita);

// Generamos nuestro libro de excel
$libro->send('ejemplo.xls');
$libro->close();
?>


Este ejemplo nos generara un libro de excel con una hoja llamada Hoja1 la cual contendrá en su
Celda (A1) la palabra

“Escribir hojas en excel”.
Las funciones que nos interesan en este script son:

Spreadsheet_Excel_Writer(): No permite crear nuestro espacio de trabajo, en el que podremos
generar cuantas hojas queramos.

Es el constructor de la clase Spreadsheet_Excel_Writer y puede recibir como parámetro el
nombre del archivo de salida.


addFormat(): Nos permite añadir al libro distintos formatos para poder ser usados en nuestras
hojas. Como parámetro puede
recibir una array con las propiedades de nuestro formato.
Este objeto además tiene una serie de funciones para establecer
distintos formatos P/E: setBol(),
setAlign(), etc.


addWorksheet(): Nos permite agregar a nuestro libre una hoja de trabajo en la cual colocaremos
nuestros datos. Como parámetro
puede recibir el nombre de nuestra hoja, el cual no puede ser
mayor a 31 caracteres.


write(): Esta funcion nos permite escribir información en nuestra hoja, recibe como parámetros:
- Número de fila: un número entero.
- Número de Columna: un número entero.
- Información a escribir
- Formato de la celda, proveniente del objeto Format.

send(): Esta funcion es necesaria para preparar las cabeceras HTTP para mandar un archivo Excel. Recibe como parámetro el
nombre del archivo a usar en las cabeceras HTTP.

Además de estas funciones podría interesarnos la función:

writeFormula: Esta funcion nos permite escribir formulas en nuestra hoja, recibe como parámetros:
- Número de fila: un número entero.
- Número de Columna: un número entero.
- Cadena de la Formula.
- Formato de la celda, proveniente del objeto Format.
Un ejemplo de esta:
$hoja->writeFormula(0, 4, "=SUM(A1,C1)");

Con esto termino este mini HOW-TO, pueden encontrar más información acerca de SpreadSheet en:
http://pear.php.net/manual/en/package.fileformats.spreadsheet-excel-writer.php

Espero que les haya sido de utilidad este artículo.

Fuente: http://jeiff.blogspot.com

Formularios HTML en menos de 5 minutos

Este es otro pequeño HOW-TO basado en el framework PEAR, esta vez crearemos en menos de 5 minutos un formulario con su validación listo para ser enviado.


La librería a utilazar se llama HTML_QuickForm, para su instalación podriamos hacerlo así:

$ pear install HTML_QuickForm

O bien puedes descargar el paquete desde http://pear.php.net/package/HTML_QuickForm/download

Una vez que cuentas con la libreria es hora de crear nuestro formulario:

require_once("HTML/QuickForm.php");

//Creamos nuestro formulario con el nombre de frmBuscar
$formulario = new HTML_QuickForm('frmBuscar');
//Asignamos los valores por deafault de nuestro elementos
$formulario->setDefaults(array('busqueda' => '',
'opcion'=>'1'));

//Creamos un encabezado para nuestro formulario
$formulario->addElement('header', null,
'

Búsqueda de Anuncio Clasificado
');

/*Agregamos un campo de texto con el nombre de busqueda y la
leyenda Palabra a Buscar, tamaño de 50 caracteres y solo se
permitira capturar 255 caracteres */
$formulario->addElement('text', 'busqueda', 'Palabra a Buscar',
array('size' => 50, 'maxlength' => 255));

//Agregamos un campo oculto en nuestro formulario
$formulario->addElement('hidden','opcion');

//Apartir de aquí crearemos un elemento de tipo SELECT
//Iniciaremos por crear las opciones para este elemento
$opts = array("0"=>"Todos","puebla"=>"PUEBLA","tlaxcala"=>"TLAXCALA",
"df"=>"DF Mexico","veracruz"=>"VERACRUZ");
/*Creamos el elemento select con nombre de estado, la leyenda Estado,
y agregamos la opciones*/
$s_estado=$formulario->createElement('select','estado','Estado:',$opts);
$formulario->addElement($s_estado);

//Agregamos nuestro boton para mandar la información
$formulario->addElement('submit', null, 'Buscar');

/*Aplicamos un filtro a nuestro campo busqueda para eliminar
espacios en blanco tanto a la derecha como a la izquierda */
$formulario->applyFilter('busqueda', 'trim');

/*Y pones la restricción, para que el usuario tenga que escribir algo
en nuestro campo busqueda antes de ser enviado */
$formulario->addRule('busqueda', 'Teclee la palabra a Buscar', 'required', null, 'client');

//Por ultimo solo despelgamos nuestro formulario
$formulario->display();
?>

Este código nos generara una página HTML que contendra un formulario de busqueda, el cual contendra un campo de texto validado, un select para seleccionar un estado, y un campo oculto con valor de 1.

En la segunda parte de este pequeño HOW-TO explicare cada una de las funciones utilizadas aqui, y escribire un ejemplo un poco mas completo.



Fuente: http://jeiff.blogspot.com/