Pasando variables GET a un Wrapper.
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.
- 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.
- 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.
- 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); ?>"
- 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!.
Some articles published on the Joomla Community Magazine represent the personal opinion or experience of the Author on the specific topic and might not be aligned to the official position of the Joomla Project
By accepting you will be accessing a service provided by a third-party external to https://magazine.joomla.org/
Comments