José León, qadram software S.L., PHP es un lenguaje de programación interpretado, cuyo propósito inicial era facilitar la
creación de páginas web dinámicas. 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 propósito
general e incluso, para la creación de aplicaciones de escritorio.
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
Delphi para PHP “en acción”
1. Documento Técnico
Delphi para PHP “en acción”
José León, qadram software S.L.
Diciembre 2009
Corporate Headquarters EMEA Headquarters Asia-Pacific Headquarters
100 California Street, 12th Floor York House L7. 313 La Trobe Street
San Francisco, California 94111 18 York Road Melbourne VIC 3000
Maidenhead, Berkshire Australia
SL6 1SF, United Kingdom
2. SUMARIO
PHP es un lenguaje de programación interpretado, cuyo propósito inicial era facilitar la
creación de páginas web dinámicas. 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 propósito
general e incluso, para la creación de aplicaciones de escritorio.
Entre sus características, 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 características 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 pequeña. No requiere la definición de tipos de variables, aunque sí
se puede saber el tipo de una variable en un determinado momento.
Delphi para PHP supone una auténtica revolución en el panorama del desarrollo de
aplicaciones PHP, ya que proporciona un entorno de desarrollo visual completamente
integrado, y, lo más importante, una librería de clases orientada a componentes, que
facilita enormemente el desarrollo de interfaces.
Delphi para PHP representa la opción más 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 librería de clases visual que ha sido modelada
utilizando VCL para Windows como base.
Este documento le presenta todas las características 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.
3. 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 página 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 arrástrela hasta su
localización definitiva. Las ventanas de herramienta también pueden estas agrupadas
en pestañas, 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 también le permite cambiar la configuración activa.
4. PÁGINA DE BIENVENIDA
Al iniciar el IDE, se muestra esta página, que puede utilizar para abrir un proyecto o
archivo reciente, leer las últimas noticias relacionadas con Delphi para PHP, acceder a
notas de la versión, al documento de instalación y le presenta enlaces con más
información en la web. También 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 página es un
explorador web, por lo que puede utilizarlo para navegar por internet.
5. ESTRUCTURA
Este panel muestra la estructura del elemento que se esté editando actualmente en la
zona de contenido. Por ejemplo, si está editando código PHP, este panel mostrará una
representación jerarquizada del contenido de su código fuente. Sin embargo, si está
editando un formulario visual, este panel mostrará una vista jerárquica de los
componentes que contiene dicho formulario.
Dependiendo de la vista activa puede realizar diferentes acciones. Si está mostrando
la estructura de un código fuente, haciendo doble clic en cualquier elemento, el
editor se posicionará en la declaración 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.
6. INSPECTOR DE OBJETOS
El inspector de objetos muestra las propiedades y eventos del objeto seleccionado en
el diseñador, tanto su nombre, como su valor. Y también le permite cambiar dicho
valor o asignar un evento. Dependiendo del tipo de elemento que esté seleccionado,
las pestañas disponibles de información cambian, por ejemplo, si es un componente
VCL para PHP, se mostrarán Propiedades, Eventos y Javascript, pero si es un
componente HTML, se mostrará solo Propiedades, ya que el resto de pestañas no
tienen sentido para ese elemento.
Es importante destacar que las propiedades cuyo valor difiera del valor por defecto, se
muestran en negrita. También 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 edición 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.
7. GESTOR DE PROYECTOS
Puede utilizar esta herramienta para agrupar los archivos de su aplicación en
proyectos, y estos, a su vez, ser agrupados en grupos de proyectos. En cualquier caso,
la creación de un proyecto no es necesaria para la utilización de Delphi para PHP, ya
que se puede trabajar perfectamente en archivos independientes. Sin embargo, hay
herramientas, como el asistente de internacionalización o el de despliegue, que son
más útiles cuando se trabaja con un proyecto, ya que necesitan saber todos los
archivos que componen una aplicación.
Cualquier archivo puede formar parte de un proyecto, incluyendo sus plantillas HTML o
las hojas de estilo CSS.
Para añadir un proyecto nuevo a un grupo de proyectos, utilice el botón “Nuevo” de
la barra de herramientas, también puede añadir un proyecto existente al grupo de
proyectos actual utilizando el comando Proyecto | Añadir proyecto existente.
Por último, puede hacer clic con el botón derecho sobre un proyecto, y utilizar “Añadir
carpeta al proyecto”, una herramienta muy útil para incorporar al proyecto archivos
sueltos que estén en una carpeta. Esta herramienta permite filtrar por extensión para
añadir solo los archivos que cumplan con la condición del filtro.
8. EXPLORADOR DE DATOS
Esta herramienta tiene una doble función, primero, le permite explorar bases de datos,
añadiendo la información de la conexión, y luego expandiendo cada uno de los
niveles. Puede explorar tablas, vistas, procedimientos almacenados, funciones y
sinónimos, y, a su vez, los campos y parámetros que los componen.
La segunda función es la de interactuar con el diseñador de formularios, ya que puede
arrastrar y soltar información 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 crearán 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, más 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 están creando formularios con acceso a datos.
9. PALETA DE HERRAMIENTAS
La paleta de herramientas contiene todos los componentes que puede utilizar para
desarrollar su aplicación. Estos componentes se instalan en el IDE mediante “paquetes”
en la opción Componente | Paquetes. Dichos componentes se agrupan en
categorías, como “Standard”, “Additional”, etc., y puede utilizar el símbolo (-) para
colapsar dichas categorías 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 tamaño por defecto.
También 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 tamaño
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.
10. VCL PARA PHP
ESTRUCTURA
VCL para PHP es la librería 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 librería es Object, igual que en VCL
para Windows, que es TObject. Esta clase proporciona métodos básicos como
“classname”, que están disponibles para todas las clases que derivan de ella.
Directamente de Object, deriva Persistent, que introduce métodos y propiedades que
permiten almacenar y recuperar una clase en la sesión.
A continuación, de Persistent, deriva Component, que es la clase mínima 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 código que luego interpretará el
navegador.
11. PROPIEDADES Y EVENTOS
En Delphi para Windows, podemos crear una propiedad para un determinado
componente, es decir, un atributo que determine una característica de un objeto, y
cuyo acceso venga determinado por dos métodos. Uno de los métodos 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 algún 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 métodos, el “setter” y el
“getter”, y una vez un objeto tiene definidos dichos métodos, es posible escribir código
como este:
01 <?php
02 require_once("vcl/vcl.inc.php");
03 //Includes
04 use_unit("system.inc.php");
05
06 class MiClase extends Object
07 {
08 protected $_mipropiedad="";
09
10 function getMiPropiedad() { return $this‐>_mipropiedad; }
11 function setMiPropiedad($value) { $this‐>_mipropiedad=$value; }
12
13 }
14
15 $objeto=new MiClase();
16
17 $objeto‐>MiPropiedad="¡hola, mundo!";
18
19 echo $objeto‐>MiPropiedad;
20
21 ?>
12. Hay dos tipos de propiedades, Public y Published, la diferencia está en el nombre de
los métodos, 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
02 class MiClase extends Object
03 {
04 protected $_propiedadpublic="";
05
06 function readPropiedadPublic() { return $this‐>_propiedadpublic; }
07 function writePropiedadPublic($value) { $this‐>_propiedadpublic=$value; }
08
09
10 protected $_propiedadpublished="";
11
12 function getPropiedadPublished() { return $this‐>_propiedadpublished; }
13 function setPropiedadPublished($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 aplicación 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 aplicación se cierra. En
una aplicación 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 automática, 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 aplicación.
CARACTERÍSTICAS DE TIEMPO DE DISEÑO
Para que un IDE pueda gestionar componentes de forma visual, es absolutamente
necesario que dichos componentes puedan distinguir cuando están ejecutándose
dentro del IDE y cuando lo están haciendo en la aplicación del usuario.
Quizás, en tiempo de diseño, el componente quiera mostrar indicadores, guías o
información adicional, exclusivamente para el desarrollador. Es por eso, que es
necesario proporcionar un mecanismo por el cual, podamos saber si estamos en
tiempo de diseño o tiempo de ejecución. Para ello, podemos comprobar si el bit
13. csDesigning está establecido en la propiedad ControlState, de estar activado, indica
que el componente está siendo utilizando dentro del IDE.
01 <?php
02 if (($this‐>ControlState & csDesigning) == csDesigning)
03 {
04 echo "Estoy dentro del IDE";
05 }
06 else
07 {
08 echo "Estoy en tiempo de ejecución";
09 }
10 ?>
Aparte, para facilitar al desarrollador el uso de los componentes, es necesario
proporcionar información adicional al IDE, como por ejemplo, indicar los valores
válidos 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é categoría de la
paleta de componentes debe aparecer.
TIPOS DE CONTROLES
Actualmente, hay varios tipos de controles o componentes, que varían desde los
menos visuales a los más visuales:
Componentes no visuales
Controles basados en tags HTML estándar
Controles HTML compuestos
Controles Javascript
Controles de Imagen
Controles Flash
Veamos con más detalle las características 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
ningún código visible por el usuario, pero sí que utiliza Javascript para toda su
programación. Otro tipo de componentes no visuales, son los de acceso a datos, que
permiten conectar controles con tablas de base de datos.
14. COMPONENTES BASADOS EN TAGS HTML ESTÁNDAR
Estos componentes generan código basado en tags HTML estándar 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 están basados en estos tags. La ventaja de
utilizar estos controles, es que prácticamente todos los navegadores proporcionan una
representación 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 características
avanzadas, ya que son mucho más ligeros y se ejecutan más rápido que controles más
complejos.
15. COMPONENTES HTML COMPUESTOS
Controles como CheckListBox, utilizan el HTML disponible, para funcionar, en este caso,
tablas, checkboxes, etc. Estos componentes también 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, imágenes y CSS.
Estos componentes también pueden hacer uso de Ajax para interactuar con el
servidor y actualizar su estado sin necesidad de hacer un envío completo.
16. CONTROLES JAVASCRIPT
Estos controles suelen estar basados en librerías 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 están mejorando la velocidad de ejecución de
Javascript de forma asombrosa, por lo que el uso de estos componentes hace que
cada vez, las aplicaciones web se asemejen más a aplicaciones de escritorio.
17. CONTROLES DE IMAGEN
Hay veces que un componente, en vez de generar código 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 dinámica 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 línea de código 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>
18. CONTROLES FLASH
Podemos decir que este tipo de controles son los más 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 envían a la película flash que los
utiliza para mostrar el control al usuario. Un ejemplo de este tipo de control, es el
control OpenChart, basado en una librería flash.
EMPAQUETADO DE CÓDIGO YA EXISTENTE
La forma más sencilla de crear un componente VCL para PHP, es empaquetar código
ya existente. Existen multitud de librerías, 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 librería de clases fue diseñada 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 librería, ofreciendo un interfaz común de
propiedades, métodos y eventos que se utilizarán para llamar a la librería que
deseemos. De esta forma, podemos incorporar la funcionalidad de dicha librería en el
IDE, y realizar diseños de interfaces de forma visual, con el mínimo esfuerzo.
ASISTENTE DE CREACIÓN DE COMPONENTES
Para crear un nuevo componente, lo más 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. Después 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 categoría de la paleta que queramos.
19. Una vez pulsemos aceptar, se creará la unidad con el código base de nuestro
componente:
01 <?php
02 require_once("vcl/vcl.inc.php");
03 //Includes
04
05 //Class definition
06 class MyNewComponent extends Control
07 {
08 function __construct($aowner = null)
09 {
10 parent::__construct($aowner);
11 }
12
13 function dumpContents()
14 {
15 parent::dumpContents();
16 }
17 }
18 ?>
Y también, si lo hemos seleccionado, el código del paquete:
01 <?php
02 require_once("vcl/vcl.inc.php");
03 use_unit("designide.inc.php");
04
05 setPackageTitle("Put the title of your package here");
06 //Change this setting to the path where the icons for the components reside
07 setIconPath("./icons");
08
09 //Change yourunit.inc.php to the php file which contains the component code
10 registerComponents("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 interactúan con el IDE, para indicar cómo se tiene que instalar un
determinado componente o grupo de componentes.
Aparte de indicar donde instalar los componentes, también contienen indicaciones
para el IDE acerca de las propiedades de dichos componentes, y como editarlas en el
Inspector de Objetos.
20. GENERACIÓN DE CÓDIGO
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” código para que sea el navegador el encargado de pintarlos.
Por lo tanto, la tarea básica de un desarrollador de componentes VCL para PHP es la
de analizar el código que hay que generar, código que entienda el navegador (HTML,
Javascript, CSS) para que el componente vaya cambiando en base al valor de sus
propiedades.
Este es quizás el aspecto que más diferencia la creación de componentes VCL para
PHP de la creación de componentes VCL para Windows, el resto, es exactamente
igual, propiedades, métodos y eventos.
La generación del código principal se hace sobrescribiendo el método
dumpContents(), que es llamado por la VCL para PHP para obtener el código del
componente. Existen otros, como dumpHeaderCode() que son más específicos.
01 <?php
02 function dumpContents()
03 {
04 // set type depending on $_ispassword
05 $type = ($this‐>_ispassword) ? 'password' : 'text';
06
07 if ($style != "") $style = "style="$style"";
08
09 // call the OnShow event if assigned so the Text property can be changed
10 if ($this‐>_onshow != null)
11 {
12 $this‐>callEvent('onshow', array());
13 }
14
15 $avalue=$this‐>_text;
16 $avalue=str_replace('"','"',$avalue);
17 echo "<input type="$type" id="$this‐>_name" name="$this‐>_name"
value="$avalue" $style />";
18 }
19 ?>
21. LOCALIZACIÓN DE APLICACIONES
La localización de aplicaciones en Delphi para PHP es un proceso que consta de dos
partes bien diferenciadas: Traducción de las cadenas o literales usados en el código y
la traducción de las propiedades de los componentes que sean de tipo cadena.
CADENAS EN EL CÓDIGO
Para traducir las cadenas de texto del código, se utiliza el método estándar de
traducción de aplicaciones en el mundo *nix, esto es, la tecnología gettext que es
soportada perfectamente por el motor de PHP.
Para indicar que una cadena de texto está sujeta a traducción, debemos encerrarla
en la función _(“”), de esta forma, el parser encargado de extraer esas cadenas
puede identificarlas. Aparte, llamando a esa función, hace que la cadena devuelta
sea la traducción correcta en base al lenguaje activo.
1 <?php
2 function mifuncion($parametro)
3 {
4 echo _("Cadena sujeta a traducción");
5 }
6 ?>
Para traducir las cadenas, utilizamos el asistente de internacionalización, que recopila
los archivos que componen el proyecto, pide información 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 extensión .po.
Una vez tenemos ese archivo con extensión .po, podemos utilizar un programa de
edición llamado poEdit (o cualquier otro con soporte para .po) que nos permite
traducir las cadenas almacenadas y generar un archivo binario con extensión .mo.
Este archivo .mo es el que utiliza el motor de PHP para traducir las cadenas que se
pidan mediante la función _(“”).
Este proceso lo podemos repetir cuantas veces queramos a medida que vayamos
desarrollando nuestro proyecto, ya que las cadenas nuevas que se introduzcan, se
añadirán al archivo .po, y no se pierden los contenidos que ya se hayan traducido.
22. 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, francés, todos los cambios de propiedades que hagamos en
dicho idioma, se almacenarán en un archivo .xml.php aparte, no solo de las
propiedades de tipo cadena, sino todas, de forma, que estas propiedades se tendrán
en cuenta solo cuando el lenguaje activo cambie.
Dependiendo del idioma al cual queramos traducir nuestra aplicación, 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.
23. CAMBIANDO EL LENGUAJE ACTIVO
Para cambiar el lenguaje de nuestra aplicación en tiempo de ejecución, debemos
usar la propiedad Language del objeto global application:
01 <?php
02 function Button1Click($sender, $params)
03 {
04 global $application;
05
06 if ($application‐>Language == "(default)")
07 {
08 $application‐>Language = "Spanish (Traditional Sort)";
09 }
10 else
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, quizás 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
aplicación, 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 más 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.
24. 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 código,
debe estar escrito en PHP.
Aparte de esos eventos, los navegadores actuales, también soportan la ejecución de
código Javascript. Este código se ejecuta en el ordenador del cliente, más
concretamente en su navegador, sin enviar ninguna petición al servidor. Es por esto,
que este tipo de eventos tienen una gran utilidad cuando las operaciones que
queramos realizar necesiten de una respuesta rápida (como por ejemplo, reaccionar
al movimiento del ratón) o queramos actualizar la información que está viendo el
usuario, sin necesidad de tener que consultar al servidor para ello.
Por todo esto, los componentes VCL para PHP también soportan eventos Javascript, a
estos eventos se accede desde la pestaña Javascript del Inspector de Objetos.
Haciendo doble clic en cualquiera de ellos, nos genera el manejador de evento,
donde ya podemos escribir nuestro código, y el lenguaje que debemos utilizar para
ello es Javascript.
1 <?php
2 function Button5JSClick($sender, $params)
3 {
4 ?>
5 //Add your javascript code here
6 window.alert("Este evento se produce cuando se pulsa el botón.");
7 <?php
8 }
9 ?>
25. FINDOBJ
Una de las cosas que más llama la atención a los desarrolladores que se introducen en
el mundo del javascript, es la incompatibilidad entre los distintos navegadores. A pesar
de existir un estándar 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 más comunes cuando se programa en Javascript, está la búsqueda de
objetos, por ejemplo, de una caja de edición en un formulario o de un botón, al cual
debemos obtener una referencia para poder utilizarlo. VCL para PHP incorpora una
rutina estándar para obtener una referencia a un objeto, que permite abstraer las
diferencias entre navegadores y que incluso funciona cuando los objetos están en
diferentes frames.
Esa rutina se llama findObj, y se le pasa el nombre del objeto que queremos obtener.
1 //Find the object
2 hidden=findObj('edit_hidden');
3
4 //Use it
5 hidden.value=edit.value;
ACCESO A DATOS
PHP es un lenguaje de acceso a datos por excelencia. Debido a sus orígenes como
lenguaje de programación para hacer páginas web, esta característica le ha servido
para disponer de múltiples formas de acceder a los datos, y lo que es más importante,
muy rápidas.
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 estándar, están basados en la librería ADOdb,
que, a pesar de su nombre, no hay que confundir con la tecnología ADO de Microsoft.
Esta es una librería 100% escrita en PHP, que proporciona una capa de abstracción
sobre el motor de base de datos que utilicemos en nuestra aplicación, permitiendo
migrar a otro motor de base de datos, con cambios mínimos o ninguno.
Por lo tanto, cuando utilicemos los componentes estándar, no debemos preocuparnos
del tipo de base de datos, ya que estos componentes se encargarán de la mayor
parte del trabajo.
26. COMPONENTES NATIVOS
Obviamente, utilizar una capa de abstracción sobre los datos, tiene alguna
penalización de rendimiento, que si bien, para la mayor parte de aplicaciones no
supone ningún 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 tecnología que permite realizar llamadas desde un navegador a un
servidor de forma transparente, sin que el usuario perciba ningún 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
botón. En el código de dicho evento, tenemos que utilizar el método AjaxCall, que es
el encargado de generar todo el código javascript necesario para realizar la llamada:
01 //Class definition
02 class Index extends Page
03 {
04 public $Label1 = null;
05 public $Button1 = null;
06 function Button1JSClick($sender, $params)
07 {
08 //Dump the call using Ajax to the Button1Click event
09 echo $this‐>Button1‐>ajaxCall("Button1Click");
10 ?>
11 //Return false to prevent the button submit the form
12 return(false);
13 <?php
14 }
15
16 function Button1Click($sender, $params)
17 {
18 $this‐>Button1‐>Caption = "clicked Ajax " . date("Y‐m‐d g:i:s a");
19 $this‐>Label1‐>Caption = "Hello from Ajax!! " . date("Y‐m‐d g:i:s a");
20 $this‐>Label1‐>Color = "#" . dechex(rand(0, 0xFFFFFF));
21 }
22 }
27. DEPURACIÓN 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 aplicación, ya
que emite un informe con las líneas de la aplicación que se han ejecutado, cuantas
veces, y el tiempo empleado en dicha ejecución.
Para utilizarlo, tenemos que habilitarlo marcando la casilla “Habilitar trazador”, y
ejecutando en modo de depuración.
28. APLICACIONES DEL MUNDO REAL
En esta segunda parte del documento, vamos a dejar a un lado la teoría y vamos
centrarnos en la práctica. Vamos a ver la rapidez con la cual podemos desarrollar una
página web corporativa, y, posteriormente, veremos cómo interactuar con Delphi
para Windows.
PÁGINA WEB CORPORATIVA
Vamos a realizar un sencillo ejemplo de página web corporativa, pero que nos va a
servir para poder ver todos los aspectos relativos a la programación con Delphi para
PHP. En este ejemplo veremos cómo utilizar plantillas, como conectar con base de
datos y como desplegar nuestra aplicación.
ESTABLECER LOS REQUERIMIENTOS
Primero vamos a especificar las páginas de las que va a constar nuestra web:
Inicio
Servicios
Clientes
Contacto
Empresa
El contenido de dichas páginas 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 página, reutilizando el
aspecto gráfico será más sencillo. También queremos que el aspecto gráfico sea
independiente del contenido, por lo que vamos a usar un sistema de plantillas.
CREACIÓN DE LA BASE DE DATOS
Vamos a crear una web corporativa, donde el texto de las páginas va a estar
almacenado en una tabla de base de datos. De esta forma, podemos centralizar el
script que va a mostrar las páginas y también podemos crear nuevas páginas de
forma más fácil.
Para nuestra aplicación, vamos a usar MySQL, se podría decir que es el motor de base
de datos más usado por los programadores PHP, es muy rápido 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 pequeña, con una sola tabla, para albergar las
páginas, con un campo para el identificador y otro para el texto a mostrar.
1 CREATE TABLE IF NOT EXISTS `paginas` (
2 `id` int(11) NOT NULL AUTO_INCREMENT,
3 `pagina` varchar(40) NOT NULL,
4 `texto` text NOT NULL,
5 PRIMARY KEY (`id`)
29. 6 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
En este documento no se explica la instalación y puesta en marcha de un servidor
MySQL, pero una vez instalado, aconsejamos la instalación 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 creación que se encuentra en la parte superior.
PhpMyAdmin también permite la inserción de datos, por lo que será muy útil para
introducir la información de las páginas por defecto.
CREACIÓN DEL PROYECTO
Para empezar a programar, abrimos Delphi para PHP, y creamos una nueva
aplicación. Cuando se crea una nueva aplicación, 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 elección,
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:
CONEXIÓN CON LA BASE DE DATOS
Para acceder a la base de datos, vamos a utilizar un DataModule, para un proyecto
tan pequeño, no sería necesario, pero es conveniente acostumbrarse a aislar las
conexiones con base de datos en un módulo aparte.
Para añadir un módulo de datos, seleccionamos Archivo | Nuevo | Módulo 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 módulo 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 botón derecho en
el nodo de MySQL y seleccionamos “Registrar base de datos”. Nos presentará un
diálogo donde tenemos que introducir los datos de conexión con nuestra base de
datos.
30. Una vez relleno, presionamos OK, y ya tendremos nuestra base de datos registrada.
Ahora podemos desplegarla, para ver su contenido, más concretamente, las tablas
que contiene.
Esta misma operación 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 “páginas” desde el
explorador de datos, al datamodule.
31. Esta operación nos habrá creado tres componentes:
Database
Table
Datasource
Los tres componentes ya tienen todas sus propiedades necesarias puestas al valor
correcto y están interconectados entre sí y listos para funcionar.
Si este proceso lo tuviéramos que hacer a mano, tendríamos 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 más sencillo arrastrar y soltar que hacer todo eso.
SISTEMA DE PLANTILLAS
Vamos a utilizar plantillas, ya que aportan un alto grado de personalización y
flexibilidad, y es lo que suele llegarnos desde los diseñadores. 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 programación de nuestra web.
32. 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. Podría estar en una subcarpeta sin problemas, pero es
más conveniente en la misma, por si acaso el diseñador 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 página principal exclusivamente. Es conveniente que hagamos una copia
de la plantilla, ya que varios de esos trozos eliminados, serán 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 páginas.
33. Una vez hecho esto, guardamos el archivo, y si lo abrimos en un navegador web, esto
es lo que veremos.
34. Ahora vamos a configurar la página, 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 más utilizado por los
programadores PHP, se denomina Smarty y puedes encontrar más información en este
enlace: http://www.smarty.net/
Para poder situar contenido dinámico 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 página e insertamos este
código:
1 function IndexTemplate($sender, $params)
2 {
3 //Obtener el objeto template
4 $template=$params['template'];
5
6 //Asignar un contenido en el hueco
7 $template‐>_smarty‐>assign('CONTENIDO','¡Hola Mundo!');
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 PÁGINAS
Ya hemos visto como insertar contenido en el hueco que hemos creado, así que ahora
vamos a procesar las peticiones de páginas e insertar el contenido que haya en la
base de datos.
Los enlaces a las páginas van a tener la forma index.php?page=nombre, donde
nombre, debe coincidir con el campo “página” de la tabla de base de datos.
35. 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
conexión con la base de datos. Utilizamos Archivo | Usar unidad y seleccionamos
“dbmodule.php”.
Esto añade, en la zona de inclusiones, la directiva require_once con el código fuente
que le hemos indicado. De esta forma, ya tenemos acceso a dicho objeto.
Primero vamos a ver si hay alguna petición de página, eso lo hacemos utilizando el
objeto $input para realizar un filtrado y prevenir algún tipo de ataque:
1 global $input;
2
3 //Miramos si hay un parámetro page en la entrada
4 $page=$input‐>page;
5
6 //De haberlo, lo filtramos como una cadena, si no
7 //hay ninguno, sacaremos la página por defecto
8 if (is_object($page)) $pagina=$page‐>asString();
9 else $pagina='inicio';
Ahora tenemos que utilizar ese nombre de página 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í quedaría la rutina completa:
01 function IndexTemplate($sender, $params)
02 {
03 //Obtener el objeto template
04 $template=$params['template'];
05
06 global $input;
07
08 //Miramos si hay un parametro page en la entrada
09 $page=$input‐>page;
10
11 //De haberlo, lo filtramos como una cadena, si no
12 //hay ninguno, sacaremos la página por defecto
13 if (is_object($page)) $pagina=$page‐>asString();
14 else $pagina='inicio';
15
16 global $DBModule;
17
18 //Filtramos la tabla de paginas por la página que queremos mostrar
19 $DBModule‐>tbpaginas1‐>close();
20 $DBModule‐>tbpaginas1‐>Filter='pagina="'.$pagina.'"';
21 $DBModule‐>tbpaginas1‐>open();
22
23 //Sacamos el contenido
24 $contenido=$DBModule‐>tbpaginas1‐>texto;
25
36. 26 //Asignar un contenido en el hueco
27 $template‐>_smarty‐>assign('CONTENIDO',$contenido);
28 }
Ahora solo tenemos que introducir en la base de datos los textos de las páginas, que,
recordemos, van a ser: inicio, servicios, clientes, contacto, empresa.
Para la página 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 <div id="featured">
03 <div id="featured‐block" class="clear">
04 <div id="featured‐ribbon"></div>
05 <a name="TemplateInfo"></a>
06 <div class="image‐block">
07 <a href="index.html" title=""><img src="images/img‐featured.jpg" alt="featured"
width="350px" height="250px"/></a>
08 </div>
09
10 <div class="text‐block">
11 <h2><a href="index.html">Read me first</a></h2>
12 <p class="post‐info">
13 Posted by <a href="index.html">erwin</a> | Filed under
14 <a href="index.html">templates</a>,
15 <a href="index.html">internet</a>
16 </p>
17 <p>
18 <strong>JungleLand 1.0</strong> is a free, W3C‐compliant, CSS‐based website
template
19 by <a href="http://www.styleshout.com/">styleshout.com</a>. This work is
20 distributed under the <a rel="license"
href="http://creativecommons.org/licenses/by/2.5/">
21 Creative Commons Attribution 2.5 License</a>, which means that you are free to
22 use and modify it for any purpose. All I ask is that you include a link back to
23 <a href="http://www.styleshout.com/">my website</a> in your credits. For more free
designs, you can visit
24 <a href="http://www.styleshout.com/">my website</a> to see
25 my other works.
26 </p>
27
28 <p>Good luck and I hope you find my free templates useful!</p>
29 <p><a href="index.html" class="more‐link">Read More</a></p>
30 </div>
31 </div>
32 </div>
Si ahora ejecutamos la aplicación, veremos como en el centro sale el trozo de HTML
de “featured”.
Para la página de servicios, vamos a poner un trozo del style.html, que representa a un
mensaje de un blog:
38. 3 <li id="{%$INICIO%}"><a href="index.php">Inicio</a></li>
4 <li id="{%$SERVICIOS%}"><a href="index.php?page=servicios">Servicios</a></
5 <li id="{%$CLIENTES%}"><a href="index.php?page=clientes">Clientes</a></li>
6 <li id="{%$CONTACTO%}"><a href="index.php?page=contacto">Contacto</a></li>
7 <li id="{%$EMPRESA%}"><a href="index.php?page=empresa">Empresa</a></li>
8 </ul>
9 </div>
De esta forma, veremos en la parte superior los enlaces a todas las páginas que
queremos, y, aparte, podemos establecer cuál de ellas va a estar resaltada si
establecemos el hueco de su nombre de página a “current”. Para eso tenemos que
añadir esta línea al final del evento OnTemplate:
1 $template‐>_smarty‐>assign(strtoupper($pagina),'current');
Haciéndolo de esta manera, nos resultará muy sencillo añadir páginas en el futuro
siguiendo el mismo esquema.
DESPLIEGUE
En este último paso, vamos a ver las tareas necesarias para desplegar una aplicación
Delphi para PHP. Podemos utilizar el asistente de despliegue o realizar la instalación por
nuestra cuenta.
En ambos casos, la instalación es muy sencilla, realmente es una copia de archivos y al
único aspecto que tenemos que prestar atención es a la localización de la carpeta
que contiene VCL para PHP.
Por defecto, las aplicaciones están preparadas para funcionar teniendo la librería de
clases como un subdirectorio de nuestra aplicación. Es decir, si nuestra aplicación
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
búsqueda 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 (imágenes,
hojas de estilo, etc.) que están almacenados en la carpeta de la VCL.
Para este ejemplo, vamos a poner la VCL para PHP en una subcarpeta de nuestra
aplicación.
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.
Después 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.
39. 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 añadir al proyecto todos los archivos de los que consta.
El primer paso del asistente de despliegue, recolecta los archivos de los que consta
nuestra aplicación. 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 aplicación 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 aplicación para ir probándola.
Una vez subidos todos estos archivos al servidor, debemos cambiar la configuración 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 conexión del componente Database y
cambiarlas por los valores correctos.
01 <object class="Database" name="dbweb1" >
02 <property name="Left">285</property>
03 <property name="Top">163</property>
04 <property name="Connected">1</property>
05 <property name="DatabaseName">web</property>
06 <property name="Host">localhost</property>
07 <property name="Name">dbweb1</property>
08 <property name="UserName">root</property>
09 <property name="UserPassword">test</property>
10 </object>
Y eso es todo, nuestra aplicación tiene que funcionar perfectamente en el servidor. Os
aconsejo que utilicéis servidores Linux, ya que el rendimiento en la ejecución de PHP es
bastante mejor que en Windows. En cualquier caso, siempre utilizar Apache como
servidor web y PHP cargado como módulo, no como CGI.
40. INTERACTUANDO CON DELPHI PARA WINDOWS
SERVICIO WEB
Una de las grandes utilidades que podemos darle a Delphi para PHP es la creación de
aplicaciones de servicios web, es decir, que proporcionen información 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 búsqueda de un
cliente en la base de datos y devuelva el estado de una ficticia cuenta de crédito.
En el caso de existir más de un cliente que coincida con la búsqueda, devolverá un
listado con dichos clientes, para que usuario pueda elegir.
CREACIÓN 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 crédito.
1 CREATE TABLE `webservice`.`clientes` (
2 `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
3 `firstname` VARCHAR( 40 ) NOT NULL ,
4 `lastname` VARCHAR( 40 ) NOT NULL ,
5 `credit` FLOAT( 10, 2 ) NOT NULL DEFAULT '0'
6 ) ENGINE = INNODB;
Ahora, insertamos varios registros de prueba para tener datos con los que realizar
algunas pruebas puntuales.
1 INSERT INTO `webservice`.`clientes`
2 (`id`, `firstname`, `lastname`, `credit`)
3 VALUES
4 (NULL, 'Jane', 'Smith', '200'), (NULL, 'Joe', 'Black', '400');
DESARROLLO DEL SERVICIO WEB
Procedemos a crear una nueva aplicación, utilizando Archivo | Nuevo | Aplicación, y
como no vamos a necesitar ningún formulario, cerramos la página 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 más que suficiente
para este proyecto. Así que utilizando Archivo | Nuevo | Data Module, creamos uno
nuevo.
41. Ahora sí que podemos guardar toda la aplicación 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 añadamos
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 aplicación, veremos cómo este componente ya proporciona
una funcionalidad básica, 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 disposición
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
42. cadenas, si solo devuelve una, será el crédito del cliente, pero si devuelve más, serán
todos los nombres de los clientes que coinciden con la búsqueda.
Para devolver un array de cadenas, debemos añadir un tipo complejo de datos, para
eso, podemos utilizar el evento OnAddComplexTypes del componente Service y llamar
al método addComplexType.
01 function serviceAddComplexTypes($sender, $params)
02 {
03 $this‐>service‐>addComplexType
04 (
05 'ArrayOfstring',
06 'complexType',
07 'array',
08 '',
09 'SOAP‐ENC:Array',
10 array(),
11 array(array('ref'=>'SOAP‐ENC:arrayType','wsdl:arrayType'=>'string[]')),
12 'xsd:string'
13 );
14 }
Ahora que ya tenemos definido el tipo complejo de datos, vamos a registrar la función
que va a ser publicada por el servicio web. Esto se hace en el evento
OnRegisterServices.
1 function serviceRegisterServices($sender, $params)
2 {
3 $this‐>service‐>register('getCredit',
4 array('input'=>'xsd:string'),
5 array('return'=>'tns:ArrayOfstring'),
6 'http://localhost/');
7 }
Una vez registrada nuestra función, debemos implementarla, recordemos lo que
debemos hacer:
Buscar en la tabla de clientes un cliente cuyo nombre coincida con el
parámetro de entrada
Devolver todos los registros que coincidan como un array de cadenas
Aquí podéis ver la implementación de dicha función:
01 function getCredit($input)
02 {
03 global $Webservice;
04
05 $Webservice‐>tbclientes1‐>close();
06 $Webservice‐>tbclientes1‐>Filter="concat(firstname,' ',lastname) like '%$input%'"
07 $Webservice‐>tbclientes1‐>open();
08 $result=array();
44. 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 descripción 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 código que se añadirá al proyecto para acceder al servicio web.
Si presionamos el botón de finalización, dicha unidad se añadirá a nuestro proyecto.
Ahora vamos a ver cómo utilizarla. Para eso, ponemos un TButton en el formulario y lo
llamamos btnQueryCredit.
45. Como hemos visto en los requerimientos, es posible que se devuelva más de un
resultado, si la cadena de búsqueda coincide con más de un cliente. Es por ello que
necesitamos añadir otro formulario, que solo lo utilizaremos para pedir la selección 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í tenéis 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 código que necesitamos llamar, y
también la unidad que contiene nuestro formulario de selección. Después, generamos
el evento OnClick del botón y escribimos este código.
47. Si ahora ejecutamos nuestra aplicación, veremos que funciona como esperábamos:
Si pedimos el crédito de un cliente que NO está en la base de datos,
obtendremos un mensaje indicándolo
Si pedimos el crédito de un cliente que está en la base de datos, veremos su
crédito
Si el patrón de búsqueda coincide con varios clientes, veremos una pantalla
que nos indica que debemos seleccionar uno de ellos, y si aceptamos, veremos
el crédito de dicho usuario.
Las posibilidades de este sistema de trabajo son ilimitadas, podemos crear servicios
web que interactúen 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.
48. CONCLUSIÓN
Es muy difícil 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 visión
global sobre lo que es el producto, y sobre todo, desde el punto de vista práctico, con
la esperanza de que le pueda servir de ayuda en su toma de decisiones. Si ya es
usuario de Delphi para PHP, quizás encuentre información 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 tecnologías RAD que tanto han beneficiado a los
programadores Delphi para Windows.
SOBRE EL AUTOR
José León es el arquitecto principal de Delphi para PHP, comenzó a escribir una
primera versión aproximadamente en el año 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 catálogo 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 España, 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ł Głowacki por su interés en Delphi para PHP y por su
incansable capacidad de comunicación.
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
company’s 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.