En php yo utilizo mucho el paquete de PEAR HTML Sigma para mis templates de HTML , ya que bien ligero y muy facil de utilizar , pero a menudo nos topamos con pequeños problemas y Sigma no nos deja parsear la informacion como nosotros la queremos y hay algunos problemas con los que me he topado que a veces son cosas pequeñas pero que pueden llegar a consumir mucho tiempo encontrando el problema asi que veremos algunos problemas con los que me he topado y espero que les puedan servir de algo.

Un problema que me paso recientemente y solo por estar probando encontre la solucion es que cuando uno define el inicio y final de los bloques a parsear hay que tener un poco de cuidado cuando se estan definiendo los nombres de los bloques, ya que por alguna extraña razon de este mundo latente, si ponemos de nombre ” <!– BEGIN bloque-parsear1 –> ” por dar un ejemplo , Sigma tiene problemas interpretando el GUION “-” y simplemente le trasquila todo y no parsea ese bloque, o a veces parsea partes pero no llega a funcionar como nosotros queremos. Asi que es preferible solo poner Numero y Letras para definir nuestros bloques utilizando Sigma.

Otro de los problemas con los que me he topado es que cuando del lado de PHP se le hace un $object->setVariable($arreglo); por dar un ejemplo y ese contiene llaves asociativas que son las mismas que nuestras tags en la template para ser parseadas, esto nos puede llegar a a causar problemas si definimos esa misma tag en otro bloque o parte de nuestra template, asi que si ustedes llegan a ver que se estan parseando bloques que ustedes creen que no se deberian de estar parseando , revisen eso y lo mejor es ponerles nombres a las tags, que no se repitan , asi no tendran problemas.

Estos son algunos problemas simples que llegan a suceder, pero a pesar de todo esto es un muy buen paquete de PEAR para utilizar.

Si les han sucedido algunos otros problemas y creen que merecen ser mencionados pueden dejar comentarios y los podemos discutir.

Saludos.

Cuando estamos trabajando en el desarrollo de sitios web, en ciertos casos necesitamos enviar valores en los headers http de la página web. Un ejemplo de esto es el uso de cookies que al establecer su valor, se envía la petición de almacenamiento en el header de la página. También al hacer redireccionamientos desde php por medio del uso de la función header().

Algo que debemos de conocer al hacer uso de estas funciones es que no podemos mandar a escribir ninguna salida (html, xml, etc) en el script antes de enviar los headers. Esto es debido a que cuando el servidor web devuelve la salida de nuestro script , este implicitamente debe mandar al navegador los headers de la página web, por lo cual ya no los podemos modificar posteriormente.

En el siguiente ejemplo podremos observar mejor lo que expliqué en el parráfo anterior. Es un trozo de código de php que imprime un código html y luego establece el valor de una cookie:

<html>
<body>
<p>prueba de seteo de cookies</p>
</body>
</html>
<?php
$val='cookie de prueba';
if(setcookie("var", $val,time()+3600,'/')){
echo "seteo cookie";
}
?>

Este código nos va a generar el siguiente error:

Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\xampp\htdocs\tipsdeaweb\ejemplo_buffer.php:6) in C:\Program Files\xampp\htdocs\tipsdeaweb\ejemplo_buffer.php on line 9

Esto se debe a que con el seteo del valor de la cookie estamos tratando de modificar los headers de la página, que ya han sido enviados cuando se escribió el código HTML. Esto lo podemos solucionar utilizando funciones para escribir en el búfer del script de php, lo cual hará que el servidor web no enviará los headers ni el HTML que escribimos, sino hasta que nosotros liberemos el búfer. Esto nos permite guardar toda la salida del script en memoria y poder hacer modificaciones a los headers. Los nombres de las funciones que utilizaremos son: ob_start (está función indica que todo lo que escribamos a la salida del script se almacenará en memoria y no se enviará como respuesta del servidor web) y ob_flush (indica que debe de liberar y escribir todo lo que se almacenó en el búfer).

A continuación el nuevo script con las funciones de manejo de búfer el cual nos permite setear la cookie.

<?php
ob_start();
?>
<html>
<body>
<p>
prueba de seteo de cookies</p>

</body>
</html>
<?php

$val='cookie de prueba';
if(setcookie("var", $val,time()+3600,'/')){
echo "seteo cookie";
}
ob_end_flush();
?>

Si probamos este script podemos ver que ya no nos genera ningún warning de php, y que efectivamente seteó el valor de la cookie en nuestro navegador.

Neozilon les comentaba acerca del uso de librerias de PEAR en hostings donde tenemos acceso limitado a instalar ciertas
cosas, bien, existe un script que nos facilita el trabajo de instalación de estos paquetes. Read more…

Una de las tecnicas en la Optimizacion para Motores de Busqueda (SEO por sus siglas en inglés) es la de eliminar el paso de variables por querystring y utilizar URLs simulando una estructura de carpetas, las cuales facilitan el indexamiento de las mismas. En un ejemplo explícito estamos hablando de trasladar:

http://tusitio/archivo.php?variable1=valor1&variable2=valor2

a un equivalente como este:

http://tusitio/archivo/valor1/valor2/

Una explicación más detallada pueden verla en el siguiente post de SEO Profesional:

http://www.seoprofesional.com/index.php/05-11-2007/posicionamiento-web-en-buscadores/optimizacion-de-codigo/htaccess-url-dinamicas-y-seo/

Espero les sea útil.

Muchas veces, nos pasa que al aprender un nuevo lenguaje de programacion, nos encontramos con funciones que aparentemente, son simples, y no tienen mucha utilidad, pero con el paso del tiempo, nos damos cuenta, que nos pueden sacar de apuros, e incluso hacen ver nuestro codigo mas limpio, e incluso mas profesional.

Este es el caso, de 3 funciones (2 realmente, la otra es una construccion del lenguaje), muy simples de PHP, que nos pueden ayudar a simplificar nuestro codigo y ahorrarnos tiempo y trabajo.

La primera que veremos es list():

list()  es una construccion del lenguaje, que nos permite asignar valores a un conjunto de variables, en un solo paso, para entenderlo de mejor forma, veamoslo con un ejemplo:

Supongase que tenemos el arreglo:

$arreglo = array(‘solido’, ‘liquido’, ‘gaseoso’);

Si quisieramos asignar cada uno de los valores del arreglo a variables, normalmente hariamos lo siguiente:

$estado1 = $arreglo[0];
$estado2 = $arreglo[1];
$estado3 = $arreglo[2];

Y aqui es donde la funcion list() nos puede a ayudar a hacer nuestro codigo mas facil de leer y tambien mas reducido, veamos como podemos hacerlo:

list($estado1, $estado2, $estado3) = $arreglo;

list() lo que hace es mapear cada uno de los elementos del arreglo, a cada una de las variables enviadas como argumento a la funcion, empezando desde el indice 0 por supuesto. Pero no todo es perfecto, y el unico inconveniente con la funcion list() es que solo funciona para arreglos con indices numericos.

Pero no todo esta perdido, para eso PHP nos ofrece otra alternativa, y es la funcion extract

extract() nos permite mapear cada uno de los elementos de una matriz asociativa a la tabla de simbolos actual, por ejemplo:

Supongamos que tenemos el siguiente arreglo asociativo

$tupla = array(‘nombre’ => ‘Maria’, ‘edad’ => 22, ‘estado_civil’ => ‘soltera’);

Normalmente, lo que hariamos para utilizar individualmente cada uno de los valores del arreglo, seria lo siguiente:

$nombre = $tupla[‘nombre’];
$edad = $tupla[‘edad’];
$estado_civil = $tupla[‘estado_civil’];

Lo cual, es valido, pero un poco tedioso, mas cuando se trata de un arreglo de muchos elementos, cosa que se puede hacer en una sola linea, utlizando la funcion extract(), veamos como:

extract($tupla);
echo “$nombre, $edad, $estado_civil \n”;

Lo que nos retornaria:

Maria, 22, soltera

Como podemos ver, es una funcion simple, pero nos permitiria ahorrar algunas lineas de codigo, y nos seria de mucha utilidad por ejemplo, cuando necesitamos obtener una tupla de la BD, la cual nos es retornada por una funcion, como un arreglo associativo, donde cada llave del arreglo, es el nombre de la columa de la tabla.

Y por ultimo, y no por eso, es la menos importante, la funcion compact():

compact() es todo lo contrario a las funciones list() y extract(), su funcion es construir un arreglo con variables previamente definidas en nuestra tabla de simbolos, por ejemplo:

Supongamos que tenemos los siguientes datos:

$identificacion = array(‘nombre’ => ‘maria’, ‘apellido’ => ‘bonita’);
$direccion = array(‘Pais’ => ‘Guatemala’, ‘Ciudad’ => ‘Guatemala’);
$hijos = array(‘pedro’, ‘pablo’, ‘paco’);

Y quisieramos unirlos todos en un arreglo, que representaria la informacion personal de Maria, normalmente lo hariamos de esta forma:

$info = array(‘identificacion’ => $identificacion, ‘direccion’ => $direccion, ‘hijos’ => $hijos);

Lo cual no esta mal, pero puede ser un poco tedioso, e incluso verse un poco desordenado, cuando se traten de muchos datos, lo cual se simplificaria utilizando la funcion compact(), veamos como:

$info = compact(‘identificacion’, ‘direccion’, ‘hijos’);

Que se ve mucho mas compacto y mas simple de entender. compact() lo que hace en resumidas cuentas, es buscar los argumentos en la tabla de simbolos, y construir un arreglo donde, el argumento, en caso de que exista una variable con ese nombre en la tabla de simbolos, se convierte en la llave y el valor de la variable, como el valor de la llave en el arreglo.

De esta forma, si  imprimimos el contenido de $info obtendriamos:

Array 
( 
    [identificacion] => Array 
        ( 
            [nombre] => maria 
            [apellido] => bonita 
        )     

    [direccion] => Array 
        ( 
            [Pais] => Guatemala 
            [Ciudad] => Guatemala 
        )     

    [hijos] => Array 
        ( 
            [0] => pedro 
            [1] => pablo 
            [2] => paco 
        )     

)

Bueno, espero que este articulo, les haya sido de utilidad, y que pongan en practica alguna de las funciones que aprendimos.

Hola de nuevo, no se si a ustedes les ha pasado , pero a mi al menos cuando comenzaba en esto me paso lo que a continuacion se los detallare, Yo utilizo mucho las librerias de PEAR para el desarrollo de aplicaicones en PHP por su versatilidad, porque no son muy pesadas (en sentido de espacio) y la mayoria trae una documentacion muy decente y me ha facilitado grandemente la existencia para el desarrollo web. Pero vayamos al grano. Read more…

Bueno, para realizar esta tarea hay muchas formas de realizarla, hay muchos scripts y librerias que lo pueden hacer, y esta es otra forma mas en que se puede realizar esto de una manera sencilla y sin despeinarnos, para esto hago uso de 2 clases de PEAR que son HTTP_Upload y la otra es Image_Transform basicamente esto es lo que necesitamos para poder subir y crear nuestro thumbnail de una manera sencilla como veremos a continuacion. Read more…

Hace poco escribí un artículo mencionando lo útil que es usar funciones agregadas para agrupar datos en la Base de Datos en vez de hacerlo en PHP por ejemplo.

Hoy escribo su contraparte, una función en PHP que nos permite agrupar un arreglo (array)con cualquier cantidad de llaves (índices).

Por ejemplo veamos el siguiente arreglo de PHP. (La versión con más datos está en el script.)

Array
(

    [0] => Array
        (
            [name] => Juan
            [color] => Azul
            [edad] => 24
        )

    [1] => Array
        (
            [name] => Juan
            [color] => Rojo
            [edad] => 24

        )
    [2] => Array
        (
            [name] => Juan
            [color] => Verde
            [edad] => 24
        )
    [3] => Array
        (
            [name] => Pablo
            [color] => Azul
            [edad] => 25
        )
    [4] => Array
        (
            [name] => Pablo
            [color] => Amarillo
            [edad] => 25
        )
)

Digamos que lo queremos agrupar por el indice “name”.

Con la función:

function groupArray($array,$groupkey)
{
 if (count($array)>0)
 {
 	$keys = array_keys($array[0]);
 	$removekey = array_search($groupkey, $keys);		if ($removekey===false)
 		return array("Clave \"$groupkey\" no existe");
 	else
 		unset($keys[$removekey]);
 	$groupcriteria = array();
 	$return=array();
 	foreach($array as $value)
 	{
 		$item=null;
 		foreach ($keys as $key)
 		{
 			$item[$key] = $value[$key];
 		}
 	 	$busca = array_search($value[$groupkey], $groupcriteria);
 		if ($busca === false)
 		{
 			$groupcriteria[]=$value[$groupkey];
 			$return[]=array($groupkey=>$value[$groupkey],'groupeddata'=>array());
 			$busca=count($return)-1;
 		}
 		$return[$busca]['groupeddata'][]=$item;
 	}
 	return $return;
 }
 else
 	return array();
}

Podemos enviar un arreglo como primer parámetro y luego en el segundo parámetro indicar el indice por el que queremos agrupar. Por ejemplo agrupando por “name” tenemos:

Array
(
    [0] => Array
        (
            [name] => Juan
            [groupeddata] => Array
                (
                    [0] => Array
                        (
                            [color] => Azul
                            [edad] => 24
                        )
                    [1] => Array
                        (
                            [color] => Rojo
                            [edad] => 24
                        )
                    [2] => Array
                        (
                            [color] => Verde
                            [edad] => 24
                        )
                )
        )
    [1] => Array
        (
            [name] => Pablo
            [groupeddata] => Array
                (
                    [0] => Array
                        (
                            [color] => Azul
                            [edad] => 25
                       )
                    [1] => Array
                        (
                            [color] => Amarillo
                            [edad] => 25
                        )
                )
        )
)

o podríamos agrupar por “edad”:

Array
(
    [0] => Array
        (
            [edad] => 24
            [groupeddata] => Array
                (
                    [0] => Array
                        (
                            [name] => Juan
                            [color] => Azul
                        )
                    [1] => Array
                        (
                            [name] => Juan
                            [color] => Rojo
                        )
                    [2] => Array
                        (
                            [name] => Juan
                            [color] => Verde
                        )
                )
        )
    [1] => Array
        (
            [edad] => 25
            [groupeddata] => Array
                (
                    [0] => Array
                        (
                            [name] => Pablo
                            [color] => Azul
                        )
                    [1] => Array
                        (
                            [name] => Pablo
                            [color] => Amarillo
                        )
                )
        )
)

Espero que les sea útil. Estamos en contacto!