A pesar de que en la p�gina se presentan las gr�ficas, convendr�a colocar el array con los datos. Esta operaci�n no es sencilla, aunque pueda parecerlo. Si el array del que estamos hablando lo insertamos despu�s de utilizar la funci�n DrawGraph() (o PrintImage()), no aparecer� en la pantalla del navegador. Si lo colocamos antes, nos espera una sorpresa desagradable: el array aparecer�, pero en lugar de las gr�ficas s�lo veremos signos raros. La causa de tal situaci�n es el env�o de la cabecera Content-type: image/* (donde * representa el formato del dibujo requerido), precediendo la aparici�n de la gr�fica. Por supuesto, eliminando la posibilidad de visualizaci�n del texto com�n anterior (este funcionamiento lo ocasionar�a el env�o autom�tico de la encabecera Content-type: text/html). Tampoco se puede visualizar el texto despu�s de la transferencia del dibujo, ya que el navegador, que est� en espera de una gr�fica, no lo interpretar� de manera correcta. La �nica salida es la creaci�n de un script extra y utilizar en �l la etiqueta HTML IMG. Como el valor del par�metro SRC en la etiqueta IMG podemos dar el nombre del script que crea el dibujo:
... print "Visualizaci�n del array de datos"; print "<IMG SRC=\"graph.php\">"; ...
Esta soluci�n resulta �til s�lamente cuando todos los datos necesarios para la creaci�n de las gr�ficas (es decir, el array de datos y el argumento del m�todo para el objeto PHPlot) se encuentren dentro del archivo llamado en la etiqueta IMG. En el caso del script que se presenta en el Listado 2, los datos proven�an del formulario, del que fueron enviados con la ayuda del m�todo POST. Lo que para nosotros, desafortunadamente, es un problema, ya que en la soluci�n que deseamos implementar, el formulario deber�a llamar al script cuyo fragmento se presenta m�s arriba (es decir, �ste en el cual se encuentra el array con los datos y la etiqueta IMG). Pero, �C�mo transferir los datos del formulario al script, llamado en la etiqueta IMG? Si los datos fueran transferidos con el m�todo GET, se podr�a unir la cadena query string al nombre del script; sin embargo, en el caso de formularios enormes, el obst�culo podr�a ser la capacidad limitada de esta cadena. Tambi�n se puede almacenar el array $_POST en la variable de la sesi�n y restaurar su contenido dentro del script que se menciona.
Es dif�cil no apoyarse en la idea de que soluciones como esta son un perfecto ejemplo de exageraci�n en cosas sencillas. La transferencia de un array superglobal dentro de otro o convertir datos del array $_POST por query string son cosas poco comunes. Por consiguiente, �de qu� manera dar una soluci�n m�s sencilla a este problema? El m�todo PrintImage() nos resulta de ayuda, el cual - adem�s de que puede desplegar la gr�fica � tambi�n permite almacenarla en un archivo. Teniendo la gr�fica en un archivo, �podemos acceder a ella desde la etiqueta IMG!
Ocup�monos del script que nos permitir� almacenar la gr�fica en un archivo. Este se presenta en el Listado 7.
<?php include_once("phplot.php"); $data=array(array("Votaci�n",30,25,12,33)); $graph = new PHPlot(); $graph->SetPrintImage(false); $graph->SetFileFormat("jpg"); $graph->SetOutputFile("graph.jpg"); $graph->SetIsInline(true); $graph->SetDataValues($data); $graph->SetDataType("text-data"); $graph->SetPlotType("pie"); $graph->SetTitle("Resultados de la votaci�n"); $graph->SetLegend(array("Partido A", " Partido B", " Partido C", " Partido D")); $graph->DrawGraph(); $graph->PrintImage(); ?>
Comparando con el script mencionado anteriormente, aqu� aparecen tres funciones nuevas: SetFileFormat(), SetOutputFile() y SetIsInline(). La pimera de ellas permite definir el formato del archivo en el cual se almacenar� la gr�fica. Se puede utlizar los mismos formatos que proporciona la versi�n de la librer�a GD instalada. La segunda funci�n permite definir el nombre del archivo en el cual se encontrar� la gr�fica, y la tercera bloquea el despliegue de la gr�fica en la pantalla. Gracias al uso de estas funciones, en el momento de utilizar el m�todo PrintImage(), en el disco aparecer� el archivo graph.jpg, mientras tanto la p�gina que se visualiza en el navegador quedar� vac�a (no tendr� lugar el env�o de la cabecera Content-type: image/*).
Para saber c�mo utilizar tal gr�fica salvada en el archivo, veamos el script que se presenta en el Listado 8 y el efecto de su funcionamiento que se presenta en la Figura 9.
<?php include("pie_to_file.php"); print "Tabla de datos:<BR><BR>". "<TABLE BORDER>". "<TR><TD>Partido A</TD> <TD>Partido B</TD> <TD>Partido C</TD> <TD>Partido D</TD></TR>". "<TR><TD>30</TD><TD>25</TD> <TD>12</TD> <TD>33</TD></TR>". "</TABLE><BR><BR>"; print "<IMG SRC='graph.jpg'>" ?>
![Figura 9: Unimos datos de texto y gráficas](/cursos_descargas/phpsol_phplot/figura9.gif)
Como podemos ver, en la primera l�nea es llamado el script pie_to_file.php, ya conocido del Listado 7, que crea la gr�fica y la almacena en el archivo graph.jpg. Este archivo se llama en la �ltima l�nea con el tag IMG.
La librer�a PHPlot ofrece muchas m�s posibilidades. Vale la pena notar la posibilidad de escalar los datos, caracter�stica indispensable en el caso de tener la necesidad de colocar datos de valores muy diversos en una gr�fica. Para escalar la gr�fica se utiliza la funci�n DoScaleData(), la cual no es proporcionada por la clase PHPlot, pero si por la clase descendiente PHP_Data (el c�digo de esta clase se encuentra en el archivo phplot_data.php). Si quisieramos utilizar las funciones proporcionadas por la clase descendiente, hay que incluir su c�digo con ayuda de la funci�n include(), y luego crear un objeto de esa clase ($chart = new PHPlot_Data). Utilizando tal objeto se puede llamar los m�todos de la clase base (PHPlot), tanto como los de la descendiente (PHPlot_Data).
�Tomando datos
Introducir datos de manera manual no parece ser una soluci�n muy pr�ctica. Ser�a mucho m�s c�modo obtener tal informaci�n desde uno de los sitios web. Supongamos que queremos presentar las cotizaciones de las monedas en una gr�fica. Estas cotizaciones las proporcionan casi todos los sitios web de los bancos. Si quisi�ramos utilizarlos, bastar�a la funci�n fsockopen(): enviar al navegador la cabecera del request cuyo prop�sito ser� cargar el documento que contenga la informaci�n sobre las cotizaciones de las monedas y, luego, con ayuda de la funci�n fgets() y el uso de expresiones regulares, extraer de la p�gina el fragmento requerido y colocar los datos en el array de datos con la estructura que cumpla los requerimientos de la librer�a PHPlot.