Creando contenido dinámico en PHP para Silverlight
Posted on : 12-08-2009 | By : Rodrigo | In : Silverlight, Silverlight 3
Tags: php, Silverlight 3, XAML
9
Introducción
Como mencionábamos en el artículo anterior, Silverlight puede ser hospedado en prácticamente cualquier tecnología Web del lado del Servidor. Asimismo podemos utilizar las características de la tecnología que estemos utilizando para poder crear Xaml de manera dinámica y enviar dicho contenido a la aplicación Silverlight ya sea a través de parámetros de inicialización (parámetro InitParams en <object>) o a través de un endpoint que podamos descargar por medio de un objeto de tipo WebClient. Es este último caso el que usaremos en este artículo para crear contenido dinámico con PHP.
Creación del proyecto
Siguiendo los mismos pasos que usamos en el artículo anterior para la creación de un Sitio Web en IIS y una aplicación Silverlight, crearemos un nuevo proyecto de tipo Silverlight Application en Visual Studio .NET con el nombre PHPDynamicXaml. Inmediatamente después de haber creado el proyecto borraremos los archivos Default.aspx y PHPDynamixXamlTestPage.aspx y sus archivos relacionados, dejando únicamente el archivo .html.
Agreguemos ahora un archivo llamado Content.php usando la plantilla de Archivo de Texto disponible al seleccionar la opción “Agregar nuevo elemento” en el menú contextual del proyecto. La siguiente figura muestra la ventana de Solution Explorer y la Solución actual:
Será en el archivo Content.php en donde escribiremos el código necesario para la creación dinámica de contenido Xaml. En nuestro ejemplo el contenido será una serie de rectángulos, el cual su número será definido por medio de un parámetro en el Querystring llamado r. El siguiente fragmento ejemplifica el código de PHP necesario para la construcción dinámica de contenido en Xaml:
<?php
header('Content-Type: text/xaml');
$cuantos = 0;
if ($_GET["r"]!=null)
$cuantos = $_GET["r"];
echo "<Canvas xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' Width='800' Height='600'>";
for ($i=1; $i<=$cuantos; $i++)
{
echo "<Rectangle Canvas.Top='" . $i * 10 . "' Canvas.Left='" . $i * 10 . "' Width='30' Height='30' Fill='Red' Stroke='Black' />";
}
echo "</Canvas>";
?>
Es importante resaltar en especial la siguiente línea:
header(‘Content-Type: text/xaml’);
la cual establece que el tipo de contenido que regresará la página .php será de tipo Xaml (también funciona con el content type text/xml ya que Xaml no es más que Xml). Lo anterior es de suma de importancia ya que estamos redefiniendo el comportamiento predeterminado que tiene PHP de regresar HTML.
Ahora bien, como podrán darse cuenta el código obtiene el número de rectángulos a crear por medio del parámetro r del Querystring. Lo que hacemos es simplemente hacer un bucle for para la creación dinámica del Xaml que represente el número buscado de rectángulos. Recuerden que cuando generamos Xaml dinámico es necesario incluir el xmlns por default en el contenedor raíz, si es que interpretaremos este código Xaml utilizando XamlReader.Load().
Lo que resta será escribir el código necesario en nuestra aplicación Silverlight para ejecutar la página php y obtener el resultado de su ejecución (lo cual será efectivamente contenido Xaml). El siguiente código muestra el manejador del evento Loaded del UserControl MainPage:
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
WebClient client = new WebClient();
client.DownloadStringCompleted += (s, a) =>
{
if (a.Error == null)
{
string result = a.Result;
var newElement = XamlReader.Load(result) as UIElement;
LayoutRoot.Children.Clear();
LayoutRoot.Children.Add(newElement);
}
};
int r = 0;
try
{
if (HtmlPage.Document.QueryString["r"] != null)
{
r = int.Parse(HtmlPage.Document.QueryString["r"]);
}
}
catch (Exception)
{
r = 0;
}
string url = string.Format("/Content.php?r={0}", r);
client.DownloadStringAsync(new Uri(url, UriKind.RelativeOrAbsolute));
}
}
La propiedad HtmlPage.Document.QueryString (parte del Puente HTML) permite leer el parámetro r que puede establecer el usuario en la página .html y que a su vez será utilizado para la invocación de la página Content.php. El resto del código se encarga de obtener el resultado de la descarga del endpoint (Content.php) e interpretar el resultado por medio del método XamlReader.Load().
La siguiente figura muestra el resultado de ejecutar la siguiente página:
http://localhost:9050/PHPDynamicXamlTestPage.html?r=12
Lo anterior demuestra que PHP, además de permitirnos hospedar las aplicaciones Silverlight, lo podemos usar para la creación dinámica de contenido Xaml.







[...] ha escrito un par de excelentes artículos de cómo integrar PHP y Silverlight, aquí el detalle: “Creando contenido dinámico en PHP para Silverlight Introducción Como mencionábamos en el artículo anterior, Silverlight puede ser hospedado en [...]
[...] ha escrito un par de excelentes artículos de cómo integrar PHP y Silverlight, aquí el detalle: “Creando contenido dinámico en PHP para Silverlight Introducción Como mencionábamos en el artículo anterior, Silverlight puede ser hospedado en [...]
[...] ha escrito un par de excelentes artículos de cómo integrar PHP y Silverlight, aquí el detalle: “Creando contenido dinámico en PHP para Silverlight Introducción Como mencionábamos en el artículo anterior, Silverlight puede ser hospedado en [...]
[...] This post was Twitted by andresvillenas [...]
Gracias por compartir la información.
Yo estoy haciendo una aplicación con php para mostrar un listado de usuarios y no sabia como mostrar lo en silverlight pero ahora ya tengo una idea.Me pregunto si tiene algun ejemplo relacionado con extracción de datos de Mysql con php y mostrarlos en silverlight.
Buen trabajo..!
Hola Wilfo, esto te puede servir: http://www.designersilverlight.com/2010/05/23/php-mysql-and-silverlight-the-complete-tutorial-part-2/
Gracias Rodrigo por el link esta genial amigo.
Voy a chekear el ejercicio para probar lo.
Hola Rodrigo , me podrias ayudar en lo siguiente:
(En el link que me diste hay una parte que dice:
http://”)
Interpretado seria:direccion dodne tengo mis archivos php.
Los tengo aqui:
http://localhost:88/PhpServicio/
Y en la linea de donde se instancia el WebClient hago esto:
string baseURI=” http://localhost:88/PhpServicio/”
Pero al correr el silverlight desde visual studio no me muestra la información.
Alguna sugerencia ,Rodrigo?
Wilfo, mandame a detalle por mail tu duda
salu2!