Está en la página 1de 48

Documento Tcnico

Delphi para PHP en accin


Jos Len, qadram software S.L.
Diciembre 2009

Corporate Headquarters
100 California Street, 12th Floor
San Francisco, California 94111

EMEA Headquarters
York House
18 York Road
Maidenhead, Berkshire
SL6 1SF, United Kingdom

Asia-Pacific Headquarters
L7. 313 La Trobe Street
Melbourne VIC 3000
Australia

SUMARIO
PHP es un lenguaje de programacin interpretado, cuyo propsito inicial era facilitar la
creacin de pginas web dinmicas. Se utiliza principalmente en el desarrollo de
aplicaciones web, siendo ejecutado en el lado del servidor, aunque actualmente ha
evolucionado hasta poder ser utilizado como lenguaje de scripting de propsito
general e incluso, para la creacin de aplicaciones de escritorio.
Entre sus caractersticas, destaca la multiplataforma, es decir, los scripts PHP pueden
ser interpretados en multitud de sistemas operativos y entornos, lo que aporta una gran
versatilidad. Otra de sus caractersticas principales, son las extensiones, que
proporcionan funciones al lenguaje, enriqueciendo las aplicaciones de forma muy
sencilla.
Su sintaxis es muy similar a C, con algunos toques de Perl, y debido a esto, su curva de
aprendizaje es muy pequea. No requiere la definicin de tipos de variables, aunque s
se puede saber el tipo de una variable en un determinado momento.
Delphi para PHP supone una autntica revolucin en el panorama del desarrollo de
aplicaciones PHP, ya que proporciona un entorno de desarrollo visual completamente
integrado, y, lo ms importante, una librera de clases orientada a componentes, que
facilita enormemente el desarrollo de interfaces.
Delphi para PHP representa la opcin ms sencilla para los programadores en Delphi
para Windows a la hora de aprender a crear aplicaciones web, ya que les
proporciona el mismo IDE, y una librera de clases visual que ha sido modelada
utilizando VCL para Windows como base.
Este documento le presenta todas las caractersticas del producto que debe tener en
cuenta si est pensando desarrollar aplicaciones web en PHP, o si ya lo hace, le
explica las mejoras de productividad puede conseguir.

UN RECORRIDO POR EL IDE


VENTANA PRINCIPAL
La ventana principal acoge todos los elementos que Delphi para PHP proporciona
para el desarrollo de aplicaciones. Cuando el IDE arranca por primera vez, vemos en
el centro la pgina de bienvenida, que muestra los proyectos recientes, noticias,
enlaces a recursos, etc. En la parte izquierda podemos ver el panel de estructura y el
inspector de objetos, y en la parte derecha, el gestor de proyectos, explorador de
datos y paleta de herramientas.
El interfaz est compuesto de ventanas empotrables que le permiten configurar el
entorno de desarrollo para que se ajuste a su forma de trabajar. Para mover una
herramienta de un sitio a otro, simplemente haga clic sobre ella y arrstrela hasta su
localizacin definitiva. Las ventanas de herramienta tambin pueden estas agrupadas
en pestaas, de forma que compartan una misma zona de trabajo. Estas
configuraciones se pueden guardar utilizando la barra de herramientas de la zona
superior, y el desplegable tambin le permite cambiar la configuracin activa.

PGINA DE BIENVENIDA
Al iniciar el IDE, se muestra esta pgina, que puede utilizar para abrir un proyecto o
archivo reciente, leer las ltimas noticias relacionadas con Delphi para PHP, acceder a
notas de la versin, al documento de instalacin y le presenta enlaces con ms
informacin en la web. Tambin dispone de cuatro botones en la parte superior que le
permiten crear nuevos elementos, como proyectos o componentes, abrir proyectos y
archivos e incluso, acceder a la ayuda. A todos los efectos, esta pgina es un
explorador web, por lo que puede utilizarlo para navegar por internet.

ESTRUCTURA
Este panel muestra la estructura del elemento que se est editando actualmente en la
zona de contenido. Por ejemplo, si est editando cdigo PHP, este panel mostrar una
representacin jerarquizada del contenido de su cdigo fuente. Sin embargo, si est
editando un formulario visual, este panel mostrar una vista jerrquica de los
componentes que contiene dicho formulario.
Dependiendo de la vista activa puede realizar diferentes acciones. Si est mostrando
la estructura de un cdigo fuente, haciendo doble clic en cualquier elemento, el
editor se posicionar en la declaracin del elemento pulsado. Si est mostrando la
estructura de un formulario, doble clic no har nada, pero puede arrastrar y soltar
elementos dentro de otros, para insertar un control dentro de otro.

INSPECTOR DE OBJETOS
El inspector de objetos muestra las propiedades y eventos del objeto seleccionado en
el diseador, tanto su nombre, como su valor. Y tambin le permite cambiar dicho
valor o asignar un evento. Dependiendo del tipo de elemento que est seleccionado,
las pestaas disponibles de informacin cambian, por ejemplo, si es un componente
VCL para PHP, se mostrarn Propiedades, Eventos y Javascript, pero si es un
componente HTML, se mostrar solo Propiedades, ya que el resto de pestaas no
tienen sentido para ese elemento.
Es importante destacar que las propiedades cuyo valor difiera del valor por defecto, se
muestran en negrita. Tambin indicar que las propiedades que hacen referencia a
otro componente se muestran en rojo y que, si se les asigna un valor, se pueden
desplegar para cambiar directamente los valores de dicha referencia.
Puede utilizar el Inspector de Objetos para la edicin de propiedades complejas,
como por ejemplo Font, de forma que se pueden establecer propiedades anidadas
como Align o Size de independientemente.
A la hora de editar una propiedad, dependiendo del tipo de propiedad y el editor
asignado, se muestra un tipo de editor, puede ser texto normal, una lista de valores o
un editor personalizado.

GESTOR DE PROYECTOS
Puede utilizar esta herramienta para agrupar los archivos de su aplicacin en
proyectos, y estos, a su vez, ser agrupados en grupos de proyectos. En cualquier caso,
la creacin de un proyecto no es necesaria para la utilizacin de Delphi para PHP, ya
que se puede trabajar perfectamente en archivos independientes. Sin embargo, hay
herramientas, como el asistente de internacionalizacin o el de despliegue, que son
ms tiles cuando se trabaja con un proyecto, ya que necesitan saber todos los
archivos que componen una aplicacin.
Cualquier archivo puede formar parte de un proyecto, incluyendo sus plantillas HTML o
las hojas de estilo CSS.
Para aadir un proyecto nuevo a un grupo de proyectos, utilice el botn Nuevo de
la barra de herramientas, tambin puede aadir un proyecto existente al grupo de
proyectos actual utilizando el comando Proyecto | Aadir proyecto existente.

Por ltimo, puede hacer clic con el botn derecho sobre un proyecto, y utilizar Aadir
carpeta al proyecto, una herramienta muy til para incorporar al proyecto archivos
sueltos que estn en una carpeta. Esta herramienta permite filtrar por extensin para
aadir solo los archivos que cumplan con la condicin del filtro.

EXPLORADOR DE DATOS
Esta herramienta tiene una doble funcin, primero, le permite explorar bases de datos,
aadiendo la informacin de la conexin, y luego expandiendo cada uno de los
niveles. Puede explorar tablas, vistas, procedimientos almacenados, funciones y
sinnimos, y, a su vez, los campos y parmetros que los componen.
La segunda funcin es la de interactuar con el diseador de formularios, ya que puede
arrastrar y soltar informacin desde el explorador de datos en el formulario activo. Si
arrastra una base de datos, se crear un componente Database, con las propiedades
establecidas en sus valores adecuados. Si arrastra una tabla, se crearn los
componentes necesarios (Database, Table, Datasource), todos ellos conectados
convenientemente, y aparte, un DBGrid conectado al Datasource. Si arrastra un
campo de una tabla, se crear un Edit, ms todos los componentes de acceso a
datos si es necesario.
Puede establecer tipo de control que se crear mediante los dos desplegables de la
parte superior, denominados Conjunto de datos y Campos. Esto es muy til
cuando se estn creando formularios con acceso a datos.

PALETA DE HERRAMIENTAS
La paleta de herramientas contiene todos los componentes que puede utilizar para
desarrollar su aplicacin. Estos componentes se instalan en el IDE mediante paquetes
en la opcin Componente | Paquetes. Dichos componentes se agrupan en
categoras, como Standard, Additional, etc., y puede utilizar el smbolo (-) para
colapsar dichas categoras y dejar solo las que le interesen.
Para utilizar un componente de la paleta, haga clic en su icono o nombre, y luego
haga clic en un formulario, el componente se crear a su tamao por defecto.
Tambin puede arrastrar y soltar para crear el componente con unas dimensiones
establecidas, y puede hacer doble clic directamente en la paleta de herramientas
para que el componente se cree dentro del control activo, centrado y con su tamao
por defecto.
Si desea buscar un componente, puede hacer clic en el icono de filtro, y luego,
utilizando el teclado, escribir parte del nombre. A medida que vaya escribiendo, la lista
de componentes se filtrar y se mostrar solo aquellos cuyo nombre contenga la
cadena que est escribiendo.

VCL PARA PHP


ESTRUCTURA
VCL para PHP es la librera de clases que utiliza Delphi para PHP para crear
aplicaciones. Ha sido escrita utilizando la misma estructura que VCL para Windows,
por lo que todas las clases base son las mismas y sirven para lo mismo.
Por ejemplo, la clase base de todas las clases de la librera es Object, igual que en VCL
para Windows, que es TObject. Esta clase proporciona mtodos bsicos como
classname, que estn disponibles para todas las clases que derivan de ella.
Directamente de Object, deriva Persistent, que introduce mtodos y propiedades que
permiten almacenar y recuperar una clase en la sesin.
A continuacin, de Persistent, deriva Component, que es la clase mnima a utilizar para
escribir un componente que se pueda situar en un formulario.
Component introduce propiedades tan importantes como Name, y el concepto de
propiedad entre componentes.
Posteriormente, Control, deriva de Component y es el control base para crear
controles visuales, es decir, controles que produzcan cdigo que luego interpretar el
navegador.

PROPIEDADES Y EVENTOS
En Delphi para Windows, podemos crear una propiedad para un determinado
componente, es decir, un atributo que determine una caracterstica de un objeto, y
cuyo acceso venga determinado por dos mtodos. Uno de los mtodos se utiliza para
establecer el valor y el otro para obtenerlo, de esta forma, se puede formatear la
propiedad, validarla o ser notificado cuando se produzca algn cambio.
En la sintaxis de PHP no existe una palabra clave para definir una propiedad
entendida de esta forma, pero no hay que preocuparse, ya que VCL para PHP
proporciona un mecanismo similar.
En VCL para PHP, una propiedad est compuesta de dos mtodos, el setter y el
getter, y una vez un objeto tiene definidos dichos mtodos, es posible escribir cdigo
como este:
01<?php
02require_once("vcl/vcl.inc.php");
03//Includes
04use_unit("system.inc.php");
05
06classMiClaseextendsObject
07{
08protected$_mipropiedad="";
09
10functiongetMiPropiedad(){return$this>_mipropiedad;}
11functionsetMiPropiedad($value){$this>_mipropiedad=$value;}
12
13}
14
15$objeto=newMiClase();
16
17$objeto>MiPropiedad="hola,mundo!";
18
19echo$objeto>MiPropiedad;
20
21?>

Hay dos tipos de propiedades, Public y Published, la diferencia est en el nombre de


los mtodos, read/write o set/get, de esta forma el IDE es capaz de saber qu
propiedades debe presentar en el Inspector de Objetos y que propiedades no.
01<?php
02classMiClaseextendsObject
03{
04protected$_propiedadpublic="";
05
06functionreadPropiedadPublic(){return$this>_propiedadpublic;}
07functionwritePropiedadPublic($value){$this>_propiedadpublic=$value;}
08
09
10protected$_propiedadpublished="";
11
12functiongetPropiedadPublished(){return$this>_propiedadpublished;}
13functionsetPropiedadPublished($value){$this>_propiedadpublished=$value;}
14
15}
16?>

PERSISTENCIA
Una de las diferencias entre las aplicaciones web y las aplicaciones de escritorio es la
persistencia de los datos. En una aplicacin de escritorio, el programa no termina
hasta que se cierra la ventana principal, por lo tanto, los valores asignados a las
propiedades de los componentes no se pierden hasta que la aplicacin se cierra. En
una aplicacin web, los scripts que las componen se ejecutan de principio a fin,
perdiendo el valor de dichas propiedades.
En VCL para PHP, esto est resuelto de forma automtica, ya que los componentes
almacenan el valor de sus propiedades y posteriormente lo recuperan cuando el script
arranca de nuevo.
Esto tiene el efecto deseado, es decir, siempre que establezcamos el valor de una
propiedad, dicha propiedad conservar el valor asignado durante todo el tiempo de
vida de la aplicacin.

CARACTERSTICAS DE TIEMPO DE DISEO


Para que un IDE pueda gestionar componentes de forma visual, es absolutamente
necesario que dichos componentes puedan distinguir cuando estn ejecutndose
dentro del IDE y cuando lo estn haciendo en la aplicacin del usuario.
Quizs, en tiempo de diseo, el componente quiera mostrar indicadores, guas o
informacin adicional, exclusivamente para el desarrollador. Es por eso, que es
necesario proporcionar un mecanismo por el cual, podamos saber si estamos en
tiempo de diseo o tiempo de ejecucin. Para ello, podemos comprobar si el bit

csDesigning est establecido en la propiedad ControlState, de estar activado, indica


que el componente est siendo utilizando dentro del IDE.
01<?php
02if(($this>ControlState&csDesigning)==csDesigning)
03{
04echo"EstoydentrodelIDE";
05}
06else
07{
08echo"Estoyentiempodeejecucin";
09}
10?>

Aparte, para facilitar al desarrollador el uso de los componentes, es necesario


proporcionar informacin adicional al IDE, como por ejemplo, indicar los valores
vlidos para una determinada propiedad, o el tipo de editor de propiedades a utilizar
cuando se edite una propiedad.
O incluso, indicar al IDE, mediante el registro del componente, en qu categora de la
paleta de componentes debe aparecer.

TIPOS DE CONTROLES
Actualmente, hay varios tipos de controles o componentes, que varan desde los
menos visuales a los ms visuales:
Componentes no visuales
Controles basados en tags HTML estndar
Controles HTML compuestos
Controles Javascript
Controles de Imagen
Controles Flash
Veamos con ms detalle las caractersticas principales de cada uno.

COMPONENTES NO VISUALES
Estos componentes derivan directamente de Component, y no producen ninguna
salida por el navegador, sino que aportan funcionalidad, como por ejemplo, el
componente Timer. Este componente se utiliza para ser notificado, mediante un
evento, y dependiendo de un intervalo de tiempo. Este componente no produce
ningn cdigo visible por el usuario, pero s que utiliza Javascript para toda su
programacin. Otro tipo de componentes no visuales, son los de acceso a datos, que
permiten conectar controles con tablas de base de datos.

COMPONENTES BASADOS EN TAGS HTML ESTNDAR


Estos componentes generan cdigo basado en tags HTML estndar como <input> o
<select> y utilizan sus propiedades para generar todos los atributos que determinan el
aspecto de dicho tag.
Controles como Button, Edit o ComboBox estn basados en estos tags. La ventaja de
utilizar estos controles, es que prcticamente todos los navegadores proporcionan una
representacin de ellos, y se adaptan visualmente al interfaz que utilice el usuario en su
sistema operativo.
Es conveniente utilizar estos controles cuando no se requieran caractersticas
avanzadas, ya que son mucho ms ligeros y se ejecutan ms rpido que controles ms
complejos.

COMPONENTES HTML COMPUESTOS


Controles como CheckListBox, utilizan el HTML disponible, para funcionar, en este caso,
tablas, checkboxes, etc. Estos componentes tambin son muy ligeros, ya que apenas
utilizan javascript y se comportan muy bien en diferentes sistemas.
Realmente se pueden hacer muchas cosas con HTML en un navegador para emular
las aplicaciones de escritorio. Aprovechando las ventajas de VCL para PHP, se pueden
crear componentes muy sofisticados que utilicen HTML, imgenes y CSS.
Estos componentes tambin pueden hacer uso de Ajax para interactuar con el
servidor y actualizar su estado sin necesidad de hacer un envo completo.

CONTROLES JAVASCRIPT
Estos controles suelen estar basados en libreras de javascript, como jquery, qooxdoo,
xinha, etc. Utilizan toda la potencia de Javascript para crear controles avanzados,
como RichEdit o DBGrid, que emulan controles complejos que se pueden encontrar en
aplicaciones de escritorio.
Actualmente, los navegadores estn mejorando la velocidad de ejecucin de
Javascript de forma asombrosa, por lo que el uso de estos componentes hace que
cada vez, las aplicaciones web se asemejen ms a aplicaciones de escritorio.

CONTROLES DE IMAGEN
Hay veces que un componente, en vez de generar cdigo HTML o Javascript, puede
generar un archivo de imagen, por ejemplo, un PNG. Este tipo de controles, se
denominan controles de imagen, y un ejemplo, puede ser el componente
SimpleChart. Estos componentes utilizan los valores de las propiedades para generar
una imagen de forma dinmica y volcarla por la salida.
Si desea crear un control de este tipo, debe establecer el estilo csImageContent a 1
para el control, de esta forma, el IDE sabe que tiene que gestionarlo de forma
diferente.
Puede realizar esto con esta lnea de cdigo en el constructor:
1$this>ControlStyle="csImageContent=1";

Como vemos en la imagen inferior, el IDE genera primero la imagen en un archivo


temporal y luego se muestra usando el tag <img>

CONTROLES FLASH
Podemos decir que este tipo de controles son los ms avanzados, aunque para
funcionar, necesitan que el navegador del usuario disponga del plug-in de Flash. Las
valores de las propiedades de estos componentes se envan a la pelcula flash que los
utiliza para mostrar el control al usuario. Un ejemplo de este tipo de control, es el
control OpenChart, basado en una librera flash.

EMPAQUETADO DE CDIGO YA EXISTENTE


La forma ms sencilla de crear un componente VCL para PHP, es empaquetar cdigo
ya existente. Existen multitud de libreras, bien sean de javascript, de PHP, basadas en
jquery, en flash, etc, etc, que son candidatas ideales para ser integradas en Delphi
para PHP. La librera de clases fue diseada con ese concepto en mente, por lo tanto,
el proceso es muy sencillo, basta con crear un componente que actuar de
envoltorio o wrapper sobre esa librera, ofreciendo un interfaz comn de
propiedades, mtodos y eventos que se utilizarn para llamar a la librera que
deseemos. De esta forma, podemos incorporar la funcionalidad de dicha librera en el
IDE, y realizar diseos de interfaces de forma visual, con el mnimo esfuerzo.

ASISTENTE DE CREACIN DE COMPONENTES


Para crear un nuevo componente, lo ms sencillo es ejecutar el asistente que
proporciona el IDE, utilizando Componente | Nuevo Componente. Debemos indicar
que clase servir de base para desarrollar nuestro nuevo componente, normalmente
ser Control. Despus debemos introducir el nombre de la clase del nuevo
componente y por ltimo, si queremos crear el paquete para instalarlo en el IDE,
seleccionar la categora de la paleta que queramos.

Una vez pulsemos aceptar, se crear la unidad con el cdigo base de nuestro
componente:
01<?php
02require_once("vcl/vcl.inc.php");
03//Includes
04
05//Classdefinition
06class MyNewComponentextends Control
07{
08function __construct($aowner=null)
09{
10parent::__construct($aowner);
11}
12
13function dumpContents()
14{
15parent::dumpContents();
16}
17}
18?>

Y tambin, si lo hemos seleccionado, el cdigo del paquete:


01<?php
02require_once("vcl/vcl.inc.php");
03use_unit("designide.inc.php");
04
05setPackageTitle("Putthetitleofyourpackagehere");
06//Changethissettingtothepathwheretheiconsforthecomponentsreside
07setIconPath("./icons");
08
09//Changeyourunit.inc.phptothephpfilewhichcontainsthecomponentcode
10registerComponents("MyComponents",array("MyNewComponent"),"unit1.inc.php");
11?>

PAQUETES DE COMPONENTES
Un paquete de componentes, es un simple fichero PHP que contiene llamadas a
funciones PHP que interactan con el IDE, para indicar cmo se tiene que instalar un
determinado componente o grupo de componentes.
Aparte de indicar donde instalar los componentes, tambin contienen indicaciones
para el IDE acerca de las propiedades de dichos componentes, y como editarlas en el
Inspector de Objetos.

GENERACIN DE CDIGO
A diferencia de los componentes para aplicaciones de escritorio, los componentes
VCL para PHP no pintan su aspecto (excepto los controles de imagen), sino que
generan cdigo para que sea el navegador el encargado de pintarlos.
Por lo tanto, la tarea bsica de un desarrollador de componentes VCL para PHP es la
de analizar el cdigo que hay que generar, cdigo que entienda el navegador (HTML,
Javascript, CSS) para que el componente vaya cambiando en base al valor de sus
propiedades.
Este es quizs el aspecto que ms diferencia la creacin de componentes VCL para
PHP de la creacin de componentes VCL para Windows, el resto, es exactamente
igual, propiedades, mtodos y eventos.
La generacin del cdigo principal se hace sobrescribiendo el mtodo
dumpContents(), que es llamado por la VCL para PHP para obtener el cdigo del
componente. Existen otros, como dumpHeaderCode() que son ms especficos.
01<?php
02function dumpContents()
03{
04//settypedependingon$_ispassword
05$type=($this>_ispassword)?'password':'text';
06
07if($style!="")$style="style=\"$style\"";
08
09//calltheOnShoweventifassignedsotheTextpropertycanbechanged
10if ($this>_onshow!=null)
11{
12$this>callEvent('onshow',array());
13}
14
15$avalue=$this>_text;
16$avalue=str_replace('"','&quot;',$avalue);
17echo "<inputtype=\"$type\"id=\"$this>_name\"name=\"$this>_name\"
value=\"$avalue\"$style/>";
18}
19?>

LOCALIZACIN DE APLICACIONES
La localizacin de aplicaciones en Delphi para PHP es un proceso que consta de dos
partes bien diferenciadas: Traduccin de las cadenas o literales usados en el cdigo y
la traduccin de las propiedades de los componentes que sean de tipo cadena.

CADENAS EN EL CDIGO
Para traducir las cadenas de texto del cdigo, se utiliza el mtodo estndar de
traduccin de aplicaciones en el mundo *nix, esto es, la tecnologa gettext que es
soportada perfectamente por el motor de PHP.
Para indicar que una cadena de texto est sujeta a traduccin, debemos encerrarla
en la funcin _(), de esta forma, el parser encargado de extraer esas cadenas
puede identificarlas. Aparte, llamando a esa funcin, hace que la cadena devuelta
sea la traduccin correcta en base al lenguaje activo.
1<?php
2function mifuncion($parametro)
3{
4echo _("Cadenasujetaatraduccin");
5}
6?>

Para traducir las cadenas, utilizamos el asistente de internacionalizacin, que recopila


los archivos que componen el proyecto, pide informacin sobre los lenguajes a los que
se quiere traducir y, posteriormente, ejecuta sobre ellos el programa xgettext,
encargado de extraer dichas cadenas a un archivo con extensin .po.
Una vez tenemos ese archivo con extensin .po, podemos utilizar un programa de
edicin llamado poEdit (o cualquier otro con soporte para .po) que nos permite
traducir las cadenas almacenadas y generar un archivo binario con extensin .mo.
Este archivo .mo es el que utiliza el motor de PHP para traducir las cadenas que se
pidan mediante la funcin _().
Este proceso lo podemos repetir cuantas veces queramos a medida que vayamos
desarrollando nuestro proyecto, ya que las cadenas nuevas que se introduzcan, se
aadirn al archivo .po, y no se pierden los contenidos que ya se hayan traducido.

PROPIEDADES VISUALES
Para traducir las propiedades visuales, lo que debemos hacer es cambiar la
propiedad Language del formulario en el que estemos trabajando. Si cambiamos a
otro idioma, por ejemplo, francs, todos los cambios de propiedades que hagamos en
dicho idioma, se almacenarn en un archivo .xml.php aparte, no solo de las
propiedades de tipo cadena, sino todas, de forma, que estas propiedades se tendrn
en cuenta solo cuando el lenguaje activo cambie.
Dependiendo del idioma al cual queramos traducir nuestra aplicacin, hay ocasiones
donde las dimensiones de los controles no son suficientes para que quepan los nuevos
textos, es por eso, que podemos redimensionar nuestro formulario para que se
adapten correctamente.

CAMBIANDO EL LENGUAJE ACTIVO


Para cambiar el lenguaje de nuestra aplicacin en tiempo de ejecucin, debemos
usar la propiedad Language del objeto global application:
01<?php
02functionButton1Click($sender,$params)
03{
04global$application;
05
06if($application>Language=="(default)")
07{
08$application>Language="Spanish(TraditionalSort)";
09}
10else
11{
12$application>Language="(default)";
13}
14}
15?>

De esa forma, el motor de PHP utilizar el archivo .mo que coincida con el lenguaje
nuevo. Dependiendo del sistema operativo en el que se ejecute, quizs debamos
hacer algunos ajustes para que funcione correctamente, en algunas versiones de Linux
debemos instalar los locales adecuados para los idiomas en los que funciona nuestra
aplicacin, pero lo normal es que funcione por defecto en cualquier servidor.

UTILIZANDO ESTILOS CSS


Aparte de las propiedades que utilizan los componentes para determinar su aspecto,
podemos utilizar hojas de estilo CSS y asignarlas a los componentes.
Los componentes pueden tener propiedades que contengan el estilo a utilizar para un
determinado aspecto del componente. Por ejemplo, un DBGrid puede tener una
propiedad que determine el estilo de las cabeceras y otra propiedad para establecer
el estilo de las celdas de datos.

COMPONENTE STYLESHEET
La forma ms sencilla de incorporar una hoja de estilos a un formulario es mediante el
componente StyleSheet. Este componente representa un archivo .css, al que se enlaza
mediante la propiedad FileName.
Una vez hecho este enlace, cualquier componente con una propiedad de hoja de
estilos, en el Inspector de Objetos mostrar un desplegable con los estilos contenidos
en esta hoja de estilos. Puede hacer la prueba con el componente Label, y su
propiedad Style.

JAVASCRIPT
EVENTOS JAVASCRIPT
Hasta ahora, cuando nos hemos referido a eventos, siempre nos hemos limitado a
hablar de eventos PHP, es decir, eventos que suceden en el servidor, y cuyo cdigo,
debe estar escrito en PHP.
Aparte de esos eventos, los navegadores actuales, tambin soportan la ejecucin de
cdigo Javascript. Este cdigo se ejecuta en el ordenador del cliente, ms
concretamente en su navegador, sin enviar ninguna peticin al servidor. Es por esto,
que este tipo de eventos tienen una gran utilidad cuando las operaciones que
queramos realizar necesiten de una respuesta rpida (como por ejemplo, reaccionar
al movimiento del ratn) o queramos actualizar la informacin que est viendo el
usuario, sin necesidad de tener que consultar al servidor para ello.
Por todo esto, los componentes VCL para PHP tambin soportan eventos Javascript, a
estos eventos se accede desde la pestaa Javascript del Inspector de Objetos.
Haciendo doble clic en cualquiera de ellos, nos genera el manejador de evento,
donde ya podemos escribir nuestro cdigo, y el lenguaje que debemos utilizar para
ello es Javascript.
1<?php
2functionButton5JSClick($sender,$params)
3{
4?>
5//Addyourjavascriptcodehere
6window.alert("Esteeventoseproducecuandosepulsaelbotn.");
7<?php
8}
9?>

FINDOBJ
Una de las cosas que ms llama la atencin a los desarrolladores que se introducen en
el mundo del javascript, es la incompatibilidad entre los distintos navegadores. A pesar
de existir un estndar sobre este lenguaje que todos los navegadores deben cumplir, la
realidad es bien distinta. Aunque afortunadamente, poco a poco, esas diferencias se
van reduciendo.
Entre las tareas ms comunes cuando se programa en Javascript, est la bsqueda de
objetos, por ejemplo, de una caja de edicin en un formulario o de un botn, al cual
debemos obtener una referencia para poder utilizarlo. VCL para PHP incorpora una
rutina estndar para obtener una referencia a un objeto, que permite abstraer las
diferencias entre navegadores y que incluso funciona cuando los objetos estn en
diferentes frames.
Esa rutina se llama findObj, y se le pasa el nombre del objeto que queremos obtener.
1//Findtheobject
2hidden=findObj('edit_hidden');
3
4//Useit
5hidden.value=edit.value;

ACCESO A DATOS
PHP es un lenguaje de acceso a datos por excelencia. Debido a sus orgenes como
lenguaje de programacin para hacer pginas web, esta caracterstica le ha servido
para disponer de mltiples formas de acceder a los datos, y lo que es ms importante,
muy rpidas.

MODELO DE ACCESO A DATOS


VCL para PHP incorpora el mismo modelo de acceso a datos que VCL para Windows,
es decir: Database -> Dataset -> Datasource -> Control

ADODB
Los componentes de acceso a datos estndar, estn basados en la librera ADOdb,
que, a pesar de su nombre, no hay que confundir con la tecnologa ADO de Microsoft.
Esta es una librera 100% escrita en PHP, que proporciona una capa de abstraccin
sobre el motor de base de datos que utilicemos en nuestra aplicacin, permitiendo
migrar a otro motor de base de datos, con cambios mnimos o ninguno.
Por lo tanto, cuando utilicemos los componentes estndar, no debemos preocuparnos
del tipo de base de datos, ya que estos componentes se encargarn de la mayor
parte del trabajo.

COMPONENTES NATIVOS
Obviamente, utilizar una capa de abstraccin sobre los datos, tiene alguna
penalizacin de rendimiento, que si bien, para la mayor parte de aplicaciones no
supone ningn problema, en cierto tipo de aplicaciones donde la velocidad de
acceso a los datos sea crucial, puede resultar importante.
Para ello, en VCL para PHP se incluyen componentes de acceso nativo a datos, para
InterBase, Oracle y MySQL. Estos componentes no utilizan ADOdb, sino que usan las
funciones nativas de PHP para acceder a los datos.

AJAX
Ajax es una tecnologa que permite realizar llamadas desde un navegador a un
servidor de forma transparente, sin que el usuario perciba ningn refresco en el
contenido del navegador.
Si deseamos utilizar Ajax en un formulario, tenemos que establecer la propiedad
UseAjax a true, para esas peticiones sean procesadas correctamente. Para hacer una
llamada Ajax, debemos utilizar un evento Javascript, por ejemplo, cuando se pulse un
botn. En el cdigo de dicho evento, tenemos que utilizar el mtodo AjaxCall, que es
el encargado de generar todo el cdigo javascript necesario para realizar la llamada:
01//Classdefinition
02classIndexextendsPage
03{
04public$Label1=null;
05public$Button1=null;
06functionButton1JSClick($sender,$params)
07{
08//DumpthecallusingAjaxtotheButton1Clickevent
09echo$this>Button1>ajaxCall("Button1Click");
10?>
11//Returnfalsetopreventthebuttonsubmittheform
12return(false);
13<?php
14}
15
16functionButton1Click($sender,$params)
17{
18$this>Button1>Caption="clickedAjax".date("Ymdg:i:sa");
19$this>Label1>Caption="HellofromAjax!!".date("Ymdg:i:sa");
20$this>Label1>Color="#".dechex(rand(0,0xFFFFFF));
21}
22}

DEPURACIN DE APLICACIONES
Delphi para PHP incorpora un depurador integrado y totalmente configurado que le
permite depurar aplicaciones PHP desde el primer momento. Basta con poner un
punto de ruptura y presionar F9.

TRAZADOR
Esta herramienta permite encontrar los cuellos de botella de nuestra aplicacin, ya
que emite un informe con las lneas de la aplicacin que se han ejecutado, cuantas
veces, y el tiempo empleado en dicha ejecucin.
Para utilizarlo, tenemos que habilitarlo marcando la casilla Habilitar trazador, y
ejecutando en modo de depuracin.

APLICACIONES DEL MUNDO REAL


En esta segunda parte del documento, vamos a dejar a un lado la teora y vamos
centrarnos en la prctica. Vamos a ver la rapidez con la cual podemos desarrollar una
pgina web corporativa, y, posteriormente, veremos cmo interactuar con Delphi
para Windows.

PGINA WEB CORPORATIVA


Vamos a realizar un sencillo ejemplo de pgina web corporativa, pero que nos va a
servir para poder ver todos los aspectos relativos a la programacin con Delphi para
PHP. En este ejemplo veremos cmo utilizar plantillas, como conectar con base de
datos y como desplegar nuestra aplicacin.

ESTABLECER LOS REQUERIMIENTOS


Primero vamos a especificar las pginas de las que va a constar nuestra web:
Inicio
Servicios
Clientes
Contacto
Empresa
El contenido de dichas pginas estar almacenado en una base de datos, de esa
forma, podremos, en un futuro, crear un interfaz donde nuestro cliente imaginario
pueda actualizar su contenido. Aparte, crear una nueva pgina, reutilizando el
aspecto grfico ser ms sencillo. Tambin queremos que el aspecto grfico sea
independiente del contenido, por lo que vamos a usar un sistema de plantillas.

CREACIN DE LA BASE DE DATOS


Vamos a crear una web corporativa, donde el texto de las pginas va a estar
almacenado en una tabla de base de datos. De esta forma, podemos centralizar el
script que va a mostrar las pginas y tambin podemos crear nuevas pginas de
forma ms fcil.
Para nuestra aplicacin, vamos a usar MySQL, se podra decir que es el motor de base
de datos ms usado por los programadores PHP, es muy rpido y normalmente viene
preinstalado en la mayor parte de los paquetes de hosting que podemos encontrar
para PHP.
La base de datos va a ser muy pequea, con una sola tabla, para albergar las
pginas, con un campo para el identificador y otro para el texto a mostrar.
1CREATETABLEIFNOTEXISTS`paginas`(
2`id`int(11)NOTNULLAUTO_INCREMENT,
3`pagina`varchar(40)NOTNULL,
4`texto`textNOTNULL,
5PRIMARYKEY(`id`)

6)ENGINE=InnoDBDEFAULTCHARSET=latin1AUTO_INCREMENT=1;

En este documento no se explica la instalacin y puesta en marcha de un servidor


MySQL, pero una vez instalado, aconsejamos la instalacin de phpMyAdmin
(http://www.phpmyadmin.net) que permite realizar todas las operaciones necesarias.
Con esta herramienta, podremos crear la base de datos, y, dentro de esa base de
datos, ejecutar el script de creacin que se encuentra en la parte superior.
PhpMyAdmin tambin permite la insercin de datos, por lo que ser muy til para
introducir la informacin de las pginas por defecto.

CREACIN DEL PROYECTO


Para empezar a programar, abrimos Delphi para PHP, y creamos una nueva
aplicacin. Cuando se crea una nueva aplicacin, esta siempre contiene un
formulario nuevo, utilizando el Inspector de Objetos, procedemos a darle nombre, en
este caso Index. Ahora Lo guardamos todo en un directorio de nuestra eleccin,
renombrando la unidad que se ha creado como index.php, ya que va a ser nuestro
script principal. Una vez est todo guardado, debe parecerse a esto:

CONEXIN CON LA BASE DE DATOS


Para acceder a la base de datos, vamos a utilizar un DataModule, para un proyecto
tan pequeo, no sera necesario, pero es conveniente acostumbrarse a aislar las
conexiones con base de datos en un mdulo aparte.
Para aadir un mdulo de datos, seleccionamos Archivo | Nuevo | Mdulo de datos,
como vemos, es un contenedor, pero que solo soporta componentes no visuales.
Utilizando el Inspector de Objetos, cambiamos la propiedad Name a DBModule,
guardamos este mdulo de datos en la misma carpeta que el resto del proyecto, con
el nombre, por ejemplo, dbmodule.php.
Ahora vamos a utilizar el Explorador de Datos, hacemos clic con el botn derecho en
el nodo de MySQL y seleccionamos Registrar base de datos. Nos presentar un
dilogo donde tenemos que introducir los datos de conexin con nuestra base de
datos.

Una vez relleno, presionamos OK, y ya tendremos nuestra base de datos registrada.
Ahora podemos desplegarla, para ver su contenido, ms concretamente, las tablas
que contiene.
Esta misma operacin se puede hacer con cualquiera de los tipos de bases de datos
soportados.
Y ahora, lo que debemos hacer es pinchar y arrastrar la tabla pginas desde el
explorador de datos, al datamodule.

Esta operacin nos habr creado tres componentes:


Database
Table
Datasource
Los tres componentes ya tienen todas sus propiedades necesarias puestas al valor
correcto y estn interconectados entre s y listos para funcionar.
Si este proceso lo tuviramos que hacer a mano, tendramos que hacer lo siguiente:
Colocar el componente Database y poner el valor correcto en DatabaseName,
DriverName, Host, Username y UserPassword
Poner un componente Table, conectar su propiedad Database y establecer el
valor de la propiedad TableName
Poner un componente Datasource y conectar su propiedad Dataset al
componente Table
Como vemos, es mucho ms sencillo arrastrar y soltar que hacer todo eso.

SISTEMA DE PLANTILLAS
Vamos a utilizar plantillas, ya que aportan un alto grado de personalizacin y
flexibilidad, y es lo que suele llegarnos desde los diseadores. Para este proyecto,
vamos a bajar una plantilla corporativa gratuita, que cumpla con las especificaciones
XHTML.
Hay que tener en cuenta que podremos luego cambiar la plantilla sin que eso afecte
para nada a la programacin de nuestra web.

Para este ejemplo, vamos a utilizar esta plantilla:


http://www.styleshout.com/templates/preview/Jungleland1-0/index.html
La bajamos de internet, la descomprimimos, y colocamos todo su contenido en la
misma carpeta del proyecto. Podra estar en una subcarpeta sin problemas, pero es
ms conveniente en la misma, por si acaso el diseador no ha tenido en cuenta este
detalle.
Lo primero que tenemos que hacer es vaciar su zona central, que es donde
insertaremos el contenido de la base datos.
Para eso, editamos el archivo index.html y eliminamos el div con id featured, ese
trozo a la pgina principal exclusivamente. Es conveniente que hagamos una copia
de la plantilla, ya que varios de esos trozos eliminados, sern utilizados posteriormente.

Cuando quitemos ese div, tenemos que buscar el tag <div id=main> y vaciar todo el
tag, ya que este es el contenido que va a variar entre las pginas.

Una vez hecho esto, guardamos el archivo, y si lo abrimos en un navegador web, esto
es lo que veremos.

Ahora vamos a configurar la pgina, para que cuando se muestre, utilice esta plantilla,
para esto, debemos utilizar dos propiedades:
TemplateEngine, que determina el motor de plantillas a utilizar, seleccionamos
SmartyTemplate
TemplateFilename, que determina la plantilla a utilizar, en nuestro caso,
index.html
Simplemente con esto, si ejecutamos index.php utilizando F9, obtendremos la plantilla
tal y como est en el archivo index.html.
SmartyTemplate est basado en el motor de plantillas ms utilizado por los
programadores PHP, se denomina Smarty y puedes encontrar ms informacin en este
enlace: http://www.smarty.net/
Para poder situar contenido dinmico dentro de la plantilla, debemos crear un
hueco, esto se consigue con los tags especiales {%$NOMBRE%}.
1<!main>
2<div id="main">
3{%$CONTENIDO%}
4<!/main>
5</div>

De esta forma, podemos insertar el contenido que necesitemos en el plantilla.


Podemos hacer una prueba insertando algo de contenido, para ver que todo
funciona, para ello, generamos el evento OnTemplate de la pgina e insertamos este
cdigo:
1functionIndexTemplate($sender,$params)
2{
3//Obtenerelobjetotemplate
4$template=$params['template'];
5
6//Asignaruncontenidoenelhueco
7$template>_smarty>assign('CONTENIDO','HolaMundo!');
8}

Lo que estamos haciendo es obtener directamente una referencia al objeto smarty y


asignarle un valor. Si ejecutamos, veremos como en la zona de contenido saldr la
cadena Hola Mundo!.

SCRIPT DE PROCESAMIENTO DE PGINAS


Ya hemos visto como insertar contenido en el hueco que hemos creado, as que ahora
vamos a procesar las peticiones de pginas e insertar el contenido que haya en la
base de datos.
Los enlaces a las pginas van a tener la forma index.php?page=nombre, donde
nombre, debe coincidir con el campo pgina de la tabla de base de datos.

Tenemos que buscar dicho registro e insertar el contenido del campo texto en la
zona de contenido de la plantilla.
Para hacer esto, debemos incluir en nuestro script, el modulo de datos que contiene la
conexin con la base de datos. Utilizamos Archivo | Usar unidad y seleccionamos
dbmodule.php.
Esto aade, en la zona de inclusiones, la directiva require_once con el cdigo fuente
que le hemos indicado. De esta forma, ya tenemos acceso a dicho objeto.
Primero vamos a ver si hay alguna peticin de pgina, eso lo hacemos utilizando el
objeto $input para realizar un filtrado y prevenir algn tipo de ataque:
1global$input;
2
3//Miramossihayunparmetropageenlaentrada
4$page=$input>page;
5
6//Dehaberlo,lofiltramoscomounacadena,sino
7//hayninguno,sacaremoslapginapordefecto
8if(is_object($page))$pagina=$page>asString();
9else$pagina='inicio';

Ahora tenemos que utilizar ese nombre de pgina para buscar el contenido en la
tabla de base de datos, para ello, vamos simplemente a filtrar la tabla y sacar el
primer registro. As quedara la rutina completa:
01functionIndexTemplate($sender,$params)
02{
03//Obtenerelobjetotemplate
04$template=$params['template'];
05
06global$input;
07
08//Miramossihayunparametropageenlaentrada
09$page=$input>page;
10
11//Dehaberlo,lofiltramoscomounacadena,sino
12//hayninguno,sacaremoslapginapordefecto
13if(is_object($page))$pagina=$page>asString();
14else$pagina='inicio';
15
16global$DBModule;
17
18//Filtramoslatabladepaginasporlapginaquequeremosmostrar
19$DBModule>tbpaginas1>close();
20$DBModule>tbpaginas1>Filter='pagina="'.$pagina.'"';
21$DBModule>tbpaginas1>open();
22
23//Sacamoselcontenido
24$contenido=$DBModule>tbpaginas1>texto;
25

26//Asignaruncontenidoenelhueco
27$template>_smarty>assign('CONTENIDO',$contenido);
28}

Ahora solo tenemos que introducir en la base de datos los textos de las pginas, que,
recordemos, van a ser: inicio, servicios, clientes, contacto, empresa.
Para la pgina de inicio vamos a usar el trozo que eliminamos del index.html, el div
featured, lo podemos insertar con phpMyAdmin en la misma base de datos, este es
el trozo:
01<!featured>
02<divid="featured">
03<divid="featuredblock"class="clear">
04<divid="featuredribbon"></div>
05<aname="TemplateInfo"></a>
06<divclass="imageblock">
07<ahref="index.html"title=""><imgsrc="images/imgfeatured.jpg"alt="featured"
width="350px"height="250px"/></a>
08</div>
09
10<divclass="textblock">
11<h2><ahref="index.html">Readmefirst</a></h2>
12<pclass="postinfo">
13Postedby<ahref="index.html">erwin</a>|Filedunder
14<ahref="index.html">templates</a>,
15<ahref="index.html">internet</a>
16</p>
17<p>
18<strong>JungleLand1.0</strong>isafree,W3Ccompliant,CSSbasedwebsite
template
19by<ahref="http://www.styleshout.com/">styleshout.com</a>.Thisworkis
20distributedunderthe<arel="license"
href="http://creativecommons.org/licenses/by/2.5/">
21CreativeCommonsAttribution2.5License</a>,whichmeansthatyouarefreeto
22useandmodifyitforanypurpose.AllIaskisthatyouincludealinkbackto
23<ahref="http://www.styleshout.com/">mywebsite</a>inyourcredits.Formorefree
designs,youcanvisit
24<ahref="http://www.styleshout.com/">mywebsite</a>tosee
25myotherworks.
26</p>
27
28<p>GoodluckandIhopeyoufindmyfreetemplatesuseful!</p>
29<p><ahref="index.html"class="morelink">ReadMore</a></p>
30</div>
31</div>
32</div>

Si ahora ejecutamos la aplicacin, veremos como en el centro sale el trozo de HTML


de featured.
Para la pgina de servicios, vamos a poner un trozo del style.html, que representa a un
mensaje de un blog:

01<divclass="post">
02<h2><ahref="index.html">ABlogPost</a></h2>
03<pclass="postinfo">Postedby<ahref="index.html">erwin</a>|Filedunder<a
href="index.html">templates</a>,<a
href="index.html">internet</a></p>
04<p>Loremipsumdolorsitamet,consectetueradipiscingelit.Doneclibero.
Suspendissebibendum.
05Crasidurna.Morbitincidunt,orciac<ahref="index.html">convallisaliquam</a>,
lectusturpisvariuslorem,eu
06posuerenuncjustotempusleo.</p>
07<p>
08Donecmattis,purusnecplaceratbibendum,<ahref="index.html">duipede
condimentum</a>
09odio,acblanditanteorciutdiam.Crasfringillamagna.Phasellussuscipit,leo
apharetra
10condimentum,loremtelluseleifendmagna,<ahref="index.html">egetfringilla
velit</a>magnaidneque.Curabiturvelurna
11Intristiqueorciporttitoripsum.Loremipsumdolorsitamet,consectetuer
adipiscingelit.Doneclibero.Suspendissebib
12Crasidurna.Morbitincidunt,orciacconvallisaliquam,lectusturpisvarius
lorem,eu
13posuerenuncjustotempusleo.</p>
14<pclass="postmeta">
15<ahref="index.html"class="readmore">Readmore</a>|
16<ahref="index.html"class="comments">Comments(3)</a>|
17<spanclass="date">August20,2009</span>
18</p>
19</div>

Si ahora pusisemos en el navegador una direccin como esta:


http://localhost:3570/index.php?page=servicios
Veramos como se nos mostrara la misma plantilla, pero el contenido de la pgina
cambiara.
Ahora solo tenemos que repetir el proceso para el resto de pginas e insertarlas en la
base de datos.

PULIENDO DETALLES
Vamos a hacer unos pequeos cambios para completar la web y hacerla algo ms
amigable, en este caso, vamos a cambiar la cabecera de la plantilla para dos cosas:
Mostrar los enlaces de las pginas de la web corporativa
Que dependiendo de la pgina activa, se ilumine el enlace correcto
Para todo esto, tenemos que cambiar la lista <ul> dentro del div id=nav del
index.html, para que quede tal que as:
1<divid="nav">
2<ul>

3<liid="{%$INICIO%}"><ahref="index.php">Inicio</a></li>
4<liid="{%$SERVICIOS%}"><ahref="index.php?page=servicios">Servicios</a></
5<liid="{%$CLIENTES%}"><ahref="index.php?page=clientes">Clientes</a></li>
6<liid="{%$CONTACTO%}"><ahref="index.php?page=contacto">Contacto</a></li>
7<liid="{%$EMPRESA%}"><ahref="index.php?page=empresa">Empresa</a></li>
8</ul>
9</div>

De esta forma, veremos en la parte superior los enlaces a todas las pginas que
queremos, y, aparte, podemos establecer cul de ellas va a estar resaltada si
establecemos el hueco de su nombre de pgina a current. Para eso tenemos que
aadir esta lnea al final del evento OnTemplate:
1$template>_smarty>assign(strtoupper($pagina),'current');

Hacindolo de esta manera, nos resultar muy sencillo aadir pginas en el futuro
siguiendo el mismo esquema.

DESPLIEGUE
En este ltimo paso, vamos a ver las tareas necesarias para desplegar una aplicacin
Delphi para PHP. Podemos utilizar el asistente de despliegue o realizar la instalacin por
nuestra cuenta.
En ambos casos, la instalacin es muy sencilla, realmente es una copia de archivos y al
nico aspecto que tenemos que prestar atencin es a la localizacin de la carpeta
que contiene VCL para PHP.
Por defecto, las aplicaciones estn preparadas para funcionar teniendo la librera de
clases como un subdirectorio de nuestra aplicacin. Es decir, si nuestra aplicacin
estuviera en /var/www/mywebsite.com, la VCL debe residir en
/var/www/mywebsite.com/vcl, de esta forma, no necesitamos alterar la ruta de
bsqueda de archivos para nada.
En cualquier caso, la VCL para PHP debe residir en un directorio cuyo contenido sea
accesible por el servidor web, ya que varios componentes utilizan recursos (imgenes,
hojas de estilo, etc.) que estn almacenados en la carpeta de la VCL.
Para este ejemplo, vamos a poner la VCL para PHP en una subcarpeta de nuestra
aplicacin.
Lo primero que tenemos que hacer es crear la base de datos en el directorio de
destino. Para ello, podemos hacer un volcado de la base de datos que tenemos en
local y luego recuperarla utilizando ese volcado en nuestro servidor.
Despus podemos utilizar el asistente de despliegue, el cual nos guiar por todo el
proceso de copiar todos los archivos necesarios en una carpeta de nuestro disco duro.

Es importante resaltar, que el asistente no copia archivos referenciados por


propiedades de componentes, sino solo los archivos que formen parte del proyecto y
los archivos necesarios de la VCL para PHP.
Por lo tanto, si queremos que el asistente de despliegue tenga en cuenta nuestra
plantilla, debemos aadir al proyecto todos los archivos de los que consta.
El primer paso del asistente de despliegue, recolecta los archivos de los que consta
nuestra aplicacin. El segundo paso, identifica los componentes utilizados en nuestros
formularios, y el fuente de la VCL para PHP correspondiente. El tercer paso hace un
resumen de los archivos y carpetas que se van a copiar y en el ltimo paso, se pide
una carpeta donde poder hacer la copia.
Estos son todos los archivos necesarios para hacer funcionar nuestra aplicacin en un
ordenador diferente al que utilizamos para desarrollo. Mi consejo es copiar la VCL para
PHP completa, ya que es algo que no va cambiar, y siempre podemos incluir
componentes nuevos. Posteriormente, solo ser necesario copiar/actualizar los
archivos de la aplicacin para ir probndola.
Una vez subidos todos estos archivos al servidor, debemos cambiar la configuracin de
acceso a base de datos para que coincida con la del servidor. Para ello, podemos
editar el archivo dbmodule.xml.php, es una archivo texto, de sencilla estructura.
Tenemos que buscar las propiedades de conexin del componente Database y
cambiarlas por los valores correctos.
01<objectclass="Database"name="dbweb1">
02<propertyname="Left">285</property>
03<propertyname="Top">163</property>
04<propertyname="Connected">1</property>
05<propertyname="DatabaseName">web</property>
06<propertyname="Host">localhost</property>
07<propertyname="Name">dbweb1</property>
08<propertyname="UserName">root</property>
09<propertyname="UserPassword">test</property>
10</object>

Y eso es todo, nuestra aplicacin tiene que funcionar perfectamente en el servidor. Os


aconsejo que utilicis servidores Linux, ya que el rendimiento en la ejecucin de PHP es
bastante mejor que en Windows. En cualquier caso, siempre utilizar Apache como
servidor web y PHP cargado como mdulo, no como CGI.

INTERACTUANDO CON DELPHI PARA WINDOWS


SERVICIO WEB
Una de las grandes utilidades que podemos darle a Delphi para PHP es la creacin de
aplicaciones de servicios web, es decir, que proporcionen informacin y realicen
operaciones en el servidor, y se comuniquen con un cliente para Windows desarrollado
en Delphi para Windows.
Para este ejemplo, vamos a crear un servicio web, que realice una bsqueda de un
cliente en la base de datos y devuelva el estado de una ficticia cuenta de crdito.
En el caso de existir ms de un cliente que coincida con la bsqueda, devolver un
listado con dichos clientes, para que usuario pueda elegir.

CREACIN DE LA BASE DE DATOS


Como en el ejemplo anterior, vamos a crear una base de datos, y una tabla, donde se
almacenen los clientes y el estado de su cuenta de crdito.
1CREATETABLE`webservice`.`clientes`(
2`id`INT(11)NOTNULLAUTO_INCREMENTPRIMARYKEY,
3`firstname`VARCHAR(40)NOTNULL,
4`lastname`VARCHAR(40)NOTNULL,
5`credit`FLOAT(10,2)NOTNULLDEFAULT'0'
6)ENGINE=INNODB;

Ahora, insertamos varios registros de prueba para tener datos con los que realizar
algunas pruebas puntuales.
1INSERTINTO`webservice`.`clientes`
2(`id`,`firstname`,`lastname`,`credit`)
3VALUES
4(NULL,'Jane','Smith','200'),(NULL,'Joe','Black','400');

DESARROLLO DEL SERVICIO WEB


Procedemos a crear una nueva aplicacin, utilizando Archivo | Nuevo | Aplicacin, y
como no vamos a necesitar ningn formulario, cerramos la pgina nueva que se
habr creado, contestando No a la pregunta sobre si guardar los cambios o no.
Nuestro servicio web, as como los componentes de acceso a datos que vamos a
utilizar, son componentes no visibles, por lo que un Datamodule es ms que suficiente
para este proyecto. As que utilizando Archivo | Nuevo | Data Module, creamos uno
nuevo.

Ahora s que podemos guardar toda la aplicacin en el directorio que queramos y


darle nombre a los archivos. Por ejemplo, al datamodule, lo podemos nombrar como
customerservice, ya que es muy posible que en un futuro, le aadamos
funcionalidad.
Para crear un servicio web, solo necesitamos un componente, que se llama Service, lo
buscamos en la paleta de componentes y lo colocamos en el datamodule.
Le cambiamos el ServiceName por customerservice y establecemos su propiedad
Active a true.
Esto es lo que tenemos que tener en el IDE:

Si ejecutamos ahora la aplicacin, veremos cmo este componente ya proporciona


una funcionalidad bsica, en la forma de un frontend sencillo para interactuar con
nuestro futuro servicio web.

Ahora lo que tenemos que hacer es dotar de funcionalidad a dicho servicio web, para
ello, debemos registrar las rutinas o procedimientos que vamos a poner a disposicin
de los clientes del servicio web.
Inicialmente solo va a ser uno, denominado getCredit, que va tener como entrada
una cadena, con el nombre o parte del nombre del cliente, y devolver un array de

cadenas, si solo devuelve una, ser el crdito del cliente, pero si devuelve ms, sern
todos los nombres de los clientes que coinciden con la bsqueda.
Para devolver un array de cadenas, debemos aadir un tipo complejo de datos, para
eso, podemos utilizar el evento OnAddComplexTypes del componente Service y llamar
al mtodo addComplexType.
01functionserviceAddComplexTypes($sender,$params)
02{
03$this>service>addComplexType
04(
05'ArrayOfstring',
06'complexType',
07'array',
08'',
09'SOAPENC:Array',
10array(),
11array(array('ref'=>'SOAPENC:arrayType','wsdl:arrayType'=>'string[]')),
12'xsd:string'
13);
14}

Ahora que ya tenemos definido el tipo complejo de datos, vamos a registrar la funcin
que va a ser publicada por el servicio web. Esto se hace en el evento
OnRegisterServices.
1functionserviceRegisterServices($sender,$params)
2{
3$this>service>register('getCredit',
4array('input'=>'xsd:string'),
5array('return'=>'tns:ArrayOfstring'),
6'http://localhost/');
7}

Una vez registrada nuestra funcin, debemos implementarla, recordemos lo que


debemos hacer:

Buscar en la tabla de clientes un cliente cuyo nombre coincida con el


parmetro de entrada
Devolver todos los registros que coincidan como un array de cadenas

Aqu podis ver la implementacin de dicha funcin:


01functiongetCredit($input)
02{
03global$Webservice;
04
05$Webservice>tbclientes1>close();
06$Webservice>tbclientes1>Filter="concat(firstname,'',lastname)like'%$input%'"
07$Webservice>tbclientes1>open();
08$result=array();

09
10while(!$Webservice>tbclientes1>EOF)
11{
12$result[]=$Webservice>tbclientes1>firstname.''.
13$Webservice>tbclientes1>lastname.'|'.
14$Webservice>tbclientes1>credit;
15$Webservice>tbclientes1>next();
16}
17
18return($result);
19}

Si ahora ejecutamos nuestro proyecto, la descripcin WSDL ya proporciona toda la


informacin necesaria para conectar y llamar a este servicio.

DESARROLLO DEL CLIENTE


Para desarrollar el cliente, vamos a utilizar Delphi para Windows, pero hay que tener en
cuenta que cualquier herramienta de desarrollo con soporte SOAP puede servir para
consumir nuestro servicio.
Lo primero que tenemos que hacer es crear una aplicacin nueva con Delphi para
Windows. Una vez la tengamos creada, vamos a utilizar el asistente de importacin
WSDL, que est en el repositorio, en la categora WebServices.

Al ejecutarlo, el asistente nos pide la URL donde reside la WSDL que queremos importar,
dicha WSDL es accesible mediante un enlace publicado por el propio servicio.

El URL de la WSDL lo tenemos en la descripcin del servicio web:

Una vez tengamos el enlace en el portapapeles, lo pegamos la casilla del asistente y


presionamos en siguiente. Se nos mostrar un previo con los tipos de datos detectados
y la unidad de cdigo que se aadir al proyecto para acceder al servicio web.
Si presionamos el botn de finalizacin, dicha unidad se aadir a nuestro proyecto.
Ahora vamos a ver cmo utilizarla. Para eso, ponemos un TButton en el formulario y lo
llamamos btnQueryCredit.

Como hemos visto en los requerimientos, es posible que se devuelva ms de un


resultado, si la cadena de bsqueda coincide con ms de un cliente. Es por ello que
necesitamos aadir otro formulario, que solo lo utilizaremos para pedir la seleccin de
un cliente.
El formulario consta de un desplegable y dos botones, es un formulario modal normal y
corriente, as que no me voy a parar en los detalles, aqu tenis una captura.

Ahora, en el formulario de llamada del servicio web, debemos incluir en el uses, la


unidad customerservice, que es la que contiene el cdigo que necesitamos llamar, y
tambin la unidad que contiene nuestro formulario de seleccin. Despus, generamos
el evento OnClick del botn y escribimos este cdigo.

01procedureTMainForm.btnQueryCreditClick(Sender:TObject);
02var
03value:string;
04return:ArrayOfstring;
05i:integer;
06customername:string;
07k:integer;
08begin
09//Pedimosprimerounclienteporelquebuscar
10if(InputQuery('Consultarcrdito','Cliente:',value))thenbegin
11
12//Sehacelallamadaalservicioweb
13return:=GetcustomerservicePortType.getCredit(value);
14
15//Sisolosedevuelveunresultado,mostramoselcredito
16if(length(return)=1)thenbegin
17showmessage('Creditodelcliente:'+return[0]);
18end
19elseif(length(return)>1)thenbegin
20
21//Sihaymsdeuno,entonces,sepidecualsequierebuscar
22withTfrmSelectCustomer.Create(nil)dobegin
23try
24cbCustomers.Clear;
25
26//Rellenamoseldesplegable
27fori:=low(return)tohigh(return)dobegin
28customername:=return[i];
29k:=pos('|',customername);
30if(k<>0)thencustomername:=copy(customername,1,k1);
31cbCustomers.Items.Add(customername);
32end;
33
34cbCustomers.ItemIndex:=0;
35if(showmodal=mrOK)thenbegin
36//Sielusuarioaceptalaoperacinvolvemosallamaralservicioweb
37//esredundante,peroestoessolounejemplo;)
38return:=GetcustomerservicePortType.getCredit(cbCustomers.Text);
39showmessage('Creditodelcliente:'+return[0]);
40end;
41finally
42free;
43end;
44end;
45end
46elsebegin
47showmessage('Nosehaencontradoclientes');
48end;
49end;
50end;

Si ahora ejecutamos nuestra aplicacin, veremos que funciona como esperbamos:


Si pedimos el crdito de un cliente que NO est en la base de datos,
obtendremos un mensaje indicndolo
Si pedimos el crdito de un cliente que est en la base de datos, veremos su
crdito
Si el patrn de bsqueda coincide con varios clientes, veremos una pantalla
que nos indica que debemos seleccionar uno de ellos, y si aceptamos, veremos
el crdito de dicho usuario.
Las posibilidades de este sistema de trabajo son ilimitadas, podemos crear servicios
web que interacten con el servidor y realicen consultas complejas y devuelvan los
datos adecuados a aplicaciones ligeras en el cliente. Se pueden realizar cambios o
actualizaciones en los servicios web sin necesidad de actualizar los clientes. Se pueden
servir datos a diferentes clientes en diferentes plataformas con el mismo backend, etc.

CONCLUSIN
Es muy difcil explicar en un solo documento todas las capacidades de Delphi para
PHP, y todo el beneficio que le puede suponer su uso. He intentado dar una visin
global sobre lo que es el producto, y sobre todo, desde el punto de vista prctico, con
la esperanza de que le pueda servir de ayuda en su toma de decisiones. Si ya es
usuario de Delphi para PHP, quizs encuentre informacin que le sea de utilidad en sus
proyectos.
Delphi para PHP es la primera y nica herramienta de desarrollo puramente visual que
existe para PHP, y que incorpora las tecnologas RAD que tanto han beneficiado a los
programadores Delphi para Windows.

SOBRE EL AUTOR
Jos Len es el arquitecto principal de Delphi para PHP, comenz a escribir una
primera versin aproximadamente en el ao 2001 y en 2007 estableci un acuerdo
con Embarcadero (CodeGear por aquel entonces) para desarrollar Delphi para PHP
como un producto de primer nivel en el catlogo de productos de Embarcadero.
Aparte de esto, es el CEO de qadram software S.L. una empresa de desarrollo de
software a medida, basada en Espaa, que utiliza Delphi para PHP en las soluciones
que desarrolla para sus clientes.
Puede visitar la web de su empresa en http://www.qadram.com , puedes seguir las
evoluciones del desarrollo en http://twitter.com/qadram y contactar con l en
support@qadram.com
Jos quiere agradecer a Pawe Gowacki por su inters en Delphi para PHP y por su
incansable capacidad de comunicacin.

Embarcadero Technologies, Inc. is a leading provider of award-winning tools for


application developers and database professionals so they can design systems right,
build them faster and run them better, regardless of their platform or programming
language. Ninety of the Fortune 100 and an active community of more than three
million users worldwide rely on Embarcadero products to increase productivity, reduce
costs, simplify change management and compliance and accelerate innovation. The
companys flagship tools include: Embarcadero Change Manager, Embarcadero
RAD Studio, DBArtisan, Delphi, ER/Studio, JBuilder and Rapid SQL. Founded in 1993,
Embarcadero is headquartered in San Francisco, with offices located around the world.
Embarcadero is online at www.embarcadero.com.