jueves, 31 de marzo de 2011

Pasar array de PHP a JavaScript

Bueno primero que todo describiré un poco el entorno para entrar en materia,

Entorno
Entonces tenemos una página en php base.php en la cual mediante javascript, envío parametros por GET para abrir otra pagina resultado.php

El problema
Desde base.php, tengo un select múltiple así:
{script language="java script" src="...reporte.js"}{/script}...

...{span id="selMultiple"}Sitio: {/span}
{select multiple size=2 name="site[]" }
{option value="0"}[Todas]{/option}
{option value=B}B{/option}
{option value=J}J{/option}
{option value=V}V{/option}{/select}


La idea es realizar una selección múltiple desde la página base.php y a partir de ésta generar una consulta SQL que me permíta construir una clausula "IN", entonces tengo la función

{div}{input type="button" onClick="abre('$site');" value="Consultar"}{/div}

que envía los parámetros a...

{function abre(site){
url="resultado.php?site="+site+";
window.open(url,"Reporte","");
}

Aquí el problema, pues la selección múltiple de "selMultiple" crea en php un arreglo con los valores seleccionados, y no es posible pasar este arreglo "directamente" a javascript para enviarlo a resultado.php, entonces...

Mi Solución

Para realizar la consulta desde base.php y que la muestre...
Capturamos la variable con...

$site=$_GET['site'];

Luego creamos un string compatible con la sintaxis de SQL para la clausula "IN" así:

foreach ($site as $data){
$tmp.="'".$data."',";
}
$tmp=substr($tmp, 0, -1);

//resultado de $tmp para la selección de B y J será algo así 'B','J'
$sql="select * from tabla t where t.site in (".$tmp.")";
//resultado para $sql sería: "select * from tabla t where t.site in ('B','J')"

Con ésto queda lista la consulta para ver el reporte en base.php...

pero debo imprimirlo en resultado.php con Excel utilizando las etiquetas

header ("Content-type: application/x-msexcel");
$filename="Reporte.xls";
header("Content-Disposition: filename=\"$filename\";");


Entonces... lo fundamental... pasar la info del arreglo a la función de JavasCript abre()
para esto entonces utilizamos

$tmp=implode(":",$site);
//donde el resultado para $tmp será B:J
{?php
{div}{input type="button" onClick="abre('$tmp');" value="Consultar"}{/div}
?}
//donde el html quedará {div}{input type="button" onClick="abre('B:J');" value="Consultar"}{/div}

De esta forma los valores son pasados a la función... sin ningún problema, y solo restaría añadir en resultado.php

$site=$_GET['site'];
{?php
$site=explode(":",$site);
foreach ($site as $data)
{
$tmp.="'".$data."',";
}
$tmp=substr ($tmp, 0, -1);// quita la última "," para construir la sentencia adecuada
?}


//resultado de $tmp para la selección de B y J será algo así 'B','J'
$sql="select * from tabla t where t.site in (".$tmp.")";
//resultado para $sql sería: "select * from tabla t where t.site in ('B','J')"