Archive
phpxml2form, or how to quick-build an HTML form from any XML document
I’ve been trying to find the kind of PHP library that allows you to quick-generate an HTML form a basic XML structure. Apparently there is no such thing, so here you can find some code that will help you do that (you still have to build the form tags from outside the function). This code is LGPL
/**
* This function builds and prints an HTML form from a given XML Element (loaded by simplexml_load_file())
* @param object A SimpleXML object
* @param int Iteration (to know what level of recursivity we're in and print margins accordingly)
* @param string The basename (prefix) to use for the input names
* @example
* $xml = simplexml_load_file($xml_file_path);
* echo '<form action="" method="POST">';
* xml2form($xml);
* echo '<input type="submit" name="submit" value="Submit">';
* echo '</form>';
*/
function xml2form($xml,$iter=0,$basename='') {
global $attributes_non_editable; // an array of elements to "disable" in the form
$s = '- '; // the symbol to repeat to show a tree-like structure
foreach ($xml->children() as $c) {
$n = $c->getName();
$id = 0;
$attribs = '';
if ($c->attributes()) {
foreach ($c->attributes() as $k => $e) {
if ($k == 'id') {
$id = $e;
}
$attribs .= str_repeat($s,$iter+1).'<label for="'.$basename.'['.$n.']['.$id.']['.trim($k).']">'.trim($k).'</label>';
$dis = '';
if (in_array($k, $attributes_non_editable)) {
$dis = 'disabled="disabled"';
}
$attribs .= '<input type="text" name="'.$basename.'['.$n.']['.$id.']['.trim($k).']'.'" value="'.trim($e).'" '.$dis.' />';
$attribs .= '<br />';
}
}
if (!empty($n)) {
echo str_repeat($s,$iter).'<label for="'.$basename.'['.$n.']['.$id.']'.'">'.$n.'</label>';
echo '<br />';
}
if ($c->children()) {
echo $attribs;
if (empty($basename)) {
xml2form($c,$iter+1,$n.'['.$id.']');
} else {
xml2form($c,$iter+1,$basename.'['.$n.']['.$id.']');
}
echo '<br />';
} else {
if (isset($c[0])) {
echo '<input type="text" name="'.$basename.'['.$n.']['.$id.']'.'" value="'.trim($c[0]).'" /><br />';
}
echo $attribs;
}
echo "\n";
}
if ($iter == 2) { echo '<hr />';}
return true;
}
Many things can be improved (styling-wise) and it would be better with a function to wite the XML as well, but this should be enough for now…
Servicios web con PHP utilizando la herramienta NuSoap
El presente artículo esta dirigido a las personas que ya poseen conocimientos sobre Internet y programación y quieren comenzar a conocer el mundo de los web services (servicios web).
Antes de comenzar con lo que es NuSoap creo que es conveniente realizar una introducción a lo que son los Servicios Web, y para esto debemos comenzar con la definición de Web Service.
Web Service: es un sistema software diseñado para soportar la interoperabilidad máquina – máquina a través de una red. Este tiene una interfaz descripta en un formato que puede ser procesado por una máquina (específicamente WSDL, que veremos más adelante). Otros sistemas interactúan con el Web service utilizando mensajes SOAP los cuales se encuentran establecidos previamente.
Entonces podríamos decir que un Web Service es una comunicación por medio de mensajes SOAP entre diferentes equipos a través de una red.
SOAP – Simple Object Access Protocol
Es un protocolo de comunicación, el cual permite la comunicación entre aplicaciones a través de mensajes por medio de Internet. Es independiente de la plataforma, y del lenguaje. Esta basado en XML y es la base principal de los Web Services. Los mensajes SOAP son documento XML propiamente dicho, pero esto lo veremos más adelante cuando veamos un ejemplo de un mensaje SOAP.
WSDL – Web Services Description Language
Es un protocolo basado en XML que describe los accesos al Web Service. Podriamos decir que es el manual de operación del web service, porque nos indica cuales son las interfaces que provee el Servicio web y los tipos de datos necesarios para la utilización del mismo.
¿Que es NuSOAP?
NuSOAP es un kit de herramientas (ToolKit) para desarrollar Web Services bajo el lenguaje PHP. Esta compuesto por una serie de clases que nos harán mucho más fácil el desarrollo de Web Services. Provee soporte para el desarrollo de clientes (aquellos que consumen los Web Services) y de servidores (aquellos que los proveen). NuSOAP esta basado en SOAP 1.1, WSDL 1.1 y HTTP 1.0/1.1
No es el único soporte para Web Services en PHP, existen otros, pero es uno de los que están en una fase de desarrollo mucho más avanzada. Sin ir más lejos, PHP a partir de su versión 5 comienza a dar soporte para SOAP, pero aun esta en fase experimental.
La instalación es bastante sencilla, solo basta ir a la pagina en sourceforge de NuSOAP http://sourceforge.net/projects/nusoap/ y bajar el archivo comprimido (es un .zip).
Lo descomprimimos en un directorio de nuestro servidor web (como puede ser /lib que es el directorio por default), y listo, ya podemos hacer uso de NuSOAP.
Ejemplo de servicios web utilizando nusoap
Les mostrare la forma de usar nusoap para aplicaciones de servicios web usando wsdl.
ejemplo : nusoap usando wsdl
(Como proveedor del servicio web)
1.- Incluimos la libreria nusoap dentro de nuestro archivo
require_once(‘lib/nusoap.php’);
2.- Creamos la instancia al servidor
$server = new soap_server();
3.- Inicializamos el soporte WSDL
$server->configureWSDL(‘hellowsdl2′, ‘urn:hellowsdl2′);
4.- Registramos la estructura de datos usado por el servicio
// Parametros de entrada
$server->wsdl->addComplexType(
‘Person’,
‘complexType’,
‘struct’,
‘all’,
”,
array(
‘firstname’ => array(‘name’ => ‘firstname’, ‘type’ => ‘xsd:string’),
‘age’ => array(‘name’ => ‘age’, ‘type’ => ‘xsd:int’),
‘gender’ => array(‘name’ => ‘gender’, ‘type’ => ‘xsd:string’)
)
);
// Parametros de salida
$server->wsdl->addComplexType(
‘SweepstakesGreeting’,
‘complexType’,
‘struct’,
‘all’,
”,
array(
‘greeting’ => array(‘name’ => ‘greeting’, ‘type’ => ‘xsd:string’),
‘winner’ => array(‘name’ => ‘winner’, ‘type’ => ‘xsd:boolean’)
)
);
5.- Registramos el metodo a exponer
$server->register(‘hello’, // method name
array(‘person’ => ‘tns:Person’), // input parameters
array(‘return’ => ‘tns:SweepstakesGreeting’), // output parameters
‘urn:hellowsdl2′, // namespace
‘urn:hellowsdl2#hello’, // soapaction
‘rpc’, // style
‘encoded’, // use
‘Greet a person entering the sweepstakes’ // documentation
);
6.- Definimos el metodo como una función PHP
function hello($person) {
global $server;
$greeting = ‘Hello, ‘ . $person['firstname'] .
‘. It is nice to meet a ‘ . $person['age'] .
‘ year old ‘ . $person['gender'] . ‘.’;
if (isset($_SERVER['REMOTE_USER'])) {
$greeting .= ‘ How do you know ‘ . $_SERVER['REMOTE_USER'] . ‘?’;
}
$winner = $person['firstname'] == ‘Scott’;
return array(
‘greeting’ => $greeting,
‘winner’ => $winner
);
}
7.- Usamos el pedido para invocar el servicio
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ”;
$server->service($HTTP_RAW_POST_DATA);
(Como cliente, consumidor del servicio web)
——————————————-
1.- Incluimos la libreria nusoap dentro de nuestro archivo
require_once(‘lib/nusoap.php’);
2.- Creamos la instancia como cliente
$client = new soapclient(‘http://localhost/phphack/hellowsdl2.php?wsdl’, true);
3.- Chekeamos para un posible error
$err = $client->getError();
if ($err) {
// Display the error
echo ‘<h2>Constructor error</h2><pre>’ . $err . ‘</pre>’;
// At this point, you know the call that follows will fail
}
4.- Llamamos al metodo soap
$person = array(‘firstname’ => ‘Willi’, ‘age’ => 22, ‘gender’ => ‘male’);
$result = $client->call(‘hello’, array(‘person’ => $person));
5.- Chekeamos para una falla al momento de llamar al metodo
if ($client->fault) {
echo ‘<h2>Fault</h2><pre>’;
print_r($result);
echo ‘</pre>’;
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo ‘<h2>Error</h2><pre>’ . $err . ‘</pre>’;
} else {
// Display the result
echo ‘<h2>Result</h2><pre>’;
print_r($result);
echo ‘</pre>’;
}
}
6.- Una vez que todo este bien obtenemos la información deseada del servicio a travez del metodo que hemos invocado
se pude ver los pedidos y respuestas de esta manera:
echo ‘<h2>Request</h2>’;
echo ‘<pre>’ . htmlspecialchars($client->request, ENT_QUOTES) . ‘</pre>’;
echo ‘<h2>Response</h2>’;
echo ‘<pre>’ . htmlspecialchars($client->response, ENT_QUOTES) . ‘</pre>’;
// Display the debug messages
echo ‘<h2>Debug</h2>’;
echo ‘<pre>’ . htmlspecialchars($client->debug_str, ENT_QUOTES) . ‘</pre>’;
