marchando una de #humor solo para programadores, por ser viernes :D

Cuando lanzo mi script por primera vez tras varias horas de desarrollo
Cuando me piden que eche una mano un viernes por la tarde

Cuando eso que funcionaba el viernes ya no funciona el lunes
 
Cuando un bug pasa desapercibido durante una presentación
 
Cuando retomo un desarrollo de un código que no había comentado
Cuando el jefe de proyecto entra en la sala de trabajo
Hacer un update y ver que has borrado media base de datos.

Optimizando una web con urls amigables con Apache y PHP por maestrosdelweb.com

Fuente original: http://www.maestrosdelweb.com/editorial/urlamigable/

En este manual usted aprenderá cómo optimizar de manera sencilla una web dinámica hecha en PHP, cuyas urls pasadas a los enlaces contengan extensas variables mediante GET, a una web cuyas URL sean amigables (fáciles de recordar).

Los que programamos en PHP, o bajo cualquier otro lenguaje de programación orientado a web, por lo general tendemos a pasar datos de una web origen a otra destino mediante variables del tipo GET generando enlaces tal como:

http://www.tiperu.com/index.php?mod=ecommerce&producto=tienda&op=3 que difícilmente son indexadas por algunos buscadores y lo que es peor aún: son nada asimilables por un usuario común (a este grupo de URL las llamaremos URL extensas para efectos del presente artículo).

Si lo vemos desde esa perspectiva justo sería afirmar que las web dinámicas tienen desventajas en ese ámbito sobre las web estáticas del tipohttp://www.tiperu.com/ecommerce.html que son mucho más fáciles de recordar por su simpleza y carencia de variables vía GET, a este tipo de URL las conocemos (y me referiré a ellas en adelante) como URL amigables.

Quiero dejar en claro que lejos de la división convencional entre lo que son web estáticas o dinámicas en este manual me referiré a ambas en función a la diferencia de URL especificadas en el párrafo anterior  hecha la aclaración continuo con el artículo.

Felizmente para los que usamos Apache como servidor web, conjuntamente con PHP, esto tiene solución gracias al módulo mod_rewrite (URL Rewriting Engine) que nos permitirá mediante unas cuantas reglas transformar nuestras URL extensas en URL amigables.

Si bien es altamente aconsejable aprender el correcto manejo del mod_rewrite y sus correspondientes reglas, en este artículo no se hará explicación extensiva del mismo.

Debido a que el objetivo principal, es mostrar al lector cómo optimizar una web de URL extensas a URL amigables; con esto quiero dejar claro que se asume que el lector posee un website ya creado con URL extensas y desea pasarlas fácilmente a URL amigables “en un dos por tres”.

Preparando el archivo “.htaccess”:

El archivo .htaccess nos permite pasarle información al servidor Apache para que cumpla ciertas reglas de configuración en la carpeta que lo contenga, por tal motivo debemos copiar este archivo en la carpeta que contengan los archivos php en los cuales realizaremos los cambios de URL:

Options +FollowSymLinks
RewriteEngine on
#4 variables
Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5&$6=$7&$8=$9
#3 variables
Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5&$6=$7
#2 variables
Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5
#1 variable
Rewriterule ^(.*)/(.*),(.*)/$ $1.php?$2=$3

En las dos primeras líneas nos aseguramos de que esté activado el mod_rewrite en el Apache (si esto no funciona deberá comunicarse con su administrador para que active el módulo en el servidor).

Las líneas antecedidas por “#”, como las 3, 5, 7 y 9 ; son simplemente comentarios, no los tome en cuenta.

En las líneas 4, 6, 8 y 10 se establecen las reglas que nos permitirán transformar nuestras URL extensas en amigables. Analizaremos aquella que permite transformar dos variables, las demás son similares:

Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5

La expresión (Rewriterule) es la que nos permitirá escribir la regla en el Apache. La cadena (^(.*)/(.*),(.*)/(.*),(.*)/$) permite escribirá la URL amigable, inicia desde el caracter ^ hasta el $. Y finalmente la cadena ($1.php?$2=$3&$4=$5) es nuestro URL extenso. La transformación se hará de la siguiente manera:

De URL extensa:

./index.php?categoria=monitores&productoID=12345

En URL amigable:

./index/categoria,monitores/productoID,12345/

Como se puede apreciar la regla tomara el nombre del script y le quitara la extensión “.php” para tomarlo como un directorio (nótese la parte en negritas):

Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5

./index.php?categoria=monitores&productoID=12345
./index/categoria,monitores/productoID,12345/

Seguidamente toma el primer par ?valor=variable y lo transfroma en una subcarpetavalor,variable/:

Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5

./index.php?categoria=monitores&productoID=12345
./index/categoria,monitores/productoID,12345/

Y finalmente hace lo propio con el par &valor=variable y lo transforma en una subcarpetavalor,variable/:

Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5

./index.php?categoria=monitores&productoID=12345
./index/categoria,monitores/productoID,12345/

Como ya se habrá dado cuenta, los valores antecedidos por el símbolo dólar ($) en la parte de las URL extensas reemplazan a los (.*) de las URL amigables.

Bueno ya tenemos el archivo .htacces que nos permitirá lograr los resultados que deseamos a nivel del servidor, ahora procederemos a crear el script php que nos permita cambiar nuestras URL extensas en amigables sin tener que hacer ninguna modificación directa en los “N” enlaces que posea nuestro sitio web.

Generando el script en php:

El script php que se usaremos se encargará básicamente de tomar la URL extensa, si esta ha sido pasada mediante el método GET, y la transformará en una URL amigable a la cual redireccionará usando la función header.

Puesto que header redireccionará hacia la misma web, y esto causará lo que se conoce como un bucle infinito, se hará uso de variables de sesión que nos ayuden a evitar tal inconveniente.

Por tal motivo nuestro script se seccionará en 2 partes: la primera irá en las primeras líneas de todas las páginas a las que aplicaremos el script, y la segunda parte (encargada de limpiar la variable de sesión) irá al final de las páginas.

Aclarados los detalles, explicaré mediante comentarios el script php:

<?php

//Iniciamos o continuamos la sesión encargada de evitar el bucle infinito

	session_name("url_amigable");
	session_start(); //Almacenamos datos del server, script y variables (pasadas por GET)
	$Server=$_SERVER[´SERVER_NAME´];
	$Script=$_SERVER[´PHP_SELF´];
	$Variables=$_SERVER[´QUERY_STRING´]; //Verificando si tiene variables por GET

//y no se han pasado datos mediante un form por POST, ya que al redireccionar un post puede ocasionar errores.
//también verificamos que la variable de sesión ‘Listo’, sea diferente a 1, esto nos eviara un bucle infinito.

	if(!empty($Variables) & $_SERVER[’REQUEST_METHOD’]==’GET’ && $_SESSION[’Listo’]!=1){

//Si tiene variables pasadas por GET se procede a hacer el cambio.
//1. Agrupando $Variables por “variable=valor” en el array $Variable.

$Variable=explode(”&”,$Variables);
//2. Sustituyendo “=” por “,” y concadenandolo en variable $Amigable.
($i=0; $i < count($Variable); $i++){
$Amigable.="/".str_replace("=",",",$Variable[$i]);
} //3. Quitando la extension “.php” a $Script para simular un directorio.

$Dir=str_replace(”.php”,”",$Script); //4. Generando la URL Amigable.
$URL_AMIGABLE=”http://”.$Server.$Dir.$Amigable.”/”;
//5. Colocando la variable de sesión ‘Listo’ a 1 para evitar el bucle infinito al redireccionar la web.

$_SESSION[’Listo’]=1;
//6. Redireccionando a la url amigable

header(”Location: $URL_AMIGABLE”);
//7. Exit hará que culmine hasta este punto el script, si no estuviera ‘exit’el script continuaría ejecutándose y llegaría hasta el final del mismo, es decir,
// a la parte donde colocamos a la variable de sesión ‘Listo’ en cero, originándose, entonces un bucle infinito.
exit;

}//Cambie $_URL_BASE por la ruta raiz de su web, ya que al simular la url amigable.
//directorios, hará que no muestre adecuadamente los orígenes de los recursos que llama su página web.

$_URL_BASE="http://”.$Server.”/pruebas/url_amigable/index.php";
?>
<html>
<head>
<title >URL Amigables</title>
<base href = "<? echo $_URL_BASE; ?>" target="_top" />
</head>
<body>
<!-- Aquí el contenido de su página web -->
</body>
</html>
<?php
//Limpia el posible bucle, es decir, se puede volver a hacer el envío.
$_SESSION[’Listo’]=0;
?>

Recomendaciones finales:

Como habrán podido ver el script no es complicado, y la adaptación a una web ya constituida tampoco lo será. Ya he probado la técnica en uno de mis proyectos (de manera local) y me ha funcionado bastante bien.

Lo que sí quiero aclarar es que al momento de testear esta técnica en una url de 5 variables a más me generó errores (básicamente no encuentra la url amigable generada); una url de 4 variables redirecciona correctamente, pero si luego de ello refresco el navegador genera el mismo error, es decir, no (re)carga la url amigable.

Mi consejo es que usen esta técnica en una url de 3 a menos de 3 variables pasadas por GET y personalicen este script a sus necesidades. Y como es lógico, les aconsejo bastante informarse más sobre el uso del mod_rewrite en Apache, creanme que les aliviará más de un dolor de cabeza.

Finalmente les diré que pueden descargarse el script desde aquí: url_amigable.zip.

Este artículo fue publicado originalmente en willy.tiperu.com.

Incluir en PHP un archivo programado en otro lenguaje

¿Cuando queremos incluir un archivo PHP en nuestra página PHP usamos el include, ¿peró que pasa si lo que necesitamos incluir es el resultado de un archivo programado en otro lenguaje (ASP, PERL…) en nuestra página PHP?

Si lo hicieramos con un include lo único que conseguiriamos seria mostrar el código fuente de dicho archivo en nuestra página ya que el servidor lo interpretaria como un archivo de texto simple al no reconocer la extensión.

pagina.asp:

response.write "Hola, soy una página ASP"

pagina.php:

echo "Llamo a ASP desde PHP";
include ("pagina.asp");

Mostraria en pantalla:
Llamo a ASP desde PHP

response.write "Hola, soy una página ASP"

Para que se muestre el resultado de la ejecución de la página ASP (o cualquier otra página interpretada) lo que haremos es usar el file_get_contents de la siguiente manera:

echo "Llamo a ASP desde PHP";
echo file_get_contents("http://www.dominio.com/pagina.asp");

Y obtendriamos:

Llamo a ASP desde PHP
Hola, soy una página ASP

Es necesario poner siempre la ruta absoluta de la página

Autor: Xavier Bernadí i Millan
http://www.webtaller.com/construccion/lenguajes/php/lecciones/incluir-php-archivo-programado-otro-lenguaje.php

Pasar una variable de PHP a JavaScript

Es sencillo, simplemente es hacer la asignación respetando la sintaxis de JavaScript. El siguiente ejemplo lo ilustra de una forma sencilla:

<?php

echo ‘<head><title>’.$_SERVER[PHP_SELF].'</title></head>

<html>

<body>’;
$variable_php=»variable en php»;
echo ‘<script languaje=»JavaScript»>

var varjs=»‘.$variable_php.'»;

alert(varjs);

</script>’;
echo «<a href=$_SERVER[PHP_SELF]>Recargar la Página</a>»;

echo ‘</body>

</html>’;
?>

Fuente http://dns.bdat.net/trucos/faqphp-v1/x98.html

javascript: controlar entrada de datos en caja de texto (este si que funciona en chrome, firefox y explorer)

Con este código se valida lo que va tecleando el usuario en un cuadro de texto o un textarea. Puede validarse que solo escriban números, solo letras, números y letras, determinados caracteres…

Primero veremos el código (con la posibilidad de ver el ejemplo funcionando) y comentaremos el significado y funcionamiento de algunas líneas. Más adelante pondremos varias modificaciones del código original para que se adapte a lo que necesitemos en determinado momento

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Validar entrada de datos</title>
<script type="text/javascript">
function validar(e) { // 1
    tecla = (document.all) ? e.keyCode : e.which; // 2
    if (tecla==8) return true; // 3
    patron =/[A-Za-z\s]/; // 4
    te = String.fromCharCode(tecla); // 5
    return patron.test(te); // 6
}
</script>
</head>

<body>
<p><input type="text" name="textfield" onkeypress="return validar(event)" /><br />
<textarea rows="5" cols="20" onkeypress="return validar(event)"></textarea></p>
</body>
</html>

Ver ejemplo

A continuación la explicación de las líneas de código que aparecen numeradas:

1- A la función se le pasa el objeto event

2- Aquí hay que distinguir si el navegador es Internet Explorer (IE) document.all u otro, porque ya os habreis dado cuenta que no todos los navegadores son iguales. Si el navegador es IE se asigna a la variable tecla el valor de e.keyCode, en caso contrario se asigna el valor de e.which. En los dos casos se obtiene el valor ASCII de la tecla pulsada.

3- En esta línea se comprueba si es la tecla pulsada es la tecla de retroceso y en ese caso la función termina (retorna). De esta forma se permite borrar caracteres.

4- Aquí se pone la expresión regular que permite validar si se admite o no la pulsación. En el ejemplo se admiten letras mayúsculas A-Z, letras minúsculas a-z y el espacio \s

5- Se pasa el valor ASCII de la variable tecla a su carácter correspondiente

6- Si el carácter coincide con el patrón, la función devuelve true, si no coincide devuelve false.

Ahora vamos a ver varias expresiones regulares para distintas validaciones. Sustituye la línea 4 por la que necesites:

patron = /\d/; // Solo acepta números
patron = /\w/; // Acepta números y letras
patron = /\D/; // No acepta números
patron =/[A-Za-zñÑ\s]/; // igual que el ejemplo, pero acepta también las letras ñ y Ñ

También se puede hacer un patrón que acepte determinados caracteres, poniendolos entre corchetes. Veamos un ejemplo para validar que solo se acepte a, j, t, 6 y 9:

patron = /[ajt69]/;

O el caso contrario, queremos aceptar cualquier caracter, menos alguno. Los que no nos sirven se ponen en el patron y se cambia un poco el código de la función que usamos para validar

patron =/[javierb]/; // 4
te = String.fromCharCode(tecla); // 5
return !patron.test(te); // 6

Fuente: http://www.telefonica.net/web2/blas-mar/validarformu.html

formularios: campo que solo acepta numeros (ie y chrome bien, firefox mal) :(

Agregando este código en el evento OnKeyPress de un elemento INPUT, logramos que solo se puedan escribir numeros dentro de él.

< input onKeypress=»if (event.keyCode < 48 || event.keyCode > 57) event.returnValue = false;»>

Si queremos ademas permitir el caracter «.» para numeros decimales por ejemplo, es el siguiente código el que deberiamos usar.

< input onKeypress=»if (event.keyCode < 46 || event.keyCode > 57) event.returnValue = false;»>

fuente:http://www.soloasp.com.ar/vercodigo.asp?id=5

Lightbox 2 – auto ajuste de imagen

Modificacion del mitico Lightbox 2 para que las fotos que sean mas grandes que la resolucion de la pantalla se ajusten automaticamente de tal forma que nunca necesiten scroll horizontal.

Enlace a la libreria .js modificada: http://seb.box.re/assets/2007/2/4/lightboxSEB.js

Descargamos esta libreria y la sustituimos por la anterior

Autor: Sébastien Grosjean

Fuente: http://seb.box.re/2006/11/22/lightbox-2-auto-resizing-enhancement