Pasando variables GET a un Wrapper.

Escrito por | 31 Julio 2013 | Publicado en Agosto 2013
Supón que insertas un sitio web externo o desarrollado por tí en un wrapper, pero el funcionamiento de éste depende de variables que deben ser declaradas en la url. He aquí la forma de lograrlo.

Explicando el caso

En la ilustración, aparece un ejemplo de la aplicación que puede tener este tutorial. La aplicación contenida dentro del wrapper toma un número de id y una llave generada aleatoriamente. Esta url le fue enviada anteriormente al usuario por correo electrónico, a manera de confirmación. Cada usuario tendrá entonces un id y key diferentes y el script embebido en el wrapper debe recibir esas dos variables y mostrar los datos del usuario.
En el gestor de menús de Joomla, cuando agregas un nuevo item de menú tipo wrapper, te solicita una url que es la que llamará al contenido de dicho wrapper. Sin embargo si la url debe contener variables, pues la cosa cambia.

Pasar variables por url

Como sabes, una de las formas de pasar variables a un script es por medio de la url (GET) de la siguiente forma:

http://tusitio.com/pagina.php?variable1=valor1&variable2=valor2&variable_n=valor_n...etc.

En el caso del item de menú tipo wrapper, esta url queda fija y aunque declarásemos variables dentro de la url, éstas serían, digamos, constantes y no variables.

Nuestro script que recibe la variable.

Primero haremos un pequeño script en php que nos muestre, por ejemplo, el nombre de un producto en base a una variable establecida en la url. Vamos a crear un archivo llamado 'productos.php' y vamos a guardarlo en donde quieras, en este caso en la carpeta raíz del sitio. El código sería algo cómo esto:

<?php
$productos= array("ninguno", "manzanas", "peras", "uvas");
$id="0";
if (isset($_GET['id'])) $id=$_GET['id'];
if ($id>3) die ("no existe el producto");
echo $productos[$id];

Muy sencillo. El script crea un arreglo con 4 productos. Una variable  (id) establece "0" como valor predefinido y verifica si ha conseguido un valor por la url (GET) y si es así asigna dicho valor a la variable id y al final imprime el valor del arreglo en la posición indicada por la variable (recuerda que que las posiciones en los arreglos se enumeran desde 0). 


El item de menú tipo wrapper

En el gestor de menús, ingresamos al menú que queramos y agregamos un nuevo item de menú tipo wrapper. En la url establecemos "productos.php' y guardarmos. 

En este momento, si damos clic en el item de menú creado, en el wrapper solo se mostrará "ninguno" pues no está recibiendo ninguna variable y el script utiliza el valor dado por default a la variable id (cero), que en el arreglo "productos" corresponde a ese valor. 


Considerando que en la configuración global de tu sitio Joomla! tienes activadas la URL's amistosas, la url que se muestra hasta este momento en tu navegador sería algo como : 

http://tusitio.com/index.php/aliasDelItemDeMenu


Si agregamos "?id=" y un valor al final de la url, la variable la está recibiendo Joomla! pero no el wrapper.

El meollo del asunto 


Lo que sigue es: Vamos a realizar un "override" del componente wrapper para indicar a Joomla! que las variables indicadas en la url, deben ser pasadas también al wrapper. 

  1. En la carpeta de nuestro template, debemos tener una carpeta llamada "html", dentro otra más llamada "com_wrapper" y dentro de esta última, otra más llamada "wrapper". Si no existen, deberás crearlas. 
  2. Ve a la carpeta components>com_wrapper>views>wrapper>tmpl y dentro encontrarás un archivo llamado "default.php". Cópialo y pégalo en la carpeta 'wrapper' que creaste en el paso 1.
  3. Abre este último archivo (el que pegaste) y ve a la línea 37 donde encontrarás:  

    src="<?php echo $this->escape($this->wrapper->url); ?>"
     
  4. Cambia la línea anterior por lo siguiente: 

    src="<?php echo $this->escape($this->wrapper->url); 
    if (isset($_GET['id'])) echo "?id=".$_GET['id'];
    ?>"

Listo. Como sabes, la técnica override hará que Joomla! utilice este archivo en lugar que el que trae por default la instalación de Joomla!. El pequeño cambio verifica si está declarada la variable "id" en la URL y si es así la agrega junto con el signo "?" al final de la url.  

 

Intenta ahora escribir la variable en la url de joomla... así: 

 

tusitio.com/index.php/aliasDelItemDeMenu?id=2 

 

...verás que el wrapper imprime 'manzanas'.  

 

Completando el truco

 

Suponiendo que la cantidad de variables también sea ...variable... ¿qué debemos hacer?. La respuesta es sencilla. Debemos indicar a joomla que pase TODAS las variables declaradas en la URL al wrapper, por lo que el cambio hecho a la línea 37 del archivo default.php, tendría que ser el siguiente:

src="<?php echo $this->escape($this->wrapper->url).'?';
$numero = count($_GET); //cuenta la cantidad de variables GET contenidas
$tags = array_keys($_GET);// obtiene los nombres de las varibles
$valores = array_values($_GET); // obtiene los valores 
for ($i=0; $i<$numero; $i++){ //mediante un 'for' imprime todas las variables en la url del wrapper
echo $tags[$i]."=".$valores[$i]."&"; 
}

Recuerda respetar las comillas.  

 

En resumen 

 

Para pasar variables desde la URL del sitio a un wrapper, debemos hacer un override del componente com_wrapper y agregar a la url del wrapper las variables que se obtengan por GET. 

 

Esta técnica es muy útil para desarrollos independientes que necesitan operar con sus propias variables, pero que necesitas verlos insertados en una página de Joomla.  

 

¡Hasta la próxima!. 

Visto 8387 veces Etiquetado como Spanish, Desarrollador
Luciano Martínez

Luciano Martínez

Desde Ciudad de México. 

Licenciado en Sistemas de Computación Administrativa por la Universidad del Valle México. Programador php desde 2009 y usuario apasionado de Joomla! desde el mismo año. 

Desarrollo sitios web con Joomla desde el 2010. 

Actualmente participo activamente con recomendaciones y ayuda a otros usuarios dentro del JUG de la Ciudad de México en Facebook.

Mi objetivo dentro del Jooma Magazine es aportar artículos sobre las experiencias y retos que he tenido con Joomla y cómo, quizá de la manera menos elegante, he dado con una solución eficaz y que me ha dejado mucho aprendizaje. 

Al pertenecer a esta comunidad, también deseo aprender. Creo firmemente que el aprendizaje es el camino del éxito y es mejor si este aprendizaje es recíproco.