Вы находитесь на странице: 1из 468

Biblia de Flash y PHP

Matthew Keefe

Biblia de Flash y PHP Publicado por Wiley Editorial, Inc. 10475 Crosspoint Boulevard Indianapolis, IN 46256 www.wiley.com Copyright 2008 Publicado por Wiley Editorial, Inc., Indianpolis, Indiana Publicado simultneamente en Canad ISBN: 978-0-470-25824-8 Fabricado en los Estados Unidos de Amrica 10 9 8 7 6 5 4 3 2 1 Ninguna parte de esta publicacin puede ser reproducida, almacenada en un sistema de recuperacin o transmitida en cualquier forma o cualquier medio, sea electrnico, mecnico, fotocopia, grabacin, el escaneo o de otro modo, excepto segn lo permitido en las Secciones 107 y 108 de la Ley Derechos de Autor Estados Unidos 1976, sin que el previo por escrito de la editorial, o a travs del pago de la tasa por copia correspondiente al Copyright Clearance Center, 222 Rosewood Drive, Danvers, MA 01923, (978) 750-8400, fax (978) 646-8600. Pida a la Editorial para autorizacin debern dirigirse al Departamento Jurdico, Wiley Editorial, Inc., 10475 Crosspoint Blvd., Indianpolis, IN 46256, (317) 572-3447, fax (317) 572-4355, o en lnea en http://www.wiley.com/go/permissions. LIMITE DE RESPONSABILIDAD/RENUNCIA DE GARANTIA: EL EDITORIAL Y EL AUTOR NO HACEN NINGUNA DECLARACION O GARANTA CON RESPECTO A LA PRECISIN O INTEGRIDAD DEL CONTENIDO DE ESTE TRABAJO Y EXPRESAMENTE DECLINA CUALQUIER GARANTA, INCLUYENDO SIN LIMITACIN, LAS GARANTAS DE IDONEIDAD PARA UN PROPOSITO PARTICULAR. NINGUNA GARANTA SE PUEDE CREAR O AMPLIAR PARA VENTAS O MATERIAL PROMOCIONAL. EL ASESORAMIENTO Y LAS ESTRATEGIAS CONTENIDAS EN ESTE SITIO NO PUEDE SER ADECUADO PARA CADA SITUACIN. ESTA OBRA SE VENDE CON EL ENTENDIMIENTO QUE EL EDITOR ES QUE NO SE DEDICA A PROMOCIONAR SERVICIOS LEGALES, CONTABLES, U OTROS SERVICIOS PROFESIONALES. SI LA AYUDA PROFESIONAL ES REQUERIDA, LOS SERVICIOS DE UN PROFESIONAL COMPETENTE DEBE BUSCARSE. NI LOS EDITORES NI EL AUTOR SERN RESPONSABLES POR DAOS DERIVADOSDE AQU. EL HECHO DE QUE UN SITIO WEB U ORGANIZACIN SE HACE REFERENCIA EN ESTE TRABAJO COMO UNA CITACIN Y/O UNA FUENTE POTENCIAL DE NUEVA INFORMACIN DE LA ORGANIZACIN WEB O PUEDA PROPORCIONAR O RECOMENDACIONES QUE PUEDA HACER. ADEMAS, LOS LECTORES DEBEN SER CONSCIENTES DE QUE INTERNET SITIOS WEB QUE APARECEN EN ESTE TRABAJO HAN CAMBIADO O DESAPARECIDO ENTRE CUANDO ESTA OBRA FUE ESCRITA Y CUANDO SE LEE. Para informacin general sobre nuestros productos y servicios o para obtener apoyo tcnico, por favor contacte a nuestro Departamento de Atencin al Cliente dentro de los EE.UU. al (800) 762-2974, fuera de los EE.UU al (317) 572-3993 o por fax (317) 572-4002. Biblioteca del Congreso Nmero Control: 2008925780 Marcas: Wiley, y el logo de Wiley, y marcas relacionada con el comercio son marcas comerciales o marcas comerciales registradas de John Wiley & Sons, Inc. y/o sus afiliadas, en los Estados Unidos y otros pases, y no puede ser utilizada sin permiso por escrito. Flash es una marca registrada de Adobe Systems Incorporated en los Estados Unidos y/u otros pases. Todas las dems marcas son propiedad de sus respectivos propietarios. Wiley Editorial, Inc., no est asociado con ningn producto o proveedor mencionado en este libro. Wiley tambin publica sus libros en una variedad de formatos electrnicos. Parte del contenido que aparece en la impresin pueden no estar disponibles en los libros electrnicos.

Acerca del Autor


Matthew Keefe es un nuevo diseador de medios y desarrollador, con una slida experiencia en el desarrollo de aplicaciones para la web y fuera de lnea. Originalmente era una artista de tiempo completo grfico, se encontr que gran parte de la programacin relacionada con su trabajo de diseo estaba subcontratado. Matt aprendi rpidamente la programacin para la web y descubri una habilidad valiosa, pero poco conocidopuesto en esta industria, que la inteligencia es la capacidad para construir un sitio y tambin la capacidad de fuerza disearlo. Este fue preferido por los clientes, ya que podra hacer todo el proyecto con un estudio. Matt ha trabajado con empresas como Delphi, PhotoshopCafe, Kineticz Interactive, y las organizaciones Studios para nombrar unos pocos. Su trabajo ha sido publicado en Cmo Wow con Flash (Peachpit Press) para que l contribuyera como autor y el editor tcnico. Matt tambin ha finalizado recientemente un puesto de trabajo como el editor tcnico de primera de ActionScript 3 (Adobe Dev Library). Ejemplos de su obra se puede encontrar en su expediente personal en mkeefe.com.

A mi padre amoroso.

Creditos
Senior Acquisitions Editor Stephanie McComb Project Editor Beth Taylor Technical Editor Navid Mitchell Copy Editor Kim Heusel Editorial Manager Robyn Siesky Business Manager Amy Knies Sr. Marketing Manager Sandy Smith Vice President and Executive Group Publisher Richard Swadley Vice President and Executive Publisher Bob Ipsen Vice President and Publisher Barry Pruett Project Coordinator Erin Smith Graphics and Production Specialists Claudia Bell Jennifer Mayberry Ronald Terry Quality Control Technician Susan Moritz Media Development Project Manager Laura Moss-Hollister Media Development Coordinator Jenny Swisher Associate Producer Shawn Patrick Proofreading Christine Sabooni Indexing Broccoli Information Management

Prlogo
Macromedia. . . error Adobe Flash es manos abajo de uno de las ms impresionantes y poderosas herramientas para cualquier diseador, cuando se trata de llevar una experiencia para el usuario. Y como Flash sigue evolucionando no slo para web, para lo cual es popular, pero tambin para usuarios fuera de lnea con la evolucin de la plataforma, como Adobe AIR y la amplia gama de herramientas de terceros que pueden ser utilizados. Sin embargo, para un desarrollador de Flash hardcore ha tenido una mala reputacin. Debido principalmente al hecho de que el 1.0 es un idioma torpe, desgarbado, e inmaduro. En comparacin con otros lenguajes populares, cuando se introdujo como 1,0, que no era algo que se toma en serio en los ojos de un desarrollador y con razn. Pero entonces, si Flash es tan obstaculizar, por qu estoy incluso la lectura de un prlogo para un libro sobre el tema? Las cosas han cambiado, cambiado drsticamente. AS 3.0 ya est aqu y es uno de los mejores lenguajes en todo, si se entiende. AS 2.0 fue un paso en la direccin correcta, pero como 3.0 ha superado los sueos de todos los desarrolladores de Flash. Archivos de pequeo tamao, desempeo muy slido, e incluso algunos de manejo de datos de los rivales de Java, as que realmente no existe un desarrollador que puede decir que ya no es un lenguaje concreto. Y con AS 3.0 una nueva era de tratamiento de los datos se introducen en Flash. Y no slo con Flash, pero cuando empiezas a mezclar en PHP5, MySQL 5, ASP, AMFPHP, y otros mtodos de manipulacin de datos, las posibilidades que se abren en una nueva esfera. Los datos est en juego en AS 3.0, y es slo una cuestin de leer un libro como este para aplicarla. Sockets, XML, servicios web y otras fuentes de datos externas permiten un desarrollador de Flash para conseguir realmente sucio en una fuente de datos y actualizar el contenido sin tocar los archivos Flash de nuevo. La ventaja es que permite ms tiempo para desarrollar una experiencia de usuario atractivas sin preocuparse de las ediciones de repeticin, el presupuesto futuro de un cliente, etc. en realidad permite a los desarrolladores de Flash graves a seguir trabajando con las fuentes de datos a medida que se desarrollan y se concentran en los beneficios de matizar el contenido en s, en lugar de lo que el contenido es en el momento de desarrollo que pueden cambiar en el capricho de un cliente ms adelante. Atrs han quedado los das en que usted se basara sitio web de un cliente, tiene una tonelada de fondos soberanos ms grandes, slo para que ellos necesitan constantemente actualizaciones para las fotos, la copia, artculos del catlogo, etc. En este libro leers como utilizar los mtodos mencionados para ampliar su comprensin de sacar la ltima restriccin para conocer Flash de gran alcance, la actualizacin sin publicar, la apertura de un FLA, o preocuparse de si el cliente te ha enviado la copia de la derecha, imagen, o de otros activos. Deshacerse de la idea de que un proyecto de Flash est plagada de cada vez que cambia de modo fla y abrazar la idea de ejecutar la generacin de contenidos en tiempo. Michael Minor Director de medios interactivos invertedCreative.com

Agradecimientos
Me gustara dar las gracias a Laura Sinise por ayudarme a empezar. Este libro no habra sido posible sin las siguientes personas: Adquisiciones Editor Senior, Stephanie McComb; Project Editor, Beth Taylor; Copy Editor, Kim Heusel Technical Editor, Navid Mitchell y Mary Keefe. Tambin me gustara agradecer a mis amigos de Colin, Felipe, Brooke, Frank, Jimmy, y Daz y mi primo Teisha por su enorme cantidad de apoyo. Y, por ltimo, me gustara agradecer a mi familia por su comprensin y paciencia mientras yo estaba encerrado en mi oficina durante todas las horas de la noche.

Contenido
Acerca del Autor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v Prlogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .ix Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix

Parte I: Entender los Conceptos Bsicos


Capitulo 1: Introduccin con Flash y PHP

..................................3

Agregar Apache a un Servidor Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Instalacin de Apache para Windows Instalacin de Apache para UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Modificacin de Apache para Windows y UNIX Instalacin de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 Instalacin de MySQL para Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Instalacin de MySQL para UNIX Proteccin de MySQL . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Configuracin de PHP en el Servidor Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Instalacin de PHP para Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Instalacin de PHP para UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Resumen

Capitulo 2: Explorando Flash y PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37


Introduccin al Servidor Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 37 Trabajar con archivos .htaccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37 Proteccin de su contenido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Recopilacin de informacin acerca de Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Utilizacin de documentos de error personalizados Explorando lo bsico de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Entender las variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49 Trabajar con funciones Entender las estructuras de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Uso de la comprobacin de tipos en PHP Explorarando lo Bsico de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Uso de declaraciones o sentencias (stantemets) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Condiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58 Explorarando Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 59 Flash IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Editores alternativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62 Flash-Dispositivos habilitados Un Paso Adelante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62

Capitulo 3: Como realizar la conexin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63


Entender Comunicaciones en Flash ..........................................................................................63 Determinar el estado de PHP ........................................................................................64 Trabajar con distintos tipos de conexin ... .................................................................65 Conexin de Flash a PHP...........................................................................................................69 Conexin de PHP a MySQL ......................................................................................................73 Determinar el estado de MySQL....................................................................................73 Conectar a MySQL..........................................................................................................74 Acercar todo junto ....................................................................................................77 Resumen ...............................................................................................................................84

Capitulo 4: Trabajar con Datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85


Cargar datos en Flash.................................................................................................................85 Comprender las clases utilizadas para cargar los datos.................................................86 Poner todo junto .......................................................................................................87 Controlar carga de datos ..............................................................................................88 Una-va de carga .....................................................................................................88 Dos-manera de carga .....................................................................................................88 Cargar XML en Flash .............................................................................................................89 Trabajar con XML en PHP...........................................................................................................92 Carga de XML .........................................................................................................92 Envo de XML..................................................................................................................93 Cargar imgenes usando PHP ...............................................................................................95 Configurar cargador de la imagen..................................................................................96 Resumen ............................................................................................................................98

Capitulo 5: Interactuar con el Usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99


Desarrollo de un formulario usando Flash.................................................................................99 Creacin de un formulario de contacto....................................................................................101 Llamar el PHP ........................................................................................................103 Controladores de evento en formulario de contacto...................................................103 Correo en PHP .........................................................................................................105 Mdulo de login en Flash.........................................................................................................106 Cdigo esqueleto .........................................................................................................106 Controladores de eventos en login ..............................................................107 Integracin del Servidor para el mdulo de inicio de sesin .......................................110 Resumen ........................................................................................................................111

Capitulo 6: Trabajar con Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113


Cargar Cookies..........................................................................................................................113 Uso de cookies con PHP ...........................................................................................114 Uso de cookies en Flash ...............................................................................................118 Descubrir los beneficios del uso de cookies en PHP ....................................................122 Resumen ..........................................................................................................................124
8

Parte II: Desarrollo de contenido interactivo

125

Capitulo 7: Mantenimiento de Seguridad al trabajar con la entrada de usuario. . . .127


Precaucin con el uso de entrada de usuario..........................................................................127 Forma adecuada de manejar la carga de archivos.......................................................128 Comprobacin de la entrada valida..............................................................................131 Limpiar de datos de usuario.....................................................................................................132 Desinfeccin de los datos.............................................................................................133 Limpieza adecuada de datos HTML..............................................................................136 Almacenamiento de datos.......................................................................................................136 Escribir de forma segura a un archivo..........................................................................137 Crear y guardar una contrasea segura usando PHP ...................................................141 Retornar datos .........................................................................................................................143 Retornar datos de forma segura ..................................................................................143 Utilizando un enfoque ms seguro para el retorno de datos ......................................144 Comprender la seguridad Flash de Sandbox............................................................................145 Configurar el tipo de sandbox......................................................................................145 Uso de la propiedad sandboxType...............................................................................145 Determinar el activo sandbox ......................................................................................147 Garantizar una aplicacin no puede ser compartida....................................................151 Resumen...................................................................................................................................152

Capitulo 8: Uso de Sockets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153


Comprender los Sockets...........................................................................................................153 Seguridad en sockets....................................................................................................154 Implementacin de un servidor socket........................................................................154 Entender la conexin del socket...................................................................................154 Trabajar con Sockets en PHP....................................................................................................154 Buscando la versin de lnea de comandos de PHP.....................................................155 Construir un servidor socket ................................................................................156 Probar el servidor de socket.........................................................................................158 Crear un persistente servidor socket............................................................................160 Trabajar con Sockets en Flash..................................................................................................161 Inicializacin de una conexin de socket......................................................................161 Controladores de eventos (Event handlers)................................................................162 Conexiones remota de socket......................................................................................163 Uso de una clase para conexiones de socket...............................................................164 Creacin de un cliente de Chat con Sockets Usando Flash y PHP............................................167 Servidor socket PHP para el cliente de chat.................................................................167 Conectar al servidor socket ...............................................................................175 Crear el cliente en Flash ..........................................................................................177 Resumen ..........................................................................................................................188

Parte III: Ampliacin de Flash y PHP

189

Capitulo 9: Trabajar con bibliotecas de terceros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191


Repasando bibliotecas de terceros..........................................................................................191 Otros tipos de bibliotecas de terceros.........................................................................192 Bibliotecas en PHP........................................................................................................193 Instalacin de bibliotecas de terceros.....................................................................................193 Instalacin de bibliotecas en Flash CS3........................................................................193 Instalacin de bibliotecas en PHP................................................................................195 Uso de bibliotecas de terceros................................................................................................196 Trabajar con bibliotecas en Flash CS3..........................................................................196 Trabajar con bibliotecas en PHP................................................................................197 Echando un vistazo a AMFPHP..................................................................................................198 AMFPHP para AS3 y desarrolladores de PHP..............................................................198 Pruebas AMFPHP con un servicio personalizado.........................................................201 Uso de AMFPHP en Flash..........................................................................................205 Construccin de u mundo real de la Aplicacin Usando AMFPHP............................................210 Servicios de AMFPHP....................................................................................................210 Integracin de ActionScript para AMFPHP..............................................................216 Resumen..........................................................................................................................218

Capitulo 10: Uso de programacin orientada a objetos. . . . . . . . . . . . . . . . . . . . . . . 219


Entender la programacin orientada a objetos (OOP)...........................................................219 Informacin general de las prcticas de OOP..............................................................220 Uso de Clases en PHP........................................................................................................225 Importacin de clases en PHP.......................................................................................226 Instanciacin............................................................................................................226 Clases mltiples......................................................................................................228 Uso de Clases en Flash......................................................................................................229 Importacin................................................................................................................229 Clase de documento......................................................................................................229 Biblioteca de clases.......................................................................................................230 Uso de Flash y PHP para construir clases personalizadas.........................................................231 Resumen.........................................................................................................................235

Parte IV: Desarrollo de Aplicaciones 237 Capitulo 11: Desarrollo de aplicaciones bsicas. . . . . . . . . . . . . . . . . . 239
Entender elementos de una aplicacin.......................................................................239 Entender el diseo de la aplicacin..........................................................................240 Finalizacin de la etapa de planificacin.....................................................................242 Desarrollo de un cliente de Chat............................................................................................242 La porcin de Flash....................................................................................................242 PHP para la aplicacin de chat...................................................................................252
10

Uso de PHP para el desarrollo de una galera de fotos............................................................260 El desarrollo de ActionScript....................................................................................261 Navegacin de galera de fotos..................................................................................266 PHP para la galera de fotos........................................................................................270 Uso de PHP para desarrollar un lector RSS...............................................................................274 Importacin de clases....................................................................................................275 Cargando el PHP......................................................................................................275 Uso de PHP, Flash, y MySQL para desarrollar de un banner dinmico......................................279 Abrir una ventana del navegador..................................................................................281 Desarrollo Del PHP................................................................................................283 Seleccin aleatoria....................................................................................................283 Uso de PHP para desarrollar un contador de visitas.................................................................285 Contador de visitas lgico............................................................................................285 Desarrollo de contador de visitas en Flash....................................................................286 Resumen..........................................................................................................................287

Capitulo 12: Desarrollo del mundo real de las aplicaciones. . . . . . . . . . . . . . . . . . . . 289


Entender el mundo real de las aplicaciones.........................................................................289 Uso de PayPal en Flash........................................................................................................290 Uso de POST data....................................................................................................293 Uso de sendToURL....................................................................................................294 Establecer una comunicacin de PayPal......................................................................294 Uso de Flash y PHP para construir un Cart................................................................................295 Diseo de la cesta (cart) de compras............................................................................296 Construccin del PHP....................................................................................................306 Uso de PHP y Flash para construir una aplicacin de bsqueda del Amazon..........................317 Uso del servicio web de Amazon..............................................................................317 Simplificacin de la respuesta XML..............................................................................319 Desarrollo de una galera de fotos usando flickr......................................................................326 Interfaz con el servicio Web..............................................................................331 Construir un documento XML personalizado...............................................................332 Resumen..........................................................................................................................333

Captulo 13: Uso avanzado del mundo real de las aplicaciones. . . . . . . . . . . . . . . . . 335
Construccin de una aplicacin de dibujo en in Flash..............................................................335 API de dibujo en Flash..............................................................................................336 Uso de la librera GD en PHP..................................................................................................341 Generacin de una imagen en la librera GD................................................................343 Recoleccin de datos de pixeles en Flash......................................................................345 Uso de Flash para desarrollar un monitor del sitio web...........................................................347 Desarrollo de PHP para el monitor del sitio web.........................................................347 Uso de PHP a e-mail del administrador....................................................................349 Desarrollo del ActionScript para el monitor del sitio web.............................................351 Uso de Flash para desarrollar un reproductor de video...........................................................359 Desarrollo de una aplicacin de encuesta................................................................................364
11

Creando el PHP y MySQL..................................................................................364 Desarrollo de ActionScript para la encuesta.................................................................368 Construccin de un simple editor de archivos..........................................................................373 Resumen.........................................................................................................................380

Capitulo 14: Depurar aplicaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 381


Uso de informe de error en PHP..........................................................................................381 Mostrando los errores para depurar.............................................................................383 Entender los niveles de error................................................................................383 Depurar en Flash..........................................................................................................385 Uso de una alternativa Trace................................................................................................389 Resumen..........................................................................................................................392

Parte V: Mantenimiento de servidor, aplicacin y de base de datos

393

Captulo 15: Mantenimiento de una aplicacin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395


Comentando cdigo............................................................................................................395 Entender los estilos para comentar cdigo............................................................396 Eliminacin de comentarios y depurar ayuda..............................................................399 Gestion de un cambio de registro............................................................................................399 Seguimiento de errores................................................................................................399 Usos adicionales........................................................................................................400 Creacin dinmica de cambios..................................................................................400 Administracin de mltiples versiones.....................................................................................401 Aplicacin de control de versiones...............................................................................401 Apoyar el control de versin de CS3.............................................................................401 Configuracin de control de versiones..........................................................................402 Uso de libreras personalizadas................................................................................................403 Uso de libreras personalizadas con el control de versin............................................403 Publicacin de SWC..................................................................................................404 Resumen.........................................................................................................................404

Captulo 16: Mantenimiento de un servidor escalable y ms eficiente. . . . . . . . . . . 405


Ejecutando un servidor actualizado.........................................................................................405 Uso de actualizaciones automticas.............................................................................406 Plataforma Zend.........................................................................................................406 Trabajar con Development Installs ..................................................................................406 Construccin de otra versin de Apache en el mismo sistema.....................................406 Trabajar con tecnologa de punta..................................................................407 Dependencias..........................................................................................................407 Almacenamiento en cache y optimizacin...............................................................................408 Optimizacin de PHP....................................................................................................408 Optimizacin de Apache...............................................................................................412 Optimizacin de MySQL................................................................................................413 Almacenamiento en cache............................................................................................416
12

Instalacin de memcached en Linux.............................................................................416 Instalacin de memcached en Windows.......................................................................418 Terminando la instalacin para Linux y Windows..................................................418 Gestin de servidores....................................................................................................420 Manejo de copias de seguridad (Backup).................................................................................421 Administracin de archivos...........................................................................................421 Administracin copias de seguridad..............................................................................421 Uso de PHP para copia de seguridad de base de datos.................................................424 Resumen..........................................................................................................................427

Captulo 17: Construccin complete de aplicaciones avanzadas. . . . . . . . . . . . . . . . 429


Construir un reproductor de video bsico...............................................................................429 Construir un reproductor de Video en Flash y PHP..................................................................432 Como empezar........................................................................................................432 Integracin remota..............................................................................................437 Desarrollar un reproductor de video avanzado............................................................446 Construit la clase VideoListItem..............................................................................456 Trabajar con seguimiento de video..........................................................................................461 Actualizacin de la clase de video.................................................................................462 Mtodo updateVideoTracking..................................................................................463 Construccin de un componente de inicio de sesin de usuario en Flash................................465 Desarrollo de la clase LoginWindow........................................................................466 Prueba del componente de inicio de sesin.................................................................473 Creando la clase del gestor de inicio de sesin en PHP................................................476 Agregar remoto al componente de inicio de sesin.....................................................478 Finalizando el reproductor de video........................................................................................481 Uso de una biblioteca externa......................................................................................482 Agregar el componente de inicio de sesin (login)......................................................482 Resumen..........................................................................................................................486

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487

13

Introduccin
Este libro es una exploracin de varias partes en Flash y PHP. Flash se ha utilizado para todo, desde los anuncios de banner a las aplicaciones bsicas completamente funcionales a travs de la web y de escritorio. A menudo se puede encontrar la informacin necesaria para escribir aplicaciones asombrosas de Flash o la contraparte del lado del servidor pero rara vez ambos. Este libro se basa tanto en los aspectos y explica el proceso de trabajar con PHP en sus proyectos de Flash. La primera parte del libro es un paso a paso del proceso de instalacin y configuracin de PHP y todos los componentes necesarios. Una vez instalados los componentes, el paso siguiente es un resumen de PHP y una gua de qu caractersticas y tcnicas encontrar en el libro como de continuar a travs de los captulos. Cada captulo comienza con una descripcin bsica y despus se traslada rpidamente a la informacin pertinente, dejando de lado cualquier pelusa para asegurar que est recibiendo toda la informacin importante de inmediato. Parte II se centra en la importancia y las mejores prcticas de hacer sus aplicaciones ms seguras, manteniendo la funcionalidad. El tema de la seguridad se repite en los diversos ejemplos en este libro, pero esta parte en particular, es donde se encuentra la mayora de la informacin de seguridad. La parte III se extiende Flash y PHP, trabajando con varias aplicaciones de terceros y las bibliotecas. Este captulo finaliza con una visin general de AMFPHP para construir ms avanzado y ms fcil de mantener aplicaciones. Parte IV tiene toda la informacin anterior y le gua por el proceso de construccin completo de aplicaciones del mundo real en Flash y PHP. Estas aplicaciones del mundo real le ayudarn a construir sus versiones personalizadas y en ltima instancia, le permiten crear aplicaciones ms avanzadas y dinmicas.

Ejemplos y archivos fuentes


Usted puede encontrar todo el cdigo fuente y los archivos de arranque de los ejemplos en este libro en el siguiente sitio web. www.wiley.com/go/flashandphpbible

14

Introduccin

Lo que usted Necesitar


El ActionScript utilizado en este libro no es avanzado, pero un conocimiento bsico de los fundamentos que le permiten comprender mejor los ejemplos. La Biblia Flash es un complemento perfecto para este libro y lo recomiendo. Una comprensin bsica de las prcticas de programacin orientada a objetos le ayudara en la segunda parte del libro, pero no es necesario para entender los ejemplos en general. Es posible que desee tomar un libro sobre prcticas avanzadas de programacin orientada a objetos para obtener un entendimiento ms profundo del tema de. El PHP utilizado en este libro est asumiendo un conocimiento muy bsico de la materia. Esto significa que usted no slo aprender los temas avanzados, pero cmo llegar all desde el principio. PHP tambin le permite desarrollarse en un formato basado en la clase, de forma que se utilizarn en la plena aplicacin de los captulos para asegurarse de que estn construyendo una aplicacin ms completa y actualizable. La ltima cosa que necesita es una conexin a Internet para descargar el cdigo para el libro y trabajar con algunos de los servicios de terceros. Esto no se usa en todo el libro, pero para obtener la experiencia completa de la conexin a Internet ser necesario. Eso es todo lo que usted necesita. Ahora es el momento de saltar adentro del captulo 1 en slo unas pocas pginas de distancia.

15

Parte I Entender los conceptos bsicos

16

Capitulo 1 Introduccin con Flash y PHP


El proceso de empezar incluye la instalacin y configuracin de Apache, MySQL y PHP. Los ejemplos en este libro asumen la instalacin que se llevar a cabo a nivel local, sin embargo, puede modificar las rutas de acceso y direcciones URL, si desea utilizar un servidor remoto. El orden en que instalar estos programas es importante, ya que utilizan rutas de acceso y las variables de los dems, lo que resulta en el entorno de desarrollo completo. Esta gua de instalacin cubre los sistemas Windows y UNIX. Si usted ha decidido trabajar en el libro en un servidor existente, puede saltar al captulo 2. Sin embargo, hay cierta seguridad y la informacin de configuracin dentro de este captulo, usted puede encontrar til.

Agregar Apache a un servidor web


El primer paso para trabajar con Flash y PHP es para instalar los componentes necesarios. El proceso de instalacin se define por la instalacin de Apache, MySQL, PHP y, por ltimo. Esta orden es necesario porque PHP necesita caminos para Apache y MySQL para proporcionar ese apoyo. Usted puede volver a compilar (build) cualquiera de estos componentes en el futuro. Sin embargo, si usted sigue este orden de instalacin que significar menos trabajo y rehacer en el futuro. Los componentes que se instalen cambiar de vez en cuando, pero el proceso de instalacin en general sigue siendo bastante constante. Esto significa que usted puede descargar los archivos ms recientes de sus respectivos sitios de los proyectos, o para asegurar que todos los componentes trabajan juntos, usted puede obtener estos archivos desde la pgina del libro. Usted debe tener un conocimiento bsico del sistema en el que va a instalar. Es importante para ejecutar un sistema de desarrollo en una ubicacin segura. La mejor configuracin es un equipo detrs de un firewall fsico o en una red interna. Si esto no es posible, simplemente configurar el Apache no permitir las conexiones remotas y se puede cambiar el nmero de puerto para ocultarlo en la red. NOTA desarrollo de sistemas puede requerir una configuracin ms avanzada en funcin de cmo se han creado. Usted puede encontrar los problemas comunes se explica en el sitio Web del libro.

Instalacin de Apache para Windows


Una vez que determine que el sistema est instalando el sistema de desarrollo puede empezar a descargar los componentes necesarios. Se recomienda que utilice los archivos proporcionados con el libro. Tambin proporcionan los lugares necesarios para descargar los archivos ms recientes. La ltima versin de acceso desde el sitio Web de Apache. Es ms fcil de instalar desde la versin del instalador binario en lugar de compilar el cdigo fuente. Sin embargo, la compilacin de cdigo fuente, se ofrecen un mayor nivel de personalizacin y permite entender lo que se est ejecutando bajo el cap.

17

PRECAUCIN construccin de la fuente no es para el principiante. Se requiere un cierto nivel de experiencia y slo se recomienda a aquellos que realmente sienten el desafo. Los ltimos archivos binarios para Windows de instalacin de Apache se puede encontrar en

www.apache.org/dyn/closer.cgi/httpd/binaries/win32/.

Instalacin
Iniciar el proceso de instalacin abriendo el archivo de instalacin de Windows que era o bien descargarse de la pgina de libros o directamente desde el sitio Web de Apache. Esta instalacin ser principalmente visual, porque el instalador de Windows es una instalacin grfica. La clave para una correcta instalacin sigue de cerca y la lectura de las pantallas de todo el proceso de instalacin. La primera pantalla, como se muestra en la Figura 1.1, no requiere ninguna modificacin. Las siguientes dos pantallas son el acuerdo de licencia, que puede tomar el tiempo para leer o simplemente haga clic en Siguiente, ya que la informacin es bastante estndar. Despus de eso, usted encontrar una introduccin a Apache, que le da un buen panorama de lo que Apache tiene para ofrecer, como se muestra en la Figura 1.2. La pantalla tambin se ofrecen enlaces a recursos muy valiosos que rodean la comunidad de Apache.

FIGURA 1.1
La primera pantalla que no requiere ninguna modificacin del usuario. Simplemente haga clic en Siguiente para continuar el proceso de instalacin.

18

FIGURA 1.2
La informacin del servidor de un sistema de desarrollo no tiene por qu ser real, ya que muestra la figura.

19

La instalacin del servidor es donde se define la configuracin especfica para su entorno. Si usted se de instalar Apache en un sistema real, usted podra llenar en esta pgina con la informacin correcta, de lo contrario no sera Apache pide la ruta correcta. Puede aceptar las opciones por defecto para una configuracin de desarrollo, como esta. Siendo que la instalacin est en un servidor de desarrollo no tienen que rellenar la pantalla con los datos reales, a menos que utilice esta gua para instalar en un servidor en vivo. La instalacin de Apache HTTP Server 2.0 y accesos directos para los programas: La opcin es cuando se desea instalar Apache para que slo el usuario actual puede acceder a l. Si desea que todos los usuarios puedan acceder a Apache, a continuacin, tendr que instalarlo como un servicio. El proceso de instalacin de Apache se puede hacer de dos maneras, como se muestra en la Figura 1.3. La primera opcin es aceptar todas las configuraciones por defecto, que resulta en una instalacin ms rpida, pero no es siempre la mejor opcin. La opcin ms comn es la segunda alternativa personalizada en la que le dicen a Apache qu herramientas y bibliotecas que desea instalar. De vez en cuando al instalar una aplicacin que puede experimentar una escasez de espacio en disco duro. Apache, por otra parte, es tan pequeo, con todas las herramientas adicional instalado que no debera haber un problema de instalarlo.

FIGURA 1.3 20

La opcin Personalizar se determina para asegurar todas las herramientas de desarrollo estn instalados, como la biblioteca y la capacidad de construccin de mdulo.

Para los ejemplos en este libro, lo mejor es aceptar la instalacin personalizada y asegrese de que todas las bibliotecas y las extensiones estn instalados. Por ejemplo, algunos de los mdulos utilizados para modificar las solicitudes de los usuarios slo estn disponibles cuando se instala la versin completa. Dependiendo del sistema, puede tomar un tiempo para instalar Apache. Incluso si la barra de estado deje de moverse no se trate; algunos de los archivos tardan ms que otros a la instalacin. La aplicacin le avisa si algo sucede durante el proceso de instalacin, que es muy raro. Apache actualizar la barra de progreso, como se muestra en la Figura 1.4, mientras que la instalacin est ocurriendo.

FIGURA 1.4 21

Estado de la instalacin de Apache

La ltima pantalla que se ve es una nota que la instalacin fue exitosa. Un smbolo de DOS puede aparecer que le notifica que el servicio de Apache est comenzando. Tambin puede obtener una advertencia de Firewall, y tendr que conceder el acceso de Apache pide.

Pruebas
Felicidades. Si todo ha ido bien debera tener ahora Apache instalado en su mquina Windows. Para probar la instalacin, abra un navegador Web y el punto en el servidor Web Apache locales, que tambin es conocido como localhost. http://localhost/ Usted debe ser presentado con una pantalla similar a lo que se ve en la figura 1.5, que bsicamente se le informa de que Apache se ha instalado correctamente y est listo para comenzar a cumplir el contenido. Dependiendo del proceso de instalacin, puede modificar esta situacin, que a veces es necesario cuando se instala en un servidor remoto. Usted no sera capaz de acceder al servidor web Apache en la direccin localhost. En su lugar, desea sealar a la direccin IP o el nombre de dominio de su sitio Web.

FIGURA 1.5 22

La pantalla de bienvenida por defecto de Apache

Con Apache instalado, puede modificar la pgina predeterminada para ver realmente cmo funciona el Apache. Los archivos de Internet que sirve de Apache se encuentran en la raz del documento. Esto es similar a la public_html o www que usted ha visto muy probablemente en un servidor Web remoto. A diferencia de un servidor Web remoto, los permisos de estos archivos son a menudo inaccesibles para los dems usuarios no ver desde su propio ordenador personal. La ubicacin de este directorio Web en Windows utilizando una instalacin por defecto es: C:\Program Files\Apache Group\Apache2\htdocs Usted ver muchos ficheros en este directorio, tales como los archivos del mismo ndice en varios idiomas. Usted no desea modificar cualquiera de estos archivos, ya que podra estropear el ncleo de Apache o introducir errores que seran muy difciles de rastrear, por tanto, crear un nuevo archivo. Usando su editor de texto favorito, crear una pgina HTML muy simples, tales como las siguientes: <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd> <html xmlns=http://www.w3.org/1999/xhtml lang=en> <head> <title>My Custom Page</title> <body> <h1>Welcome to my custom page</h1> <p>This is a test of the customization of Apache!</p> <p>Pretty cool huh?</p>

23

</body> </html> Guardar este nuevo archivo en el directorio de la Web Apache y el nombre que myPage.html. Despus de guardar el archivo, abra en el navegador Web para presenciar la flexibilidad en Apache. Este no es el ejemplo ms avanzado, pero se le debera dar la idea bsica de cmo modificar y trabajar con el servidor web Apache. Ahora es el momento de crear ejemplos ms tiles, porque tiene lo bsico. En este punto, con Apache instalado y probado, puede pasar a la instalacin y configuracin de PHP, o puedes ir adelante con el proceso de configuracin de Apache. Alternativamente, se puede leer a travs de la instalacin de Apache en UNIX, que se trata en la siguiente seccin. La instalacin de Apache en UNIX estara ms cerca de trabajar con un servidor remoto, ya que encontrar que la mayora de los servidores Web se basan en Linux. Esto no significa que usted nunca se encontrar un servidor basado en Windows Web en vivo, pero ciertamente no es tan comn.

Instalacin de Apache para UNIX


El proceso de instalacin en UNIX es ms avanzada que la instalacin de Windows. Sin embargo, la instalacin de UNIX a menudo es el escenario ms comn para un servidor en vivo. El primer paso para instalar Apache es la descarga de la fuente. Esta fuente puede ser descargado desde el sitio del libro, o directamente desde el sitio Web de Apache. Uso de la fuente proporcionada en el sitio web del libro asegura que se est ejecutando un sistema casi idntico al utilizado para escribir este libro. Va a encontrar la fuente, como se muestra en la Figura 1.6, directamente desde Apache en la siguiente URL:

http://httpd.apache.org/download.cgi.

FIGURA 1.6 24

Aqu est una lista de las posibles versiones del cdigo fuente para su descarga desde el servidor Apache.

Despus de descargar el cdigo fuente de Apache, puede comenzar el proceso de instalacin.

Preinstalacin
Antes de la instalacin puede comenzar, la fuente debe ser extrado del archivo descargado. Esto se hace simplemente descomprimir el archivo tarball y desempaquetar el archivo sin comprimir. $ gzip -d httpd-2.2.6.tar.gz $ tar xvf httpd-2.2.6.tar Una vez que los dos ltimos procesos se completa, se quedan con un nuevo directorio que contiene el cdigo fuente. Antes de continuar, cambiar de directorio, lo que significa que estar en el directorio del cdigo fuente se encuentra en. $ cd httpd-2.2.6/

Instalacin
25

Cuando se extrae el cdigo fuente, usted puede comenzar el proceso de instalacin. Apache instalar con su propio conjunto de opciones, pero usted tiene la posibilidad de modificar estos. Si desea configurar Apache con los valores predeterminados, simplemente escriba ./configure. Sin embargo, es una mejor prctica para adaptar el proceso de instalacin de su entorno. Una de las opciones ms importantes que puede definir es el --prefix, que es donde Apache se instalar. Esta opcin se utiliza en toda la aplicacin y tambin se utiliza ms tarde durante la instalacin de PHP y en la seccin de configuracin. Para simplificar un proceso de configuracin se utiliza parcialmente modificada, pero no dude en mirar a travs de la documentacin de Apache para obtener una mejor comprensin de lo que la configuracin se puede cambiar. $ ./configure --prefix=/usr/local/apache --enable-rewrite=shared \ --enable-spelling=shared Una vez que comienza el proceso de configuracin, puede tomar unos minutos para completar. La mayora de las veces podrs ver el proceso de impresin en la ventana de terminal, pero incluso si no lo es, se est ejecutando. Despus de configurar el comando se haya completado, puede ejecutar make para construir el paquete de Apache. $ make Una vez ms, este proceso puede llevar tiempo dependiendo de su sistema, as que por favor sea paciente. Una vez que el comando make se ha completado, el ltimo comando para ejecutar instala el paquete, para terminar la parte de la instalacin. $ make install

Pruebas
Con Apache instalado, usted puede iniciar y ponerlo a prueba en el navegador. Apache se instala una herramienta muy til, apachectl, que se puede encontrar en el directorio bin/ de la ubicacin de instalacin. Usando el camino elegido para esta instalacin, la aplicacin apachectl se encuentran aqu. $ usr/local/apache/bin/apachectl Utilice el comando siguiente para iniciar el servidor Apache: $ usr/local/apache/bin/apachectl start Utilice este comando para detener el servidor Apache: $ usr/local/apache/bin/apachectl stop Para reiniciar el servidor Apache, utilice este comando: $ usr/local/apache/bin/apachectl restart Probando el servidor se realiza haciendo una llamada a localhost desde el navegador web en http://localhost/. Como usted puede ver, la instalacin fue un xito. A fin de probar y entender mejor cmo modificar los archivos de Apache sirve, HMTL crear un nuevo archivo y guardarlo en la raz de la Web Apache.

26

Usando su editor de texto favorito, que en UNIX ms probable es que vi, crear este nuevo archivo HTML. Los siguientes comandos asumen que se est usando vi.

Crear un Nuevo archivo:


$ vi /usr/local/apache/htdocs/sampleFile.html Con el fin de comenzar a introducir el cdigo HTML, usted necesita decirle a vi entrar en modo de insercin, que se realiza pulsando I. Presione ESC para salir del modo de insercin. Pegue o escriba el siguiente ejemplo de cdigo HTML: <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd> <html xmlns=http://www.w3.org/1999/xhtml lang=en> <head> <title>My Custom Page</title> <body> <h1>Welcome to my custom page</h1> <p>This is a test of the customization of Apache!</p> <p>Pretty cool huh?</p> </body> </html> Una vez que el archivo es creado, pulse ESC y escriba el siguiente comando para guardar y cerrar el editor. Tenga en cuenta, el : es parte del comando. :wq Algunos archivos de agregar o modificar requieren que reinicie Apache, sin embargo, los archivos de base de Internet no entran en esa categora. Ahora puede mostrar la nueva pgina, aadiendo el nombre del archivo a la llamada localhost en http://localhost/sampleFile.html. Como se puede ver, el servidor de Apache ha sido instalado correctamente y se haya podido aadir un archivo personalizado que Apache adecuadamente sirve. En este punto, usted debe tener un conocimiento bsico de cmo funciona el Apache. La siguiente seccin (independiente de la plataforma) entra en ms detalles acerca de cmo se puede modificar Apache.

27

Modificacin de Apache para Windows y UNIX


Los siguientes consejos, trucos y ajustes se pueden realizar en las instalaciones de Windows o UNIX. Esto se debe a que son especficas de Apache y no el medio ambiente que puede correr. Cuando se trabaja en el desarrollo de sistemas no es raro que requieren ms de una instalacin de Apache. Esto podra poner a prueba sangrante cdigo de vanguardia, un apoyo ms plug-ins, o simplemente para garantizar un proyecto se ejecuta en un clon del sistema en vivo. El proceso de instalacin de Apache se mantiene ms o menos igual. Slo tienes que cambiar la opcin de prefijo apuntando a una nueva ubicacin/diferente. Usted puede ejecutar varias versiones de Apache, sin embargo, requieren de ubicaciones de instalacin independiente. Ejecutar varias versiones de Apache, al mismo tiempo utilizando slo las opciones por defecto de instalacin no es posible. Esto se debe a Apache que se cre para escuchar las peticiones en el puerto 80 por defecto. Usted puede modificar el puerto que escucha en el Apache editando el archivo de configuracin. Los archivos de configuracin se encuentran en el directorio conf/, que se encuentra en el directorio que usted designe durante la instalacin de Apache. Por ejemplo, puede cambiar el puerto que funciona en Apache. Comience por abrir el fichero de configuracin. Para abrir el archivo de configuracin en UNIX, use vi. $ vi /usr/local/apache/conf/httpd.conf Para abrir el archivo de configuracin de Windows, navegue hasta el directorio de instalacin y abrir el archivo httpd.conf en su editor de texto favorito. C:\Program Files\Apache Group\Apache2\conf\httpd.conf Cuando el archivo est abierto, desplcese hacia abajo o de bsqueda de la directiva Listen, que tendr un aspecto similar a la siguiente: # # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the <VirtualHost> # directive. # Listen 80 NOTA Apache slo se ver en este archivo durante el inicio. Cuando haya terminado la edicin, asegrese de reiniciar el servidor Apache. Cambio de un valor que le permite ejecutar varias copias de Apache. Sin embargo, ejecutar varias instancias de Apache puede ser intensivo del procesador, as que asegrese de que slo se ejecutan como muchos casos, segn sea necesario. En la mayora de los casos, se ejecutar slo una instancia en un servidor en vivo.

28

Instalacin de MySQL
Ahora que est instalado Apache, el siguiente componente a instalar es MySQL. Esta sera la base de datos que el contenido de su aplicacin se almacenan y se gestione por medio de PHP.

Instalacin de MySQL para Windows


Al igual que el proceso de instalacin de Apache, MySQL tiene un instalador de Windows que hace que todo el proceso mucho ms fcil. Las guas de instalacin a travs del proceso de instalacin de la base de datos bsicos y los componentes adicionales que necesita. Para esta instalacin, la instalacin por defecto se utiliza, pero no dude en personalizar, que es una muy buena manera de aprender.

Descargar
El primer paso para la instalacin de MySQL es descargar la ltima instalar los archivos. Puede utilizar los archivos proporcionados en el sitio Web del libro para garantizar la compatibilidad o puede visitar el sitio Web de MySQL en http://dev.mysql.com/downloads/mysql/5.0.html#win32 para obtener la ltima versin estable en este momento. Seleccione el programa de instalacin de Win32 con el programa de instalacin para que el proceso de instalacin en general ms fcil. Esto le permite utilizar la interfaz grfica de usuario en lugar del comando tradicional lnea de proceso de las versiones anteriores.

Instalacin
Despus de descargar y abrir el instalador de una pgina de bienvenida, seguida por otras pginas que componen el proceso de instalacin, como se muestra en la Figura 1.7. Similar a la instalacin de Apache, MySQL tambin tiene varias opciones de configuracin que necesitan ser modificados. Repasa atentamente los pasos siguientes para asegurar su base de datos funcionar correctamente. Elija la opcin de instalacin Tpica, que instala los componentes bsicos necesarios para operar y mantener una base de datos MySQL. Haga clic en Siguiente para pasar al siguiente paso. En este punto, MySQL ha sido instalado. La ltima pgina le da la opcin de iniciar la seccin de configuracin al hacer clic en Siguiente. Asegrese de seleccionar esta opcin. Si accidentalmente cerca de esta pgina usted puede volver a ejecutar o abrir la aplicacin de configuracin en el directorio mysql/ en archivos de programa. La instalacin de MySQL no ofrecen casi nada en la modificacin. Esto es porque el apoyo a la aplicacin Asistente para la configuracin se ocupa de todas las opciones de configuracin necesarios. Seleccione la opcin de configuracin detallada, como se muestra en la Figura 1.8. Esto le permite ajustar la configuracin de MySQL en lugar de utilizar todos los valores predeterminados. Haga clic en Next para continuar.

29

FIGURA 1.7
Esta pgina es el proceso de instalacin. La instalacin puede durar varios minutos, dependiendo del sistema.

Si selecciona la opcin de configuracin estndar se le presenta con una pequea lista de las pantallas de configuracin. Esto acelera el proceso de configuracin, pero no le permiten personalizar la funcionalidad de MySQL y podra resultar en un sistema menos eficiente.

30

FIGURA 1.8
Seleccione el tipo de configuracin.

El tipo de servidor determina la memoria, disco duro, y el uso de la CPU. Esto ha sido instalado en su equipo de desarrollo de modo que quieren asegurarse de que MySQL no llegar a ser excesivamente procesador o recursos. Seleccin de la opcin Mquina de Desarrollo garantiza esto no suceda. Las otras dos opciones son para los servidores dedicados. La opcin de la mquina del servidor se utiliza cuando se instala MySQL en la misma mquina del servidor Web, como Apache, se est ejecutando. Esto est bien para un medio en el sitio de la trata, pero usted puede encontrar un aumento en el uso de recursos que el sitio se vuelve ms activa. Cuando esto sucede, tendr que introducir una mquina dedicada a ejecutar su base de datos MySQL, que en este momento es que seleccione la opcin Dedicado MySQL Server Machine. Esta opcin le dice a MySQL se instala en una mquina dedicada y utilizar todos los recursos y la memoria que se presente. NOTA Asegrese de que usted nunca accidentalmente seleccione la opcin dedicado MySQL Server Machine cuando se instala en un servidor Web. Su sistema no ser capaz de gestionar adecuadamente los recursos y, eventualmente, podra fallar. MySQL constantemente tratan de asignar toda la memoria libre, siempre que est disponible, lo que significa que el servidor Web cierra una conexin rancio, MySQL podra robar la memoria libre hasta que no haya ms espacio para la conexin disponible.

After you select an option (in this example Dedicated Machine), click Next (see Figure 1.9).

31

FIGURA 1.9
Despus de seleccionar una opcin (en este ejemplo mquina dedicada), haga clic en Siguiente (ver Figura 1.9).

Seleccione la opcin multifuncional de base de datos como el tipo de uso de base de datos para permitir la mxima capacidad de expansin del sistema. Esto permite a MySQL para optimizar tanto para los motores de almacenamiento InnoDB y MyISAM. Si esta es la primera vez que la instalacin de MySQL, que es muy posible, porque muchos sistemas del buque con ella ya est instalado, usted puede preguntarse cmo se usan las otras dos opciones. La base de datos transaccional opcin Slo se usa cuando va a correr una gran cantidad de consultas transactionbased. Esto significa que se ajuste un montn de preguntas (UPDATE, SELECT, DELETE, INSERT) en una carrera para asegurar que todos los cuadros adecuados y los datos son modificados. Pero si algo va mal en una de esas modificaciones que podra arruinar los datos restantes. Esto significara una gran cantidad de edicin de datos innecesarios y en algunos casos podra resultar en datos incorrectos. Una transaccin busca un error o un disparo y si se encuentran todas las modificaciones introducidas durante el inicio de la transaccin se deshacen y vuelve a su estado no modificados. He aqu un ejemplo simple de una transaccin basada en MySQL, que modifica dos partes separadas de los datos en la misma mesa. START TRANSACTION; UPDATE users SET credits = credits - 100 WHERE id = 3002; UPDATE users SET credits = credits + 100 WHERE id = 3002; COMMIT; Durante el proceso de una operacin de las anotaciones se hagan disponibles para otras sesiones para garantizar que los datos no pueden ser ledos o modificados, mientras que una transaccin se est realizando.

32

Usted puede pensar en este proceso como algo similar a dar vuelta a la alimentacin en su casa a que alguien no puede querer darle al interruptor de luz mientras est trabajando en algo. La base de datos no transaccionales Slo se selecciona la opcin cuando usted sabe que nunca tendr la capacidad de transaccin. Esto slo se permite que el motor de almacenamiento MyISAM, que pueden proporcionar mejores resultados, pero tambin limita la funcionalidad en general. Frecuentemente usted encontrar la opcin de base de datos multifuncional, como se muestra en la figura 1.10, en la mejor opcin, pero tambin es bueno saber la oferta de otras opciones.

FIGURA 1.10
La opcin multifuncional de base de datos es seleccionado como el tipo de almacenamiento de base de datos.

La siguiente pgina le permite personalizar el sistema de almacenamiento InnoDB, pero lo mejor es dejarla como esta con la configuracin predeterminada. En algunos casos, puede que quiera elegir una ubicacin distinta, que puede hacer haciendo clic en el botn Examinar a la derecha del cuadro de instalacin. Elegir un lugar diferente slo es necesario cuando el anuncio Drive Info en la parte inferior de la ventana de informes de una pequea cantidad de espacio libre en disco, lo que significa que su base de datos podra consumir el resto de sus recursos. PRECAUCIN Asegrese de que nunca elegir una unidad extrable, como la ubicacin de almacenamiento, ya que podra perjudicar a la base de datos si la unidad no est conectada en todo momento. Como se dijo anteriormente, con mayor frecuencia es mejor dejar esta opcin en su opcin por defecto, como se muestra en la figura 1.11, para garantizar las funciones de su base de datos correctamente.

33

FIGURA1.11
Configuracin de tablas InnoDB

La siguiente opcin es una aproximacin de conexiones simultneas que su base de datos MySQL que hacer. Debido a que esta instalacin se realiza en un servidor de desarrollo, una estimacin de no ms de 25 es un supuesto realista. En realidad, no sera raro tener ms de 5, pero el 25 es un nmero de buena base. Seleccione el procesamiento de transacciones online (OLTP) en la opcin "Decisin de Apoyo ", la partida cuando se est desarrollando una aplicacin Web para que el pblico tiene acceso. Esto es porque realmente no tienen idea de cuntas personas pueden tratar de acceder al sistema en cualquier momento dado. A medida que su aplicacin sigue creciendo incluso puede ser necesario a la cadena de mltiples bases de datos as como para manejar la carga, pero por ahora una base de datos es suficiente, especialmente considerando que esta instalacin se est realizando en el sistema local. Seleccione la opcin de ajuste manual cuando se desea especificar un nmero exacto. Esto slo es necesario cuando se desea tener un control total sobre la aplicacin Web. Muchas veces se ve este nmero manual establecida en 300 viven en las aplicaciones Web. Esto parece ser un buena medio con la capacidad de manejar mltiples conexiones. Tenga cuidado de no establecer la opcin de conexiones simultneas, como se muestra en la Figura 1.12, demasiado alto porque el sistema slo tendr tantos recursos que pueden ser divididos y compartidos por cada conexin. Si agrega ms memoria a su solicitud, usted puede aumentar este nmero, pero que no siempre puede ser la mejor opcin.

34

FIGURA 1.12
Establezca el nmero aproximado de conexiones simultneas.

Las opciones de red de determinar si las bases de datos MySQL ser visible a otros sistemas, ms all de la configuracin local. Para la garanta definitiva, deshabilitar el TCP/IP. Si usted tiene varias mquinas de desarrollo, puede habilitar y elija un puerto no estndar. Para esta instalacin, la red est habilitada, como se muestra en la figura 1.13, y el puerto por defecto se utiliza porque no tienen la intencin de permitir que otras personas se conectan, pero mi servidor web est ubicado detrs de un firewall de hardware para mayor seguridad. Elija un nmero de puerto no estndar si instala otra versin de MySQL en el mismo sistema. Esto no es muy comn, pero a veces hay que desplegar hacia atrs entornos compatibles para probar el cdigo en diversas configuraciones. Esta es una alternativa rentable a la construccin y el mantenimiento de una mquina fsica para manejar el proceso de pruebas. Asegrese de seleccionar la opcin Habilitar el modo estricto para garantizar las funciones de su servidor de base de datos correctamente.

35

FIGURA 1.13
Configuracin de las opciones de red

En la siguiente pgina se puede seleccionar el juego de caracteres predeterminado utilizado en su base de datos. El juego de caracteres estndar se selecciona la opcin para este ejemplo (ver Figura 1.14), pero muchas veces esto no es la mejor opcin, ya que no permite la compatibilidad con la mayora de los sistemas existentes o permitir la expansin en el tiempo. Para este ejemplo va a funcionar bien porque no tienen ningn carcter avanzado se utiliza. Usted puede, por supuesto, seleccione cualquier opcin que mejor se adapte a su uso, pero prefiero el mejor apoyo para la opcin de Multilingismo. Esta opcin permite una mayor expansin y es altamente recomendable cuando el almacenamiento de texto en muchos idiomas diferentes. Seleccione el carcter seleccionado por defecto Manual Set/ opcin de gestin de las raras ocasiones en que desea especificar un cierto carcter configurado para utilizar en lugar de elegir una seleccin de ellos. Usted probablemente nunca utilice esta opcin porque es demasiado especfica, pero est disponible si es necesario. Si usted piensa que va a utilizar varios idiomas, le recomiendo la segunda opcin, el mejor apoyo al multilingismo, para asegurar sus aplicaciones ser capaz de expandirse, y tambin le permitir experimentar con diferentes opciones despus. La pgina Opciones de Windows (vea la Figura 1.15) determina cmo se inicializa MySQL. Por ejemplo, si usted elige para ejecutar MySQL como un servicio que se inicia o detiene de forma automtica, controlada por el sistema operativo. Si usted tiene instalada una versin anterior de MySQL, usted tendr que elegir un nombre de servicio diferente. Esto es para garantizar el servicio existente no colisionar con este. Seleccione el lanzamiento del servidor MySQL automticamente opcin para asegurar la base de datos est disponible cuando se inicia el sistema. Esto no es obligatorio, pero si lo hace de modo que no tienen que iniciar el servicio manualmente cada vez que reinicie su mquina. Puede, por supuesto, la solicitud de acceso a los servicios en su sistema y modificar esta opcin en cualquier momento, as como desactivar el servicio hasta la prxima vez que la mquina arranca.

36

FIGURA 1.14
Seleccin de un juego de caracteres predeterminado

El directorio Incluye Bin en Windows opcin PATH, cuando se selecciona, incluye soporte para MySQL desde la lnea de comandos, simplemente escribiendo MySQL. Esto significa que cualquier smbolo del sistema le permitir un acceso rpido a la base de datos MySQL. Puede consultar las instrucciones de su sistema operativo para modificar esta variable PATH. Tambin puede aadir PHP y Apache para esta variable mismo camino, que los expondra a la lnea de comandos tambin. De hecho, cuando se instala PHP algunos materiales de instruccin para llevar a cabo esta modificacin se ofrece.

37

FIGURA 1.15
Las opciones de Windows determina cmo MySQL se inicia y se accede.

La configuracin final se utiliza para establecer una contrasea de root, como se muestra en la figura 1.16. El usuario root tiene permisos globales sobre sus bases de datos, as que puede imaginarse lo importante que es asegurar este usuario. Usted no tiene que elegir una contrasea, pero por defecto, MySQL se instala sin contrasea de root, lo que significa que nadie tiene acceso a sus bases de datos. Lo mejor es elegir una difcil de adivinar la contrasea, vuelva a escribir una vez ms, y asegrese de que el acceso a la raz de la opcin Habilitar el control remoto de mquinas no se ha seleccionado para deshabilitar la capacidad para administrar las bases de datos de forma remota. Puede parecer esta opcin permitira una mejor facilidad de uso, pero hay algunas excepciones, una de las cuales es la seguridad general de un sistema. A pesar de que esta configuracin se realiza en un servidor de desarrollo, es mejor mantener la seguridad en la vanguardia del proceso de instalacin. Si lo hace, asegrese de seguir las precauciones necesarias al realizar una instalacin similar en una configuracin remota. Si la seguridad no es una preocupacin, usted tiene la opcin de crear una cuenta annima. Sin embargo, la creacin de dicha cuenta es casi idntico a un nombre de usuario root sin contrasea y tienen las mismas preocupaciones por la seguridad global.

38

FIGURA 1.16
Opciones de seguridad para MySQL

La ltima pgina, como se muestra en la figura 1.17, es para la transformacin de la configuracin de los valores establecidos en las pginas anteriores. Si por alguna razn se detecta un error, MySQL le notificar. La mayora de las veces podrs ver cada vieta con una marca aplicada de completarse. Cuando se termina el proceso, se le presentar con un aviso informndole de la configuracin se ha completado y MySQL est listo para usar. Ahora ha instalado correctamente y configurado MySQL para ser utilizados por el resto de este libro. Haga clic en Finalizar para cerrar la pgina de configuracin y comenzar a probar la instalacin.

39

FIGURA 1.17
Pantalla de configuracin de transformacin con avisos adecuados, ya que cada tarea se ha completado.

Pruebas
Despus de instalar MySQL puedes probarlo. Puede ver el estado del servicio usando el monitor de MySQL, que determina si el servidor de base de datos est en marcha. Usted puede utilizar la lnea de comandos para registrar e investigar en la base de datos MySQL igual que lo hara en un servidor remoto. Para abrir un nuevo smbolo del sistema, como se muestra en la Figura 1.18, presione la tecla Windows + R. Cuando el tipo de sistema abierto, el siguiente comando para iniciar sesin: $ mysql -uroot -p NOTA Si aparece "command not found", tendr que aadir MySQL a la variable PATH. Un aviso Introduzca Contrasea. Escriba la contrasea establecida en el proceso de configuracin. NOTA Cuando se escribe una contrasea, el sistema no mostrar las actualizaciones de texto.

40

FIGURA 1.18
El smbolo del sistema con el comando entr para iniciar sesin en el servidor de base de datos MySQL

Si la conexin es exitosa, un aviso que describe el servidor MySQL. La notificacin contiene la versin de MySQL que est actualmente en ejecucin. El siguiente es un ejemplo de la Comunicacin: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.0T.45-community-nt MySQL Community Edition (GPL) Una vez que se conecte a MySQL, el smbolo del sistema cambia a mysql>. A partir de este momento, hasta que salga, todos los comandos se dirigen al servidor de base de datos. Por ejemplo, para ver qu bases de datos estn disponibles, escriba el comando siguiente: mysql> show databases; Para probar la instalacin de bases de datos, crear una nueva base de datos: mysql> create database flashphp; Cuando se crea la base de datos, se puede seleccionar con el siguiente comando: mysql> use flashphp; Incluso puede pasar en el nombre de base de datos durante la fase de inicio de sesin, como el: $ mysql -uroot -p flashphp En este punto, MySQL debe ser instalado correctamente en el servidor de desarrollo de Windows. La siguiente seccin explica cmo instalar MySQL para UNIX y sistemas similares a UNIX. El proceso de instalacin de PHP est directamente siguiendo las instrucciones de UNIX. Sintase libre para ir por delante si slo desea centrarse en un sistema Windows.

41

Instalacin de MySQL para UNIX


Usted puede instalar MySQL en su sistema UNIX, utilizando el cdigo fuente proporcionado en el sitio del libro, o usted puede descargar los archivos ms recientes de MySQL directamente en http://dev.mysql.com/

downloads/mysql/5.0.html#linux.
NOTA La versin de descarga depende del entorno en el que est instalando. Consulte la siguiente gua para ms informacin:

http://dev.mysql.com/doc/refman/5.0/en/which-version.html.
Despus de descargar los archivos de instalacin es necesario, puede comenzar la preparacin para el proceso de instalacin. El primer paso es agregar el usuario y grupo mysql para que MySQL Ejecutar como. El comando siguiente crea el grupo mysql y aade un usuario de MySQL a ese grupo nuevo: $ groupadd mysql $ useradd -g mysql mysql Elija el directorio en el que desea instalar MySQL. Usted puede elegir el mismo lugar donde se instal Apache para mantener todos sus componentes de desarrollo en el mismo lugar. $ cd /usr/local NOTA Puede que tenga que realizar la instalacin de MySQL como root si se protege el directorio. Descomprima el paquete de distribucin y crear un vnculo simblico a ese directorio. $ gunzip < /usr/local/mysql-5.0.45-linux-i686-glibc23.tar.gz | tar xvf $ ln -s /usr/local/ mysql-5.0.45-linux-i686-glibc23 mysql Cuando el comando se ha completado el desembalaje, el cambio en el directorio de instalacin. $ cd mysql Cambiar la propiedad de los archivos a MySQL ejecutando un comando de la propiedad recursiva. El primer comando cambia la propiedad y el segundo cambia el atributo de grupo. $ chown -R mysql $ chgrp -R mysql Si no tiene instalada una versin anterior de MySQL en este equipo, debe crear el directorio de datos MySQL y tablas de permisos. scripts/mysql_install_db --user=mysql Si quiere que MySQL se ejecute automticamente cuando la mquina empieza, puede copiar el archivo mysql.server situado en el apoyo o directorio a la ubicacin donde el sistema tiene sus archivos de arranque. Para obtener ms informacin sobre la ubicacin del directorio que las preocupaciones y otros sistemas especficos, vaya a http://dev.mysql.com/doc/refman/5.0/en/UNIX-postinstallation.html#automatic-start. Cuando todo est bien expandido e instalado, puede empezar a probar. Para iniciar el servidor MySQL, ejecute el comando siguiente desde el directorio de instalacin de MySQL: $ bin/mysqld_safe -- user=mysql &

42

Utilice el siguiente comando para verificar que el servidor est funcionando realmente: $ bin/mysqladmin version $ bin/mysqladmin variables La salida de mysqladmin version vara dependiendo de la versin instalada. Esta es una muestra que regresa ese comando: mysqladmin Ver 14.12 Distrib 5.0.54, for pc-linux-gnu on i686 Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license Server version Protocol version Connection UNIX socket Uptime: 5.0.54 10 Localhost via UNIX socket /var/lib/mysql/mysql.sock 0 days 2 hours 2 min 07 sec

Threads: 1 Questions: 323 Slow queries: 0 Opens: 0 Flush tables: 1 Open tables: 7 Queries per second avg: 0.000

Proteccin de MySQL
Es importante que usted proteja a los usuarios de MySQL de la actividad maliciosa. Por defecto, MySQL se instala la raz y los usuarios annimos, sin contraseas, que es lo mismo que usar un valor predeterminado global. Es una prctica muy buena para asignar contraseas de inmediato y en algunos casos, eliminar por completo los usuarios annimos.

Configurar un contrasea en Windows


La contrasea para la cuenta root se le dio una contrasea cuando se ejecut el programa de instalacin. Sin embargo, si por alguna razn usted desea cambiarla, simplemente ejecute el siguiente comando, NEW_PASSWORD sustituyendo con la contrasea real que desea utilizar: $ mysql -uroot mysql> SET PASSWORD FOR root@localhost = PASSWORD(NEW_PASSWORD); mysql> SET PASSWORD FOR root@% = PASSWORD(NEW_PASSWORD);

Configurar un contrasea en UNIX


La instalacin de MySQL en Unix deja el login de root sin contrasea, a diferencia de la instalacin de Windows. Es muy importante asignar una contrasea inmediatamente: $ mysql -uroot mysql> SET PASSWORD FOR root@localhost = PASSWORD(NEW_PASSWORD); mysql> SET PASSWORD FOR root@host_name = PASSWORD(NEW_PASSWORD);

43

Se debe reemplazar host_name con el nombre de host del servidor. Si usted no conoce la mquina del servidor, ejecute este comando mientras est conectado a MySQL para determinar la informacin: SELECT Host, User FROM mysql.user; Para eliminar la cuenta annima, acceda a MySQL y emitir el siguiente comando: DROP USER ; PRECAUCIN Tenga cuidado al eliminar un usuario y revise la ortografa del nombre del usuario antes de emitir esa orden.

Configuracin de PHP en el Servidor Web


PHP es el ltimo componente para instalar a fin de completar el proceso de construccin del sistema de desarrollo. El proceso de instalacin de PHP es sencillo, pero requiere un poco de personalizacin. NOTA Al instalar el soporte para XML y las bibliotecas de GD, el sistema puede requerir de las bibliotecas y de componentes adicionales.

Instalacin de PHP para Windows


Instalacin de PHP para Windows es en realidad bastante simple. Gran parte del proceso de instalacin consiste en mover archivos de un lado y edicin de archivos existentes. Usted puede encontrar los archivos de instalacin de PHP en el sitio Web del libro o puede descargar la ltima archivos directamente desde el sitio en php.org www.php.net/downloads.php.

Instalacin
Para empezar el proceso de instalacin de PHP, ejecute el instalador de la aplicacin que ha descargado. La pgina de bienvenida para el asistente de configuracin, como se muestra en la figura 1.19. La carpeta de destino, como se muestra en la figura 1.20, es donde se instala PHP. Por defecto, se eligi una ruta de directorio de Archivos de programa dentro de ella. Esto puede causar problemas en algunos servidores. Una ruta comn es C:\php o C:\php5 si va a instalar varias copias de PHP.

44

FIGURA 1.19
La pgina de bienvenida de instalacin de PHP

45

FIGURA 1.20
Seleccione la carpeta de destino.

El programa de instalacin de PHP est construido para configurar PHP y Apache para trabajar juntos. Esto incluye la edicin de los archivos de configuracin de Apache. En la pgina de configuracin de servidor Web, como se muestra en la Figura 1.21, seleccione la versin de Apache que haba instalado previamente. Si no est seguro de qu versin est instalada, puede ejecutar el siguiente comando en el smbolo del sistema: /usr/local/apache2/bin/httpd v El siguiente es un ejemplo de salida de la orden anterior: Server version: Apache/2.0.59 Server built: Aug 31 2007 01:58:43

46

FIGURA 1.21
La pgina web de configuracin del Instalador de PHP

En la siguiente pgina, ver la Figura 1.22, es donde se informar a la instalacin de la ubicacin del directorio de configuracin de Apache. Por ejemplo, si has seguido la gua de instalacin de Apache en el comienzo de este captulo, el camino sera el siguiente: C:\Program Files\Apache Group\Apache2\conf\ En la siguiente pgina que usted elija las extensiones adicionales necesarios para este libro (vea la Figura 1.23). Dichas extensiones son GD2, EXIF, MySQL, y PEAR. Tambin puede elegir instalar cualquier otra que usted piensa que puede ser til.

47

FIGURA 1.22
Directorio de configuracin de Apache

48

FIGURA 1.23
Elija las extensiones que desea instalar, adems de PHP.

Toda la configuracin se establece en este momento, y usted puede hacer clic en Instalar para comenzar el proceso de instalacin de PHP. Cuando haya finalizado la instalacin de una pgina aparece Completo. Usted puede abrir el directorio en el que PHP est instalado y ver los diferentes archivos. Tambin puede editar el archivo php.ini para satisfacer sus necesidades especficas. C:\php5\php.ini La configuracin por defecto de la php.ini debe trabajar para una configuracin de desarrollo con la excepcin que debe permitir a display_errors. Habilitacin de la visualizacin de los errores le dice a PHP para imprimir cualquier error en la pantalla. En una instalacin de produccin que podra ser considerado un problema de seguridad. Un servidor de desarrollo es generalmente slo visto por los televidentes autorizados, lo que significa que permite esta opcin no es un problema. Abra el archivo php.ini y busque la seccin relativa a error_reporting. display_errors = Off

Cambia el valor a On.


display_errors = On

49

NOTA Los cambios en el archivo php.ini no son visibles hasta que se reinicie el servidor. Asegrese de reiniciar el servidor web Apache antes de continuar porque usted ha hecho algunas modificaciones en la configuracin de Apache.

Pruebas
Despus de instalar PHP puede crear una muestra del archivo PHP a probarlo. Un archivo de ejemplo comn es el archivo phpinfo, lo que le permite ver las variables de configuracin para la instalacin de PHP en el servidor. Usted puede utilizar el Bloc de notas o cualquier otro editor de texto para crear este archivo de ejemplo. Si instala la suite completa Web de Adobe, puede utilizar Dreamweaver para escribir archivos de PHP (ver Figura 1.24). Esta es la sintaxis para el archivo phpinfo. <?php phpinfo(); ?> Guardar este archivo como info.php en la raz de documentos de la instalacin de Apache. Por ejemplo, si instala Apache en la ubicacin predeterminada, el archivo PHP se guarda en: C:\Program Files\Apache Group\Apache2\htdocs\info.php

50

FIGURA 1.24 La muestra del archivo PHP como se ve en Dreamweaver CS3

Ahora puede abrir este archivo en el explorador Web, como se observa en la Figura 1.25. http://localhost/info.php Si lo prefiere, puede crear un archivo PHP para probar si PHP est funcionando correctamente, como los siguientes: <?php print Hello, World! This is PHP.; ?> Al ejecutar este archivo en el navegador, debera ver el mensaje aparece.

51

FIGURA 1.25
Informacin PHP muestra en un explorador Web

Instalacin de PHP para UNIX


Instalacin de PHP para UNIX es ms detallado y requiere ms configuracin. Esto es cierto para la mayora de configuraciones de instalacin de comandos de lnea. Usted puede descargar el instalador de archivos desde el sitio Web del libro o de uno de los sitios Web oficiales de PHP. Despus de obtener los archivos de instalacin de PHP, usted puede comenzar el proceso de instalacin. Antes de comenzar la instalacin, es una buena idea dejar de Apache para asegurarse que ninguno de los archivos se corrompe. /usr/local/apache/bin/apachectl stop Para iniciar la instalacin, cree el directorio en donde PHP se instalar. mkdir /usr/local/php5 Puede sustituir simplemente PHP5 para php. Sin embargo, aadiendo el nmero de versin hace que sea ms fcil disponer de mltiples instalaciones y ser ms fcil de manejar en el futuro. cd /usr/local/php5

52

Descomprimir los archivos y escriba el directorio de instalacin: gunzip php-5.2.5.tar.gz tar -xvf php-5.2.5.tar cd php-5.2.5

Configuracin de parametros de construccin


El siguiente paso es la construccin de la lnea de configuracin. Este contendr todas las extensiones necesarias y las caractersticas que desea incluir en la instalacin. Por ejemplo, es necesario incluir la base de datos y soporte de imgenes para completar algunos de los captulos de este libro, entre otros. Cada opcin est contenida dentro de un conjunto de comillas simples ( ') e incluir la ruta si es necesario. ./configure --prefix=/usr/local/php5 --withapxs=/ usr/local/apache/bin/apxs --with-gd --enable-exif --with-mysql=shared,/usr/local/php5 --withmysqli= shared,/usr/local/php5/bin/mysql_config --withlibxmldir=shared,/usr/local/php5 --withxsl= shared,/usr/local/php5 --with-jpeg-dir=/usr/local/php5 --with-png-dir=/usr/local/php5 --enable-gd-native-ttf -with-freetype-dir=/usr/local/php5 --withgettext= shared,/usr/local/php5 Cuando el proceso de configuracin es completa (que puede tardar un tiempo dependiendo del sistema), crear y ejecutar el instalador: make make install Despus de que el hacer el comando de instalacin se ha completado, PHP debe ser instalado.

Configuracin
Unas raciones de PHP necesita ser configurado para asegurarse de que funciona a la perfeccin con Apache y su sistema de desarrollo global. Modificacin de este proceso es bastante fcil de completar, pero incorrecta puede resultar en un sistema roto. Adems, al modificar los archivos de configuracin, lo mejor es hacer una primera copia de seguridad. El primer paso es mover el archivo php.ini a una ubicacin central que PHP usar cuando se inicia. cp php.ini.recommended /usr/local/lib/php.ini Con el fin que Apache cargue los archivos de PHP, aadir mdulo de referencias necesarias: LoadModule php5_module modules/libphp5.so AddType application/x-httpd-php .php .phtml AddType application/x-httpd-php-source .phps Reinicia Apache que estos cambios surtan efecto. Cada vez que usted modifique los valores en PHP o Apache, debe reiniciar el servidor. /usr/local/apache/bin/apachectl start Con todo correctamente instalado, puede probar la configuracin mediante la ejecucin de una muestra de archivos de PHP:

53

<?php phpinfo(); ?>

Resumen
En este captulo, usted fue a travs de los pasos necesarios para instalar el sistema de desarrollo completo. Este proceso incluy la instalacin de Apache, PHP y MySQL en Windows o UNIX servidor Web. El siguiente captulo le gua por el proceso de hacer esta configuracin de desarrollo ms seguro. Esto incluye la obtencin de los archivos en el servidor, as como la configuracin general del servidor a travs del archivo de configuracin httpd.conf .

54

Capitulo 2 Explorando Flash y PHP


Si ha instalado todos los componentes en el servidor, puede configurar el programa de instalacin para ser ms seguro. Despus se explica la seguridad, el siguiente paso es configurar los controladores de error apropiado y buscar la manera de crear una configuracin ms fcil de usar para el usuario final. Despus de la seguridad y la configuracin del servidor Web se completa, que se ver en una visin general de PHP para entender mejor cmo funciona todo. El uso de MySQL y la integracin bsica con PHP se explican utilizando varios ejemplos con las descripciones y explicaciones. La ltima seccin explora Flash, incluyendo la configuracin de clase y una explicacin general de IDE.

Introduccin al Servidor Web


En el Captulo 1, aprendi a configurar un servidor de desarrollo, que incluy la instalacin de PHP, MySQL y Apache. Esta seccin es una visin general de cmo el servidor Web est configurado, as como la forma de hacer que el sistema sea ms seguro.

Trabajar con archivos .htaccess


El archivo .htaccess se utiliza para modificar la forma de las funciones de Apache para un directorio especfico. Este archivo es similar al archivo httpd.conf en la configuracin global de Apache, con la excepcin de que no es necesario y puede ser a nivel mundial con discapacidad, siempre que el administrador modifica la configuracin del servidor Web. La sintaxis de este archivo no es muy avanzada. Se trata bsicamente de un archivo de texto que informa al servidor Web de modificaciones especficas. Por ejemplo, ha notado un sitio Web que se ha especializado extensiones de archivo, como anfitrin de la Web MediaTemple, que tiene el siguiente formato?

http://www.mediatemple.net/contact.mt
Observe cmo la url tiene la extensin .mt. Esta extensin no es una extensin de archivo estndar. Esta modificacin puede conseguirse utilizando el archivo .htaccess: # use custom file extensions AddType application/x-httpd-php .me Esta modificacin tambin se puede hacer utilizando el archivo httpd.conf, si usted prefiere que el servidor Web podr utilizar esta extensin de archivo personalizado. Apache maneja muchas peticiones por defecto y puede ofrecer an ms con mdulos adicionales instalados. Un mdulo en particular, le permite tener las URL personalizadas, tambin conocido comnmente como limpiar las URL.

55

Las posibilidades .htaccess son variados y dependen totalmente de su aplicacin. Uno de los usos ms comunes de. Htaccess es redirigir www y sin www las solicitudes en la misma ubicacin. Esto no slo limita enlaces redundantes, pero tambin proporciona una mejor optimizacin del motor de bsqueda. Un ejemplo de esta conversin, utilizando el dominio de example.org, sera algo similar a lo siguiente: # Force www.domain.com to domain.com RewriteCond %{HTTP_HOST} ^www.example.org [NC] RewriteRule ^(.*)$ http://example.org/$1 [R=301,L]

Proteccin de su contenido
Usted puede proteger su contenido en un nmero de maneras. Usted puede construir un sistema de autenticacin personalizada o utilizar la autenticacin bsica que est empaquetado con Apache. La autenticacin bsica se establece en dos fases. El primer paso es crear la contrasea y usuario. Utiliza el archivo htpasswd para crear el archivo de contraseas. Esta contrasea la creacin de comandos se encuentra en el directorio bin/ en la que instal Apache. Por ejemplo, lo ms probable es encontrar el archivo en la ubicacin siguiente, suponiendo que utiliza la ruta de instalacin se sugiere en el captulo 1. $ /usr/local/apache/bin/htpasswd La primera vez que crear un usuario, es necesario informar a la contrasea de solicitud de creacin para crear un archivo de la nueva contrasea. Desde ese momento se omite la opcin-c. PRECAUCIN Error para quitar la opcin-c despus de la instalacin del primer usuario se traducir en un nuevo archivo de contraseas y eliminar cualquier informacin a los usuarios existentes. Aunque no es obligatorio, es una buena prctica peridicamente copias de seguridad de esta y cualquier otros archivos importantes en caso de que su sistema se encuentra con un accidente inesperado o corrupcin de datos. El comando para crear una contrasea es simplemente una llamada a la aplicacin de contrasea con el nombre de usuario se aade al final. $ cd /usr/local/apache/bin/ $ htpasswd -c /usr/local/apache/passwd/passwords USERNAME Asegrese de sustituir USERNAME por el nombre de usuario real que usted desea agregar. La aplicacin htpasswd le pedir la contrasea que desea asignar y, a continuacin, pedir que escriba la misma contrasea de nuevo para confirmar. El archivo generado es la contrasea cifrada. Sin embargo, an debe guardarlo en un lugar seguro. Bajo ninguna circunstancia debe este archivo ser almacenado en el directorio pblico, ya que podra comprometer la integridad de su sistema. Esto no es tan importante en un sistema de desarrollo, pero es una buena prctica a seguir todas las medidas de seguridad adecuadas, incluso en una configuracin de desarrollo, para familiarizarse con ellos. A medida

56

que contine trabajando en los servidores, la seguridad se convertir en una segunda naturaleza. Nunca debe colocar apagado para ahorrar tiempo. Despus de crear el archivo de contraseas, aadir el control de seguridad en .htaccess en cualquier lugar que se desea proteger con contrasea. Por ejemplo, vamos a aadir la autenticacin al servidor entero porque un servidor de desarrollo y que no quiere que nadie vindolo. Agregue lo siguiente a un nuevo archivo .htaccess en la raz del directorio Web. AuthType Basic AuthName Authorization Required AuthUserFile /usr/local/apache/passwd/passwords Require valid-user Esto informa a Apache que cualquier solicitud en este directorio y por debajo requiere autorizacin. La ltima lnea permite a cualquier usuario en el archivo de contraseas para poder iniciar sesin. Require valid-user Tambin puede agregar un nombre de usuario especfico, pero esto es ms difcil de mantener. Esta es la autenticacin bsica por lo que tiene varias limitaciones. Por ejemplo, usted no puede modificar el cuadro de dilogo que aparece en el navegador del usuario. No se puede modificar la etiqueta de valores junto a los cuadros de entrada y, lo ms importante, no se puede permitir que el usuario salga. Si su aplicacin requiere un sistema de acceso ms personalizado e integrado, que puede ser mejor para construir una instalacin personalizado PHP/ MySQL, dependiendo de tus necesidades.

Recopilacin de informacin acerca de Apache


A medida que contine trabajando con Apache, hay algunos comandos y herramientas que pueden resultar en ms tiempo para desarrollar una aplicacin en lugar de microgestin en el servidor.

Iniciar y Detener Apache


A veces, Apache puede actuar justo como cualquier otra pieza de software o hardware en su sistema. A menudo, cuando esto ocurre, un simple reinicio se soluciona el problema. Por ejemplo, como ms archivos de los usuarios peticin de Apache, puede comenzar a llenar la memoria interna y los archivos temporales. Para reiniciar Apache slo tiene que llamar al siguiente comando en UNIX desde la lnea de comandos o reiniciar el servicio en Windows:
$ /usr/local/apache/bin/apachectl restart

NOTA La ruta de acceso a la aplicacin apachectl puede variar dependiendo de la instalacin de Apache. Si desea detener Apache y no tener reiniciar, utilice el siguiente comando. Lo ms probable es que hacer cuando la instalacin de nuevos mdulos o la actualizacin de Apache en s.
$ /usr/local/apache/bin/apachectl stop

57

Para iniciar el servidor de nuevo despus de completar la actualizacin, basta con utilizar la opcin de arranque:
$ /usr/local/apache/bin/apachectl start

Determinar la versin de Apache


En ocasiones, cuando la instalacin de nuevo software, lo que necesita saber qu versin de Apache est ejecutando actualmente. Por ejemplo, al instalar PHP, es necesario saber qu versin de Apache se est utilizando. Esto se encuentra ejecutando un simple comando interruptor.
$ /usr/local/apache/bin/httpd -V

El resultado de este comando sera algo similar a la Figura 2.1.

Determar que modulos estn instalados en Apache


Usted puede fcilmente determinar qu mdulos estn instalados actualmente en Apache con el comando siguientes indicadores de la lnea en UNIX.
$ /usr/local/apache/bin/apachectl -t -D DUMP_MODULES

Para determinar los mdulos de Windows, se debe ejecutar el siguiente comando:


httpd -t -D DUMP_MODULES

58

FIGURA 2.1 Viendo la actual versin de Apache

Una respuesta de ejemplo de este comando es algo similar a lo siguiente: Loaded Modules: core_module (static) mpm_worker_module (static) http_module (static) so_module (static) include_module (shared) deflate_module (shared) log_config_module (shared) env_module (shared) expires_module (shared) headers_module (shared) setenvif_module (shared) ssl_module (shared) mime_module (shared) status_module (shared) autoindex_module (shared) info_module (shared) 59

vhost_alias_module (shared) negotiation_module (shared) dir_module (shared) imagemap_module (shared) actions_module (shared) userdir_module (shared) alias_module (shared) rewrite_module (shared) ... Syntax OK Si se omite la marca -D DUMP_MODULES D-DUMP_MODULES slo ver la respuesta de sintaxis. Se le informa si algo est mal o le dice que todo est bien. $ /usr/local/apache/bin/apachectl t Para Windows el commando sera httpd -t

Utilizacin de documentos de error personalizados


Cuando ve una URL de un sitio Web, Apache sirve una pgina para usted basado en su peticin. Por defecto, si Apache se le pide para servir a un archivo que no puede encontrar, devuelve una fea pgina 404 que no es muy informativo y de hecho provoca una preocupacin potencial para la seguridad. Como se puede ver en la Figura 2.2, Apache ha publicado la informacin del servidor para que el mundo vea. Ahora bien, este no es un problema de seguridad enorme, pero cada pieza de informacin puede aadir hasta un grave problema.

FIGURA 2.2 Pgina de error por defecto de Apache

Una cuestin ms importante con el uso de las pginas de error estndar es el hecho de que el usuario se presenta con una pgina intil. Por ejemplo, el usuario ya sabe que el archivo no existe, pero no tiene a dnde ir, ni idea de lo que podra ser el problema. Por extrao que parezca, si un usuario se muestra una pgina 404 que l o ella no suele durar, y eso significa que un usuario abandonado por su sitio. 60

Modificar Apache
Por suerte, Apache le permite modificar esta pgina de error por defecto. Algunos hosts permiten modificar el archivo usando el panel de control que incluye instalado cuando adquiri el servidor. En este caso, sin embargo, el servidor de desarrollo requiere que configurar manualmente la mayora de ella. La utilizacin de documentos de error personalizado es tan simple como aadir la modificacin de un archivo .htaccess. Este archivo se almacena normalmente en la raz de documentos para asegurar que todos los archivos se vea el archivo. El cdigo siguiente es la sintaxis necesaria para modificar el documento de error. # Customized Error Handler ErrorDocument 204 /error.html ErrorDocument 301 /error.html ErrorDocument 302 /error.html ErrorDocument 400 /error.html ErrorDocument 401 /error.html ErrorDocument 403 /error.html ErrorDocument 404 /error.html ErrorDocument 500 /error.html ErrorDocument 501 /error.html ErrorDocument 502 /error.html ErrorDocument 503 /error.html
Como puede ver, los documentos de error ser sustituido por un archivo. Usted puede, por supuesto, apuntar a un archivo separado para cada error detectado. Si no asigna una pgina de error especfico, Apache vuelve a su forma predeterminada. La lista anterior es un registro slido de los cdigos de error posible, pero no es completar una.

Documento de error dinmico


Utilizando PHP, usted puede crear un error de manejo dinmico del sistema. La idea es llamar a una pgina como lo hizo en el ejemplo anterior, con la excepcin de que una variable se pasar a notificar a esa pgina de que se detect el error.

Usted comienza por modificar el controlador de errores en el archivo .htaccess, tales como: # Error Handler, request is sent to a php file ErrorDocument 204 /errorHandler.php?e=204 ErrorDocument 301 /errorHandler.php?e=301 ErrorDocument 302 /errorHandler.php?e=302 ErrorDocument 400 /errorHandler.php?e=400 ErrorDocument 401 /errorHandler.php?e=401 ErrorDocument 403 /errorHandler.php?e=403 ErrorDocument 404 /errorHandler.php?e=404 ErrorDocument 500 /errorHandler.php?e=500 ErrorDocument 501 /errorHandler.php?e=501 ErrorDocument 502 /errorHandler.php?e=502 ErrorDocument 503 /errorHandler.php?e=503

61

Este cdigo le dice a Apache para redirigir los errores en el fichero de errorHandler.php, pasando en el cdigo de error. El siguiente paso es crear el archivo PHP que se encargar de los cdigos de error. Este PHP espera un argumento y ser lo suficientemente inteligente como para devolver una respuesta vlida si no hay error se pasa en.

La primera parte del archivo captura el cdigo de error e inicializa una variable para almacenar la cadena de error. <?php $errorCode = $_GET[e]; $errorString = ; ... ?> Cuando un cdigo de error se encuentra, un control para asegurarse de que es un nmero vlido que se haga para mantener la aplicacin segura. <?php $errorCode = $_GET[e]; $errorString = ; if(!is_numeric($errorCode)) { $errorCode = -1; } ... ?> Un cambio de base se utiliza para determinar el cdigo de error se encontr. Los interruptores se explica en la seccin "Explorando los fundamentos de PHP" ms adelante en este captulo. <?php $errorCode = $_GET[e]; $errorString = ; if(!is_numeric($errorCode)) { $errorCode = -1; } switch($errorCode) { case 204: // Sin Contenido (Documento vaco) $errorString = Sin Contenido (Documento vaco); break; case 301: // Movido Permanentemente $errorString = Movido Permanentemente; break; case 400: // Solicitud Incorrecta $errorString = Solicitud Incorrecta; break; case 401: // Usuario no autorizado $errorString = Usuario no autorizado; break; case 403: // Prohibido 62

$errorString = Prohibido; break; case 404: // Documento No Encontrado $errorString = Documento No Encontrado; break; case 500: // Error Interno del Servidor $errorString = Error Interno del Servidor; break; case 503: // Fuera de los Recursos $errorString = Fuera de los Recursos; break; case -1: // Error Desconocido $errorString = Error Desconocido; } ?>
El ltimo paso es para mostrar la cadena de error al usuario, que completa el error habitual de manipulacin de secuencia de comandos. Usted notar que algunos de los cdigos de error se omitieron en el interruptor para demostrar el hecho de que el guin se mueve en silencio sobre si se muestra un cdigo de error no vlido.

<?php $errorCode = $_GET[e]; $errorString = ; if(!is_numeric($errorCode)) { $errorCode = -1; } switch($errorCode) { case 204: // Sin Contenido (Documento vaco) $errorString = Sin Contenido (Documento vaco); break; case 301: // Movido Permanentemente $errorString = Movido Permanentemente; break; case 400: // Solicitud Incorrecta $errorString = Solicitud Incorrecta; break; case 401: // Usuario no autorizado $errorString = Usuario no autorizado; break; case 403: // Prohibido $errorString = Prohibido; break; case 404: // Documento No Encontrado $errorString = Documento No Encontrado; break; case 500: // Error Interno del Servidor $errorString = Error Interno del Servidor; break; case 503: // Fuera de los Recursos $errorString = Fuera de los Recursos; 63

break; case -1: // Error Desconocido $errorString = Error Desconocido; } ?> <h2>Se produjo un error al procesar su solicitud</h2> <h3><?=$errorString?></h3>
La variable $errorString se imprime en la pantalla, informando al usuario que ha ocurrido un error. Este controlador de errores personalizado presenta un error mucho mejor para el usuario. Algunos sitios web incluyen enlaces relevantes de inters o utilidad de la consulta (si se trataba de una bsqueda) para devolver la informacin pertinente. Es lamentable que un usuario podra ver una pgina de error, pero es ms comn como los cambios de tecnologa y los sistemas se actualizan. Es una buena idea para mantener vnculos permanentes, porque los motores de bsqueda vnculos cach. En el futuro, ser beneficioso para su trfico en caso de que el vnculo todava trabajaba. Como un bono a la secuencia de comandos anterior, que se encuentra en el sitio Web para este libro, hay un error completo sistema de manejo que incluye los errores localizados (se puede adaptar a otro idioma) y utiliza plantillas PHP y CSS personalizado archivo modificar el estilo.

64

Explorando lo bsico de PHP


PHP (Hypertext Pre-Processor) es un servidor de secuencias de comandos de lenguaje que se ejecuta en Apache u otras aplicaciones similares de servidor Web. PHP es uno de los servidores ms populares lenguajes de secuencias de comandos, ya que es bastante sencillo para empezar y puede manejar aplicaciones robustas. La estructura de codificacin se basa en C y puede ser escrito en un procedimiento (paso a paso) o la estructura de Classbased (objetos, propiedades, mtodos, y as sucesivamente). Una vez que entienda los conceptos bsicos de PHP, usted realmente puede comenzar a ver el verdadero poder. Este libro est basado en PHP 5, pero muchos de los siguientes consejos, tcnicas y estilos se explica en esta seccin puede ser utilizada para PHP 4 y PHP 5, que las versiones son bastante similares.

Entender las variables


Variables, tambin conocido comnmente como vars o propiedades (cuando se trabaja con clases), son probablemente el elemento ms utilizado en la programacin. Se utilizan para asignar un valor a un lugar que puede ser llamado en otra parte del cdigo. El uso de variables no es slo un ahorro de tiempo, sino que tambin hace el programa ms estructurado y de fcil mantenimiento. Aqu hay un ejemplo muy simple de una definicin de variable en PHP:

$myVar = hello world;


El ejemplo anterior asigna la cadena "Hello World" a la variable $myvar. Hay algunas cosas a tener en cuenta cuando se trabaja con variables.

 

Debe estar precedida por un simbolo dolar ($) (al menos en una Clase). Se debe finalizar con punto y coma (;).

Las variables pueden aceptar muchos tipos de datos, incluyendo pero no limitado a, String, Boolean, y Array, cada uno de los que se discute en las siguientes secciones.

Cadenas
Las variables de cadena (String) contienen texto, tales como:

Hello, World!
Tambin se puede construir cadenas utilizando las tcnicas de concatenacin, como:

$var = Hello; $var .= , World!; print $var; // Outputs: Hello, World!

65

Booleans
Booleanos son variables especiales que pueden ser uno de los dos valores posibles: verdadero o falso. Se utilizan sobre todo en caso de declaraciones y otras formas de control condicional, como:

$loggedIn = false; if($loggedIn == false) { print Sorry, you are not logged in!; }

Arrays
Las matrices son estructuras complejas de datos que consiste en un grupo de elementos que se accede por la indexacin. En PHP, este ndice puede ser un valor numrico o una cadena. Aqu hay un ejemplo de una matriz y las dos formas de acceder a los datos:

<?php $fruit = array( Orange, Apple, Strawberry, Grape ); print $fruit[1]; // Apple $fruit = array( orange => Orange, apple => Apple, strawberry => Strawberry, grape => Grape ); print $fruit[orange]; // Orange ?>

Objectos
Clases en PHP describir un objeto o la definicin de un objeto. Se componen de auto-definirse los mtodos y propiedades, que le permite crear una funcionalidad personalizada. Aqu hay un ejemplo muy bsico de una clase en PHP con una llamada de ejemplo en la parte inferior del ejemplo:

<?php class Animals { function Animal() { } public function speak($word) { 66

print $word; } } class Dog extends Animals { function Dog($word) { Animals::speak($word); } } // Create a new Dog $dog = new Dog(Hello.. Woof!); ?>

Trabajar con funciones


En el desarrollo de aplicaciones que tienden a repetir las diversas tareas. Constantemente tener que escribir estas medidas puede ser un proceso largo. Ms importante an, el cdigo de repeticin hace que una aplicacin sea menos eficiente. Funciones le permiten colocar las tareas repetitivas en un recipiente pequeo y agradable que usted puede llamar en cualquier momento siempre y cuando la funcin es accesible. Esta es una funcin de ejemplo que agrega dos nmeros y devuelve la suma:

function addNumbers($num1, $num2) { // return the sum of the two numbers return ($num1 + $num2); }
Usted llama a una funcin por referencia al nombre de funcin y de pasarle cualquier argumento que la funcin requiere. Este ejemplo devuelve 10 como la suma. Un argumento es un valor que se pasa a la funcin y ms tarde utilizados en la funcin como una variable local.

addNumbers(4, 6); // outputs 10

Funciones en PHP puede tener un argumento predeterminado asignado, lo que significa que no ser necesario que el argumento se apruebe en, como:
function addNumbers($num1, $num2, $print=true) { if($print) { print Sum is: . ($num1 + $num2); } else { return ($num1 + $num2); } } 67

Esta funcin imprime el resultado directamente a la pantalla o devolver el valor si la variable $print es falso, que es por defecto. No se puede excluir un argumento en el medio de la definicin de otros argumentos. Por ejemplo, la siguiente llamada de funcin no sera vlido:

function say($upperCase=false, $string) { if($upperCase) { return strtoupper($string); } else { return $string; } } say(Hello, World!);
Que se asignara el pasado-en cadena en el valor de $upperCase y hacer caso omiso de la variable $string. Dado que PHP no se preocupa de qu tipo de valor se pasa, se produce un error en la lnea donde se devuelve la cadena. Las clases tambin tienen funciones, llamados mtodos. Los mtodos pueden mantener las caractersticas especiales que las funciones estndar no pueden.

Entender las estructuras de control


Mayora de los lenguajes de programacin tienen estructuras de control que los fragmentos de cdigo de la oferta global y proporcionar una ruta ms dinmico para una aplicacin. Las siguientes son algunas de las estructuras de control ms comunes, incluyendo las usadas en la mayora de este libro.

if
El construccin if se encuentra en cualquier lenguaje de programacin popular, incluido PHP. Permite la ejecucin condicional de fragmentos de cdigo. Un ejemplo de una declaracin if es:

$admin = getAdminStatus(); if($admin == true) { print Admin logged in, show admin controls; }
Puede anidar sentencias if con otros estados, si una cantidad ilimitada de veces. Un uso ms realista de las declaraciones if de anidacin es una aplicacin de inicio de sesin que ha variado de los niveles de autenticacin.

$loggedIn = true; $admin = true; $editable = true; if($loggedIn) { if($admin) 68

{ if($editable) { // allow the page to be // edited because a valid // administrator is logged in } } }

else
Suponga que desea mostrar un mensaje de error a los usuarios no registrados y en el panel de control adecuado, si el usuario est conectado. Esto se hace con una declaracin ms, que se ejecuta si la condicin else no se cumpla.

$loggedIn = false; if($loggedIn) { // display control panel } else { // display login form and error message }
Una cosa no es necesaria y se coloca despus de todos los otros controles condicional, como elseif, que est en la siguiente seccin.

elseif
El elseif es la combinacin de un if y un else. Esta declaracin se coloca despus de un if, y permite que el cdigo coincida con otra condicin, que puede ser completamente diferente a si antes de ejecutar.

NOTA Un else o else..if slo se evaluarn si la anterior condicin no se cumple. $loggedIn = false; $colorOfSky = blue; if($loggedIn) { // user logged in } elseif($ColorOfSky == blue) { // color of sky is blue, log user in?? }

while
El while es un tipo de bucle. El cdigo dentro de las llaves {} se ejecuta "mientras" se cumple la condicin. Una vez que la condicin ya no es vlida, el bucle se detiene.

69

PRECAUCIN bucles en PHP puede correr para siempre si no programado correctamente. Tenga cuidado al trabajar con loops y siempre verifique los datos vlidos primero.

while($x < 50) { print x= . $x . <br />; $x++; }

for
Un bucle es el circuito ms complejos en PHP. Aqu hay un ejemplo:

for($x=0; $x < 10; $x++) { print x= . $x . <br />; }


La primera expresin ($x = 0) se ejecuta de manera incondicional una vez al comienzo del bucle. La segunda expresin ($x <10;) se evala en cada paso y el ciclo continuar hasta que esta condicin se cumple o que el bucle se detiene con una pausa. En cada paso, la tercera expresin ($x + +) es ejecutado. En este ejemplo, incrementos de $x en cada paso. Puede anidar los bucles e incluso definir las variables mltiples en la primera expresin. Esto puede hacer que el cdigo sea ms rpido, pero ms difcil de leer.

foreach
El bucle foreach se utiliza para iterar sobre un arreglo. Se asigna la variable de bucle al conjunto deseado, y en cada paso el valor se almacena en la variable de bucle.

$fruits = array(Orange, Apple, Banana, Grapefruit); foreach($fruits as $fruit) { print Fruit: . $fruit; } NOTA La variable $fruit seguirn existiendo una vez al bucle foreach se ha completado, por lo que es una buena idea de destruir el uso de la variable unset (), como unset (($fruit).

break
La ruptura de control finaliza la ejecucin de un bucle, sin importar si la condicin se cumple o no. Puede colocar un valor numrico opcional informar a PHP de cuntos niveles debe romper. Esto es til cuando se tiene un ciclo anidado que tiene que decirle a los padres a la salida si se produce un error.

for($i=0; $i < count($users); $i++) { for($j=0; $j < 5; $j++) { if($users[$i][$j][valid] == false) { 70

// found invalid user, group is compromised // exit both loops break 2; } } }

continue
A diferencia de break, continue saldr de la iteracin actual de un bucle, pero permitir que las iteraciones restantes a continuar en. Esto es til cuando se recorre un montn de datos y slo desea actuar en datos vlidos.

for($i=0; $i < count($users); $i++) { if($users[$i][valid] == false) { // invalid user, continue with remaining list continue; } // more code logic here } Al igual que break, continue tambin acepta un argumento numrico diciendo que el nmero de niveles de encerrar bucles para saltar sobre.

switch
Un switch es similar a una serie de sentencias if utilizando la misma expresin (variable). Por lo general se utiliza un switch cuando se quiere probar una variable en contra de muchas de las condiciones. switch($userLevel) { case ADMIN: print User is an admin; break; case MODERATOR: print User is a mod; break; case MEMBER: print User is an member; break; case GUEST: print User is an guest; break; } Un break se utiliza para garantizar los controles restantes no se ejecutar, de hecho, si quita los break s, cada condicin se comprobar, que pueden causar problemas si la intencin de hacer una validacin de varios niveles. 71

require
La declaracin require () intenta cargar un archivo y se cerrar el programa con un error grave si el archivo no se encuentra. Esta funcin comprueba el archivo en contra de included_path actual, as como el directorio el archivo se ejecuta en. require(importantFile.php); El error que se muestra (ver figura 2.3) a veces puede causar un problema de seguridad potencial en que se mostrar la ruta del archivo salido adelante. Una mejor manera de manejar esto es crear un cheque por el primer archivo y un limpiador de pantalla, un mensaje menos crucial para el usuario. if(!file_exists(importantFile.php)) { $error = Sorry, one of the core components could not be loaded; exit($error); // display clean error and exit remaining script } require(importantFile.php); // never runs, if file doesnt exist

72

FIGURE 2.3 PHP require() error as seen in the browser

include
La sentencia include () es similar a la requiere, con la excepcin que mostrar un error pero no detener la ejecucin de la secuencia de comandos. include(optionalFile.php);

require_once
La declaracin require_once comporta de manera similar a require, con la excepcin de que si el archivo actual ya est cargado, no intentar cargar de nuevo. Esto es ms til a medida que continuamos construyendo aplicaciones de gran tamao que a veces comparten muchos archivos. Esto asegura que se ha cargado ningn cdigo redundante. require_once(requiredFile.php); // ... other code here require_once(requiredFile.php); El segundo require_once no funcionar porque el archivo ya se ha cargado en la parte anterior del cdigo. 73

include_once
El include_once () es similar a la require_once con la excepcin de que si el archivo no se encuentra, slo se muestra un simple error.

Uso de la comprobacin de tipos en PHP


A diferencia de la mayora de lenguajes de programacin, PHP no requiere la tipificacin estricta de las variables. Esto significa que usted no tiene que definir qu tipo de datos de una variable llevar a cabo. Esto puede parecer una buena cosa porque las variables se pueden compartir. Sin embargo, la desventaja potencial de este enfoque es que una variable que espera ser una cadena que podra aparecer como una matriz. Lo ms probable es romper el cdigo o provocar una porcin de cdigo de explotacin. Imagine un cdigo similar al siguiente: $id = -1; if(isset($id)) { // sql call here, set id to a string, for some reason $id = user id; } // more logic here if($id == -1) { // user not logged in } else { // user logged in } Este es un ejemplo muy dramtico, porque est lleno de las peores situaciones, pero se puede ver cmo las variables sin tipo pueden causar dolores de cabeza.

Funciones de verificacin de Tipos


PHP ofrece algunas funciones especiales que le permiten comprobar el tipo de una variable, pero esto no impide que otro cdigo deba sobrescribir las variables. Un ejemplo de una de estas funciones se is_string, que comprueba si el passed-in el contenido de las variables de cadena. $saying = Hello, World!; if(is_string($saying)) { print $saying is a string; } PHP ofrece la capacidad de prueba para las matrices, los nmeros, las cadenas, y los valores vacos.

74

Soporte para versions futuras


Se ha mencionado que las futuras versiones de PHP podra incluir la comprobacin de tipos estricta, pero por ahora, estas funciones, cuando sea necesario, proporcionar un mayor nivel de integridad para su aplicacin It has been mentioned that future versions of PHP could include strict type checking, but for now, these functions, when needed, will provide a higher level of integrity for your application.

Explorando lo bsico de MySQL


MySQL es la aplicacin de almacenamiento usadas con PHP para crear una aplicacin dinmica. Puede almacenar casi cualquier tipo de datos en una base de datos MySQL y tienen la capacidad de compartir esa informacin con otras aplicaciones y sistemas. A menudo, una base de datos se utiliza cuando la bsqueda se debe hacer o si los datos est cambiando con frecuencia y mucha gente va a pedir estos datos actualizados. La alternativa a una base de datos es un archivo (archivo de texto) que tiene muchas limitaciones, las ms devastadoras que el hecho de que slo muchos casos en que el archivo puede ser utilizado una sola vez. Otra limitacin es la capacidad de indexar y buscar rpidamente un archivo de texto.

Uso de declaraciones o sentencias (stantements)


El contenido en una base de datos MySQL son almacenadas en tablas. Estas tablas se almacenan en bases de datos que componen el sistema de MySQL. Los datos almacenados en estos cuadros se accede utilizando diversas declaraciones y condiciones, que se llaman las consultas. Hay muchas declaraciones que se pueden utilizar en las consultas SQL.

SELECT
La sentencia SELECT es la declaracin ms comn, lo que le dice a MySQL qu contenidos (columnas) que desea obtener de una tabla. SELECT id,name,ip, bio FROM users WHERE id=3 Usted puede seleccionar los datos de varias tablas con comas (,) para separar la columna de la tabla y los nombres. SELECT users.id, users.name, members.posts, members.subs FROM users, members WHERE members.userID=users.id AND users.id=3

INSERT
La sentencia INSERT se utiliza para aadir nuevas filas a una tabla existente. Hay mltiples maneras de definir un INSERT. Si slo desea actualizar algunas columnas que usted necesita para definir las columnas. INSERT INTO members (name, bio, ip) VALUES ($name, $bio, $ip);
Un acceso directo se utiliza para excluir a las definiciones de columna. Sin embargo, esto slo es posible cuando todos los valores se actualizan o se han asignado los valores por defecto cuando se crea la tabla.

75

INSERT INTO members ($name, $bio, $ip); Despus de un INSERT, ha concluido, usted puede hacer una llamada a mysql_insert_id (), que devolver el ID de la insercin exitosa ltima. $result = mysql_query(INSERT INTO members ( . $name . , . $bio . , . $ip . )); $rowID = mysql_insert_id($result);

DELETE
La sentencia DELETE se utiliza para eliminar una o ms filas de una tabla. Al igual que las dems declaraciones, puede crear una condicin utilizando, WHERE, AND, OR, y as sucesivamente. DELETE FROM users WHERE id=3 Tambin puede eliminar todos los registros en una base de datos, omitiendo la condicin: DELETE FROM users PRECAUCIN La sentencia DELETE es muy poderosa que se debe utilizar con extrema precaucin.

Condiciones
Las condiciones en MySQL se utilizan para limitar la cantidad de datos que se devuelve. Por ejemplo, una consulta SQL como la siguiente devuelve todos los usuarios en la base de datos: SELECT * FROM users

WHERE
Esto estara bien si eso es lo que desea que se produzca. Es probable que slo quieren regresar a ciertos usuarios o incluso a un usuario especfico. Esto se hara usando la condicin WHERE. SELECT * FROM users WHERE id=3

AND
La condicin AND se utiliza cuando se necesita para que coincida con ms de una condicin. Un ejemplo sera que desea devolver una base de datos de los miembros que se han registrado y tienen una cuenta vlida. SELECT * FROM users WHERE active=1 AND registered=yes Usted puede utilizar cualquier combinacin de las sentencias condicionales, con la excepcin de que slo debe haber uno en el pliego.

76

OR
En la declaracin OR se utiliza cuando se desea slo una condicin para que coincida. Por ejemplo, desea que los usuarios que tengan un nivel de administrador o mod. Piense en esto como if..else para SQL. SELECT * FROM users WHERE level=admin OR level=mod Las condiciones en MySQL puede ser til cuando se trata de desglosar los datos, especialmente cuando se inicia la combinacin de ellos. No es raro para crear sentencias SQL muy complejo en cuestin de minutos.

Explorando Flash
Flash no es slo una tecnologa, es tambin el nombre de una herramienta de desarrollo de Adobe, que se utiliza para crear contenido Flash activado. Este contenido puede ser desde un simple anuncio publicitario a todo el camino a una completa base de datos impulsada sitio web con video y la interaccin del usuario.

Flash IDE
Flash IDE (Integrated Development Environment), como se muestra en la Figura 2.4, es una herramienta de desarrollo robusta con muchas caractersticas tiles.

77

FIGURE 2.4 Flash CS3 IDE with default layout

Una de las herramientas de actualizacin es el editor de cdigo, tambin conocido como el panel de ActionScript. Este panel, como se ve en la figura 2.5, es donde se escribe el cdigo ActionScript para las aplicaciones de Flash. La ltima versin se ha completado de cdigo robusto, depuracin avanzada, as como el resaltado de sintaxis para mi algunas de las nuevas caractersticas.

78

FIGURE 2.5 Panel ActionScript en Flash CS3

Aqu es donde la mayora de su vida el desarrollo se gasta. El panel no es el nico editor, usted puede crear archivos completos de ActionScript, como se muestra en la Figura 2.6, y los incluyen en su aplicacin. Para crear un archivo AS, seleccione Archivo Nuevo. Elija ActionScript 3 Archivo de la columna del medio. Guarde el archivo como Sample.as a su escritorio.

79

FIGURE 2.6 External ActionScript editor included with Flash CS3

Editores Alternativos
Encontrars muchos editores de ActionScript en el mercado. Mi favorito es FDT de Powerflasher en http://fdt.powerflasher.com/. Este editor ofrece la mayor cantidad de personalizacin y se basa en el editor de Eclipse, que muchas otras empresas dependen. Crear un nuevo archivo FLA y guardarlo en su escritorio tambin. Ahora abra el editor de cdigo y agregue el siguiente cdigo: #include Sample.as Esa lnea de cdigo incluye el contenido de Sample.as en su aplicacin. Esto significa que usted puede escribir todo el cdigo ActionScript en el archivo externo y Flash sabr incluirlo cuando se prueba o construir la aplicacin.

80

Flash-dispositivos habilitados
Flash ya no es una simple herramienta de animacin para crear grficos llamativos para la Web. Ahora puede encontrar Flash instalado en una gran variedad de productos tales como telfonos celulares, reproductores de medios, e incluso en algunas cmaras. La tecnologa del telfono celular es especialmente interesante porque estos dispositivos suelen tener conexiones a Internet activa, lo que significa que usted puede desarrollar aplicaciones dinmicas de Internet (RIA) para dispositivos mviles, as como el escritorio.

Un paso adelante
Ahora debe tener un conocimiento bsico de lo que Flash es y cmo se ha avanzado en la ltima versin. En este libro se explican los distintos aspectos de Flash y ActionScript en cuanto a trabajar con PHP y gestin de datos. Sin embargo, para una gua ms detallada sobre Flash CS3, le recomiendo el Adobe Flash CS3 Professional Biblia, publicado por John Wiley & Sons, Inc..

Resumen
En este captulo, usted aprendi sobre el servidor Web y cmo modificar los archivos de configuracin para configurar su desarrollo a medida o el medio ambiente en vivo. Esta informacin incluye pginas de error personalizadas, la aplicacin de mdulos especficos, y mejores prcticas para la proteccin de su contenido. Despus de entender los conceptos bsicos de trabajo con el servidor Web, el siguiente paso fue aprender a trabajar con PHP. El estudio abarc los aspectos bsicos de PHP, as como detalles de los captulos de este libro. La segunda mitad del captulo incluye informacin sobre MySQL y cmo trabajar con los datos en su base de datos. La ltima parte fue una visin general de Flash y cmo trabajar con el entorno de desarrollo. Para una visin ms detallada, se dieron algunas referencias.

81

Capitulo 3 Cmo realizar la Conexin


Cmo conseguir una conexin es una frase usada para describir el proceso de conexin a diversas fuentes de datos. En este captulo, es el proceso de conexin de ActionScript (Flash), PHP, MySQL y de diversas maneras. Esta informacin puede ser un sitio Web simple o una base de datos impulsada por el sistema de gestin de contenido de Flash, que se convierte en el front-end de visualizacin. Si estos tres componentes no estn instalados, consulte el Captulo 1 antes de continuar con este captulo. La primera parte de cada seccin se centra en lo que cada tipo de conexin tiene que ofrecer y se avanza hacia ejemplos para proporcionar una visin completa del resultado final.

Entender Comunicaciones en Flash


Desarrollo de aplicaciones autnomo carece de ciertas funciones, principalmente la capacidad de trabajar con datos dinmicos. En pequeas aplicaciones que puede utilizar archivos planos, como los archivos XML, pero los que planteara un problema como un proyecto sigue creciendo. Archivo de texto simple basado en aplicaciones tambin sufren el bloqueo de archivos, lo que puede ocurrir si hay demasiadas personas accediendo al archivo. Cuando esto ocurre, Apache y/o PHP puede lanzar un error que no da lugar a los usuarios para utilizar el sitio.

Determinar el estado de PHP


El primer paso para establecer una conexin con PHP en Flash es determinar si PHP est correctamente instalado y en funcionamiento. Esto se hace mediante la creacin de un archivo PHP simple de las salidas de la configuracin actual de la versin de PHP instalada. La funcin de PHP phpinfo() muestra la informacin de configuracin mediante la creacin de una pgina personalizada de HTML, como se muestra en la Figura 3.1. ADVERTENCIA Dejar el archivo phpinfo en su servidor puede ser un riesgo de seguridad. Lo mejor es que slo debe subir cuando lo necesite para mirar, y luego borrarlo. El siguiente es un archivo de informacin que muestra que hace una llamada a la funcin phpinfo(). <?php // output php configuration settings phpinfo(); ?>

82

FIGURA 3.1 Aqu est la salida de la funcin phpinfo, que muestra la configuracin actual de configuracin de PHP.

Si se le presenta con el archivo phpinfo, que generalmente es de color morado y se inicia con la versin de PHP instalada, entonces todo est instalado correctamente. Sin embargo, si usted ve un cuadro de dilogo para descargar el archivo PHP, esto significa que Apache es configurado incorrectamente o no se ha habilitado para el apoyo de PHP. Este nivel de configuracin se trata en el captulo 1 y en los archivos de ayuda que se suministran con Apache. En raras ocasiones puede presentarse con un servidor no se encuentra la pgina, lo que podra significar Apache no est instalado o corriendo. Suponiendo que PHP y Apache estn funcionando correctamente, puede seguir adelante con el proceso de conexin de Flash a PHP.

Trabajar con distintos tipos de conexin


Flash ofrece muchos tipos diferentes de opciones de comunicacin. La determinacin de que la comunicacin a utilizar en el proyecto se lleva a cabo mediante la caracterstica intencional de la aplicacin especfica.

83

Una-va de comunicacin
Una comunicacin bidireccional en Flash es el proceso de envo de datos a un servidor web y no buscar o por el cuidado si una respuesta vuelve. Esto es principalmente usado para abrir un URL, pero tambin podra utilizarse para actualizar un archivo con la intencin de manipular el resultado. Este tipo de comunicacin se utiliza a menudo por el simple hecho de mandar un evento o si lleva algn tipo de sistema de limpieza. Por ejemplo, si su sitio necesita limpieza peridica de archivo (borrar, renombrar, mover), es una buena idea para unir esta al frente del sistema final, porque los recursos del servidor slo se utilizarn cuando las mismas ya proporcionar contenido para el usuario . Este se habra iniciado por una comunicacin bidireccional entre escenas. NOTA La actualizacin de visualizacin concepto no debe ser utilizado para soluciones de copia de seguridad porque una visin lento podra dar lugar a falta de copias de seguridad. He aqu un ejemplo de la comunicacin unidireccional en Flash: var serverFile:String = http://localhost/callLink.php; var urlRequest:URLRequest = new URLRequest(serverFile); navigateToURL(urlRequest); La funcin navigateToURL acepta dos parmetros. El primer parmetro es la instancia del URLRequest, y el segundo parmetro es la ventana o el de destino. Por defecto, la ventana es _self, lo que significa la nueva pgina se cargar en el navegador actual, si existe. Sin embargo, en algunos casos, puede que desee abrir una nueva ventana del navegador, que se puede hacer aadiendo el segundo parmetro. var serverFile:String = http://localhost/callLink.php; var urlRequest:URLRequest = new URLRequest(serverFile); navigateToURL(urlRequest, _blank);

El parmetro de la ventana puede aceptar una de las siguientes cadenas, como se muestra en la Tabla 3.1. TABLE 3.1 _self _blank _parent _top Window Targets para enlaces Marco actual de la ventana actual Nueva ventana Parent del marco actual Marco de alto nivel en la ventana actual

El parmetro ventana tambin puede aceptar un nombre personalizado, como el nombre de un marco o ventana especfica. Por ejemplo, suponiendo que usted desea enviar un vnculo a la ventana llamada "childWindowBox", el cdigo se vera como el siguiente bloque: var serverFile:String = http://localhost/callLink.php; var urlRequest:URLRequest = new URLRequest(serverFile); 84

navigateToURL(urlRequest, childWindowBox); Usted sustiye los nombres de las ventanas precompilados y aade su nombre personalizado. Aunque este es un pequeo cambio, ofrece algunas grandes funcionalidades aadidas. Abrir una ventana nueva o existente es slo una de las posibilidades de conexin con otros datos. Otro tipo de comunicacin unidireccional en Flash se puede realizar mediante el uso de sendToURL(). El sendToURL () se utiliza para comunicarse en silencio con un guin. Comunicacin silenciosa es una forma de comunicacin unidireccional que no carga una pgina Web por separado. Esta forma de comunicacin ofrece la posibilidad de enviar datos a un servidor sin interferir con la experiencia de navegacin del usuario. Aqu est el ejemplo anterior, con la nueva funcin aadida, junto con algn error de manipulacin de base para gestionar las solicitudes no vlidas y no est disponible. var serverFile:String = http://localhost/callLink.php; var urlRequest:URLRequest = new URLRequest(serverFile); try { sendToURL(urlRequest); } catch (e:Error) { // handle error here }

Envo de datos al servidor


Puede haber ocasiones en las que desea no slo en silencio solicita una direccin URL, sino tambin enviar los datos a lo largo de la misma. Esto se hace utilizando la clase URLVariables, que le permite crear un objeto de pares nombre/valor. Estos seran los mismos que los que se encuentran en una solicitud de HTML estndar. var serverFile:String = http://localhost/callLink.php; var variables:URLVariables = new URLVariables(); variables.id = 1004; variables.user = James; var urlRequest:URLRequest = new URLRequest(serverFile); urlRequest.data = variables; try { sendToURL(urlRequest); } catch (e:Error) { // handle error here } Otro ejemplo de una va de comunicacin es a ciegas enviar datos POST a un servidor. Esto aade la seguridad un poco ms a su aplicacin mediante la eliminacin de los parmetros de la URL, y se realiza mediante la inclusin de los parmetros dentro de la peticin. 85

El cdigo de la solicitud de datos POST es simplemente asignar un valor a la propiedad mtodo de la instancia URLRequest. ActionScript tiene una variable esttica en la clase URLRequestMethod que se asigna a la variable mtodo. var serverFile:String = http://localhost/callLink.php; var variables:URLVariables = new URLVariables(); variables.id = 1004; variables.user = James; var urlRequest:URLRequest = new URLRequest(serverFile); urlRequest.method = URLRequestMethod.POST; urlRequest.data = variables; try { sendToURL(urlRequest); } catch (e:Error) { // handle error here } Aqu est una muestra de que se enviarn al servidor. Como puede ver, el contenido y los elementos POST tienen la informacin que se envi. Las partes restantes de la solicitud son los atributos de datos estndar y no son especficas para este ejemplo. POST /callLink.php HTTP/1.1 Accept-Language: en Accept-Encoding: gzip, deflate Cookie: login=usernames;session-id=120670l Referer: http://www.example.org/ User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Content: id=1004%2Fuser=James Content-Type: application/x-www-form-urlencoded Accept: text/xml, text/html;q=0.9,text/plain;q=0.8,image/png Pragma: no-cache Content-Length: 327 Connection: keep-alive Host: www.example.org

Dos-vas de comunicacin
En algunos casos, usted desea recibir una respuesta cuando enva los datos. Una de ellas sera cuando se intenta cargar los datos de un usuario especfico de una base de datos. Usted podra pasar el identificador de usuario y espera recibir algn tipo de datos que contienen informacin de ese usuario. La respuesta de una comunicacin de dos vas se controla mediante la asignacin de un detector de eventos y la asignacin de una funcin de controlador. var serverFile:String = http://localhost/callLink.php; var variables:URLVariables = new URLVariables(); 86

variables.id = 1004; variables.user = James; var urlRequest:URLRequest = new URLRequest(serverFile); urlRequest.method = URLRequestMethod.POST; urlRequest.data = variables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, userResponseHandler); try { urlLoader.load(urlRequest); } catch (e:Error) { //handle error here } // handler function function userResponseHandler(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var args:URLVariables = new URLVariables(urlLoader.data); trace(User Data: + args.response); } La funcin de respuesta se pasa una referencia al evento. Las instancias URLLoader y URLVariables manejar el proceso separando la respuesta y volver slo los datos que fue enviado de vuelta. La respuesta viene de nuevo con otros valores y parmetros, pero la mayora de las veces slo estar interesado en la propiedad de datos de la instancia de URLLoader. Ms aplicaciones completas a menudo regresan formato XML, que est cubierto en el captulo 3 con otros datos de diferentes ejemplos de carga. Ahora que sabe cmo trabajar con un solo sentido y comunicacin de dos vas, la siguiente seccin se expande sobre estas prcticas mediante la conexin a PHP.

Conexin de Flash a PHP


El proceso de conexin de flash PHP se realiza mediante las clases de pre-compilados que se introdujeron en la seccin anterior. Si usted no tiene instalado PHP en este momento, consulte el Captulo 1 para comprender e instalar PHP. Para iniciar este ejemplo, abra el archivo de partida que se incluye en los archivos de libro de origen. Los archivos de cdigo fuente se puede encontrar en el sitio Web del libro. El archivo de partida para este ejemplo tiene el diseo y componentes que han aadido, como se muestra en la Figura 3.2, que le permite centrarse en el cdigo que hace que todo funcione. La primera parte de este ejemplo es para definir la variable de que el archivo PHP se encuentra en el servidor local o remoto. var phpFile:String = http://localhost/connecting/exampleConn.php; Una vez definida la ubicacin del script PHP, el siguiente paso es crear la funcin que se llama cuando se pulsa el botn. function callServer(e:MouseEvent):void { 87

var urlRequest:URLRequest = new URLRequest(phpFile); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, serverResponse); loader.load(urlRequest); } FIGURA 3.2 Aqu est el diseo completo de la aplicacin de ejemplo que va a trabajar con el.

Esta funcin crea instancias URLLoader y URLRequest. El phpfile se pasa a la URLRequest para crear el objeto. Por ltimo, el detector de eventos se adjunta a la variable de gestor para hacer referencia a serverResponse, que es la funcin que se llama cuando se carga los datos. function serverResponse(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); timeTxt.text = variables.returnValue; } El controlador de funcin serverResponse () del servidor se encarga de capturar los datos que se pasa de nuevo desde el archivo PHP. Despus de que los datos se ha cargado correctamente, se pasa a la clase URLVariables para generar un objeto dinmico. 88

Este objeto contiene los datos dinmicos de respuesta pasados del servidor, por lo que una llamada a un objeto simple es todo lo que se necesita para cargar los datos de la muestra. En este ejemplo, los datos de la muestra ser el timestamp UNIX capturado y devuelto por PHP. La ltima parte es un controlador simple botn que llama a la funcin callServer cuando un usuario hace clic en el botn. callBtn.addEventListener(MouseEvent.CLICK, callServer); El cdigo PHP para este ejemplo es muy simple una declaracin de impresin. La funcin time() se utiliza para agarrar el timestamp UNIX actual. La variable returnValue situado en la cadena es una definicin de variable personalizada, de modo Flash sabe cmo llamar una vez que se carguen los datos. Esta variable se puede nombrar cualquier nmero de cosas e incluso puede ser una serie de estos: <?php print returnValue=Hello from PHP, time is: . time(); ?>

Concatenacin de datos
El .= se utiliza para concatenar o unirse a mltiples variables utilizadas en una cadena larga. En este caso, se est construyendo en la lnea anterior para crear la cadena de datos de usuario que le ser devuelto a Flash. <?php $userData = username=James; $userData .= &id=1004; $userData .= &level=Reader; print $userData; ?> El resultado que se pasar de nuevo a Flash se ver algo similar a lo siguiente: username=James&id=1004&level=Reader Usted puede notar que el nombre de relacin entre el valor es muy similar a la forma en que se enven los datos POST. Sin embargo todo lo que necesita saber para trabajar con estos datos en Flash son los nombres de las variables.

Mltiples piezas de datos


Tome la funcin actual serverResponse () y modificarlo para incluir estas nuevas variables que se envan desde el cdigo PHP. El ejemplo siguiente es regresar no modificable valores, sin embargo, en una aplicacin real, que los datos lo ms probable es venir de una fuente de datos dinmicos. Como aprendimos en la seccin anterior, el formato de datos de Flash se convierte en una muy simple y fcil de usar, conjunto de objetos. function serverResponse(e:Event):void { 89

var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); userTxt.text = Welcome back, + variables.username; levelTxt.text = Your current level is: + variables.level; } Una limitacin de la funcin anterior es las variables var slo es accesible dentro de esa funcin. Para asegurar los datos devueltos sea accesible por toda la aplicacin, es una buena idea guardar los datos en una variable externa. Por ejemplo, este ejemplo se basar en el cdigo anterior, aadiendo la nueva variable de asignacin y definicin. El primer cambio consiste en crear una variable de objeto que almacenar los datos. var phpFile:String = http://localhost/connecting/exampleConn.php; var storedResult:Object; function callServer(e:MouseEvent):void { ... } function serverResponse(e:Event):void { ... } callBtn.addEventListener(MouseEvent.CLICK, callServer); Despus de la variable de objeto es definida por new, el siguiente paso es modificar la funcin serverResponse para almacenar los datos cargados en la variable de la recin creada. function serverResponse(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); // check for valid data if(uint(variables.itemLength) > 0) { storedResult = variables; } userTxt.text = Welcome back, + variables.username; levelTxt.text = Your current level is: + variables.level; } Los datos objeto cargado se almacena en el objeto storedResult, pero slo si se encuentra una itemLength vlida. La variable itemLength tambin es devuelto por el PHP y validado mediante una simple sentencia if. Con esta nueva incorporacin al cdigo que se puede compartir los datos cargados con otras variables y secciones dentro de esta misma solicitud. NOTA Los datos almacenados no son accesible hasta que el proceso de carga se complete. El ltimo paso es modificar el PHP para devolver la variable nueva creada itemLength, que se hace con otra adicin a la cadena $userData. 90

<?php $userData = username=James; $userData .= &id=1004; $userData .= &level=Reader; $userData .= &itemLength=3; print $userData; ?> Ahora que tiene una comprensin de cmo cargar los datos estticos de PHP en Flash, la siguiente seccin se ampla en este formato de datos estticos y presenta una base de datos MySQL.

Conexin de PHP a MySQL


Cargando datos en Flash de un archivo PHP esttico es una gran manera de aprender el proceso. Sin embargo, una aplicacin RealWorld probablemente no va a utilizar ese formato. Los datos siempre estn cambiando y nadie quiere actualizar los archivos PHP con la mano.

Determinar el estado de MySQL


Antes de la conexin con MySQL est establecido, asegrese de que MySQL est instalado y funcionando correctamente. NOTA La instalacin por defecto de MySQL deja la contrasea en blanco. Esto est bien para un sitio de pruebas, pero la contrasea no debe dejarse en blanco en un servidor en vivo. La instalacin ms comun para el uso de MySQL en PHP es mediante la inclusin de la biblioteca de MySQL durante el proceso de instalacin de PHP. Esto significa que la informacin de MySQL ser mostrado en phphinfo, que se explica en la seccin anterior. Comprobacin de MySQL se hace simplemente mediante la creacin de un archivo de prueba phpinfo y funcionando en tu navegador, como se muestra en la Figura 3.3. <?php phpinfo(); ?> Este resultado es una pgina HTML masiva que muestra toda la informacin relativa a la instalacin actual de PHP. Para determinar el estado de MySQL, la bsqueda de "MySQL". Tenga en cuenta que podra haber ms de uno.

91

FIGURA 3.3 Aqu est la parte del archivo phpinfo que explica la instalacin de MySQL disponible.

NOTA La seccin de MySQL en el archivo phpinfo no ser visible a todos si no se instala. Suponiendo que MySQL est correctamente instalado y en funcionamiento, puede pasar a la siguiente seccin, que explica cmo conectar PHP a una base de datos MySQL.

Conectar a MySQL
El proceso de conectar a MySQL de PHP es bastante simple. El primer paso es obtener la informacin de conexin de su administracin del servidor o, si usted acaba de instalar, los datos de acceso seran los valores predeterminados. Aqu est el muy bsico, no hay cdigo volantes para conectarse a una base de datos MySQL. <?php $host $user $pass $link ?>

= = = =

localhost; ; ; mysql_connect($host, $user, $pass); 92

La funcin mysql_connect acepta tres argumentos. El nombre de host es el primer argumento, que casi siempre se establece en "localhost". El segundo es el nombre de usuario que se eligi al instalar MySQL, y, por ltimo, la contrasea de su base de datos MySQL, que es blanco para la configuracin por defecto. La funcin mysql_connect retorna un ID de recursos, que es una referencia a la conexin de MySQL actual. Este ID se puede utilizar en el futuro las llamadas SQL, como mysql_query, y muchas otras funciones. Si le sucede que imprimir esta variable $link podrs ver un cdigo de recursos. El ejemplo siguiente devuelve cdigo identificador de recurso: <?php $link = mysql_connect(localhost, root, ); print Response: . $link; ?> El bloque de cdigo anterior produce una respuesta, como: Response: Resource id #32

Conexin persistente
La funcin mysql_connect estandar cerrar la conexin una vez finalizada la ejecucin del script. Sin embargo, hay algunos casos en los que se desea mantener una conexin que no se cierra una vez que el guin est finalizado. La funcin mysql_pconnect es exactamente lo que hace esto posible. Esta funcin mantiene una conexin despus de que el script se ejecuta. La ventaja de mysql_pconnect es que elimina la necesidad de una nueva conexin. Sin embargo, la desventaja es que las conexiones persistentes se almacenan en una piscina y no se garantiza la misma conexin cada vez, que puede producir resultados inesperados. He aqu un ejemplo de una conexin persistente, donde el nico cambio es pa delante de la palabra "conectar" en la funcin de conexin. <?php $link = mysql_pconnect(localhost, root, ); print Persistent Resource ID: . $link; ?>

Cerrar la conexin
Despus de que el SQL finalice la ejecucin, una buena prctica es eliminar la conexin a liberar recursos y memoria. Esto se hace simplemente haciendo un llamado a mysql_close(), que cierra la conexin. Cierre de la conexin no es siempre necesaria, ya que se cerrar automticamente cuando la secuencia de comandos detenga su ejecucin. Dicho esto, en una aplicacin ms grande es mejor liberar recursos tan pronto como sea posible para mantener un uso responsable. Aqu est el anterior mysql_connect() ejemplo, con la adicin cerrar. <?php $link = mysql_connect(localhost, root, ); print Response: . $link; 93

// close connection mysql_close($link); ?> La funcin mysql_close puede aceptar una referencia de recursos de identificacin, que viene muy bien cuando usted tiene mltiples conexiones. Este argumento no es obligatorio, por defecto la ltima conexin se cerrar. NOTA Una conexin persistente creado por mysql_pconnect() no puede cerrar con mysql_close().

Seleccionar la base de datos


Despus de establecer la conexin MySQL, usted puede seleccionar una base de datos. Usted no ser capaz de consultar la base de datos hasta una conexin adecuada y de la base de datos son los elegidos. La funcin mysql_select_db le permite seleccionar la base de datos para consulta. Tambin puede utilizar esta funcin para cambiar las bases de datos. NOTA De una conexin activa slo puede tener una base de datos conectada a la vez. La funcin mysql_select_db acepta dos parmetros. El primer parmetro es el nombre de base de datos. El segundo parmetro (opcional) es un enlace al recurso de conexin activa. Esto es importante para usar cuando usted tiene pocas conexiones diferentes o si desea seguir correctamente la conexin activa. Aqu hay un ejemplo utilizando el cdigo anterior para la conexin y seleccionar una base de datos: <?php $link = mysql_connect(localhost, root, ); mysql_select_db(db_name, $link); // close connection mysql_close($link); ?>

Acercar todo junto


Usted puede usar su comprensin de cmo conectar a MySQL desde PHP para ampliar este concepto y crear una aplicacin completa. La primera parte del proceso de desarrollo es crear la base de datos y tablas, y rellenar con los datos. En este ejemplo ser el comienzo de un sitio de una lista de CD donde el usuario solicita se devuelve una categora de gnero y los lbumes especificos. Comience por crear dos tablas de MySQL para este ejemplo. El primer cuadro corresponde a los gneros y la segunda tabla es la lista de lbumes. CREATE TABLE genre ( id int(11) NOT NULL auto_increment, name varchar(100) default , dateAdded int(11) default 0, PRIMARY KEY (id) ) ENGINE=MyISAM; CREATE TABLE albums ( id int(11) NOT NULL auto_increment, 94

genreID int(11) NOT NULL default 0, artist varchar(200) NOT NULL default , albumName varchar(200) NOT NULL default , PRIMARY KEY (id) ) ENGINE=MyISAM; Utilizando cualquier navegador o editor que desee, crear una base de datos de msica y aadir los dos cuadros para empezar. Despus de crear las tablas, se puede llenar con los datos predefinidos para este ejemplo, que se lleva a cabo mediante la ejecucin de una serie de declaraciones de INSERT MySQL. INSERT INTO genre (name, dateAdded) VALUES (Blues, 1197090235); INSERT INTO genre (name, dateAdded) VALUES (Country, 1197090146); INSERT INTO genre (name, dateAdded) VALUES (Jazz, 1197090525); INSERT INTO genre (name, dateAdded) VALUES (Rock, 1197090230); INSERT INTO albums (genreID, artist, albumName) VALUES (4, Rob Thermo, Rob\s Rock Mix); INSERT INTO albums (genreID, artist, albumName) VALUES (4, Bill Dato, Rock Out Live); INSERT INTO albums (genreID, artist, albumName) VALUES (4, Jim Limb, Woodward 37th); INSERT INTO albums (genreID, artist, albumName) VALUES (4, Jason Alex, Guitar Mashup); INSERT INTO albums (genreID, artist, albumName) VALUES (4, Sam Riley, The Live Ones); Con la base de datos creada y las mesas asignadas y lleno de datos de ejemplo, puede continuar con la parte de PHP de la aplicacin.

Conectar el PHP
El cdigo PHP se inicia mediante la conexin a la base de datos recin creado usando las tcnicas aprendidas en la seccin anterior. <?php $link = mysql_connect( localhost , username , password ); mysql_select_db( music , $link); Cuando se establece una conexin, puede crear la consulta que se ocupa de la carga de los datos del lbum. En primer lugar, crear el gnero para buscar mediante el establecimiento de una variable esttica. En una aplicacin ms completa, la variable ms probable es que se pasa a travs de URL o de alguna otra forma de una llamada. $genreID = 4; $query = SELECT g.name, a.artist, a.albumName; $query .= FROM albums a, genre g; $query .= WHERE a.genreID=g.id; $query .= AND g.id= . $genreID; Una llamada a mysql_query () se hace, que es responsable de ejecutar la consulta SQL anterior. Esta funcin devuelve un identificador de recurso que se utilizar en el resto de las llamadas de SQL. 95

$result = mysql_query($query); Este lbum cargado de datos se almacenarn en un nombre o cadena de valor de la simplicidad, sino un ejemplo del mundo ms real-lo ms probable es utilizar XML u otro tipo de datos estructurados. $response = resp=loaded\n ; CROSS--REF El uso de datos XML se explica en el captulo 3. Esto incluye la carga y el ahorro de XML cuando se trabaja con PHP/MySQL objetos de datos. En este punto, la conexin a MySQL y la llamada debe ser creado, pero an no puede probar el cdigo, porque no emitir nada. La siguiente seccin explica el dar salida de los datos mediante un bucle while comn para recorrer los datos devueltos por las tablas de la base de datos de msica. Los datos se devuelven en un formato de lista de base, pero tiene que haber una forma de diferenciar los datos. Esto se hace mediante la creacin de un identificador nico en cada instancia de los resultados y la asignacin a el valor del nombre. $index = 0; La siguiente parte es la carne de la solicitud, que es el bucle while. while($row = mysql_fetch_array($result)) { ... } El contenido del bucle while construye la respuesta de cadena. while($row = { $response .= $response .= $response .= $index++; } mysql_fetch_array($result)) &artist . $index . = . $row[artist]; &album . $index . = . $row[albumName]; &genre . $index . = . $row[name]. \n;

Usted se dar cuenta de la variable $ respuesta se le asigna un nombre y el valor de cada pieza individual de los datos devueltos por la base de datos. Los datos devueltos por la funcin mysql_fetch_array entra como una matriz multidimensional. La variable $row almacena cada fila de datos, y utiliza el nombre de la columna para acceder a la pieza especfica de datos, tales como: $response .= &artist . $index . = . $row[artist]; Este proceso se repite para cada pieza de datos que desea capturar. Los datos que est disponible para este circuito, mientras que se determina en la consulta SQL que se defini en la seccin anterior.

96

Usted puede haber notado que la consulta SQL se vio obligado a incluir slo las columnas necesarias. Esto se hace para limitar la cantidad de datos y utilizar menos memoria, lo que se suma como un sistema sigue creciendo. Si usted necesita todas las columnas de las tablas, se puede utilizar un asterisco (*), que modifica la llamada anterior de SQL para buscar algo como: $query $query $query $query = SELECT g.*, a.*; .= FROM albums a, genre g; .= WHERE a.genreID=g.id; .= AND g.id= . $genreID;

Dos letras se asignan asteriscos (*) porque son referencias a las dos tablas necesarias para este ejemplo. Uso de mltiples tablas en una llamada de SQL es muy comn en mantener la relacin de los datos conocidos, y ello permite que los datos que se almacenan en las pequeas, trozos ms manejables. La ltima parte de PHP crea un "total" de valor que indica a Flash la cantidad de datos que se devuelven. Esto es necesario porque los datos estn en formato de cadena. Cuando se utiliza un tipo de datos XML o matrices, no necesitar esta variable adicional. El ndice creado por cada fila de datos se hace el recuento, ya que slo se incrementa cuando se encuentra una nueva fila de datos, lo que significa que est en sincrona con la cantidad de datos en la cadena. $response .= &total= . $index; La ltima parte es la declaracin de impresin, que expone estos datos para Flash o una aplicacin Web para cargar. print $response;

Aqu hay un ejemplo de respuesta:


resp=loaded &artist0=Rob Thermo&album0=Robs Rock Mix&genre0=Rock &artist1=Bill Dato&album1=Rock Out Live&genre1=Rock &artist2=Jim Limb&album2=Woodward 37th&genre2=Rock &artist3=Jason Alex&album3=Guitar Mashup&genre3=Rock &artist4=Sam Riley&album4=The Live Ones&genre4=Rock &total=5 Esa es la aplicacin completa, que carga en un bloque de datos del lbum usando el gnero como la clave. Aqu est todo el cdigo PHP en una lista para copiar/pegar o para examinar de cerca y comprender mejor cmo es que trabajan todos juntos. <?php $link = mysql_connect(localhost, username, password); mysql_select_db(music, $link); $genreID = 4; $query = SELECT g.name, a.artist, a.albumName; $query .= FROM albums a, genre g; 97

$query .= WHERE a.genreID=g.id; $query .= AND g.id= . $genreID; $result = mysql_query($query); $response = resp=loaded\n; $index = 0; while($row = mysql_fetch_array($result)) { $response .= &artist . $index . = . $row[artist]; $response .= &album . $index . = . $row[albumName]; $response .= &genre . $index . = . $row[name]. \n; $index++; } $response .= &total= . $index; print $response; ?>

Construir el Flash
La porcin de Flash de esta aplicacin es responsable de cargar los datos y recorre a imprimir cada lbum. Para simplificar, esta aplicacin es ActionScript, lo que significa la presentacin de los datos se hace en el panel Salida. Una aplicacin ms completa que tomar estos datos cargados y mostrarlos en una lista o de otro componente de datos personalizados. El primer paso es definir el archivo PHP que se llama, que tendra un aspecto similar a este, dependiendo de cmo su sistema est configurado:
var phpFile:String = http://localhost/getAlbums.php;

Cuando se define la variable de PHP, el siguiente paso es crear la funcin que se llama el servidor.
function loadHandler():void { ... }

Esta funcin establece la primera instancia de URLRequest, pasando la variable de PHP como un argumento.
var urlRequest:URLRequest = new URLRequest(phpFile);

El URLLoader se utiliza para crear un detector de eventos y para iniciar el proceso de carga en la realizacin de esta funcin. La variable URLRequest se pasa a la funcin de carga de la instancia de clase URLLoader, que se requiere para cualquier tipo de carga de datos.
var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, callServerHandler); urlLoader.load(urlRequest);

La siguiente funcin es la de definir callServerHandler, que se llama una vez que los datos son enviados desde el archivo PHP escrito en la seccin anterior. Esta funcin se pasa una referencia de evento que contiene los datos cargados. 98

function callServerHandler(e:Event):void { ... }

El primer paso en esta funcin es la de crear la instancia de URLLoader, que se utiliza para capturar los datos cargados. La instancia de eventos contiene una propiedad de destino, que se utiliza aqu pasando en un nuevo URLLoader. El resultado se almacena en la variable de gestor local, que se utilizar en el resto de esta funcin,.
var loader:URLLoader = URLLoader(e.target);

Usted puede recordar de la seccin de PHP de este ejemplo que los datos se devuelven en pares de nombre y objeto de valor. Que los datos se almacenan en la propiedad de datos de la recin creada instancia de gestor. Estos datos se pasa a una instancia de la clase URLVariables, que crea un objeto de ActionScript para otras partes de la secuencia de comandos puede manejar los datos.
var dataObj:URLVariables = new URLVariables(loader.data);

Ahora que se carguen los datos, puede probar usando una simple declaracin de seguimiento que debe mostrar las entradas totales devueltos.
trace(Total Albums: + dataObj.total);

Que la llamada trace debe mostrar lo siguiente en el panel Salida:


//Output: Total Albums: 5

Esto significa que el archivo PHP que se llama y los datos se carga correctamente desde la base de datos usando PHP como el controlador de datos en el medio. Usted podra terminar el script de aqu, ya que todas las obras, pero para seguir usando el bucle for.. para mostrar la informacin de cada lbum utilizando una serie de trace las llamadas por la simplicidad. El bucle for.. se establece con la propiedad total de la dataObj para determinar cuntas veces el bucle debe ejecutarse. for(var i:uint = 0; i < dataObj.total; i++) { ... } La primera huella (trace) en el bucle for.. muestra el lbum actual que se muestra. El nmero actual lbum es creado utilizando la variable i del bucle 1 agregado. La razn de esto es que la variable i comienza en cero, y para fines de presentacin del primer disco debe ser de 1. trace(Album + (i + 1)); 99

La siguiente sentencia trace est configurado para mostrar el artista actual. El valor se recupera de la instancia de objetos dataObj utilizando una referencia de objeto dinmico. El nombre "artista" se adjunta a la variable i, que crea un nombre de instancia. trace( Artist: + dataObj[artist + i]); El resto de las instrucciones de seguimiento (trace) son duplicados de la anterior, con el nombre de instancia y en la descripcin ligeramente modificada. trace( Album: + dataObj[album + i]); trace( Genre: + dataObj[genre + i]); En este punto, el ciclo se completa y tambin lo es la aplicacin de ejemplo completa. Ahora puede probar el ejemplo y debera ver las instrucciones de seguimiento de muestra en el panel Salida, como se muestra en la Figura 3.4. FIGURA 3.4 Aqu hay un ejemplo de los datos del lbum aparece en el panel Salida.

100

La porcin de ActionScript completo de esta aplicacin sigue: var phpFile:String = http://localhost/getAlbums.php; function loadHandler():void { var urlRequest:URLRequest = new URLRequest(phpFile); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, callServerHandler); urlLoader.load(urlRequest); } function callServerHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var dataObj:URLVariables = new URLVariables(loader.data); // Simple trace for example for(var i:uint = 0; i < dataObj.total; i++) { trace(Album + (i + 1)); trace( Artist: + dataObj[artist + i]); trace( Album: + dataObj[album + i]); trace( Genre: + dataObj[genre + i]); } } loadHandler(); loadHandler();

Resumen
El ejemplo anterior debera haber dado una comprensin bastante buena de trabajar con una base de datos MySQL en Flash usando PHP como la secuencia de comandos en el medio. Puede ampliar este ejemplo para crear una aplicacin ms robusta ya que esta muestra se utiliz para ilustrar el concepto, y no centrarse en pantalla o la propia apicacin. De datos de MySQL es slo un ejemplo de los datos que se pueden mostrar en Flash. El siguiente captulo se ampla en este ejemplo y presenta objetos de datos ms avanzadas, tales como XML, junto con otras formas de datos, tales como imgenes y archivos de texto.

101

Capitulo 4 Trabajar con Datos


Trabajar con datos es el proceso de enviar y cargar informacin para ActionScript de interpretar. Hay dos tipos de datos que pueden ser utilizados en ActionScript. Estos seran estticas y dinmicas. En los casos ms comunes, el proceso dinmico que se prefiere a la esttica. Principalmente porque los datos dinmicos a menudo incluye un componente de base de datos. En este captulo se trata de trabajar con datos dinmicos en Flash y PHP. Usted comienza por la carga de archivos de texto simple, a continuacin, pasar a XML y la carga ms avanzados. El captulo concluye con una aplicacin de ejemplo completa que carga los datos de imagen para mostrar una imagen en miniatura y la imagen de tamao normal.

Cargar datos en Flash


Cargando datos en Flash es una prctica muy comn. En casi todos los proyectos, que desea tener algunos dinmicos (actualizables) de las porciones. El propsito de los datos dinmicos es la de limitar el importe de la actualizacin necesaria. Por ejemplo, si nos fijamos en un sitio de noticias, vers que la mayora del contenido externo no cambia (logotipos, navegacin, etc.) Esto tambin es vlido para una aplicacin Flash en la que lo ms probable es que slo tienen una cierta parte que en realidad necesita ser actualizado. Esta seccin le gua por el proceso de carga de datos XML de todas las forma de imgenes y sonido. El proceso de carga de datos en Flash se familiariza con bastante rapidez como la mayora de los tipos de datos que se carga tienen requisitos similares. Empiece por buscar un ejemplo sencillo que cargar un archivo de texto. En este ejemplo se buscar el archivo de texto en un par de lugares diferentes dependiendo de donde la aplicacin se est ejecutando. Si se ejecuta este cdigo en el IDE de Flash se ver en el mismo lugar de la FLA se guarda o en el directorio temp del usuario si el archivo no se ha guardado. Si el cdigo es compilado en un archivo SWF, el archivo de texto se cargan desde el mismo directorio que el SWF se almacena en. var txtFile:String = sample.txt; var urlRequest:URLRequst = new URLRequest(txtFile); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, loadHandler); loader.load(urlRequest); function loadHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); trace(Loaded Data: + loader.data); } El anterior ejemplo, carga un archivo "sample.txt" y todos los rastros de su contenido en el panel Salida de Flash, que se abre automticamente. Otra forma de abrir o cerrar el panel de salida es por la eleccin de la ventana salida. 102

Comprender las clases utilizadas para cargar los datos


De ActionScript en Flash tiene una serie de clases prefabricadas que se utilizan para cargar los datos. La siguiente seccin explica la funcin de cada una de esas clases.

URLRequest
Esta clase se utiliza para configurar el archivo que se carga. Se puede asignar de manera directa a una variable, o para mantener el cdigo general ms compacto, asignar directamente dentro de load() de la URLLoader. De hecho, se puede aplicar este proceso a muchas de las clases. Esto no tiene ningn impacto en la funcionalidad de la clase y no es un paso necesario. ... loader.load(new URLRequest(txtFile));

URLLoader
Como se indica en el Docs Live Adobe, "La clase URLLoader descarga datos desde una URL como texto, datos binarios o variables con codificacin URL. Es til para la descarga de archivos de texto, XML, o cualquier otra informacin que se utilizar en una dinmica, basada en datos de aplicacin. El URLLoader sirve a dos propsitos al enviar y cargar datos en ActionScript. El primer objetivo de la URLLoader es configurar el controlador completo. El otro propsito es capturar los datos cargados en el controlador completo. Una diferencia notable de la segunda finalidad es el hecho de la URLLoader no tiene una nueva palabra clave antes de que.

Configurar el callback
El ltimo paso en la creacin de un gestor de datos es la devolucin de llamada. La devolucin de llamada es otro nombre para el controlador de la funcin que se llama cuando los datos se ha cargado completamente. Esta funcin se asigna al evento Event.COMPLETE en la clase URLLoader. var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, loadHandler); Esta funcin de devolucin de llamada requiere un argumento del tipo de evento, que se pasa automticamente en cuando se llama al ActionScript. Este argumento es que el contenido de los datos cargados se almacenan. NOTA Si usted se olvide de incluir el argumento en el controlador de eventos obtendr un argumento de error de recuento de desfase. ArgumentError: Error #1063: Argument count mismatch on sendtophp_fla::MainTimeline/serverResponse(). Expected 0, got 1. at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/onComplete()

103

Poner todo junto


Ahora que tiene una comprensin de cmo el cdigo para cargar los datos con ActionScript funciona, puedes pasar a ejemplos ms concretos de envo y de carga. En este ejemplo, usted puede experimentar y construir a partir de la clase URLLoader porque tiene mucho ms que justo el simple evento COMPLETE que usted utiliza. Por ejemplo, hay un evento IOError que se llama cuando se carga o por un error de envo. El cdigo para diversos eventos es casi lo mismo, para su ejemplo IOError se vera como este: var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, ioHandler); function ioHandler(e:Event):void { trace( File loading was terminated ); } Usted notar rpidamente que lo nico que cambia es la cadena de eventos y la funcin de controlador. Eventos mltiples tambin pueden ser asignados, y es a menudo una buena idea mantener un alto nivel de compatibilidad. Tambin son capaces para depurar cdigo rpidamente si configura los eventos adecuados.

Asignar mltiples eventos


Suponga que desea manejar el IOError y el evento completo para la instancia del cargador. Usted puede entrar en cada controlador de eventos, sin embargo, esto puede convertirse en un largo proceso cuando se trabaja con cargadores mltiples. Una forma de lograr el resultado pretendido es utilizar una funcin para asignar los controladores. Es, bsicamente, pasan en la meta como un argumento y asignar dinmicamente los controladores de su evento. var txtFile:String = sample.txt; var urlRequest:URLRequest = new URLRequest(txtFile); var loader:URLLoader = new URLLoader(); assignHandlers(loader); loader.load(urlRequest); function assignHandlers(target:*):void { target[addEventListener](Event.COMPLETE, completeHandler); target[addEventListener](IOErrorEvent.IO_ERROR, ioErrorHandler); } function completeHandler(e:Event):void { ... } function ioErrorHandler(e:Event):void { ... }

104

Un nuevo concepto introducido en esta funcin es la forma dinmica de la asignacin de detectores de eventos. El [] se utilizan para definir una cadena dentro de ellos como una variable. En este caso, la cadena "addEventListener" es en realidad el mtodo para invocar y los valores con los () son los argumentos para pasar al mtodo. El uso de este ejemplo para la escucha de un solo evento es una especie de exageracin, pero si usted est trabajando con varios eventos que se convierte rpidamente en beneficios.

Manipular carga de datos


Despus de usar los pasos anteriores para cargar los datos, tendr que utilizar estos datos de alguna manera. Sin embargo, antes de que te sumerjas en el trabajo con los datos cargados se necesita una comprensin de lo que se pasa de nuevo y cmo trabajar con l. En las siguientes secciones, aprender a manejar los datos que se ha cargado. Una vez que haya completado esta seccin se entender por completo la manera de cargar los datos y cmo trabajar con los datos cargados.

Una-va de carga
Carga de un archivo de texto o la imagen es considerada una forma de carga, sobre todo porque no se pasa a lo largo de las normas o medidas para el archivo cargado. Una llamada a cargar una imagen se esperara una imagen que se volvi y nada ms. Este tipo de proceso de carga es ms comnmente entendido, si nos fijamos en un sitio Web. El logo en ese sitio se solicita y se carga, sin datos adicionales se las arregl para lograr esto.

Dos-va de carga
Dos formas de carga es el proceso de carga de datos al pasar a lo largo de los argumentos de que el proceso solicitado se encargar. Por ejemplo, una llamada a un servidor de publicidad pasara a lo largo de la cuenta de ello y posiblemente de algn otro tipo de informacin para determinar qu anuncios se debe mostrar. Cuando se trabaja con aplicaciones de PHP o scripts dinmicos de otros es muy probable que pase a lo largo de los parmetros de trabajar. An ms importante es el hecho de que usted puede obtener diferentes tipos de datos de vuelta. Por ejemplo, usted puede esperar que un objeto, obtenga un cdigo de error. El propsito de esta seccin es desarrollar una forma en la que se pueda manejar este caso. var phpFile:String = sample.php; var urlRequest:URLRequest = new URLRequest(phpFile); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, serverHandler); loader.load(urlRequest); function serverHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var vars:URLVariables = new URLVariables(loader.data); if(vars.response == ERROR) { trace(An Error occurred, response not loaded); } else { trace(Server Response: + vars.response); 105

} } Este controlador es muy similar a los ejemplos anteriores, con la excepcin de que la variable de respuesta se ha dado una definicin sin tipo. Esto permite que varios tipos de datos que se almacenen en ella, como una cadena para un error y un objeto para la respuesta esperada. NOTA Tenga cuidado al establecer una variable como untyped (sin tipo). Esto elimina la comprobacin de errores y hace que sea difcil saber lo que contiene una variable.

Cargar XML en Flash


Es ms que probable que usted se encontrar trabajando con gran cantidad de datos. Lo ideal sera que esta informacin ser devuelto en formato XML. XML es un estndar de la industria, despus de empezar a trabajar con l rpidamente entender por qu. Se basa en las etiquetas para definir los objetos de datos, similar a una matriz multidimensional. El promotor se le permite definir etiquetas personalizadas, con tanta facilidad la construccin de un estilo de XML es muy til sin dolor.

Usar E4X con XML


Una importante actualizacin a ActionScript 3 es la capacidad para analizar XML utilizando E4X. Esto nos permite obtener rpidamente los datos ocultos en lo profundo de un archivo XML con el cdigo y mucho menos de lo necesario en las versiones anteriores. Por ejemplo, usted puede comenzar con un archivo XML como este: <store> <item> <name>Book</name> <section>Learning</section> <price>19.95</price> <inStock>yes</inStock> </item> <item> <name>Football</name> <section>Sports</section> <price>4.99</price> <inStock>no</inStock> </item> <item> <name>Bike</name> <section>Sports</section> <price>89.95</price> <inStock>yes</inStock> </item> <item> <name>Basketball</name> <section>Sports</section> <price>8.95</price> <inStock>no</inStock> </item> 106

<item> <name>Magazine</name> <section>Periodicals</section> <price>5.95</price> <inStock>yes</inStock> </item> </store> Ahora quieres cargar este archivo y mostrar slo los artculos que estn en stock. Uso E4X Esta ser una tarea muy sencilla. Usted puede comenzar con la secuencia de carga estndar que se ha visto en ejemplos anteriores. El camino hacia el archivo XML que queremos cargar en este ejemplo es storeItems.xml . var xmlFile:String = storeItems.xml; loadXML(); function loadXML():void { var urlRequest:URLRequest = new URLRequest(xmlFile); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, xmlHandler); urlLoader.load(urlRequest); } Despus de que el archivo XML se cargue completamente la funcin de xmlHandler se llama. Esta funcin est en el archivo XML que se lee y el punto donde se utiliza E4X. Esta funcin es un poco ms avanzada que la que hemos visto en los ejemplos de cdigo anteriores, de modo que la funcin se divide en piezas ms manejables. function xmlHandler(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); // Loop through all items, ONLY show items in stock for each(var item in xml..item) { if(String(item..inStock) == yes) { trace(Product: + item.name); trace(\tSection: + item.section); trace(\tPrice: + item.price); } } } El primer paso en esta funcin es tomar los datos cargados y pasar a la clase XML, que asegura que usted va a trabajar con objetos XML vlido en las siguientes secciones. var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); 107

Un for..each se utiliza en cada bucle para caminar por el archivo XML y buscar elementos que estn en stock. Este bucle tambin tiene un operador especial .. "Descendiente de acceso", que est buscando para cada elemento en el objeto XML. El "descendiente de acceso" se introdujo en ActionScript 3 para acceder a los descendientes o hijos y los hijos en los nios. Esto se hace utilizando dos operadores en la sucesin de puntos (..) seguido por el nombre del elemento descendiente. for each(var item in xml..item) { ... } Este es un avance enorme de ActionScript 2, donde se establecera bucles anidados y atravesar todo el documento XML. Sin embargo, una cosa para notar es que el descendiente de acceso es sensible a maysculas por lo que es mejor utilizar una convencin de nomenclatura coherente. <items> <item> <objectName>Example</objectName> </item> </items> La convencin de nombres ms comunes para los nombres de nodo cuando se trabaja con XML es camel-caso. Camel-case est comenzando la primera palabra con un carcter en minscula y luego la primera letra de cada palabra en mayscula. firstSecondThird Ahora que el general for..each para cada bucle define el siguiente paso aadir en la verificacin real de los artculos instock. Esto se logra mediante la creacin de una sentencia condicional para ir dentro del bucle. var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); for each(var item in xml..item) { if(String(item..inStock) == yes) { trace(Product: + item.name); trace(\tSection: + item.section); trace(\tPrice: + item.price); } } Esta parte se ve en cada elemento en el circuito, y utilizando el descendiente de acceso, busca la variable de instock. La variable instock bien se establecer en s o no, si la variable se establece en s, entonces simplemente imprimir los datos del artculo. En un ejemplo ms avanzado de estos datos lo ms probable es que se pasa a una funcin de visualizacin o, posiblemente, un componente DataGrid. Eso es todo lo que hay que buscar rpidamente a travs de un archivo XML y la comprobacin de los valores especficos del nodo. Puede ampliar este ejemplo para buscar mltiples tipos y utilizar los resultados para construir una mini-tienda que slo debe mostrar los elementos que estn en stock.

108

NOTA Al trabajar con XML es una buena idea mantener un formato coherente. Esto le permite trabajar con varios archivos sin tener que reconstruir la lgica del programa en general. Tambin es una buena idea para que pueda trabajar con otros desarrolladores en el mismo proyecto.

Trabajar con XML en PHP


En la siguiente seccin usted aprender cmo cargar y administrar los datos XML utilizando PHP. Esto le permitir desarrollar aplicaciones de forma ms dinmica.

Carga de XML
El proceso de cargar el cdigo XML en PHP se puede lograr en un par de maneras diferentes. Usted puede tomar rpidamente un vistazo a usar PHP para cargar XML porque este proceso es bastante sencillo. A continuacin, buscar la forma de crear dinmicamente y enviar datos XML. Este proceso se puede lograr en un par de maneras diferentes.

Old-fashioned Dom XML


Dom XML es la vieja manera de trabajar con XML. En cierto modo es muy similar a trabajar con XML en versiones anteriores de ActionScript. Usted necesita utilizar una serie de bucles para encontrar los nodos, y esto simplemente requiere un cdigo mucho ms de lo necesario. <?php $doc = domxml_open_file(sample.xml); $node = $doc->document_element()->first_child(); while($node) { if(($node->node_name() == sampleNode) && ($node->node_type() == XML_ELEMENT_NODE)) { $content = $node->first_child(); print $content->node_value(); break; } $node = $node->next_sibling(); } ?> NOTA El cdigo domxml requiere PHP 4.3, o bien debe tener PECL instalado por separado. Usted puede encontrar ms informacin en el sitio Web de PHP (http://us.php.net/manual/en/ref.domxml.php). El anterior ejemplo, se carga en el archivo XML y el uso de Dom XML analiza a travs de ella para encontrar el sampleNode. Trabajo en el bucle, que busca el nodo seleccionado, y cuando ese nodo se encuentra imprimir el contenido en la pantalla. No es un ejemplo muy elaborado, pero muestra el proceso general que se encuentra en un ejemplo ms avanzado.

109

Simple XML
Trabajar con XML sencillo rpidamente muestra lo fcil que se puede cargar el cdigo XML. Este bloque de cdigo es lograr el mismo resultado que antes, pero con muchas menos lneas de cdigo. Dos lneas de cdigo en lugar de 13 es una mejora considerable. <?php $xml = simplexml_load_file(sample.xml); print $xml->sampleNode;?>

Envo de XML
El proceso de envo de XML de PHP en Flash se explica en la seccin siguiente. En general, el cdigo para esto es muy similar a la carga de XML.

Imprimir dinamicamente XML


A menudo tendr que trabajar con XML dinmico. Normalmente, cuando se trata de una base de datos se convierte en una prctica mucho ms comn. El proceso de creacin de XML dinmico es muy simple: Se establece el tipo correcto de encabezado de archivo e imprimir el XML primas. El siguiente bloque de cdigo es un ejemplo de cmo alcanzar esto.

<?php header(content-type: text/xml); $xmlData = ; $xmlData .= <store>\n; $xmlData .= <item>\n; $xmlData .= <name>Book</name>\n; $xmlData .= <section>Learning</section>\n; $xmlData .= <price>19.95</price>\n; $xmlData .= <inStock>yes</inStock>\n; $xmlData .= </item>\n; $xmlData .= <item>\n; $xmlData .= <name>Football</name>\n; $xmlData .= <section>Sports</section>\n; $xmlData .= <price>4.99</price>\n; $xmlData .= <inStock>no</inStock>\n; $xmlData .= </item>\n; $xmlData .= <item>\n; $xmlData .= <name>Bike</name>\n; $xmlData .= <section>Sports</section>\n; $xmlData .= <price>89.95</price>\n; $xmlData .= <inStock>yes</inStock>\n; $xmlData .= </item>\n; // add more items here $xmlData .= </store>\n; print response= . $xmlData; ?> La lnea de la magia en este ejemplo sera la funcin de impresin que enva el XML en el bfer de salida y, finalmente, pasa a lo largo de Flash. Como puede ver, este es un ejemplo bastante simple.

110

Dinamica de XML desde la base de datos


Supongamos que quiere crear el XML de una llamada de base de datos MySQL. Una base de datos es un enfoque ms comn al desarrollar una aplicacin, porque los datos es a menudo dinmico. Imprime esttica en el caso no sera muy fcil de mantener. Aqu est el cdigo, que se desglosan y se ha ido a travs de. <?php header(content-type: text/xml); $query = SELECT * FROM store WHERE inStock=yes; $link = mysql_connect(localhost, user, pass); $result = mysql_query($query, $link); $xmlData = ; $xmlData .= <store>\n; while($row = mysql_fetch_array($result)) { $xmlData .= <item>\n; $xmlData .= <name> . $row[name] . </name>\n; $xmlData .= <section> . $row[section] . </section>\n; $xmlData .= <price> . $row[price] . </price>\n; $xmlData .= <inStock> . $row[inStock] . </inStock>\n; $xmlData .= </item>\n; } $xmlData .= </store>\n; print response= . $xmlData; ?> Usted mir a cargar el contenido de una base de datos en el captulo 2, y en su mayor parte es el mismo proceso. En realidad, la nica diferencia se encuentra dentro del bucle while. Este es el punto en el que construir la estructura de rbol XML y, finalmente, la impresin de la respuesta de vuelta a Flash. Ah lo tienen formas mltiples para enviar y cargar datos XML en PHP y Flash. Usted puede tomar estos ejemplos sencillos y construir aplicaciones completas. De hecho, usted ser sobre la base de este ejemplo en el captulo 11 para el ejercicio de la Mini cesta de compras.

Cargar imagenes usando PHP


ActionScript puede cargar mucho ms que simple texto y archivos XML. Un concepto ms avanzado es cargar las imgenes, pero usted tendr que un paso ms y las imgenes de carga determinada por un archivo PHP. Cargue el archivo de arranque que se puede encontrar en los libros de sitio Web. Este archivo tiene un UILoader y un TileList vertical para mantener las imgenes, como se muestra en la Figura 4.1. El contenido de este archivo no son particularmente importantes para este ejemplo, pero usted puede experimentar con otros componentes para construir aplicaciones ms avanzadas.

111

FIGURE 4.1

Mostrando la solicitud completa con imgenes cargadas

Configurar cargador de la imagen


El primer paso para construir el cargador de la imagen es la construccin de la parte de ActionScript de la solicitud, que se muestra aqu. El siguiente cdigo asume que el thumbSP ScrollPane ya se encuentra en la etapa. var xmlFile:String = http://localhost/ch03/loadImages.php; var imageDir:String = images/; function callServer(e:MouseEvent):void { var urlRequest:URLRequest = new URLRequest(xmlFile); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, xmlLoaded); loader.load(urlRequest); } function xmlLoaded(e:Event):void { var loader:URLLoader = URLLoader(e.target); var xml:XML = new XML(loader.data); var thumbContainer:TileList = thumbSP; thumbContainer.removeAll(); 112

thumbContainer.sourceFunction = sourceHandler; thumbContainer.addEventListener(Event.CHANGE, loadMainImage); for each(var item:XML in xml..product) { var smImage:String = item.smImage.toString(); var lgImage:String = item.lgImage.toString(); thumbContainer.addItem({source:{sm:smImage, lg:lgImage}}); } } function sourceHandler(item:Object):String { return imageDir + item.source.sm; } function loadMainImage(e:Event):void { imageUI.source = imageDir + e.target.selectedItem.source.lg; } callBtn.addEventListener(MouseEvent.CLICK, callServer); Este ejemplo tiene un cdigo exclusivamente para trabajar con los componentes, que no es necesario para entender en este punto. Sin embargo, la funcin de cargador de xmlLoaded es el foco. El primero, xmlLoaded, se utiliza para caminar por el archivo XML cargado y las imgenes en miniatura en el componente TileList. Notar que el XML uso E4X para encontrar los nodos de la imagen. Este ejemplo asume que los nodos a ser llamado producto, que es donde la imagen de las fuentes pequeas y grandes se pueden encontrar. Se utiliza el mtodo addItem para pasar en un objeto que contiene la imagen de las fuentes pequeas y grandes. Esto ahorra tiempo al escribir la lgica de hacer clic en una miniatura. Los incendios TileList fuera un evento de cambio cuando se hace clic en un tema. Esto se utiliza para conectar el controlador, que carga la imagen grande. thumbContainer.addEventListener(Event.CHANGE, loadMainImage); function loadMainImage(e:Event):void { imageUI.source = imageDir + e.target.selectedItem.source.lg; } El controlador de sourceFunction se utiliza para agregar en la ruta de acceso a las imgenes. Esta funcin se llama cada vez que un elemento se agrega a la TileList. thumbContainer.sourceFunction = sourceHandler; function sourceHandler(item:Object):String { return imageDir + item.source.sm; }

113

Resumen
En este captulo usted aprendi cmo enviar y cargar datos usando PHP y Flash que luego se ampli a este mediante el envo y carga de datos XML, que le ha permitido desarrollar una aplicacin ms dinmica . Ahora debe tener un buen entendimiento de cmo trabajar con datos en Flash y PHP. Tambin aprendi algunas de las razones diferentes por las cuales usted debe usar una forma especfica de datos en la aplicacin.

114

Capitulo 5 Interactuar con el Usuario


La aplicacin muchas veces tienen algn nivel de interaccin con el usuario final para enriquecer la experiencia de aplicacin general. Esto es ms comn de un contacto o algn otro tipo de formulario, que permite que el dueo del sitio, para permitir la comunicacin sin dar una direccin de correo electrnico o que requieren que el usuario tenga un cliente de correo electrnico. Otra forma que usted encontrara en una aplicacin es una forma de acceso, que le permite limitar el acceso a determinados aspectos o partes de su aplicacin. En este captulo se explicar el proceso de construccin de formulario en Flash y cmo hacerlas interactivas usando PHP. Tambin obtendr una visin general de envo de datos mediante Flash, sin embargo, te recomiendo leer el captulo 4 para entender completamente el proceso de envo y carga de datos.

Desarrollo de un Formulario usando Flash


Los formularios generalmente consisten en cuadros de entrada, botones, cuadros de lista y botones de radio, como se muestra en la Figura 5.1. Cada uno de estos elementos est disponible como un componente de Flash. Puedes acceder al panel de componentes eligiendo Window Componentes. Usando uno de estos componentes precompilados es tan simple como hacer clic y arrastrndolo a una capa en el documento de Flash. FIGURA 5.1 Ejemplo de formulario construido usando los componentes por defecto que vienen con Flash

NOTA Si el componente no aparece en el escenario, garantizar la capa no muestra un icono de llave en la lista de capas. Si ejecut esta pelcula Flash, se veran algunos componentes frescos en el escenario, pero no seran funcionales. El proceso de su utilizacin es muy sencilla. Se asigna un nombre de instancia del componente y el nombre de referencia en el cdigo ActionScript.

115

Por ejemplo, si usted tena un TextInput y quera que cebado, debe agregar el siguiente: textInstance.text = please enter your name; Tan til como el cdigo es, tambin debe capturar la entrada del usuario. Esto se logra mediante la adicin de un componente de botn Enviar al escenario. userName.text = please enter your name; submitBtn.addEventListener(MouseEvent.CLICK, submitHandler); function submitHandler(e:MouseEvent):void { trace(User input: + userName.text); } Puede ampliar este ejemplo para aadir la comprobacin de errores y hacer cumplir los campos obligatorios: function submitHandler(e:MouseEvent):void { if(userName.text.length == 0) { trace(Please enter a name!); } } Muy a menudo, usted querr obtener informacin de un visor de su sitio. Esto se logra mediante la adicin de un formulario de contacto, que generalmente consta de un formulario de Flash que las conversaciones en un archivo PHP.

Creacin de un formulario de contacto


Para esta seccin, usted va a utilizar el archivo de inicio que se incluye en el sitio Web del libro. Este archivo tiene todos los componentes situados en el MovieClip contactMC ya en el escenario y se le ha asignado los nombres de instancia que va a utilizar en el cdigo ActionScript. Aqu est el ActionScript completo del formulario de contacto: var phpFile:String = http://localhost/ch04/contact.php; var form:MovieClip = contactMC; function sendMessage(e:MouseEvent):void { // first check the fields var nameStr:String = form.nameTxt.text; var subjectStr:String = form.subjectTxt.text; var messageStr:String = form.msgTxt.text; var allFields:Boolean = true; // check name if(nameStr.length < 2) { allFields = false; } // check subject 116

if(subjectStr.length < 2) { allFields = false; } // check message if(messageStr.length < 2) { allFields = false; } if(!allFields) { trace(All required fields not filled in!); form.statusTxt.htmlText = <font color=\#FF0000\>+ All required fields not filled in!</font>; return; } var variables:URLVariables = new URLVariables(); variables.name = nameStr; variables.subject = subjectStr; variables.msg = messageStr; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.method = URLRequestMethod.POST; urlRequest.data = variables; var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, sendHandler); loader.load(urlRequest); } function sendHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); if(variables.resultCode == SENT) { // message sent form.statusTxt.htmlText = <font color=\#009933\>Email+ sent, thank you.</font>; } else if(variables.resultCode == ERROR) { // message not sent form.statusTxt.htmlText = <font color=\#FF0000\>Email+ not sent, please try again.</font>; } else { // unknown response form.statusTxt.htmlText = <font color=\#FF0000\>Unknown + ERROR</font>; } } form.sendBtn.addEventListener(MouseEvent.CLICK, sendMessage);

117

El enfoque de esta seccin estar en las funciones sendMessage y sendHandler. La funcin sendMessage asigna las variables que se pasan a la PHP, crea instancias de las clases necesarias, y establece el caso de oyentes (event listeners). function sendMessage(e:MouseEvent):void { ... var variables:URLVariables = new URLVariables(); variables.name = nameStr; variables.subject = subjectStr; variables.msg = messageStr; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.method = URLRequestMethod.POST; urlRequest.data = variables; var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, sendHandler); loader.load(urlRequest); } CROSS--REF Parte del cdigo en la seccin anterior se explica en mayor detalle en el captulo 4.

LLamar el PHP
La llamada a la PHP se divide en tres clases: la clase URLVariables, URLRequest y URLLoader, los trabajos de los cuales son la creacin de un contenedor para los datos del formulario de contacto, hacer un objeto de solicitud y, finalmente, llamar al archivo PHP. Las clase URLVariables tiendas de los datos de contacto del formulario en un formato de objeto nombre.valor, que luego se adjunta a la propiedad de los datos de la URLRequest. El URLRequest establece un mtodo de peticin mediante la propiedad POST esttico de la clase URLRequestMethod, que indica a Flash si desea enviar los datos en formato GET o POST. GET enva los datos a cabo adjunta al final de la URL: file.php?var1=value1&var2=value2 POST enva los datos en la solicitud, que en la mayora de los casos es ms seguro. La ltima clase utilizado en este formulario de contacto es URLLoader. Esta clase aade el detector de eventos que se llama cuando el PHP se ha cargado completamente y cualquier respuesta que se espera ha sido devuelto. Esta clase tambin hace una llamada a la mtodo load(), pasando por una referencia a la URLRequest. En ltima instancia, hace la llamada al PHP y pasa a lo largo de las variables de formulario de contacto que ha asignado. Eso es todo lo que se necesita para configurar y realizar la llamada al PHP.

118

Controladores de evento en formulario de contacto


El siguiente paso en el proceso es establecer el controlador de eventos que se llama cuando el PHP enva una respuesta. function sendHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); if(variables.resultCode == SENT) { form.statusTxt.htmlText = <font color=\#009933\>Email+ sent, thank you.</font>; } else if(variables.resultCode == ERROR) { form.statusTxt.htmlText = <font color=\#FF0000\>Email+ not sent, please try again.</font>; } else { form.statusTxt.htmlText = <font color=\#FF0000\>Unknown + ERROR</font>; } } Usted notar rpidamente que la clase URLLoader se utiliza de nuevo, pero esta vez para obtener la respuesta de PHP. Este se coloca en la clase URLVariables para sacar el resultado de la respuesta global. El PHP est configurada para simplemente responder con un mensaje SENT (enviado) o respuesta de error (ERROR response), sin embargo, tambin usar una instruccin ms para atrapar cualquier respuestas desconocidas, algunos de los cuales podran incluir errores de red o de simples errores de anlisis en el cdigo PHP. Un componente Label se encuentra en el formulario de contacto MovieClip, que es donde la respuesta se enva al usuario a ver. En una escritura ms avanzado que volvera ms probable es que una serie de resultados y dejar el texto de respuesta en el Flash, lo que permitira la capacidad de adaptar las respuestas a determinados idiomas, tambin llamada localizacin. Con la creacin de ActionScript, puede pasar al cdigo de PHP: <?php error_reporting(0); // disable all error reporting set_time_limit(120); // let script run for no more than 2 minutes $emailTo = you@yourdomain.com; $name = $_POST[name]; $from = $_POST[fromEmail]; $subject = $_POST[subject]; $msg = $_POST[msg]; if(!empty($_POST)) 119

{ $headers = ; $headers .= ; $date = date(F j, Y, time()); // Grab todays date $email_info .= Below is the visitors contact info and message.\n\n; $email_info .= Visitors Info:\n; $email_info .= -----------------------------------------\n; $email_info .= Name: . $from . \n; $email_info .= Date Sent: . $date . \n\n; $email_info .= Message\n; $email_info .= -----------------------------------------\n; $email_info .= . $msg . \n; // Mail headers, do not alter $mailheaders = From: . $from . < . $name . > \n; $mailheaders .= Reply-To: . $from . \n\n; if(mail($emailTo, $subject, $email_info, $mailheaders)) { print resultCode=SENT; } else { print resultCode=ERROR; } } ?>

Correo en PHP
La mayor parte de este PHP es similar a lo que han estado trabajando en las secciones anteriores, con algunas excepciones, por supuesto. La excepcin ms notable es la introduccin de la funcin mail(), que tiene una serie de argumentos: mail($to, $subject, $emailBodyInfo, $emailHeaders); Los dos primeros son el correo electrnico para enviar y de asunto del correo electrnico, que es bastante estndar. Los dos ltimos son los ms importantes: $emailBodyInfo contiene el contenido de su e-mail, y $emailHeaders define el archivo como un e-mail. Esta variable contiene la informacin de enrutamiento, la respuesta a, y todos los otros variablese-mail specifican que un servidor de correo busca.

Globales
Asigna variables para contener los datos en el pasado de Flash, que se realiza mediante el global $_POST datos de matriz. Globales en PHP manejar la informacin general de los terrenos y los valores que cualquier secuencia de comandos tiene acceso. Usted va ms razones por las globales puede ser el enfoque equivocado en el captulo de seguridad. Volviendo a tu programa de correo electrnico, el uso de la variable de los datos globales $_POST para acceder a las variables pasadas desde Flash. 120

$emailTo = you@yourdomain.com; $name = $_POST[name]; $from = $_POST[fromEmail]; $subject = $_POST[subject]; $msg = $_POST[msg]; Eso es todo el cdigo que se necesita para desarrollar un formulario de contacto completamente funcional usando Flash y PHP. Usted puede ampliar en este ejemplo y dar al formulario de contacto mucha ms funcionalidad. Algunas cosas para pensar en aadir sera un proceso de validacin ms robusta, ms campos de formulario, y las respuestas, posiblemente, ms informativo para el usuario.

Mantener la seguridad en mente


Un elemento muy importante tener en cuenta acerca de este ejemplo formulario de contacto es el cdigo no honra los procedimientos de seguridad y de hecho permite al usuario pasar los datos a PHP. Un ejemplo ms slido y directo exigira un nivel mucho ms fuerte de la seguridad, sin embargo, para fines de demostracin general de seguridad ha quedado fuera.

Mdulo de Login en Flash


Ms a menudo que no se quiere tener una parte segura de un sitio Web. Un ejemplo muy popular de esto sera una seccin de repaso para un fotgrafo, cuando un cliente puede ingresar y ver las fotos. La porcin del formulario de esta aplicacin es casi idntica al formulario de contacto. Se necesita un nombre cuadro de usuario y de Contrasea y un botn Enviar a fuego fuera de la rutina de controlador de inicio de sesin. Aqu hay un diseo de muestra que se puede encontrar en el archivo de partida, o usted puede crear a partir de cero. Los nombres de instancia para este ejemplo se muestran en la Tabla 5.1. TABLA 5.1

Componentes de Formulario para el modulo de Login


usernameTxt passwordTxt resetBtn loginBtn Nombre de usuario para iniciar sesin Password to be attempted Boton de reinicio, limpiar los campos Boton de inicio de sesion, encender el loginHandler

Ahora que tiene el formulario visual completo, puede pasar al ActionScript, lo que hace que el formulario sea funcional.

Cdigo esqueleto
En los ejemplos anteriores, usted mir todo el cdigo en una seccin larga, pero a veces puede ser abrumadora. En cuanto a la estructura de cdigo ofrece una manera rpida de evaluar las variables de programa, las funciones, y otros elementos. 121

Aqu est el esqueleto de cdigo para el mdulo de Login (inicio de sesin): stop(); // stop the playhead var phpFile:String = http://localhost/ch04/login.php; var form:MovieClip = loginMC; var loggedIn:Boolean = false; function function function function loginHandler(e:MouseEvent):void {...} resetHandler(e:MouseEvent):void {...} clearIndicators():void {...} sendHandler(e:Event):void {...}

form.usernameTxt.tabIndex = 1; form.passwordTxt.tabIndex = 2; form.resetBtn.tabIndex = 3; form.loginBtn.tabIndex = 4; form.passwordTxt.displayAsPassword = true; form.resetBtn.addEventListener(MouseEvent.CLICK, resetHandler); form.loginBtn.addEventListener(MouseEvent.CLICK, loginHandler);

Controladores de eventos en Login


Similar al ejemplo de formulario de contacto, es necesario asignar los controladores de eventos que manejan la informacin de acceso, la compensacin, y los cambios de interfaz de usuario para el mdulo de inicio de sesin (login). El primer controlador de eventos es loginHandler, que es responsable de llamar al servidor de datos y garantizar la validez se pasa al servidor. Su ltima tarea es asignar el controlador para el evento resultado. function loginHandler(e:MouseEvent):void { clearIndicators(); var user:String = form.usernameTxt.text; var pass:String = form.passwordTxt.text; var allFields:Boolean = true; if(user.length < 2) { allFields = false; form.userRequiredIndicator.alpha = 1.0; } if(pass.length < 2) { allFields = false; form.passRequiredIndicator.alpha = 1.0; } 122

if(!allFields) { form.statusTxt.htmlText= <font color=\#FF0000\>Username + and Password required!</font>; return; } var variables:URLVariables = new URLVariables(); variables.user = user; variables.pass = pass; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.method = URLRequestMethod.POST; urlRequest.data = variables; var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, sendHandler); loader.load(urlRequest); } Este controlador comienza por asignar el nombre de usuario y contrasea para campos variables internas. Estas nuevas variables, luego se comprueba la longitud vlido, que si se establece correctamente la variable allFields. Esta variable allFields se utiliza para determinar si el mensaje de error se debe mostrar y la funcin se debe abandonar el mismo. Si allFields no se establece que puede continuar la creacin de la llamada al servidor. Esta parte es idntico al ejemplo de formulario de contacto. De hecho, pronto se dar cuenta de que ActionScript tiene un formato muy similar para todos los tipos de carga y el envo de datos. El siguiente controlador se centrar en clearHandler, es la que se asigna al resetBtn. Su trabajo consiste en borrar todos los campos del formulario y hacer una llamada a la funcin clearIndicators, que se ver en un momento. function resetHandler(e:MouseEvent):void { form.usernameTxt.text = ; form.passwordTxt.text = ; form.statusTxt.htmlText = ; clearIndicators(); } La funcin clearIndicators cambia la opacidad alfa de los iconos que se pueden encontrar a la derecha de los componentes de TextInput nombre de usuario y contrasea en el archivo de arranque. Si est creando este mdulo desde el principio lo ms probable es omitir esta funcin y la llamada a ella en el resetHandler. function clearIndicators():void { form.userRequiredIndicator.alpha = 0; form.passRequiredIndicator.alpha = 0; } El ltimo controlador necesario para este mdulo es el sendHandler, que se llama cuando el cdigo PHP enva una respuesta. 123

function sendHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); if(variables.resultCode == LOGGED_IN) { loggedIn = true; gotoAndStop(2); } else if(variables.resultCode == NOT_LOGGED_IN) { form.statusTxt.htmlText = <font color=\#FF0000\>+ Username/Password not correct.</font>; } } La respuesta que pasa de PHP es evaluada para determinar si el usuario es vlido y si o no a la pgina segura debe mostrarse. if(variables.resultCode == LOGGED_IN) { loggedIn = true; // user logged in, gotoAndStop(2); // sample has secure page on frame 2 } else if(variables.resultCode == NOT_LOGGED_IN) { form.statusTxt.htmlText = <font color=\#FF0000\>+ Username/Password not correct.</font>; } Suponiendo que el usuario est conectado, usted establece una variable de loggedIn y pasar al segundo cuadro, que en el ejemplo de arriba es una seccin secreta, como se muestra en la Figura 5.2. Su ejemplo ms probable es que tenga una razn ms importante para estar conectado, pero tal vez no.

124

FIGURA 5.2 Ejemplo de pgina segura que slo es visible si el usuario se registra

Integracin del Servidor para el modulo de login


El cdigo PHP para el mdulo de conexin es la siguiente parte en el proceso. <?php error_reporting(0); // deshabilitar todos los reports de error $user = $_POST[user]; $pass = $_POST[pass]; // ejemplo de respuesta de contrasea, normalmente // se envia desde la base de datos $storedPassword = 83e4a96aed96436c621b9809e258b309; if(!empty($_POST)) { if($user == guest && md5($pass) == $storedPassword) { print resultCode=LOGGED_IN; } else { print resultCode=NOT_LOGGED_IN; } } ?> Su enfoque en esta seccin est en los datos de $_POST y comprobar condicional para determinar si la contrasea es correcta o no. Este resultado se enva de regreso a Flash en el que se utiliza para establecer registrado en el estado y todo lo que un usuario vlido a ver. 125

Un ejemplo ms slido tendra el PHP se evaluar en una base de datos en lugar de una cuerda esttica. La variable $storedPassword tiene una cadena md5() de hash. MD5 es un algoritmo de hash que est disponible en muchos lenguajes de programacin, uno de los cuales es PHP y es ms frecuente al almacenar contraseas en una base de datos. Usted va a mirar MD5 un poco ms en profundidad en el captulo de seguridad, pero por ahora lo ms importante a destacar es que la cadena de hash es su contrasea. Ahora dispone de un mdulo de inicio de sesin completo utilizando Flash y PHP. Desde aqu se puede ampliar este ejemplo para incluir la integracin de bases de datos y ms importante, un nivel adicional de seguridad.

Resumen
En este captulo usted aprendi cmo construir formulario en Flash y cmo hacerlas interactivas usando PHP. Como un proyecto ms avanzado que cre entonces un componente de inicio de sesin utilizando la informacin anterior, aprendi acerca del desarrollo de forma global.

126

Capitulo 6 Trabajar con Cookies


Las cookies son muy comunes en la navegacin Web. De hecho, usted sera muy difcil de navegar la Internet en la forma en que estamos acostumbrados a las cookies, si dej de funcionar. Este captulo es cmo trabajar con las cookies de Flash y PHP. Cubre la carga y el envo de cookies y se investiga cmo se elimina una cookie. La segunda mitad del captulo es acerca de compartir los objetos, que son las cookies de Flash. Actan casi lo mismo que las cookies del navegador estndar con algunas diferencias, que se investigue. Una vez que haya completado este captulo, entenderemos completamente la forma de trabajar con las cookies y por qu son importantes para una aplicacin exitosa y la experiencia del usuario.

Cargar Cookies
Una cookie es un archivo pequeo colocado en el ordenador del usuario por un servidor Web. Este archivo se enva de nuevo al servidor sin cambios cada vez que el usuario accede al servidor. Mayora de las veces una cookie contendr el nombre de usuario para un sitio Web. Una cookie tambin puede ser utilizado para guardar la configuracin del usuario y de los dems pequeos de la informacin. El proceso de carga de las cookies se explica en varias piezas para comprender mejor cmo funcionan. Usted notar que el proceso de carga "cookies" es muy similar a la carga de otros tipos de datos.

Uso de cookies con PHP


El uso de cookies con PHP es necesario para desarrollar una aplicacin web usable. Usted encontrar muchas oportunidades para aplicar las cookies de sesin de usuario a los estilos y muchos otros usos. Al empezar a trabajar con datos dinmicos ms a menudo se desea guardar partes de la mquina del usuario. Hacer esto permite que el programa de registro de un usuario de forma automtica o modificar un estilo basado en la configuracin del usuario. Las cookies se guardan por dominio y el directorio. Esto significa que cualquier pgina dentro del mismo dominio o ruta de acceso puede leer que "cookie". Esto es muy til cuando se construyen mltiples ejemplos y tambin significa otro sitio Web no puede leer las cookies de un sitio diferente. NOTA La solucin comn para el intercambio de cookies a travs de un dominio es crear un subdominio. Una cookie es slo especfico para el dominio global y simplemente hace caso omiso de caminos, parmetros, y subdominios.

Cargar una cookie


Ahora que tiene una comprensin de lo que es una "cookie", echar un vistazo a cmo cargar y trabajar con uno en PHP: El cdigo siguiente intenta cargar una "cookie" y mostrar la respuesta como se muestra en la Figura 6.1 127

<?php $username = Jimmy; if (!isset($_COOKIE[user])) { setcookie(user, $username); print Welcome . $username; } else { Print Welcome back, . $_COOKIE[user]; } ?> Los controles de cdigo anterior de la existencia de la cookie "usuario" en la matriz mundial de las cookies. Si se encuentra la cookie, el usuario es recibido de nuevo. Si la cookie no se encuentra, la cookie y el usuario es recibido por primera vez. La variable $_COOKIE es una matriz multidimensional que puede contener muchas cookies diferentes. Esta variable se llena automticamente por PHP y no requiere que usted agregue a la misma. FIGURA 6.1 La declaracin de impresin como se muestra en la ventana del navegador

128

Guardar un cookie
Establecer o guardar una cookie en PHP es muy simple: usted hace una llamada a la funcin setcookie. El primer argumento es el nombre de la cookie, el segundo argumento es el valor de la cookie. Por ejemplo, supongamos que desea establecer una cookie time_logged_in. setcookie(time_logged_in, time()); Cada vez que desee guardar una cookie puede llamar a la funcin setcookie. Si la cookie existe, se actualiza, y si no existe, se crea. NOTA La capacidad para guardar una cookie depende de si un usuario permite o no cookies.
La funcin setcookie acepta ms de dos argumentos, pero en realidad slo se requiere que el primer argumento, que es el name (nombre).

Caducidad de un Cookie
Por defecto, una cookie expira cuando termina el perodo de sesiones o el usuario cierra el navegador. La forma en que la sesin termina, es por una cantidad de tiempo predefinido en el servidor. Por defecto, esta cantidad es 0 segundos porque la sesin se termina cuando el navegador se cierra. Normalmente, el desarrollador no necesita saber cunto tiempo dura una sesin. Usted, por supuesto, estar ms interesados en existe o no la cookie. En ocasiones, usted querr asegurarse de que una cookie se borra despus de una cierta cantidad de tiempo. Este es el caso cuando se trabaja con datos de seguridad o un sistema de gestin de contenidos. Supongamos que usted quiere que la cookie expire poco despus de creada la cookie. setcookie(username, adminDave, (time() + 7200)); Esto le dice el navegador del usuario para eliminar la cookie de 2 horas despus de crear la cookie. La fecha de caducidad de una cookie es en segundos, as que para este ejemplo, 7200 es de 2 horas. Otra forma de verlo es (60 * 60 * 2). Alguna vez has abierto tu navegador, visita un sitio, y se introdujeron al contenido personalizado que se haba solicitado en una sesin anterior? Estos datos se determin mediante una cookie guardado en su equipo que no se eliminan cuando finaliza el perodo de sesiones. Mira un ejemplo de una cookie que no expira durante tres meses. <?php $secondsInDay = 86400; $daysBeforeExpiration = 90; setcookie(userStylePref, blueTheme, (time() + ($secondsInDay * $daysBeforeExpiration)); ?> Se comienza con el nmero de segundos en un da 86400. Luego de configurar la variable $daysBeforeExpiration que es la celebracin de das que desea que la "cookie" dure. 129

El ltimo paso es establecer la cookie. Multiplique el segundo por el da, aadir a la funcin time(), y esto se convierte en su fecha de vencimiento. Tres meses es slo un ejemplo, puede establecer un cookie expire aos ms tarde. Sin embargo, los usuarios tienen una tendencia a limpiar su almacenamiento de navegador. Por lo tanto, nunca debe permitir que una aplicacin se base en la existencia de una "cookie".

Eliminar una cookie


En algn momento de su aplicacin, usted probablemente querr eliminar una cookie. Sin embargo, el navegador de Internet locales que el usuario est en no permitir que un servidor Web directamente eliminar una cookie. En su lugar, establezca la fecha de caducidad tras la fecha actual y, bsicamente, hacer que la cookie expire. Esto le indica al navegador Web para borrar la cookie, porque ya no est en uso. setcookie(time_logged_in, , (time() - 300));

Asignar mltiples cookies


El proceso de asignacin de cookies mltiples es bastante sencillo. Es, bsicamente, hacer varias llamadas a la funcin setcookie para garantizar que cada cookie tienga un nombre nico.

<?php $username = jimmy; $userID = 5; $loggedInTime = time(); setcookie(username, $username); setcookie(userid, $userID); setcookie(logged_in_since, $loggedInTime); ?> El cdigo anterior establece tres cookies haciendo tres llamadas a la funcin nica setcookie. Tambin puede realizar la llamada setcookie en una funcin personalizada si el cdigo passed-in requiere ms seguridad. Por ejemplo, puede crear una funcin saveCookie que garantice el dato est limpio <?php function saveCookie($name, $value, $expires=0) { if($name == ) { print Name not provided, cookie not saved ; } if($value == ) { print Value not provided, cookie not saved ; } setcookie($name , $value, $expires); } $username = jimmy ; 130

$userID = 5; $loggedInTime = time(); saveCookie( username , $username); saveCookie( userid , $userID); saveCookie( logged_in_since , $loggedInTime); ?> Su funcin saveCookie se utiliza como proxy para la funcin setcookie precompilados. Esto le permite comprobar el pasado en los datos y asegurarse de que ha sido debidamente cumplimentado. En el ejemplo anterior, se imprime un error si el nombre o el valor est vaco. Usted puede aprovechar esta seguridad simple comprobar un paso ms all al asegurar que los datos es, de hecho, una cadena y no contiene ningn cdigo potencialmente malicioso. Al empezar a desarrollar aplicaciones Web que va a aprender a seguir las normas rgidas en lo que se refiere a la seguridad. Ahora que han visto cmo usar cookies en PHP, usted puede buscar en el uso de "cookies" en Flash. El proceso de usar las cookies en Flash es muy similar, pero ofrece algunas ventajas que usted va a mirar.

Uso de cookies en Flash


Las cookies de Flash en realidad se llaman objetos compartidos y compartimos atributos similares a las cookies en PHP. Algunos de estos atributos incluyen la capacidad de almacenar pequeas cantidades de datos a nivel local y recuperarlos por cualquier archivo en el dominio bsico. Al igual que las cookies en PHP, el usuario tiene la posibilidad de desactivarlas por sitio o el mundo. Sin embargo, tienen algunas diferencias. Una ventaja importante a los objetos compartidos es la capacidad de unirse a ellos. Esto significa varias pelculas tienen la capacidad de ver el expediente y recibir una alerta cuando se actualiza. Por ejemplo, supongamos que tiene un juego multijugador, y queremos que cada cliente para seguir la partitura en sincrona. Con los objetos compartidos puede permitir que cada uno de los clientes de lectura/escritura de acceso y los otros actualizarn los cambios de puntuacin.

Cargar Objetos compartidos


El cdigo siguiente intenta cargar un objeto compartido y crea uno si no existe. Como puede ver, cargar un objeto compartido es bastante simple y slo requiere una lnea de cdigo. Cookies en PHP no ofrecen la posibilidad de crear uno de forma nativa, si no existe, hay que comprobar la cookie y crear manualmente. var so:SharedObject = SharedObject.getLocal(sample); trace(Object is + so.size + bytes in size);

Guardar objetos compartidos


El proceso de guardar un objeto compartido es tambin sencillo. Comience por crear una nueva instancia de la clase SharedObject. var so:SharedObject = SharedObject.getLocal(sample); Despus de que el objeto se crea, puede adjuntar los datos del objeto compartido para aadir elementos a los datos del objeto, como: 131

var so:SharedObject = SharedObject.getLocal(sample); so.data.user = guest; Usted puede llamar y recordar que por encima de bloque de cdigo y el valor no se guarda todava. La razn es porque es necesario alertar a los objetos para escribirlo en el sistema de archivos local, llamando al mtodo flush. var so:SharedObject = SharedObject.getLocal(sample); so.data.user = guest; so.flush(); NOTA Al usar flush (), comprueba si el usuario tiene almacenamiento local deshabilitado mediante el Administrador de configuracin (www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager07.html). Si el objeto no existe, se crea uno. En algunos casos, usted querr saber si el objeto compartido existe. La manera de lograrlo es mediante el control de la propiedad de tamao. var so:SharedObject = SharedObject.getLocal(sample); if(so.size == 0) { // Shared object doesnt exist. trace(Shared Object doesnt exist.); } Suponiendo que el tamao de la prueba volvi igual a cero, usted sabrr que el objeto compartido no existe. A continuacin, puede tomar este resultado y sustituir la simple traza con el cdigo para crear el objeto. var so:SharedObject = SharedObject.getLocal(sample); if(so.size == 0) { // Shared object doesnt exist. so.data.user = guest; }

Eliminar objeto compartido


A diferencia de PHP, los objetos compartidos de forma explcita se puede eliminar del sistema de almacenamiento local. Realizar una llamada al mtodo clear() elimina el objeto compartido y sus datos, pero la referencia al objeto permanecer. var so:SharedObject = SharedObject.getLocal(sample); so.data.user = guest; trace(Username is: + so.data.user); // guest so.clear(); trace(Username is: + so.data.user); // undefined 132

El segundo trace devuelve indefinido debido a que la llamada anterior a clear() ha suprimido el valor. Ahora puede volver a asignar el valor. Sin embargo, no es necesario eliminar un objeto para reasignarlo. Usted simplemente puede volver a escribir a la misma.

Acercar a todos juntos


Ahora que usted ha mirado en cada concepto individual, llevar todo en un ltimo ejemplo. En este ejemplo se va a crear, guardar, editar y borrar un objeto compartido. Comience por abrir el archivo de partida que se pueden encontrar en el sitio Web del libro, que ha sido precompilados para este ejemplo. Despus de abrir el fichero en Flash, abra el panel de acciones (presionar la tecla F9 o Alt + F9) y aadir el cdigo ActionScript. var soDomain:String = sample; var so:SharedObject = null; function loadObject():void { so = SharedObject.getLocal(soDomain); trace(Shared Object Loaded); } function addDataToObject(name:String, value:String):void { if(so == null) { trace(You must first load the Shared Object); } so.data[name] = value; so.flush(); trace(Value added: + so.data[name]); } function deleteObject():void { if(so == null) { trace(You must first load the Shared Object); } so.clear(); trace(Shared Object deleted); } function readObject(name:String):void { if(so == null) { 133

trace(You must first load the Shared Object); } else { trace(Shared Object Value : + so.data[name]); } } function loadHandler(e:MouseEvent):void { loadObject(); } function saveHandler(e:MouseEvent):void { addDataToObject(test, valueTxt.text); } function deleteHandler(e:MouseEvent):void { deleteObject(); } function readHandler(e:MouseEvent):void { readObject(test); } loadBtn.addEventListener(MouseEvent.CLICK, loadHandler); saveBtn.addEventListener(MouseEvent.CLICK, saveHandler); deleteBtn.addEventListener(MouseEvent.CLICK, deleteHandler); readBtn.addEventListener(MouseEvent.CLICK, readHandler); Las partes ms importantes de este cdigo es addDataToObject y la funcin de dos variables que son referencias a los objetos compartidos: nombre de la propiedad y el valor a la tienda. var soDomain:String = sample; var so:SharedObject = null; function addDataToObject(name:String, value:String):void { ... } La funcin addDataToObjectcomprueba para asegurarse de que el objeto compartido se ha cargado correctamente y los intentos de asignar el valor utilizando un objeto dinmico. function addDataToObject(name:String, value:String):void { if(so == undefined) { trace(You must first load the Shared Object); } so.data[name] = value; 134

so.flush(); } Despus de llamar la funcin addDataToObject, se puede leer en el objeto compartido simplemente haciendo un llamado a los datos del objeto. trace(Shared Object Data: + so.data.test); Eso es todo lo que hay que trabajar con objetos compartidos en Flash. Ahora ya sabe cmo cargar, guardar y eliminar los objetos compartidos y las cookies de Flash. NOTA Los objetos compartidos tambin se pueden utilizar en un entorno remoto, pero requieren un sistema ms avanzado.

Descubrir los beneficios de cookies en PHP


Ahora que han estudiado el uso de cookies, tanto en PHP y Flash, veamos algunas razones por las que el uso de cookies en PHP es una mejor opcin. Cuando se trabaja en Flash, parece que los objetos compartidos son la mejor opcin, pero no siempre lo son. Cookies en PHP ofrecen la posibilidad de compartirlos entre sitios HTML y Flash. Los objetos compartidos slo son accesibles desde dentro de Flash, que pueden ser tanto buenos como malos. El lado bueno es que ninguna otra aplicacin puede cambiar las cookies. En el lado malo, sino que tambin significa que no puede compartir y agregar un nivel de coherencia entre las aplicaciones. Hay una solucin bastante comn a este problema, sin embargo, que es regular el uso de cookies en Flash, pasando a travs de un intermediario de PHP. En primer lugar, mirar el cdigo PHP que har llegar la informacin de la cookie de vuelta a Flash. <?php if(isset($_POST[act]) && $_POST[act] == getcookie) { if(isset($_COOKIE[$_POST[cookieName]])) { print resp= . $_COOKIE[$_POST[cookieName]]; } else { print resp= . cookie_not_found; } } ?> Este cdigo garantiza los datos POST adecuados se enven antes de continuar. Suponiendo que los datos vlidos se pasa, el siguiente paso es determinar si la cookie, de hecho, existe. Utilice una prueba condicional para determinar si los datos de la cookie o un mensaje de error ser enviado a Flash. if(isset($_COOKIE[$_POST[cookieName]])) 135

{ print resp= . $_COOKIE[$_POST[cookieName]]; } else { print resp= . cookie_not_found; } De cualquier manera, la variable pasada a Flash "respectivamente". De esta manera usted puede programar fcilmente el cdigo ActionScript para manejar la respuesta en consecuencia. La razn por la que se utiliza isset() en el primer caso de declaracin de PHP no es tan accidental puede enviar un aviso a Flash alertar a la variable no es enviado. Este tipo de aplicacin es un muy buen candidato para XML, que se explica en profundidad en el captulo 3. XML lo que hace es tan slo devolver en el valor que usted est interesado. Para este ejemplo simple, se continuar con un retorno printbased estndar. Ahora que tiene el PHP en su lugar se puede pasar al ActionScript. El ActionScript hace una llamada al PHP y espera una "cookie" o error que ser devuelto. var phpFile:String = http://localhost/ch05/cookies/loadCookie.php; var variables:URLVariables = new URLVariables(); variables.act = getcookie; variables.cookieName = sample; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.method = URLRequestMethod.POST; urlRequest.data = variables; var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, serverHandler); loader.load(urlRequest); function serverHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); if(variables.resp == cookie_not_found) { trace(Requested Cookie Not Found); } else { trace(Cookie Data: + variables.resp); } } El total de la llamada al servidor es similar a otras llamadas en este libro. El enfoque en esta convocatoria es de las variables pasadas al PHP y la respuesta. Se utiliza la clase URLVariables para asignar el acto y las variables cookieName. La variable de actuar le dice a PHP que su peticin es vlida, y la variable cookieName contiene el nombre de la cookie que usted est buscando. 136

var variables:URLVariables = new URLVariables(); variables.act = getcookie ; variables.cookieName = sample ; Al igual que los otros ejemplos cargador, tiene que asignar una funcin para manejar la respuesta del servidor. Esta es la funcin que se llama despus de que el PHP pasa de nuevo bien la cookie o un mensaje de error. Comience usando la clase URLLoader para obtener los datos que figuran en la respuesta. A continuacin, realizar una llamada a la clase URLVariables, que devuelve un objeto de las variables de respuesta. En este caso, se busca respectivamente la "propiedad". En primer lugar, compruebe si la respuesta es "cookie_not_found", que se explica por s mismo. Es ms que probable, la cookie que se establecern y la segunda sentencia trace podra ser llamado, pero la programacin nunca es bueno para asumir esto. Por eso se aade la sentencia condicional. function serverHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); if(variables.resp == cookie_not_found) { trace(Requested Cookie Not Found); } else { trace(Cookie Data: + variables.resp); } } Usted puede tomar este ejemplo para el siguiente paso, estableciendo la cookie si uno no se encuentra, o incluso pasar a lo largo de una matriz o un objeto de los nombres de cookies para cargar rpidamente todas las cookies de un sitio. AMFPHP, que usted va a mirar en el captulo 8, sera una gran manera de la carga en varias cookies.
Como usted puede ver, hay varias formas de trabajar con las cookies, tanto en PHP y Flash. Incluso desarrollar una forma comn en la que tanto PHP y Flash pueden compartir la misma cookie de datos.

NOTA Intercambio de informacin de la cookie todava tiene la limitacin de que el PHP tiene que estar en el dominio que va a cargar las cookies. Una cosa a tener en cuenta con este script es el hecho de que este ejemplo simple no es el control de la entrada pasa a la de PHP. Seguramente querra aadir en a una aplicacin real.

Resumen
En este captulo usted aprendi cmo cargar y trabajar con las cookies de Flash y PHP. Para iniciar aprendi a cargar un cookie existente de la mquina del usuario y luego aprendi a modificar y actualizar esa cookie. Ahora debi entender cmo trabajar con las cookies de Flash y PHP y entender por qu son importantes cuando se desarrolla una aplicacin.

137

Parte II Desarrollo de Contenido Interactivo

138

Capitulo 7 Mantenimiento de Seguridad al Trabajar con la entrada de Uuario


Trabajar con la entrada del usuario se centra en las mejores prcticas de almacenamiento y la devolucin de datos mientras se mantiene un alto nivel de seguridad. Este captulo est dividido en secciones que se centran en un aspecto especfico del manejo de los datos de usuario. Esto no es un paso gua basada en el trabajo con los datos del usuario, que puede encontrarse en el Captulo 4. En su lugar, este captulo se centra en los aspectos especficos de la seguridad al manejar los datos. El subtema de este captulo es trabajar con la comprensin y sandbox (caja de arena) en Flash. Bsicamente, la caja de arena es un contenedor que cada aplicacin se ejecuta en el, pero la seccin entra en ms detalle y proporciona ejemplos visuales para explicar mejor la caja de arena y cmo afecta a sus aplicaciones. Las prcticas previstas en este captulo se puede adaptar a las aplicaciones futuras que se desarrollan. El mantenimiento de una aplicacin segura es casi tan importante como el bloqueo de la casa antes de salir. Una aplicacin tcnicamente seguir funcionando si no est seguro. Sin embargo, la vida til de que la aplicacin no es cierto. Hay muchos aspectos de la seguridad en una aplicacin: datos esterilizado, inicios de sesin seguros, almacenamiento de archivos, y la posibilidad de aprovechamiento, para nombrar unos pocos. En este captulo, el foco es la seguridad de la entrada del usuario. La entrada del usuario es cualquier pedazo de datos, el usuario puede modificar. Esta lista incluye los datos de las cookies, los inicios de sesin, las sesiones y la carga de archivos.

Precaucin con el uso de entrada de usuario


Los datos del usuario se expande ms all de un sencillo cuadro de texto en un formulario de contacto. Ahora que sabes qu datos se considera la entrada de usuario, te ests preguntando cmo algo tan inofensivo como un sistema de carga de archivos representa un riesgo para la seguridad. Como con la mayora de seguridad, no es la tecnologa o caracterstica que tiene fallos, pero cmo se implementa.

Forma adecuada de manejar carga de archivos


Por ejemplo, supongamos que hay un archivo PHP de base que acepta la carga de archivos y almacena la informacin de los archivos cargados en una base de datos. La primera cuestin a plantearse es qu partes de esta sencilla aplicacin son posibles problemas de seguridad? 139

  

La forma en si? El componente de base de datos? El archive cargado?

Comprobar extensions de archivos vlidos


El archivo subido sera el menos obvio de una violacin de seguridad, pero mira en algn cdigo de ejemplo que explica cmo se puede fcilmente convertirse en un problema. Una muy comn, pero el intento de inducir a error a asegurar la carga de archivos proceso es comprobar que una prrroga vlida, como la: <?php $file = $_FILES[0]; if(strpos($file[name], .jpg) !== false) { if(!move_uploaded_file($file[tmp_name], storage/)) { print File uploaded; } } ?> Como puede ver, el cdigo est configurado para buscar el archivo con extensin .jpg. La funcin strpos se utiliza para devolver el ndice o la colocacin del valor facturado, que en este ejemplo es .jpg. A primera vista esto parece bastante seguro y deben dejar de cargar maliciosos, pero no es as. Este cdigo no importa de donde la extensin del archivo es, por lo que podra haber imagename.jpg.php como el nombre del archivo y que ser aprobado. Peor an, si esto es para una galera de fotos de acceso pblico, ese archivo se puede ejecutar PHP libremente porque ya est en el servidor. La capacidad para ejecutar cdigo intruso se convierte en una gran preocupacin cuando el usuario malintencionado es capaz de colocar cdigo directamente en un servidor de confiados. Imagina una imagen que est siendo cargado que es en realidad un archivo PHP con el cdigo como el siguiente: <?php error_reporting(E_ALL); phpinfo(); mysql_connect(localhost, anyuser, anypass); ?> NOTA Presentacin de informes de errores puede ser obligado a salir al deshabilitar la directiva display_errors en el archivo php.ini. Esto asegura el informe de errores no puede querer dar marcha atrs en. Cuando se accede a travs del navegador, este cdigo podra permitir a todos los errores para ser visible, mostrar la informacin del servidor vital, la fuerza de un intento fallido de la base de datos exponer el verdadero camino de archivo, como se puede ver en la Figura 7.1, y determinar si existe una base de datos.

140

Uso de una mejor forma de comprobar las extensiones de archivo


Volviendo al ejemplo de una simple carga, vamos a aadir las medidas de seguridad ms robusta. La principal modificacin del cdigo es el caso de declaracin de los controles de una extensin de archivo vlido. En lugar de buscar la existencia de un tipo de archivo, se ve al final del nombre de archivo y recupera la extensin correcta reales.
if(strrpos( $file[name], .jpg) !== false) { ... }

FIGURA 7.1 Mensaje de error devuelto cuando la base de datos es intencionalmente a fallar en la conexin

A primera vista parece que nada ha cambiado, pero en realidad si. La funcin strpos ha sido sustituido por el strrpos menos comn, que busca el tipo de archivo a partir del final de la cadena y en movimiento hacia el frente. Esto asegura que la extensin del archivo final se encuentra y no uno enterrado en el nombre. Al igual que con el cdigo, en general, la seguridad puede ser ampliado, y este ejemplo permite una gran expansin. Aqu hay un mtodo ms dinmico de la bsqueda de tipos de archivo vlidos que se puede colocar fcilmente en un proyecto existente o de una marca-nuevo proyecto. 141

<?php function checkForFileType($file, $type) { $fileTypePos = strrpos($file,.); if($fileTypePos === false) { return File not valid.; } if(substr($file, ($fileTypePos+1), strlen($file)) == $type) { return Valid file type; } else { return Invalid or malicious file type detected.; } } checkForFileType(sample.jpg, jpg); ?>

El cdigo anterior es una funcin personalizada que acepta dos argumentos. El primer argumento aborda el archivo a validar, y la segunda es la extensin de reconocer. Esta solucin ampliable devuelve una cadena de determinar si el tipo de archivo se encuentra o no. Menos frecuente es la tercera posibilidad, un partido vlido. Un partido no vlido: el passed-in el archivo no tiene un nombre de archivo vlido en todos los. Ahora que la parte de carga del cdigo es seguro, el siguiente punto de la seguridad es la forma real de s mismo. Esta parte lo ms probable consistir en la caja de carga de archivos y cajas de entrada de datos adicionales. En general, un ataque automatizado (equipo configurado para explotar sitios web) es el tema de seguridad a los desarrolladores estn ms preocupados con, sino una forma de la entrada en Flash tambin pueden suponer un riesgo de seguridad.

Comprobacin de la entrada vlida


Comprobacin de la validez de las cajas de entrada es un buen comienzo. Un ejemplo de un control de entrada en ActionScript es algo como lo siguiente: if(length(fileNameTxt.text) > 0) { // file name is valid } Esto es simplemente el control de la variable de fileNameTxt para una longitud que es mayor que 0, es decir, el cuadro de entrada tiene una cierta cantidad de texto en l. Ahora que el cuadro de entrada se sabe que es vlida, una llamada al servidor se hace y esto se traduce en el PHP que se llama. El PHP no seguros para un ejemplo simple podra ser algo as. <?php $name = $_POST[fileName]; 142

// database info goes here... mysql_query(INSERT INTO uploads (name) VALUES ( . $name . )); ?> Esto es bsicamente tomar el nombre de archivo y directamente insertarlo en la base de datos. Usted podra preguntarse en este punto como si el nombre de archivo es vlida en Flash esto podra ser una preocupacin de seguridad. El problema no est en los datos transmitidos desde Flash, pero lo ms importante, el hecho de que el PHP podra ser llamado por otro mtodo. Esta es una de las razones ms importantes para asegurar correctamente todos los puntos de una aplicacin. Una alternativa ms segura para el cdigo anterior es <?php $name = $_POST[fileName]; // database info goes here ... if(!empty($name) && strlen($name) > 0) { mysql_query(INSERT INTO uploads (name) VALUES ( . $name . )); } ?> Este cdigo no slo comprueba un valor vlido, sino tambin garantiza que el valor es de una longitud vlido. if(!empty($name) && strlen($name) > 0) En una aplicacin en el mundo real, probablemente sera de verificacin, por un valor de al menos dos o tres personajes, pero que todo depende del uso previsto. Esta pequea actualizacin del cdigo se asegura de que una llamada de Flash o cualquier otro mtodo se garantizar.

Validar cdigos postales (ZIP codes)


Por supuesto, proteger los datos no se limita a los campos de formulario bsico. Supongamos que hay una parte de la aplicacin que acepte un cdigo postal de cinco dgitos cuando el usuario enva una imagen. La manera de garantizar un cdigo postal vlido es por las pruebas de un valor numrico y una longitud vlida. <?php $zipCode = $_POST[zip]; if(is_numeric($zipCode) && strlen($zipCode) == 5) { // valid zip code found } ?> La funcin is_numeric() acepta una variable como un argumento que se ha probado para determinar si ese valor es un nmero. Esta funcin devuelve una respuesta verdadera/falsa por lo que puede utilizarse fcilmente dentro de una sentencia if o puede asignar el resultado a una variable. 143

Buscando tipos vlidos


Si desea realizar esta misma validacin bsica en Flash, se usara las funciones typeof y length (longitud). La funcin typeof devuelve un valor de cadena que define lo que el tipo es del tem passed-in. Esta funcin puede ser usado para algo ms que la validacin de nmero, pero funciona perfectamente para este ejemplo: if(typeof(zipCode) == number && zipCode.toString().length == 5) { // valid zip code found }

Limpiar datos de usuario


Ahora que tiene una mejor comprensin de la seguridad en su aplicacin, el siguiente paso es para desinfectar o limpiar los datos ms avanzados antes de almacenarla. El proceso de almacenamiento de datos abarca tanto el uso de bases de datos y un enfoque ms sencillo de utilizar archivos de texto estndar. La ventaja de los archivos de texto estndar es el hecho de que no necesita acceder a la base de datos. La desventaja de este mtodo es que es una solucin menos robusta que los resultados de las posibilidades de bsqueda mucho ms lento. Mayora de las veces se utiliza una base de datos, a menos que la aplicacin sea bastante pequea que no necesita el potencial de escala para una aplicacin ms grande.

Desinfecin de los datos


El primer paso para la desinfeccin de los datos se tratan en la seccin anterior, que es garantizar que al menos los datos son vlidos. Este proceso es necesario que las diversas funciones que interactan con una base de datos o sistema de archivos se crear errores muy importantes si se utilizan conjuntos de datos vaca. El proceso de desinfeccin de los datos debe hacerse en el PHP, porque siempre es una buena prctica para asumir cualquier passed-in los datos est sucio. Esto significa que aunque los datos fueron enviados desde su aplicacin Flash que podra haber sido manipulados en el proceso de presentacin. CROSS--REF Los datos enviados desde Flash es fcil de ver utilizando Charles, que se discute en el captulo 13. Charles se puede utilizar al 100 por ciento seguro de qu datos se estn enviando desde Flash. Hay un par de funciones muy tiles en PHP que puede ayudar en el proceso de desinfeccin de los datos antes de que se almacene. La primera funcin addslashes(), que caracteres de escape como cotizaciones y cortes en los datos que le pasan. El siguiente fragmento de cdigo muestra cmo addslashes desinfecta adecuadamente los datos. <?php $quote = I hope to finish the coolest Flash application ever. Which will use Flash and PHP; ?>

144

Crear consultas SQL seguras


Si ha ejecutado el cdigo anterior, se generara un error porque el procesador de PHP no permite citas dentro de las comillas. Con citas mltiples, no sera capaz de determinar dnde una cadena se inicia y otra termina. Supongamos que la variable $quote se llena dinmicamente por una llamada de Flash. La variable ser llenada correctamente en tiempo de ejecucin porque el compilador no valida el contenido sobre la marcha, sin embargo, entrar en que los datos en SQL se producir un error. An peor, en algunos casos, la cadena puede ser introducido parcialmente. Aqu hay una consulta SQL del mundo real donde usted puede ver fcilmente el problema con citas sin escape. $sql = UPDATE users SET business=Toms Diner WHERE id= . $ID; Una vez ms, la ejecucin del cdigo con el que ha introducido previamente en el PHP produce un error, pero que asumen esta cadena se construye con una peticin de $_GET. Al principio, la peticin parece seguro, pero el anuncio de consulta SQL comienza con una comilla simple ( ) y hay un apstrofo en Tom's Diner. La llamada SQL real se convertir en: $sql = UPDATE users SET business=Tom Bsicamente, esto se pone cada nombre de la empresa en la solicitud a Tom, que no es probablemente el resultado previsto. Tambin sera muy difcil de revertir si la solicitud hace copias de seguridad adecuada. Este ejemplo es bastante extrema, porque las comillas es ms comn para una llamada de SQL, pero definitivamente se puede ver cmo datos no desinfectados podra causar un da muy malo para el administrador del sistema. Ahora que sabes lo mal que datos no desinfectados pueden ser, volver a ese addslashes() y ver lo que la llamada se convierte en SQL: $business = addslashes($_GET[name]); $sql = UPDATE users SET business= . $business . WHERE id= . $ID; La llamada de SQL debidamente desinfectados ve algo como esto: $sql = UPDATE users SET business=Tom\s Diner WHERE id= . $ID; Mira a otra llamada SQL con formato incorrecto que tiene resultados drsticos. Esta se ocupa de la tala en una parte segura de una pgina Web. Una llamada de SQL para la autorizacin sera algo como esto: <?php $user = admin; $pass = password here; $query = SELECT * FROM staff WHERE user= . $user . AND pass= . $pass . ; ?> Observe cmo una vez ms el SQL a ciegas acepta los valores. Esto realmente se convierte en un problema cuando un usuario introduce una contrasea, tales como $pass = OR =; 145

La llamada de SQL resultante es una contrasea vaca, porque las citas forzadas al SQL a su fin y la OR le permite a la igualdad de s mismo. Crea una contrasea vaca, lo que significa que slo el nombre de usuario es detener a alguien de iniciar la sesin, pero nueve de cada diez veces, de administracin es un nombre de usuario vlido. SELECT * FROM staff WHERE user=admin AND pass= OR = As de simple \ significa que la diferencia entre una llamada de SQL eficaz y muy peligroso. Esta funcin es slo una forma posible de datos para desinfectar. La siguiente funcin, cuando se trabaja con una base de datos, es mysql_real_escape_string, que desinfecta los datos antes de entrar en la base de datos. Al usar esta funcin, primero debe realizar una conexin adecuada a la base de datos, de lo contrario recibir un error. La sintaxis para mysql_real_escape_string es casi lo mismo que addslashes(). Que se pasa en el valor que desea limpiar y un vnculo de MySQL opcional. Si un enlace no se pasa, se utiliza el enlace SQL ltima. <?php // connect to database, generate $link $business = mysql_real_escape_string($_GET[name], $link); $sql = UPDATE users SET business= . $business . WHERE id= . $ID; ?> La ventaja de utilizar esta funcin es que se encarga de todas las diversas escapar, que va ms all de comillas simples y dobles. El problema evidente es que requiere un enlace de MySQL, as que no se puede utilizar a menos que los datos sern almacenados en una base de datos. O, al menos, usted necesita tener acceso a una base de datos. Un uso incorrecto de esta funcin tendr como resultado un error, como se observa en la Figura 7.2.

146

FIGURA 7.2 Mensaje de error aparece cuando un enlace de base de datos MySQL no est disponible

Limpieza adecuada de datos HTML


La funcin final que mirar es htmlentities(). Bsicamente, esta funcin toma caracteres HTML y los convierte en valores numricos. Estos son mejores porque cosas como "" se convierten&quot, y esto casi elimina la necesidad de desinfeccin avanzado de datos.
<?php $str = The red fox <b>jumped</b>; // The &#039;red&#039; fox &lt;b&gt;jumped&lt;/b&gt; echo htmlentities($str, ENT_QUOTES); ?>

El segundo argumento en la funcin htmlentities() determina si las dos comillas simples y dobles se conviertan, Los valores posibles para este segundo argumento se muestran en la Tabla 7.1.

147

TABLA 7.1

Estilos de comillas disponibles


Nombre de Constante ENT_COMPAT ENT_QUOTES ENT_NOQUOTES Descripcin Convierte las comillas dobles; estilo de comillas sola Convierte tanto comillas dobles e individuales Deja a las dos comillas dobles e individuales convertidos

Es una buena idea ejecutar estas tres funciones para asegurar que sus datos es tan limpio como sea posible. Slo se necesita la potencia de procesamiento un poco ms, pero puede hacer la diferencia entre una aplicacin segura y una insegura. Ms importante an, a medida que contine la prctica estos conceptos de seguridad bien que pasarn menos tiempo de parches y la depuracin en el futuro.

Almacenamiento de datos
La base de datos no es el mtodo de almacenamiento slo, como se explica en el comienzo de esta seccin. Tambin puede utilizar archivos de texto simple para almacenar informacin, y la mayora de los pasos de desinfeccin que el trabajo aqu tambin. La nica excepcin es mysql_real_escape_string, que, como se dijo anteriormente, requiere un enlace SQL.

Escribir de forma segura a un archivo


Un ejemplo simple de la escritura de forma segura a un archivo sera algo como esto. En primer lugar, validar los datos antes de abrir el archivo. Esto garantiza que el archivo no puede verse accidentalmente por escrito a.
<?php if($fileContents != ) { $handle = fopen(sample.txt , w+); fwrite($handle, $fileContents); } else { print File content not written, invalid data; } ?>

Trabajar con datos en un orden lgico


Es importante mantener un orden lgico cuando se trabaja con datos. Por ejemplo, si la funcin addslashes() se ejecute antes de la sentencia if, la longitud del contenido podra ser expulsados y producir un resultado falso. Al mismo tiempo, si el archivo se abre antes de que los datos sean validados, un malintencionado podra explotar inyectar contenido en el archivo abierto. Piense en ello como las mismas precauciones que tomar cuando se inicia sesin en un sitio Web seguro en un lugar pblico.

148

Crear una clase para manejar saneamiento En este punto usted debe entender completamente cmo desinfectar los datos que se pueden guardar en una base de datos o un archivo de texto simple. Usted puede ampliar estas mejores prcticas para crear un conjunto de herramientas ms reutilizables. Por ejemplo, podra crear una clase de saneamiento que se ocupa automticamente del proceso. Una clase bsica sera algo similar a lo siguiente:
<?php class Sanitization { function cleanSQL($str) { return mysql_real_escape_string($str); } function cleanHTML($str) { return htmlentities($str, ENT_QUOTES); } function cleanText($str) { $s = $str; if(!ini_get(magic_quotes_gpc)) { $s = addslashes($s); } return $s; } function checkLength($str, $acceptableLength) { if(strlen($str) >= $acceptableLength) { return true; } else { return false; } } } ?>

La clase define tres mtodos, cada uno de ellos sea un sustituto de una tcnica aprendida en la seccin anterior. Este enfoque ofrece la posibilidad de ser reutilizables a medida que contine trabajando en ms aplicaciones. La clase tambin contiene ms lgica de lo que se usa porque addslashes agrega barras a barras existentes. El resultado ser tres barras de escapar cada comilla. NOTA Una doble barra har una barra en la parte delantera de la cita, ya que le indica al compilador para escapar de la barra y no pensar en ello como cdigo. The \\\ red\\\ fox jumped. 149

Trabajar con opciones de magic_quotes


Hay una configuracin en PHP llamada magic_quotes_gpc, que es responsable para escapar de los datos automticamente, como se muestra en la Figura 7.3. FIGURA 7.3 Un valor de ejemplo de la propiedad magic_quotes_gpc como se ve en la funcin phpinfo () de la listas

Desactivar magic_quotes
En menos de configuraciones de servidor comn que esta caracterstica no se puede apagar. Una prueba rpida para determinar si se ha habilitado la opcin asegura barras adicionales no se aadir. if(!ini_get(magic_quotes_gpc)) { $s = addslashes($s); } Las otras dos funciones en la clase de saneamiento simplemente limpiar el passed-in los datos y devolverlo.

150

Usar objetos compartidos


Al empezar a construir aplicaciones ms completa se llega a un punto en el almacenamiento de algunas pequeas cantidades de datos en la mquina del usuario sea necesario. Estas pequeas piezas de informacin en general, tienen un ID de usuario o perodo de sesiones que se asigna a una entrada de base de datos en el servidor en vivo. Una "cookie" Shared Object Flash se utiliza en este caso porque es una pequea pieza de informacin almacenada en el ordenador del usuario, pero no es necesario para la aplicacin se ejecute. Cuando la aplicacin que hace uso del objeto compartido se abra de nuevo, sera configurado para buscar este pequeo pedazo de datos y realizar una llamada a un servidor basado en el resultado. Sin embargo, al igual que las cookies normales que el navegador utiliza un objeto compartido puede ser editado por el usuario final, que puede tener resultados perjudiciales. Como se indica en la seccin anterior, es mejor no confiar en los datos que un usuario enva. Esta directriz comn garantiza una aplicacin ms segura y, en general hace que sea ms fcil trabajar con. NOTA La mayora de los agujeros en la solicitud son explotados por el usuario envando los datos. Imagine una aplicacin de ejemplo, que se utiliza para trabajar con un objeto compartido. Esta solicitud puede ser configurado para abrir un objeto compartido y pasar los datos a un servidor remoto. Una vez que el objeto compartido se ha cargado, una llamada al servidor remoto podra hacerse pasar por el pequeo pedazo de informacin de los objetos compartidos. En este ejemplo, la pequea pieza de informacin podra ser un ID de usuario que se han guardado en un uso previo.

Uso de PHP para manejar datos de objetos compartidos


El cdigo PHP se encarga de cargar esta pieza de informacin y consulta de la base de datos. Sin embargo, antes de una llamada a la base de datos se hace, el ID de usuario se valida asegurndose de que es un nmero vlido y dentro del rango de. <?php $userID = $_GET[user_id]; $idRange = 500; if(is_numeric($userID) && $userID > 0 && $userID < $idRange) { // connect to database at this point mysql_connect(localhost, user, pass); mysql_select_db(db_name); $r = mysql_query(SELECT * FROM user WHERE userID= . $userID); while($row = mysql_fetch_array($r)) { print resp=success&username= . $row[username] . &userlevel= . $row[user_level] . &userstyle= . $row[user_style]; } } else { print resp= . User ID not found or is invalid; } 151

?> Suponiendo que el id de usuario es vlida, un bloque de informacin se pasa de nuevo en formato de texto simple. Estos datos se carga en una matriz y se utiliza en el resto de la aplicacin. Si el ID de usuario no es vlida, se devuelve una cadena que informa al usuario de que algo pas y el perodo de sesiones existente no se puede cargar. En la mayora de los casos, si la sesin existente no se puede cargar, la aplicacin Flash sabe que empezar de nuevo en lugar de tratar de utilizar datos incompletos o errneos. NOTA ActionScript 3 corelib de Adobe (biblioteca externa) tiene una clase de MD5 que se puede utilizar en lugar de PHP.

Crear y guardar una contrasea segura usando PHP


El proceso de modificacin de una contrasea que se puede almacenar es bastante simple. En primer lugar, crear una conexin con el archivo PHP que pasa a lo largo de la contrasea en texto claro. Sin embargo, este proceso no es el ms seguro y que sera mejor para devolver una respuesta de MD5 de la contrasea cuando se realiza un intento de inicio de sesin. Para explicar el proceso, aqu la opcin de un ejemplo de lo simple (menos seguro): var phpFile:String = http://localhost/md5creator.php; var query:String = ?pass= . password; var urlRequest:URLRequest = new URLRequest(phpFile + query); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, response); urlLoader.load(urlRequest); function response(e:Event):void { var loader:URLLoader = URLLoader(e.target); var param:URLVariables = new URLVariables(loader.data); trace(User Information Loaded); trace(\tUser: + param.username); trace(\tLevel: + param. userlevel); trace(\tStyle: + param.userstyle); } Una llamada al PHP en el servidor se realiza utilizando un URLRequest bsicos, que deberan ser familiares para usted a partir de ejemplos y captulos anteriores. Una vez que el URLRequest se establece una funcin de devolucin de llamada es asignado para manejar la respuesta del servidor. En este ejemplo, tendrn que contener un MD5 de cadena o de un error. El PHP simplemente controla una cadena vlida y devuelve un valor hash MD5 (cadena cifrada). Si una cadena incompleta o vaca se enva desde el Flash, PHP devuelve un mensaje de error. <?php $string = $_GET[string]; if(strlen($string) == 0) 152

{ print response= . String not provided.; } else { $md5 = md5($string); print response= . $md5; } ?> Este sera un ejemplo bastante simple para crear un valor hash MD5. En el uso del mundo real que usted querra a las semillas de la encriptacin md5 para dar la respuesta ms original y ms difcil de romper. Una semilla es un valor conocido que se utiliza en el proceso de MD5. Si desea crear una semilla verdaderamente al azar, usando el time() es una buena idea, ya que casi todas las llamadas produce un resultado diferente. El hash para este ejemplo se debe poder verificar cuando el usuario intenta iniciar sesin. Para este ejemplo, el nombre de la aplicacin utilizada ser "securepass". cfcd208495d565ef66e7dff9f98764da La semilla (seed) se anexa a la cadena existente que ser codificado, ya sea al comienzo o al final. $md5 = md5($string + securepass); La posicin de la semilla debe ser coherente, ya que se re-crea cuando el usuario intenta iniciar sesin en la prxima vez. El cdigo PHP con la semilla nica aplicacin se vera algo como esto: <?php $string = $_GET[string]; if(strlen($string) == 0) { print response= . String not provided.; } else { $md5 = md5($string + securepass); print response= . $md5; } ?> En este punto, en la aplicacin de la semilla es creado, y usted puede continuar con el proceso de almacenar ese valor en un objeto compartido.

153

Retornar datos
Es seguro asumir que tendr que ser la devolucin de datos de vuelta a Flash en algn momento de su aplicacin. La preocupacin general de seguridad en este proceso es similar al envo de datos, con la excepcin de que ms vulnerabilidades se trat sobre la devolucin de los datos.

Retornar datos de forma segura


La idea de pasar de forma segura los datos de vuelta a Flash es mucho menos habl de tema. Esto se debe principalmente al hecho de que Flash no tiene que ser seguro, sin embargo, todava es una buena prctica para garantizar que sea. Si usted no puede validar los datos de volver a Flash puede abrir un agujero de seguridad que podra, por ejemplo, permitir a un usuario para acceder a una seccin privada de una aplicacin. An peor, puede tener efectos negativos sobre la experiencia del usuario, y sus usuarios pueden perder la fe en su aplicacin. Los datos de volver a Flash puede ser alterada de la misma forma los datos pueden salir. Para el ejemplo anterior, una serie de datos se devuelven, pero nunca se comprueba para asegurarse de que los datos son vlidos. Vamos a ampliar el ejemplo anterior para aadir esta seguridad. La funcin de respuesta es la nica seccin de cdigo que necesita ser modificado, porque la solicitud ser el mismo. function response(e:Event):void { var loader:URLLoader = URLLoader(e.target); var param:URLVariables = URLVariables(loader.data); var var var var username:String; userLevel:uint; userStyle:String; validData:Boolean = true;

if(param.username != ) { username = param.username; } else { validData = false; } if(param.userlevel!= ) { userLevel = param.userlevel; } else { validData = false; } if(param.userstyle != ) 154

{ userStyle = param.userstyle; } else { validData = false; } if(!validData) { trace(User data was not properly loaded); } else { trace(User Information Loaded); trace(\tUser: + param.username); trace(\tLevel: + param. userlevel); trace(\tStyle: + param.userstyle); } } Bsicamente, este primer cdigo inicializa variables para almacenar los datos del usuario y comprueba cada passed-in el valor de una entrada vlida. La variable de validacin se asigna a cierto desde el principio, porque si alguno de los estados, si no se cambiar a false. Este proceso se considera lgica inversa, pero funciona bastante bien para las rutinas de validacin.

Utilizando un enfoque ms seguro para el retorno de datos


En el ejemplo anterior, aprendi cmo trabajar con seguridad con los datos devueltos. El problema con este enfoque simplificado es que existen otras maneras de interceptar informacin pasa entre Flash y el servidor.

Usar respuesta unica


Hay varias opciones para crear una aplicacin an ms seguro, que todo depende del tiempo y costo de desarrollo. Es un pensamiento comn a ignorar los costos de la seguridad en ltima instancia, pero esto simplemente no es posible todo el tiempo. Frecuentemente usted trabajar en un proyecto que llega a un "punto suficientemente bueno" y la aplicacin a los buques de las cuestiones, lo cual es una desventaja para el desarrollo de aplicaciones, pero muy comn. La mejor manera de mantener bajo el costo real es mirar todas sus opciones. Una opcin es usar MD5 para crear cdigos de respuesta nica y asegurar los datos son vlidos, que trabajar, pero nada impide que el "hacker" de descompilar el SWF y mirando directamente al cdigo.

Proteger sus archivos


En versiones anteriores de ActionScript que fueron capaces de crear fondos soberanos ofuscado, lo que significa que la mayora de aplicaciones no poda descompilacin. Sin embargo, en el momento de escribir este documento no existe la herramienta para aplicaciones de AS3.

155

Comprender la seguridad de Sandbox en Flash


El recinto (sandbox) de seguridad en Flash determina qu archivos se puede acceder en funcin de dnde se encuentra el archivo SWF. Un funciones del archivo SWF de manera diferente cuando se ejecuta localmente en la mquina del usuario que lo hace en un servidor. Por ejemplo, un archivo SWF en el recinto local no puede acceder a los objetos locales y remotos. Esto impone un nivel de seguridad en la aplicacin para asegurarse de fuentes no pueden cruzar entre s. Los archivos locales pueden ser colocados en una de las tres cajas de arena (sandboxes):    local-with-filesystem: Esto asegura al usuario que el contenido local y no por casualidad puede ser enviado a una red o compartirlo. local-with-networking-sandbox: Permite que los SWFs locales puedan acceder a objetos remotos, si se encuentra un archivo de poltica vlida. local-trusted: Un archivo SWF en este recinto de seguridad puede tener acceso a datos desde cualquier lugar, tanto locales como remotos. Slo los usuarios y administradores pueden mover un archivo SWF a este recinto de seguridad.

The local-trusted sandbox cannot accidentally be set by a stand-alone SWF. This is done to ensure the level of security a user would expect. Con el fin de permitir el acceso a un dominio remoto, primero debe agregar a la clase de seguridad, haciendo un llamado a allowDomain(). Security.allowDomain(www.example.org); Tambin puede utilizar un archivo de poltica de dominio que permite el acceso de determinados dominios o todos los dominios con un comodn ( * ). <allow-access-from-domain=* />

Configurar el tipo de sandbox


Cuando se publica un archivo SWF, puede elegir el tipo de recinto de seguridad especificados en funcin de los recursos necesarios para ese uso. Para establecer el tipo de recinto de seguridad, siga estos pasos: 1. Seleccione Configuracin File.Publish (Choose File.Publish Settings). 2. Haga clic en la ficha Flash. 3. En la lista desplegable, haga clic en Reproduccin de Seguridad. 4. Haga clic en Aceptar.

Uso de la propiedad sandboxType


Un archivo SWF puede utilizar slo la lectura esttica y la propiedad Security.sandboxType para determinar qu cajn de arena del reproductor de Flash ha asignado el SWF actual.

156

En algunos casos, usted tendr que usar el valor actual de la propiedad sandboxType en la programacin para determinar cmo una aplicacin debe interactuar. Uso de una declaracin simple cambio, puede crear una funcin personalizada que se traza el tipo de recinto de seguridad actuales, como se muestra en la Figura 7.4. FIGURA 7.4 Ventana de resultados que muestra un resultado de ejemplo de la funcin de whichSandbox

function whichSandbox():String { var str:String = ; switch(Security.sandboxType) { case Security.REMOTE: str = This SWF is from an Internet URL. + It cannot access local files; break; case Security.LOCAL_WITH_FILE: str = This SWF is local, but not trusted by + the user. It does not have access to + remote files.; break; case Security.LOCAL_WITH_NETWORK: str = This SWF can communicate with remote 157

+ files, but can with local files.; break; case Security.LOCAL_TRUSTED: str = This SWF has been trusted by the user. + It can read both local and remote files.; break; } return str; } trace(Checking for current sandbox type.); trace(whichSandbox());

Determinando el activo sandbox


Determinar el tipo de recinto de seguridad actual no se limita a un simple seguimiento de respuesta. Usted puede presentar al usuario una pantalla de advertencia le notifica que el SWF actual no puede tener acceso a recursos remotos, ya que se ejecuta localmente. Tambin puede detener la fuerza de una pelcula de correr si una caja de arena local se encuentra, lo que significa que la pelcula ya no se ejecuta desde su sitio Web. Por ejemplo, una pelcula ejecuta de forma local podra haber sido robado de su sitio, as que es una buena idea para comprobar esto y actuar en consecuencia. La ejecucin de aplicaciones en el recinto (sandbox) de seguridad locales En este ejemplo se muestra en la Figura 7.5 comprueba el tipo de recinto de seguridad y muestra una cuenta regresiva, si la pelcula se est ejecutando a nivel local.

158

FIGURA 7.5 Ejemplo de la aplicacin completa que muestra una cuenta atrs de activos

Para empezar, abra el archivo de partida que se pueden encontrar en el sitio web de este libro. Los activos de este ejemplo ya se han completado para que pueda centrarse en la programacin. El primer paso es crear las variables necesarias. var timer:Timer; var sandbox:String; var startingTime:uint = 5; Despus de las variables que estn asignados, usted puede construir el init funcin inicial, que se llama tan pronto como comienza la pelcula.
function init():void { timerMC.alpha = 0; sandbox = Security.sandboxType; if(sandbox.indexOf(local) == -1) { startTimer(); } }

159

La parte principal de esta funcin es la sentencia if, que comprueba la presencia de la cadena "local" en el tipo de recinto de seguridad. Esto incluye cualquiera de las versiones locales y determina que la pelcula no se est ejecutando en el recinto de seguridad remotas. Si se detecta un recinto de seguridad local, una llamada a startTimer se hace, que se inicializa y se inicia el temporizador de cuenta regresiva. if(sandbox.indexOf(local) != -1) { startTimer(); } La funcin startTimer primero inicializa una instancia del nuevo temporizador y luego aade un detector de eventos, que se llama cada milisegundo. La ltima accin en esta funcin es mostrar el texto del temporizador, mediante el establecimiento de la propiedad alpha a 1.0 lo que la hace totalmente visible. PRECAUCIN El uso de una actualizacin del temporizador de 1 milisegundo por un perodo largo de tiempo puede crear una pelcula que no responde. Para una comprobacin inmediata, como en este ejemplo, no es una gran preocupacin. function startTimer():void { startingTime *= 1000; timer = new Timer(1, 0); timer.addEventListener(TimerEvent.TIMER, tickHandler); timer.start(); timerMC.alpha = 1.0; } El controlador de eventos en la seccin anterior le asigna una funcin para cada llamada al temporizador. Esta funcin es del controlador. El argumento pasado es una referencia al objeto de temporizador. Usted tambin puede hacer referencia al evento mundial, sin embargo, esto es ms comprensible si regresa a este cdigo en el futuro. function tickHandler(e:TimerEvent):void { var time:Timer = e.target as Timer; var milli:uint = (startingTime - getTimer()); var sec:uint = Math.round(milli / 1000); timerMC.timerTxt.text = String(sec) + ((sec == 1) ? second : seconds); if(sec == 0) { timer.stop(); stage.removeChildAt(0); } } El objetivo del objeto de evento se presenta como temporizador. Una vez ms, este paso no es obligatorio, pero es ms fcil trabajar con el cdigo. 160

La idea es mostrar los segundos restantes, que se determina utilizando los milisegundos restantes. El milisegundos restantes se obtienen mediante la funcin getTimer(), que devuelve los milisegundos de la pelcula actual ha estado en ejecucin. El startingTime se resta de este valor y el resultado es el total de milisegundos. var milli:uint = (startingTime - getTimer()); NOTA La funcin getTimer()siempre devuelve el tiempo total de la pelcula actual ha estado en ejecucin. Esto significa que si esta prueba se hace ms adelante en el proceso de reproduccin del valor no se muestran correctamente. El milisegundos restantes se convierten entonces en segundos, usando un poco de matemticas bsicas. El valor actual de la variable de mili dividido por 1000 es igual a los segundos restantes. var sec:uint = Math.round(milli / 1000); Una vez determinados los segundos, que el valor es enviado al campo de texto timerTxt en el escenario. Para la exhibicin gramatical correcta, la variable sec se utiliza para determinar si el segundo o segundos se debe mostrar. Esa variable sec se prueba en cada ejecucin de esta funcin para determinar cuando el cronmetro se detiene y para descargar la aplicacin completa. if(sec == 0) { timer.stop(); stage.removeChildAt(0); }

Descargar una aplicacin


La accin de la descarga de toda la aplicacin se realiza mediante una llamada a la removeChildAt en la instancia del escenario. En este caso, toda la pelcula debe ser eliminado, por lo que 0 es el sentido de pasar de ndice 0 y hacia abajo. if(sec == 0) { timer.stop(); stage.removeChildAt(0); } El ltimo paso del cdigo es para hacer una llamada a init, que se inicia el proceso. init(); Esa es la aplicacin completa, que se ejecutar si el recinto de seguridad actual es local. Usted puede cambiar la lgica general en la presente solicitud y agregarlo a su cuenta para asegurarse de que su pelcula no es mal ejecutar.

161

Aqu est el cdigo completado: var timer:Timer; var sandbox:String; var startingTime:uint = 5; function init():void { timerMC.alpha = 0; sandbox = Security.sandboxType; if(sandbox.indexOf(local) == -1) { startTimer(); } } function startTimer():void { startingTime *= 1000; timer = new Timer(1, 0); timer.addEventListener(TimerEvent.TIMER, tickHandler); timer.start(); timerMC.alpha = 1.0; } function tickHandler(e:TimerEvent):void { var time:Timer = e.target as Timer; var milli:uint = (startingTime - getTimer()); var sec:uint = Math.round(milli / 1000); timerMC.timerTxt.text = String(sec) + ((sec == 1) ? second : seconds); if(sec == 0) { timer.stop(); stage.removeChildAt(0); } } init(); En este punto, usted debe tener una buena comprensin de cmo el recinto de seguridad de Flash que funciona y lo que es. Como puede ver, la caja de arena puede llegar a ser un problema en algunos casos, pero en general su objetivo es proteger al usuario. En el ltimo ejemplo, el cdigo se ha ampliado y ahora la caja de arena es capaz de proteger al propietario del contenido, as como del usuario. Usted puede tomar las prcticas y tcnicas aprendidas en esta seccin y comenzar a adaptarlas a sus propias aplicaciones.

Garantizar una aplicacin no puede ser compartida


Como un extra a esta seccin, el ltimo ejemplo ser la de crear un estilo similar de verificacin cajn de arena, pero esta vez con el objetivo de que una pelcula no debe ser visible en cualquier otro sitio Web, excepto para lo que fue construido.

162

Esto se logra mediante la propiedad url en el objeto loaderInfo. Esta propiedad es accesible en cualquier objeto cargado. Para este ejemplo, el objeto cargado sera el escenario, porque es la raz de objeto de visualizacin. El cdigo para determinar la ubicacin actual de una pelcula se est ejecutando es: stage.loaderInfo.url Este cdigo devuelve una cadena que muestra una pelcula donde se est ejecutando. Un ejemplo de respuesta de una pelcula se ejecuta de forma local: file:///MacPro%20HD/Library/Server/Documents/DomainCheck.swf El uso de esta propiedad podra mostrar un mensaje de advertencia que se hizo en la prueba de caja de arena. Para fines de demostracin, un dominio no vlido se proporciona a causa de la pelcula para ser removido inmediatamente. if(String(stage.loaderInfo.url).indexOf(example.org) != -1) { stage.removeChildAt(0); } Suponiendo que el cdigo anterior se ejecuta en una pelcula que no se encuentra en el dominio example.org, la pelcula se elimina y la aplicacin ya no es accesible. Para una aplicacin ms completa que sera de verificacin de la www y sin www versin del sitio web. Tambin se podra ampliar en este cdigo y comprobar si hay una lista de sitios vlidos, lo que podra lograrse mediante un simple bucle y una serie de dominios permitidos. NOTA Esta comprobacin no es 100 por ciento seguro debido a las limitaciones en la forma en una direccin URL se puede acceder. Ahora usted debera tener una comprensin de cmo asegurar su aplicacin, y agregar un nivel de proteccin para evitar que otros sitios y lugares de beneficiarse de su contenido sin autorizacin.

Resumen
En este captulo usted aprendi cmo limpiar adecuadamente los datos del usuario, aunque es consciente de cmo puede afectar la funcionalidad de su aplicacin. A continuacin, aprendi a cargar correctamente y limpiar los datos del usuario para garantizar el proceso de almacenamiento no se vern perjudicados. El almacenamiento de la seguridad de los datos se presenta a continuacin con ejemplos de cmo simples llamadas SQL pueden causar dolores de cabeza en las aplicaciones. El siguiente paso que se introdujo fue el proceso de devolucin de datos a Flash y el anlisis de estos datos para asegurarse de que estaba bien manejado. La ltima seccin es una introduccin y una visin general de la caja de arena de Flash y cmo puede afectar a las aplicaciones. Como un bono que ha aprendido cmo crear una aplicacin que se eliminar a s misma si no se ejecuta en el dominio correcto.

163

Capitulo 8 Uso de Sockets


Cuando se trabaja con aplicaciones multiusuario, hay diferentes maneras de enviar y recibir datos. Puede utilizar un formato XML basado en el mtodo de entrega. Otra alternativa a la entrega estndar es construir un "tirn" ( pull ) de aplicacin que comprueba si hay actualizaciones mediante un temporizador. Sockets permite un mtodo " push " ( empuje ) que deja fuera a los temporizadores y las actualizaciones slo cuando los nuevos datos se envan. El uso de sockets no se limita a simples datos, que realmente podra construir una aplicacin de dibujo multiusuario que pasar las coordenadas a travs de los diversos que ha iniciado sesin en los clientes. Este captulo se divide en dos partes. La primera parte explica sockets. La segunda parte es un Flash simple basada en aplicacin de chat usando sockets como la entrega de los mensajes.

Comprender los Sockets


Un socket es un extremo de la comunicacin o parte de una computadora de una red conectada a otro equipo en el mismo protocolo. La diferencia entre una conexin tradicional (Internet) y un conector es la capacidad de hacer una distincin entre las mquinas que usted est hablando. Cuando usted solicita un sitio Web desde Internet, se obtiene la pgina solicitada, pero Internet no puede obligar a los nuevos datos directamente a usted (el cliente) sin pedir una vez ms. Un conector proporciona esta comunicacin directa, permitiendo la conexin principal para enviar datos de nuevo a usted (el cliente). Esto es ms comnmente usado en aplicaciones de conexin directa, tales como la mensajera instantnea, aplicaciones de vdeo y entornos de colaboracin en equipo.

Seguridad en sockets
El uso de sockets requiere una conexin ms directa, lo que significa que la seguridad es una preocupacin ms grande. En general, cualquiera que sea la herramienta que est utilizando para implementar el cliente o el servidor de socket permite un nivel de seguridad directamente dentro de su propia biblioteca. Por ejemplo, Flash requiere una confianza que se crear en un dominio diferente que permite a ambas partes a autorizar la conexin. En cambio, una simple conexin realizada por la lnea de comando no tiene ningn tipo de seguridad implica ms all de los lmites de un protocolo estndar. NOTA Sockets puede ser una mala eleccin cuando se aplique en determinados sistemas o configuraciones, debido a su naturaleza, la conexin directa.

Implementacin de un servidor socket


El maestro de servidor socket puede ser implementada utilizando muchos lenguajes de programacin comn. 164

Para un socket persistentes o nivel de produccin, lo ms probable es ejecutarlo desde un servidor activo para garantizar que otros usuarios puedan conectarse a l y limitar el riesgo de una conexin abierta en el sistema local.

Entender la conexin del socket


La conexin de socket en el siguiente ejemplo se encarga de comunicarse con el usuario. Las siguientes secciones explican el proceso.

Partes de un socket
Una conexin de socket est formado por dos piezas. La primera parte es la conexin principal o servidor, y la segunda parte es de los clientes que se conectan con el maestro. Los clientes pueden hablar directamente con el maestro, pero no puede hablar en general, a otros clientes. Si desea que los clientes hablen entre s se pondra en prctica un sistema de intercomunicacin con el maestro.

Que hay que cumplir (Binding)


El socket principal est ligada a una determinada direccin IP y el puerto. Esto significa que la conexin principal se hace a este punto concreto para garantizar la conexin es nica. Los clientes que quieren comunicarse con el servidor de socket debe conectarse a la misma direccin IP y puerto que el maestro.

Escuchar (Listening)
Esto es similar a la del servidor de Web estndar. Una vez que el servidor de socket se inicia, a la escucha de clientes activos y los nuevos que se quiere conectar. Estos clientes se aaden a la cola y comenzar a recibir las comunicaciones del grupo.

Trabajar con Sockets en PHP


Construccin de un servidor de socket en PHP requiere alguna configuracin previa. Un servidor de socket en PHP no se pueden ejecutar desde la versin grfica estndar debido a su conexin persistente. Un navegador Web estndar basado en la conexin sera tiempo de espera, o posiblemente accidente de la mquina host. Una conexin de socket se ejecuta con el comando nongraphic versin en lnea de PHP (CLI). El primer paso para trabajar con sockets en PHP es para determinar si usted tiene esta versin CLI de PHP instalada, ya que normalmente no se incluyen en un paquete de servidor Web.

Buscando la version de lnea de commando de PHP


La versin de lnea de comandos (CLI), si est instalado, es generalmente accesible directamente desde la Terminal en un Mac o el smbolo del sistema en un PC (ver figura 8.1). Para determinar si usted tiene esta versin, simplemente abra la lnea de comandos. En Windows, haga clic en Inicio y luego en Ejecutar. Escriba cmd en el cuadro de dilogo Ejecutar y haga clic en Aceptar. Si ests usando un Mac, abra el Finder, vaya a Aplicaciones/Utilidades, y abra el Terminal.

165

FIGURA 8.1 Ejemplo de un smbolo del sistema en Windows XP

Con la lnea de comandos Abrir, escriba lo siguiente: $ php -v Este comando le dice a PHP que informe la informacin de versin y sale. El resultado debera ser algo similar a lo siguiente: PHP 5.2.5 (cli) (built: Dec 20 2007 02:55:52) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies Si recibe una respuesta similar a la siguiente, significa que la versin de PHP puede ser instalado, pero no a nivel mundial, accesible desde cualquier lnea de comandos y se requiere una configuracin. -bash: php: command not found Usted tendr que localizar la versin de lnea de comandos o instalar a continuar con este captulo. CROSS--REF Vase el Captulo 1 para obtener informacin sobre cmo instalar la versin de lnea de comandos de PHP.

Construir un servidor socket


Para crear un servidor de socket sencillo usando PHP, empezar por crear un archivo y guardarlo en un lugar de acceso comn. Este archivo no tiene por qu estar en su directorio web y probablemente slo ser ms difcil trabajar si lo es. NOTA Usted quiere asegurarse el archivo socket no es visible en la Web, ya que podra causar que su PHP para que no funcione correctamente si un usuario malintencionado intenta ejecutar el archivo. Para entender mejor cmo trabaja el socket, empezar con un ejemplo muy simple socket de servidor. 166

Simple PHP-servidor basado en socket


La primera parte del servidor de socket es determinar la direccin IP del servidor y nmero de puerto. Si est ejecutando el servidor local no es necesario para determinar su direccin IP fsica. En su lugar, puede utilizar la direccin local. <?php $host = 127.0.0.1; $port = 8888; El nmero de puerto no es especfico, pero debe ser nico en la misma mquina para asegurarse de que no choquen con cualquier otra aplicacin en su sistema o red (si se usa de forma remota). Este script PHP necesidad de informar a seguir corriendo porque es necesario para buscar y administrar las conexiones de forma indefinida. Esto se logra mediante la aprobacin de la funcin set_time_limit un valor de 0, lo que significa esta secuencia de comandos no debe parar hasta que sali bien. set_time_limit(0); Con la configuracin del camino, usted puede crear la conexin de socket principal. $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); Los tres argumentos que se pasan en la funcin socket_create define qu tipo de conexin que es y son constantes PHP. Para este ejemplo, no son importantes, pero que se explica ms adelante en el captulo. La variable $sock ahora contiene un recurso de socket activo de identificacin. El siguiente paso es enlazar el conector para el puerto definido en la primera parte del cdigo. socket_bind($sock, $host, $port); Despus de que el socket est enlazado al puerto, usted puede empezar a escuchar las conexiones. El primer argumento es la variable $socket, que tiene el socket de recursos de identificacin. El segundo argumento es una variable de retraso que le dice a PHP la cantidad de mensajes que hacer cola antes de que un error se pasa al cliente. Esta variable es una sugerencia ya que algunos sistemas se definen o reemplazar este valor. Por ejemplo, Windows establece esta basado en el proveedor de servicios de base y, bsicamente, ignora cualquier valor usersubmitted. socket_listen($sock, 4); En este punto, usted ha construido un servidor de socket que no hace nada. Esto bsicamente significa que el servidor se inicia y espera las conexiones entrantes, pero no controla en modo alguno. El siguiente paso es configurar la parte del servidor de socket que maneja las conexiones de entrada. Es necesario crear otro conector que se encarga de las conexiones de entrada, haciendo un llamado a socket_accept pasa en el recurso id $socket. $childSocket = socket_accept($sock); 167

Desde este punto la variable $childSocket se utiliza para controlar todas las comunicaciones del cliente. Los datos enviados desde una conexin que se lee con la funcin socket_read. $incomingData = socket_read($childSocket, 2048); Esta funcin toma dos argumentos. El primer argumento es el controlador de socket de cliente, y el segundo argumento es el nmero de bytes para leer desde el cliente. Esto puede ser til al intentar ejecutar un servidor de sockets ms eficiente. Tambin es una buena idea para limitar la salida en el lado del cliente (si es posible). La funcin socket_read contina cargando informacin en la variable $incomingData hasta el lmite de datos es golpeado o uno de los personajes se encuentra la siguiente: retorno de carro (\n), tabulador (\t), o \0. PHP las trata como al final de caracteres de entrada y se mueve a la lnea siguiente en la secuencia de comandos cuando se encuentra uno.

Responder a la conexin del cliente


Despus de cargar los datos, el siguiente paso es el de actuar en esos datos y en la mayora de los casos responde al cliente. Por ejemplo, la siguiente es una simple pregunta/respuesta demo que tenga PHP en respuesta a una pregunta: if(substr($incomingData, 0, -2) == are you hungry?) { $response = Server Response > I could eat!\n; socket_write($childSocket, $response, strlen($response)); } La funcin socket_write toma tres argumentos. La primera es que el nio toma de ID de recursos, el segundo argumento es la respuesta que se enva al cliente. El tercer argumento, que es opcional, es la longitud del $response. Este ejemplo slo enva una respuesta al cliente cuando se le pide PHP si tiene hambre. Como puede ver, esto no es una aplicacin muy prctica, pero no explican claramente cmo sockets se establecen y cmo interactuar con ellos. El ltimo paso para la aplicacin de ejemplo, antes de la prueba, es el cierre de las dos conexiones de socket para liberar los recursos y permitir las conexiones a que se hizo. NOTA Si desea seguir recibiendo conexiones que slo desea quitar la variable $childSocket. socket_close($childSocket); socket_close($sock); Los enchufes pueden cerrarse en cualquier orden, pero es una buena prctica para cerrar el ltimo maestro en caso de tener que recorrer varias conexiones de cliente primero.

Probar el servidor socket


Prueba del servidor de socket que se puede hacer mediante un simple sistema o terminal, como se muestra en la Figura 8.2. Con la lnea de comando abierto, inicie la versin de lnea de comandos de PHP, pasando en el archivo de ejemplo utilizando la opcin -f. 168

$ /path/to/php -f /path/to/socket/sample/simpleSocket.php FIGURA 8.2 Servidor de socket simple se ejecuta en el smbolo del sistema

Usted notar que el indicador del sistema desaparece y el archivo PHP informes no hay actualizaciones. Esto no puede ser un resultado muy deseable porque nada es lo que le permite saber que el servidor se est ejecutando actualmente. Usted puede agregar una declaracin de impresin muy simple a la parte superior del archivo, tales como: <?php $host = 127.0.0.1; $port = 8888; set_time_limit(0); print Starting Socket Server...\n; ... Si detiene e inicia el servidor de sockets debera ver el mensaje impreso, similar a la siguiente: $ /usr/bin/php -f /path/to/simpleSocket.php Starting Socket Server... NOTA Si reinicia el servidor de socket a menudo puede ver una advertencia que indique que el puerto est en uso. Puede intentarlo de nuevo o elegir otro puerto para continuar con las pruebas. Cuando el servidor de socket est funcionando correctamente puede abrir un nuevo sistema y tratar de conectar el cliente con el servidor de socket. 169

$ telnet 127.0.0.1 8888 Despus de una conexin, un mensaje similar al siguiente debera aparecer: $ telnet 127.0.0.1 8888 Trying 127.0.0.1... Connected to localhost. Escape character is ^]. Esta aplicacin slo acepta un mensaje para ser enviado antes de ser terminado. Si usted escriba nada que no sea "Tienes hambre?" ( are you hungry? ), No ver una respuesta, a menos que haya modificado la pregunta que se pide en la aplicacin socket. Aqu est el cdigo completo de este ejemplo: <?php $host = 127.0.0.1; $port = 8888; set_time_limit(0); print Starting Socket Server...\n; $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($sock, $host, $port); socket_listen($sock, 4); $childSocket = socket_accept($sock); $incomingData = socket_read($childSocket, 2048); if(substr($incomingData, 0, -2) == are you hungry?) { $response = Server Response > I could eat!\n; socket_write($childSocket, $response, strlen($response)); } socket_close($childSocket); socket_close($sock); ?> La conexin se termina automticamente cuando el mensaje se devuelve porque no hay ningn sistema en el lugar para buscar mensajes adicionales. Una aplicacin ms realista sera suponer algn tipo de bucle en lugar de buscar ms de un mensaje.

Crear un persistente servidor socket


El servidor de socket persistentes sera muy similar al del ejemplo anterior, con la excepcin de un control de bucle de mensajes nuevos.

Bucles (loops) Recursivos


PHP no ofrece un sistema asncrono (basado en eventos) como se debera encontrar en ActionScript, pero usted puede crear un bucle para lograr el mismo resultado. Por ejemplo, aqu hay una muy simple bucle while similar a la que se utilizar en el ejemplo de conexin persistente: 170

x = 0; while(x < 50) { x++; }

Gestionar conexiones mltiples


La clave para permitir a un usuario para enviar ms de un mensaje por conexin es envolver el socket_read pide que se encargan de comprobar si hay mensajes nuevos en un bucle. do { // look for new messages $incomingData = socket_read($childSocket, 2048); if(trim($incomingData) == are you hungry?) { $response = Server Response > I could eat!\n; socket_write($childSocket, $response, strlen($response)); } else if(trim($incomingData) == exit) { $response = Goodbye!\n; socket_write($childSocket, $response, strlen($response)); socket_close($childSocket); break; } else { $response = strtoupper(trim($incomingData)) . \n; socket_write($childSocket, $response, strlen($response)); } } while(true); Si prueba el ejemplo, la conexin permanece activa hasta que cierre el sistema o que escriba "exit" cuando se conecta a la aplicacin, que informa al servidor de socket para cerrar la conexin. Tambin puede escribir nada, adems de " exit " o la pregunta anterior y la respuesta ser su entrada en maysculas. Este sencillo ejemplo no tiene soporte para varios clientes, por lo que una vez cerrado el cliente, el servidor termina tambin. En la segunda parte de este captulo se construye un completo de sockets basados en multiusuario aplicacin de chat que, por definicin, permite ms de una conexin en un momento. Ahora debe entender cmo funciona sockets en PHP, as como la forma de aplicar de maneras diferentes, dependiendo de la aplicacin. La siguiente parte se explica cmo trabaja los sockets en Flash. Luego, en el captulo final, se combina Flash y PHP para mandar y recibir informacin a travs de sockets.

171

Trabajar con Sockets en Flash


Flash es considerado el lado del cliente de una conexin de socket. Esto significa que no se puede implementar un servidor de sockets, directamente en Flash, ya que Flash es una aplicacin cliente-lado. Ser capaz de usar Flash como un servidor de sockets, si era posible, no sera muy beneficioso debido al hecho de que Flash es una aplicacin grfica. En esencia, sera un desperdicio de recursos a utilizar Flash en un entorno de lnea de comandos. Dicho esto, Flash hace un excelente cliente de servidor de socket. Telnet se utiliz en la seccin anterior, que es una manera de inicializar una conexin de cliente a un servidor de socket. Flash permite que las conexiones TCP, que requieren ms y ms el cdigo de instalacin en el principio. La mayora del cdigo de conexin en la siguiente seccin se puede construir en una clase o una biblioteca comn para reducir al mnimo la cantidad de cdigo necesario para crear una conexin de socket.

Inicializacin de una conexin socket


La primera parte de la inicializacin de una conexin de socket es definir el host y el puerto para conectar. var host:String = 127.0.0.1; var port:uint = 8888; Estas dos variables tendr que ser el mismo que el cdigo PHP que escribi en la seccin anterior. O, si usted est utilizando el cdigo suministrado, puede mantener los valores de la muestra slo se muestra. Una vez definidas las variables, crear una instancia de la clase Socket. El constructor de esta clase acepta dos parmetros. El primero es el anfitrin, y el segundo es el puerto para conectar. var socket:Socket = new Socket(host, port); A medida que contine trabajando con las fuentes de datos dinmica, a encontrar rpidamente que los controladores de eventos adecuado que sea ms fcil de entender cmo algo que est funcionando. Esto significa que los detectores de eventos aadir al proceso de socket es una buena idea. Iniciar la construccin de las llamadas, y luego crear los controladores de eventos ms adelante. socket.addEventListener(Event.CLOSE, closeHandler); socket.addEventListener(Event.CONNECT, connectHandler); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);

Controladores de eventos (Event handlers)


Las funciones de controlador de eventos usado en esta aplicacin de ejemplo de seguimiento de los errores a la ventana de salida. Una aplicacin ms realista consistira en exigir alguna lgica para manejar estos errores y responder al usuario en consecuencia. 172

function closeHandler(event:Event):void { trace(Connection to [ + host + ] closed); } function ioErrorHandler(event:IOErrorEvent):void { trace(event.text); } function securityErrorHandler(event:SecurityErrorEvent):void { trace(event.toString()); }

Controladores especiales (Special handlers)


Este ejemplo tiene dos controladores de eventos especiales. El primer controlador de eventos especiales que se llama cuando una conexin es satisfactoria, que le informa que los mensajes pueden ser enviados al servidor de socket. Los mensajes enviados antes de una conexin adecuada se podra dar lugar a errores o mensajes perdidos. function connectHandler(event:Event):void { trace(Connected to [ + host + ]); } La funcin connectHandler es el lugar ninguna llamada al servidor debe ser hecho. Sera un buen lugar para aadir la llamada del mensaje de la muestra, tales como: function connectHandler(event:Event):void { trace(Connected to [ + host + ]); try { socket.writeUTFBytes((are you hungry?\n); } catch(e:IOError) { trace(e); } } El segundo controlador de eventos especiales se llama cuando una respuesta es totalmente reunidos desde el servidor de socket. Esto se utiliza para garantizar que los mensajes parciales no son evaluados, ya que podra provocar errores de programacin que sera difcil hacer un seguimiento. function socketDataHandler(event:ProgressEvent):void { trace(Socket Server Response Loaded); } 173

Esta es la funcin en la que todo el cdigo responde debe colocarse, de forma similar a la siguiente:
function socketDataHandler(event:ProgressEvent):void { var str:String = socket.readUTFBytes(socket.bytesAvailable); trace(Socket Server Response: + str); }

Como puede ver, el trabajo con sockets en Flash no es tan diferente de cualquier otro objeto de datos. La consistencia del cdigo a travs de diferentes paquetes es un aspecto muy grandes de ActionScript.

Conexin remota de socket


El ejemplo anterior se conecta a un socket local (en la misma mquina), pero es ms realista que su aplicacin se conecta a un socket remoto. Esto significa que debe configurar una confianza entre el cliente y el servidor que ejecuta el servidor de aplicaciones sockets.

Confianza de seguridad
Un trust (confianza) utiliza el archivo crossdomain.xml con los puertos que estn autorizados, tales como:
<?xml version=1.0?> <!DOCTYPE cross-domain-policy SYSTEM http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd> <cross-domain-policy> <allow-access-from domain=* to-ports=8888 /> </cross-domain-policy>

Este archivo de acceso es que permite a cualquier cliente para conectarse en el puerto 8888 y no otro. Tambin puede definir un dominio si esta aplicacin socket slo ser accesible desde otro sitio Web, tales como.
<?xml version=1.0?> <!DOCTYPE cross-domain-policy SYSTEM http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd> <cross-domain-policy> <allow-access-from domain=anothersite.com to-ports=8888 /> </cross-domain-policy>

La segunda parte de la confianza de seguridad es una llamada a allowDomain en el archivo de Flash. Este mtodo de la clase de seguridad es responsable de definir un dominio que se le permite conectarse a este cliente. Esta conexin slo se producir si el sitio remoto tiene un buen archivo de crossdomain.
Security.allowDomain(example.com);

Cargar el achivo de poltica


En raros casos, el archivo de poltica de dominio no est en la ubicacin predeterminada, por lo que una llamada a la loadPolicyFile se puede hacer para informar a Flash donde encontrar el archivo de crossdomain.xml.
Security.loadPolicyFile(http://example.com/newloc/crossdomain .xml);

174

Ahora debe saber cmo configurar un cliente basado en conexin de socket en Flash. Como puede ver, la mayora de los cdigos utilizados en una conexin de socket est a cargo de Flash. Como se seala en el comienzo de esta seccin, el cdigo utilizado para crear una conexin de socket pueden ser reutilizados en sus proyectos.

Uso de una clase para conexiones de socket


Para entender mejor las conexiones de socket en Flash, vamos a empezar por ejemplo la construccin de un zcalo de base. Entonces una vez que los fundamentos estn en su lugar, la siguiente seccin abarcar la construccin de un socket completo de la aplicacin de chat basado en la utilizacin de Flash y PHP.

Calse basica de socket


Esta es una clase bsica de socket que fcilmente define los elementos personalizables. Slo necesitar guardar el cdigo en un archivo de ActionScript con el nombre de SimpleSocket en el mismo directorio que el documento de muestra de Flash.
package { import flash.errors.*; import flash.events.*; import flash.net.Socket; public class SimpleSocket extends Socket { public var host:String; public var port:uint; private var socket:Socket; public static var SOCK_CONNECTED:String = onSockConnect; public static var SOCK_IOERROR:String = onSockIOError; function SimpleSocket(h:String, p:uint) { host = h; port = p; socket = this; super(host, port); initListeners(); } public function sendMessage(str:String):void { if(connected) { socket.writeUTFBytes(str + \n); } else { trace(Not connected, message not sent!); } } public function readMessage():void { if(connected) { var str:String =

175

socket.readUTFBytes(socket.bytesAvailable); trace(Socket Server Response: + str); } else { trace(No message read, not connected!); } } private function initListeners():void { socket.addEventListener(Event.CLOSE, closeHandler); socket.addEventListener(Event.CONNECT, connectHandler); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); } private function closeHandler(event:Event):void { trace(Connection to [ + host + ] closed); } private function ioErrorHandler(event:IOErrorEvent):void { dispatchEvent(new Event(SOCK_IOERROR)); } private function connectHandler(event:Event):void { trace(Connected to [ + host + ]); dispatchEvent(new Event(SOCK_CONNECTED)); } private function socketDataHandler(event:ProgressEvent):void { readMessage(); } } } // last two braces are lined up for printing purposes

Usar la clase SimpleSocket


El proceso de utilizar la clase SimpleSocket es bastante simple. Comience por la creacin de una nueva pelcula de Flash. Esta pelcula hace una llamada de importacin, que es responsable de cargar la clase personalizada.
import SimpleSocket; var sock:SimpleSocket;

Para crear una conexin de socket, comience por hacer una nueva instancia de la clase SimpleSocket, pasando en el host y el puerto de informacin para conectarse al servidor socket que desea.
sock = new SimpleSocket(127.0.0.1, 8888);

Cuando se termina la llamada conexin de socket, se le desea asignar a los oyentes a los eventos personalizados. Esta clase simple slo tiene eventos para una conexin exitosa y otra para cualquier error de conexin. Puede ampliar la clase y agregar ms controladores de eventos, segn sea necesario.
sock.addEventListener(SimpleSocket.SOCK_CONNECTED, connected); sock.addEventListener(SimpleSocket.SOCK_IOERROR, ioError);

176

El ltimo paso es definir las funciones de controlador de eventos, tales como:


function ioError(e:Event):void { trace(Cant connect to + sock.host + on port + sock.port); } function connected(e:Event):void { sock.sendMessage(are you hungry?); }

Ahora puede ejecutar la pelcula y debe ver la siguiente salida si se construy o cargado el cdigo del servidor de zcalo y el servidor se est ejecutando actualmente.
Connected to [127.0.0.1] Socket Server Response: ARE YOU THERE?

Esta clase puede ser ampliado para permitir a los requisitos ms especficos, pero usted debe tener un conocimiento bsico de cmo el sistema de socket trabaja en Flash. En este punto usted tambin debe saber cmo construir una clase personalizada para manejar la mayora de la conexin de socket y comunicacin de proceso. La ltima seccin se centra en la construccin de un cliente de chat multiusuario personalizado utilizando la informacin adquirida en las secciones anteriores.

Crear un cliente de Chat con Sockets Usando Flash y PHP


En las secciones anteriores, usted aprendi cmo construir un simple servidor PHP socket. A continuacin, construy un cliente de Flash bsico para comunicarse con el servidor de socket de PHP. En esta seccin, se combinan los pasos en una aplicacin real. La aplicacin que ser construido es un cliente de chat multi-usuario que se ejecuta en Flash con un servidor de sockets de PHP para manejar las conexiones. Esta aplicacin de chat multiusuario permite mltiples conexiones de los clientes para hablar entre otros con el administrador de poder enviar mensajes especficos sobre el estado y los detalles de conexin.

Servidor socket PHP para el cliente de chat


La parte de PHP de la aplicacin ser de dos archivos: el real de la clase de servidor de zcalo y la pgina que llama a iniciar el servidor de zcalo. El servidor socket de clase esqueleto parece en el siguiente bloque de cdigo. Como puede ver, la clase Socket tiene muchos mtodos. De partirlos en fcil de mantener las partes crearn un mejor producto en el final.
class ChatServer { ... function ChatServer($ip=192.168.1.110, $port=8888) {} public function startServer() {} public function stopServer() {} private function initLoop() {} private function createMasterClient() {}

177

private private $admin) private private private }

function function {} function function function

notifyClient($sockID, $buffer) {} notifyClients($clients, $sock, $buffer, handleError($str, $err) {} endSocket($sockID=null) {} serverMessage($str) {}

Propiedades del Chat


La primera parte para centrarse en la clase son las propiedades, que se encarga de almacenar los mensajes de error diferentes, as como detalles de la conexin.
private $ipAddress = null; private $port = null; private $masterClient = null; private $clients; // Server Messages private static $SOCKET_CREATE_FAIL = socket_create() failed; private static $SOCKET_BIND_FAIL = socket_bind() failed; private static $SOCKET_LISTEN_FAIL = socket_listen() failed; private static $SOCKET_ACCEPT_FAIL = ; private $LINE_ENDING = \n; private static $SHOW_ERRORS = 1; // display errors (0=off, 1=on)

Estos mtodos son los establecidos como privado para garantizar que no sea accidentalmente accesible a otros scripts. Puede configurar mtodos get y set si decide que desea compartir estas o cualquiera de las propiedades de una clase. PRECAUCIN Tenga cuidado cuando autorice a los mtodos y propiedades para ser accesible a nivel mundial. La falta adecuada bloquea estos elementos puede resultar en fallas de seguridad. El mtodo constructor es responsable de almacenar el host y el puerto de la informacin. Este mtodo tambin se crea una nueva matriz que almacenar la informacin del cliente conectado. Usted se dar cuenta de los valores ms comunes en el constructor estn predefinidos. Esto significa que, si no de host o puerto se define por la secuencia de comandos llamada se utilizan estos valores por defecto:
function ChatServer($ip=127.0.0.1, $port=8888) { $this->ipAddress = $ip; $this->port = $port; $this->clients = array(); }

La siguiente funcin es llamada por el segundo archivo PHP y es donde la funcin de servidor maestro, as como la funcin de sistema de escucha se llaman desde. La funcin stopServer izquierda est vaco porque el servidor de socket se apaga cuando la relacin termina. Usted puede agregar ms lgica que podra permitir la desviacin a distancia o incluso de cierre en un momento determinado.
public function startServer() { $this->createMasterClient(); $this->initLoop(); }

178

public function stopServer() { /* empty */ }

La funcin de initLoop, que se llama cuando se inicia el servidor, es el ncleo del servidor de socket. Esta funcin es responsable de la inicializacin de nuevas conexiones y la escucha de los mensajes enviados desde las conexiones existentes. Esta funcin abarca la mayor parte de esta aplicacin. Usted va a mirar en partes. El primer paso de esta funcin es la de restablecer la variable $socketsChanged que contiene la lista modificada de conexiones de socket.
private function initLoop() { $socketsChanged = null; while(true) { // connection and message loop } }

El contenido del bucle while es donde la mayora de los clientes y control de mensaje aparece. La funcin socket_select ser responsable de modificar el estado de lectura de un socket de nuevos datos se encuentra, que lo seala, y aade al socket de la matriz de los sockets cambiado para ser doblada a travs. Este es usado para limitar el control de los datos en los bucles foreach. NOTA La funcin socket_select modifica la matriz. Es una buena idea hacer una primera copia.
... while { $socketsChanged = $this->clients; $write = NULL; $except = NULL; socket_select($socketsChanged, $write, $except, NULL); foreach($socketsChanged as $socket) { ... } }

Se podra ampliar esta funcionalidad a mltiples mtodos en la clase, pero es una buena idea guardar todos los cdigos pertinentes, junto. El bucle foreach se ejecuta a travs de cada conexin de socket activo. Se comprueba en el servidor maestro y luego se revisan para asegurarse de que existe un cliente activo. Si no hay cliente activo existe el script exits, porque algo ha ido mal y el cdigo no ser capaz de continuar.
foreach($socketsChanged as $socket) { if($socket == $this->masterClient) { if (($client = socket_accept($this->masterClient)) < 0) { $this->handleError(ChatServer::SOCKET_ACCEPT_FAIL, ); continue;

179

} else { array_push($this->clients, $client); } } else { ... } }

Si el cliente se ha agregado y la instancia del servidor principal existe, la otra parte del cdigo se ejecute. Esta parte comprueba el bfer de mensaje para un mensaje vlido. Si no se encuentra buffer vlido, la conexin del cliente finaliza. Esta rutina de limpieza garantiza que los recursos no se estn desperdiciando.

Excluyendo el servidor maestro de la comunicacin


Suponiendo que un mensaje vlido se encuentra, el valor se almacena en una variable de cadena nueva y el servidor maestro se retira de la matriz. Esto se hace para garantizar todos los mensajes o el mantenimiento no se producir en la conexin principal. Por ejemplo, un mensaje de difusin de informar a los clientes del servicio no es algo que el servidor maestro tiene que recibir. La funcin array_shift elimina el primer elemento y rekeys la matriz, bsicamente cambiando todos los elementos de uno.
if($socket == $this->masterClient) { ... } else { $buffer = ; // filled by socket_recv (undocumented) $bytes = socket_recv($socket, $buffer, 2048, 0); if($bytes == 0) { $this->endSocket($socket); } else { $allclients = $this->clients; array_shift($allclients); // remove master $specialString = $buffer; } ... }

Parametros especiales del chat


Cuando se encuentra un mensaje vlido, se comprueba de los parmetros especiales. Esto podra ser un simple peticin "exit" o una bandera de administracin ms avanzada que se utiliza para notificar a los clientes con mensajes de servicio. Los tipos de mensajes especiales son slo un ejemplo de casos de uso. Usted puede cambiar, agregar o eliminar los mensajes especiales, dependiendo de cmo configurar su cliente de chat. 180

// look for admin beacon if(substr($specialString, 0, 7) == [admin]) { $this->notifyClients($allclients, $socket, substr($buffer, 7), true); }

El mensaje "exit" es llamado por un cliente que quiere salir de chat. Si el usuario simplemente cierra la pelcula de Flash, el servidor de socket quita el usuario de la lista en el siguiente bucle paso. Esto le da al usuario una forma de dejar limpio el sistema y ver un mensaje "adis" ( Goobye ) de que l o ella a salido.
else if(substr($specialString, 0, 4) == exit) { $this->serverMessage(Closing Connection: . $socket); $this->notifyClient($socket, Goodbye); $this->endSocket($socket); }

A ms avanzada aplicacin de chat probablemente habra documentacin en el sitio Web. Este comando "help" te muestra otra forma de entregar los comandos ms utilizados directamente a sus clientes conectados. Usted se dar cuenta de este comando es muy similar al "hombre" de comandos que se encuentra en las terminales UNIX.
else if(substr($specialString, 0, 4) == help) { $this->notifyClient($socket, Chat Help:\n . Type exit to leave chat); }

Si no se encuentra ningn mensaje especial, simplemente transmitir el mensaje sin editar a todos los otros clientes. Este sistema an se mostrar su comentario a usted. Una aplicacin ms completa sera necesario establecer para excluir el autor del comentario que no se actualicen.
else { $this->notifyClients($allclients, $socket, $buffer); }

Como puede ver, el mtodo initLoop tiene un montn de responsabilidades y maneja una buena parte de todo el servidor de socket.

Conexin cliente - maestro


El mtodo createMasterClient se llama cuando se inicia el socket de servidor. Este mtodo inicializa el servidor de socket y crea la conexin principal a la que todos los dems clientes se conectan.
private function createMasterClient() { if(($this->masterClient = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { $this->handleError(ChatServer::SOCKET_CREATE_FAIL, $this->masterClient); }

181

Las opciones de socket se establecen para permitir la reutilizacin de la direccin local, que informa de PHP de sobrescribir la conexin existente est permitido. Usted establece este a false si quiere mantener una relacin nica.
socket_set_option($this->masterClient, SOL_SOCKET,SO_REUSEADDR, 1);

Antes de la conexin inicial se puede hacer, debe asegurarse de que la direccin est disponible y no en uso por una aplicacin existente.
if(($bindRes = socket_bind($this->masterClient, $this->ipAddress, $this->port)) < 0) { $this->handleError(ChatServer::SOCKET_BIND_FAIL, $bindRes); }

Suponiendo que la direccin est disponible, se hace una llamada a socket_listen, lo que hace que el socket listo para recibir peticiones de conexin. Una vez hecha la conexin, el cliente principal es aadido a la matriz del cliente y el proceso de inicializacin se ha completado.
if(($ret = socket_listen($this->masterClient, 5)) < 0) { $this->handleError(ChatServer::SOCKET_LISTEN_FAIL, $ret); } $this->clients = array($this->masterClient);

El ltimo paso en el mtodo de createMasterClient es enviar un mensaje de servidor que informa al operador de servidor que un nuevo servidor de chat se ha inicializado. En este ejemplo, el operador es que, por lo que se dar cuenta de una declaracin de impresin en el sistema cuando se inicia el servidor.
$this->serverMessage(Chat Server Started); }

Notificar a un cliente especfico


Hay dos tipos de notificaciones a clientes en esta aplicacin de chat. El primer tipo es una notificacin mundial y el segundo tipo es para un solo usuario. La sola notificacin de usuario es ms comnmente utilizado para enviar mensajes de estado a un cliente. El nico mtodo de usuario acepta dos parmetros que definen el conector especfico de identificacin y el mensaje a enviar a ese cliente. Un bucle foreach es usado para encontrar el cliente especfico, y si la encuentra, una llamada a socket_write que se haga, enviando el mensaje.
private function notifyClient($sockID, $buffer) { foreach($this->clients as $client) { if($client == $sockID) { socket_write($client, $buffer . $this->LINE_ENDING); } } }

182

Notificar a todos los clientes


La notificacin global es similar al mtodo de un solo usuario, con la excepcin que comprueba si se enva el mensaje ha de ser marcado como un mensaje de administracin. La bandera de administrador se puede establecer cuando se hace una llamada a notifyClients. El valor por defecto es falso, asegurando que los mensajes de cliente no pueden ser marcados como provenientes de la administracin.
private function notifyClients($clients, $sock, $buffer, $admin) { foreach($clients as $client) { if($admin == true) { socket_write($client, ADMIN NOTICE: . $buffer); } else { socket_write($client, $sock . wrote: . $buffer); } } }

Controlar errores
Como la aplicacin sigue funcionando, est obligada a tener un error o dos. En lugar de tirar estos errores de distancia, es una buena idea para capturarlos y al menos los mostrar en el servidor. Un ejemplo de un controlador de errores de base se puede ver aqu:
private function handleError($str, $err) { if(ChatServer::SHOW_ERRORS) { $this->serverMessage(($str . : reason: . $err) . $this->LINE_ENDING); } }

El mtodo de handleError comprueba primero que los errores deben ser mostradas por el control de la propiedad esttica de SHOW_ERRORS, definido en la parte superior del archivo de clase. El passed-in el mensaje de error que se transmite al mtodo serverMessage, que lo imprime. Usted puede llamar al mtodo serverMessage directamente, pero utilizando este sistema de transmisin le permite capturar los errores y mantener el cdigo limpio. No tendra sentido tener la condicin de SHOW_ERRORS en serverMessage porque un mensaje no siempre es un error.

Finalizar una conexin


La conexin se termina cuando el cliente cierra el navegador o aplicacin. Sin embargo, el usuario tambin puede cerrar la conexin mediante el envo de los parmetros especiales de "exit". Un mtodo de terminacin de conexin se utiliza para garantizar la matriz de conexiones activas est correctamente manejada. Este mtodo tambin eliminar el maestro de clientes activos, si no existe, en ltima instancia poner fin a la conexin con el servidor propio zcalo.

183

La funcin array_search se utiliza para encontrar el socket id de cerrar. Esta funcin devuelve el id de la matriz. Esto se utiliza para eliminar la conexin de la lista y poner fin a la conexin de socket especfico.
private function endSocket($sockID=null) { // close master if no socket is defined if($sockID == null) { $sockID = $this->masterClient; } $index = array_search($sockID, $this->clients); unset($this->clients[$index]); socket_close($sockID); }

Monitoriar servidor
El ltimo mtodo de la clase de chat se utiliza para imprimir los mensajes sobre el servidor directamente al socket activos del sistema, por lo general se ejecutan en el servidor Web para que los clientes estn conectando.
private function serverMessage($str) { print $str . $this->LINE_ENDING; }

Conectar al servidor socket


La conexin al chat de primera clase construido en la seccin anterior es manejado por el segundo archivo PHP. Este archivo ser el que podramos llamar cuando quiere iniciar el servidor de chat. La construccin del sistema de esta manera le permite abandonar el chat de clase en su propio y duplicar la conexin sin modificar el cdigo.

Construir el archive de conexion


He aqu un ejemplo de conexin en el dominio localhost, tambin conocida comnmente como la direccin de bucle invertido de su mquina o el servidor.
#!/usr/bin/php -q <?php include ChatServer.php;

La primera lnea se utiliza para definir el comando a la terminal. No es necesario, pero no significa que usted puede excluir a los interruptores, en este caso el -q que se utiliza para suprimir la produccin de cabecera HTTP, cuando se llama al script PHP. La prxima lnea incluye la clase ChatServer, lo que le permite llamar desde ese punto. Una vez que el archivo se incluye adecuadamente puede hacer un nuevo ejemplo chat, pasar en el host y el puerto que le gustara comenzar a escuchar. En este ejemplo, la mquina local se utiliza y est enlazado al puerto 8888. El nmero de puerto no tiene por qu ser la misma, ya que slo necesita ser abierto. Es una buena idea escoger un nmero de puerto que no ser utilizada por otras aplicaciones en su sistema.
$chatServer = new ChatServer(127.0.0.1, 8888);

184

El ltimo paso es iniciar el servidor y permitir que otros se conecten a ella. Para detener el servidor puede cerrar el terminal o pulse Ctrl + C, que en la mayora de los terminales pondr fin al proceso activo.
$chatServer->startServer();

Aqu est el cdigo completo de este sencillo test:


#!/usr/bin/php -q <?php include ChatServer.php; $chatServer = new ChatServer(127.0.0.1, 8888); $chatServer->startServer(); ?>

Probar la conexin
Para la prueba simple, puede conectar al servidor de chat utilizando el mtodo de telnet, como se muestra en la Figura 8.3, que se explic al comienzo del captulo. Este mtodo representa una grfica y la limitacin de uso, por lo que la prxima seccin es el proceso de desarrollo de la aplicacin Flash que se conecta a este servidor de sockets de PHP. FIGURA 8.3 Ejemplo de servidor de chat se ejecuta en el smbolo del sistema

185

Crear el cliente en Flash


El cliente de chat Flash se utiliza para interactuar con el servidor de socket. Esta aplicacin cliente se puede usar en forma local o en un sitio web, dependiendo de cmo el servidor de socket est configurado. Para este ejemplo, el cdigo asume que el servidor de socket se ejecuta localmente. La parte de diseo del cliente de Flash se ha terminado para usted, como se muestra en la Figura 8.4. Este archivo de arranque se encuentra en el sitio Web para este libro, junto con el cdigo de todas las dems secciones. La primera parte del cdigo de Flash inicializa el host y el puerto de informacin, que se pasa a una nueva instancia de la clase Socket.
var host:String = 127.0.0.1; var port:uint = 8888; var socket:Socket = new Socket(host, port);

FIGURA 8.4
La aplicacin completa, que puede encontrarse en el sitio Web del libro

186

Despus de realizada la conexin, asignar los detectores de eventos, que ser llamado cuando los nuevos datos se envan o se carga.
socket.addEventListener(Event.CLOSE, closeHandler); socket.addEventListener(Event.CONNECT, connectHandler); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); socket.addEventListener(ProgressEvent.SOCKET_DATA, sockHandler);

El cliente de chat tambin necesita los controladores de eventos que sern asignados a la caja de mensajes de texto y botones de entrada de presentacin, tales como:
msgTxt.addEventListener(Event.CHANGE, inputHandler); clearBtn.addEventListener(MouseEvent.CLICK, clearButtonHandler); sendBtn.addEventListener(MouseEvent.CLICK, sendButtonHandler);

El ltimo controlador de eventos se le asignar al teclado para permitir el uso de la tecla Intro para enviar mensajes. Esto no es un paso necesario, pero aade funcionalidad a la aplicacin.
addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);

Funciones de control de eventos


Las funciones que se asignan a los controladores de eventos se puede ver en el siguiente cdigo. Como puede ver, estos controladores de eventos tienen la funcionalidad bsica para este ejemplo, pero podra ampliarse en una aplicacin de mundo ms real.
function closeHandler(event:Event):void { statusMessage(Connection to [ + host + ] closed, #FF0000); disableInterface(); } function connectHandler(event:Event):void { statusMessage(Connected to [ + host + ], #006600); sendRequest(); } function ioErrorHandler(event:IOErrorEvent):void { statusMessage(event.text, #FF0000); } function securityErrorHandler(event:SecurityErrorEvent):void { statusMessage(event.toString(), #FF0000); } function sockHandler(event:ProgressEvent):void { readResponse(); }

187

Capturar pulsaciones de teclas


El controlador de eventos claves (Key) tiene un cdigo especial. Esto atrapa caso de que el momento presiona la tecla y el control para ver si es la tecla Enter. Para este ejemplo, la nica clave para buscar es Enter. Si usted necesita ms de una, se podra definir en una matriz o utilizar un modificador de declaracin switch..case. Si el presionar la tecla Intro, se haga una llamada a dispatchEvent, obligando al hacer clic con el botn "Enviar".
function keyDownHandler(e:KeyboardEvent):void { if(e.keyCode == Keyboard.ENTER) { sendBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); } }

Controlar envoi de mensajes


El controlador de clave hace una llamada al evento, haga clic en el botn "Enviar", que se asigna a la funcin siguiente. Esta funcin comprueba la longitud del TextInput msgTxt y, si la longitud es mayor que cero, se prepara el mensaje y se enva. El ltimo paso de esta funcin es para desactivar la casilla de mensajes para garantizar el mismo mensaje que no est molesta. Se podra aadir el cdigo de compensacin en el controlador de estado. Esta claro que el campo una vez que sabe que el mensaje ha sido enviado. Esto le permite conservar el mensaje y evitar mensajes perdidos debido a fallos en la red.
function sendButtonHandler(e:MouseEvent):void { if(msgTxt.text.length > 0) { writeLine(msgTxt.text); clearBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); } }

Borrar (Clearing) el mensaje de la entrada


La funcin clearButtonHandler es llamado cada vez que desea borrar el campo de entrada de texto y deshabilitar el botn Enviar un mensaje nuevo hasta que se introduzca. Los botones se desactivarn cuando el evento de cambio de envo en la siguiente seccin.
function clearButtonHandler(e:MouseEvent):void { msgTxt.text = ; msgTxt.dispatchEvent(new Event(Event.CHANGE)); }

188

Checking the text input length


Cuando un mensaje nuevo se incluye o el cuadro de entrada se borra, una llamada a un cambio en el cuadro de msgTxt se hace. Este evento es responsable de comprobar la longitud del texto en el cuadro de entrada y activar o desactivar los botones Enviar y borrar, como se muestra en la Figura 8.5, en funcin del resultado de la verificacin de la longitud.
function inputHandler(e:Event):void { if(e.target.text.length > 0) { clearBtn.enabled = true; sendBtn.enabled = true; } else { clearBtn.enabled = false; sendBtn.enabled = false; } }

FIGURA 8.5 Resultados de la aplicacin en el estado desactivado

189

Mantener una interfaz estable


Para crear una aplicacin estable, la interfaz y los botones estn desactivados cuando no hay una conexin actual.
function enableInterface():void { msgTxt.enabled = true; bodyTxt.enabled = true; } function disableInterface():void { bodyTxt.editable = false; msgTxt.enabled = false; clearBtn.enabled = false; sendBtn.enabled = false; }

Estos habilitan y deshabilitan las funciones son llamadas de otras partes del cdigo, en funcin del resultado de la conexin activa. Por ejemplo, la funcin disableInterface se llama desde el closeHandler, que se distribuye cuando se termina una conexin activa.
function closeHandler(event:Event):void { ... disableInterface(); }

Enviar (Sending) la solicitud inicial


La funcin sendRequest se llama cuando se realiza una conexin. Esta funcin enva datos a la funcin de estado y borra toda la informacin existente en la cola en la conexin del socket.
function sendRequest():void { statusMessage(Send initial request to [ + host + ], #006600); socket.flush(); enableInterface(); }

Envo de mensajes en el servidor de socket


El proceso de hecho enva los mensajes en el servidor de socket se maneja en la funcin writeLine. Esta funcin se llama writeLine de la entrada y presentar los controladores, que se definen en la porcin anterior del cdigo.
function writeLine(str:String):void { ... }

190

La primera parte de la funcin es aadir una nueva lnea en el mensaje, que puede tener en cuenta es el final del indicador de mensajes en PHP.
str += \n;

Esta funcin tambin hace uso de los try..catch el estilo de programacin para garantizar los errores en el proceso de envo estn correctamente capturados y oculta para el usuario. Para simplificar, el error se muestra en la ventana de salida. En una aplicacin ms realista, usted deseara informar al usuario si el mensaje no fue enviado, as como almacenar el mensaje intenta enviar de nuevo ms tarde.
try { socket.writeUTFBytes(str); } catch(e:IOError) { trace(e); }

Controlar actualizaciones de estado


Esta aplicacin posee un cuadro de situacin, que se utiliza para notificar al usuario de la posible conexin o problemas de mensaje. Todas estas actualizaciones de estado se envan a la funcin de statusMessage, que las inserta en la casilla de estado y los colores en consecuencia.
function statusMessage(str:String, color:String=#000000):void { statusTxt.htmlText += <font color=\ + color + \> + str + </font>; }

Un color por defecto se aplica en caso de que la persona que llama se olvida de definir uno. La no inclusin de un color predeterminado podra resultar en el texto no se aade. La ltima funcin en esta aplicacin basado en socket de chat se llama cuando un nuevo mensaje se recibe desde el servidor de socket.
function readResponse():void { }

La primera parte de esta funcin recupera el mensaje nuevo de la clase socket y lo asigna a la variable str, que se utiliza en la parte restante de esta funcin.
var str:String = socket.readUTFBytes(socket.bytesAvailable);

Antes de que el mensaje se pueda visualizar, debe quitar todas las lneas extra nuevo que podra afectar a cmo se muestra el texto. Esto se realiza mediante una funcin de subcadena muy bsicas que devuelve el mensaje de exclusin de los dos ltimos caracteres, que en este caso sera "\r\n".
// strip off line feeds if(str.substring((str.length-2), str.length) == \r\n)

191

{ trace(found \\n\\r); str = str.substring(0, (str.length-2)); }

Una vez que las nuevas lneas se han eliminado, el siguiente paso es determinar si este mensaje fue enviado por un administrador. Este ejemplo permite a cualquier *usuario* a ser un administrador. En una aplicacin ms completa, usted quiere exigir a ingresar antes una cuenta de administrador puede ser utilizado. Si el mensaje es de un administrador, el contenido del mensaje son de color rojo, para que los mensajes de administracin se resalten.
if(str.substring(0, 12) == ADMIN NOTICE) { bodyTxt.htmlText += <font color=\#FF0000\> + str + </font>; }

Si el mensaje es estndar, entonces simplemente se agrega a el rea de texto y la funcin termina, esperando el siguiente mensaje para ser recuperado.
else { bodyTxt.htmlText += <font color=\#000000\> + str + </font>; }

Eso es todo lo que hay a la basada en Flash cliente de chat con un servidor de sockets en PHP. En este punto, usted puede iniciar el servidor de socket (a menos que ya se est ejecutando) y probar el cliente de chat, como se muestra en la Figura 8.6. Siendo que este sistema est pensado para mltiples conexiones, puede llamar a algunos de sus amigos y hacer que lo prueben. O bien, puede modificar el cdigo para permitir conexiones remotas y dejar a muchos usuarios conectarse mediante el envo de un enlace a la aplicacin Flash. Aqu est el cdigo completo para el cliente de chat de ejemplo:
var host:String = 127.0.0.1; var port:uint = 8888; var socket:Socket = new Socket(host, port); socket.addEventListener(Event.CLOSE, closeHandler); socket.addEventListener(Event.CONNECT, connectHandler); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); socket.addEventListener(ProgressEvent.SOCKET_DATA, sockHandler); msgTxt.addEventListener(Event.CHANGE, inputHandler); addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); clearBtn.addEventListener(MouseEvent.CLICK, clearButtonHandler); sendBtn.addEventListener(MouseEvent.CLICK, sendButtonHandler); this.align = StageAlign.TOP_LEFT;

192

this.scaleMode = StageScaleMode.NO_SCALE; function writeLine(str:String):void { str += \n; try { socket.writeUTFBytes(str); } catch(e:IOError) { trace(e); } } function sendRequest():void { statusMessage(Send initial request to [ + host + ], #006600); socket.flush(); enableInterface(); } function readResponse():void { var str:String = socket.readUTFBytes(socket.bytesAvailable); // strip off line feeds if(str.substring((str.length-2), str.length) == \r\n) { trace(found \\n\\r); str = str.substring(0, (str.length-2)); } if(str.substring(0, 12) == ADMIN NOTICE) { bodyTxt.htmlText += <font color=\#FF0000\> + str + </font>; } else { bodyTxt.htmlText += <font color=\#000000\> + str + </font>; } } function enableInterface():void { msgTxt.enabled = true; bodyTxt.enabled = true; } function disableInterface():void { bodyTxt.editable = false; msgTxt.enabled = false; clearBtn.enabled = false; sendBtn.enabled = false; }

193

function statusMessage(str:String, color:String=#000000):void { statusTxt.htmlText += <font color=\ + color + \> + str + </font>; } function clearButtonHandler(e:MouseEvent):void { msgTxt.text = ; msgTxt.dispatchEvent(new Event(Event.CHANGE)); } function sendButtonHandler(e:MouseEvent):void { if(msgTxt.text.length > 0) { writeLine(msgTxt.text); clearBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); } } function inputHandler(e:Event):void { if(e.target.text.length > 0) { clearBtn.enabled = true; sendBtn.enabled = true; } else { clearBtn.enabled = false; sendBtn.enabled = false; } } function closeHandler(event:Event):void { statusMessage(Connection to [ + host + ] closed, #FF0000); disableInterface(); } function connectHandler(event:Event):void { statusMessage(Connected to [ + host + ], #006600); sendRequest(); } function ioErrorHandler(event:IOErrorEvent):void { statusMessage(event.text, #FF0000); } function securityErrorHandler(event:SecurityErrorEvent):void { statusMessage(event.toString(), #FF0000); } function sockHandler(event:ProgressEvent):void

194

{ readResponse(); } function keyDownHandler(e:KeyboardEvent):void { if(e.keyCode == Keyboard.ENTER) { sendBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); } } // disable interface until connected disableInterface();

FIGURA 8.6

La aplicacin Chat se ejecuta en el navegador

195

Resumen
En este captulo, usted ha aprendido lo que es un servidor de socket y cmo estn construidos. A continuacin, aprendieron a construir un servidor de socket sencillo y conectarse a l utilizando Flash. Una vez que haba una comprensin del Flash y PHP partes del proceso, el paso final es construir una aplicacin multiusuario completa de chat con un servidor de sockets en PHP corriendo detrs de las escenas. Usted puede tomar la informacin aprendida en este captulo y ampliarlo para crear una aplicacin de chat totalmente funcional. Puede agregar caractersticas tales como la moderacin, los miembros, temporizadores, salas de chat, y as sucesivamente. Es importante darse cuenta de que los sistemas de servidor de socket no se limitan a las aplicaciones de chat. Usted puede utilizar esta misma tecnologa para construir una aplicacin de dibujo multiusuario o incluso construir una arquitectura de monitoreo de servidor multipunto. Como puede ver, sockets de corriente se puede utilizar en una variedad de maneras. Una vez que aprendas lo bsico, su imaginacin es el nico lmite a su desarrollo.

196

Parte III Ampliar Flash y PHP

197

Capitulo 9 Trabajar con Librerias de terceros


El uso de bibliotecas de terceros sigue creciendo a medida que las aplicaciones ms exigentes se estn desarrollando. Bibliotecas de terceros a menudo a resolver un problema o realizar una tarea comn ms fciles de manejar, que permite al desarrollador centrarse en los aspectos ms importantes de la aplicacin de. La primera parte de este captulo est dedicado a explicar qu bibliotecas de terceros son, cmo usarlos, y lo que se necesita para instalar una biblioteca. La segunda parte de este captulo se centra en el uso de AMFPHP en Flash. AMFPHP es bsicamente una librera PHP que ofrece un vnculo comn entre Flash y una base de datos, as como otros tipos de datos.

Repasando librerias de terceros


Una tercera parte es la coleccin de un paquete personalizado o un pedazo de cdigo que es desarrollado por una compaa u organizacin a trabajar con el producto de otra compaa. Por ejemplo, si nos fijamos en el navegador Firefox, hay una serie de plug-ins y mejoras que son liberadas por los desarrolladores no trabajadores de Mozilla. Los desarrolladores tienen distintas opiniones sobre bibliotecas de terceros, una de las preocupaciones ms importantes acerca de estas bibliotecas es la seguridad. Tienes que tener cuidado al trabajar con otras porciones de cdigo, especialmente si no tienen el tiempo o los conocimientos para investigar a fondo la forma en que funciona el cdigo. Los problemas de seguridad son an ms importantes cuando no se conoce a la parte que se desarroll en la biblioteca o si la biblioteca est en contacto con algn aspecto de seguridad de su aplicacin. Por ejemplo, no es una buena idea usar una cookie o sesin en la biblioteca de un programador desconocido. Si lo hace, puede introducir los agujeros de seguridad en su aplicacin. Hay algunas excepciones notables al trabajar con bibliotecas de terceros y aplicaciones seguras. Por ejemplo, si usted est construyendo una aplicacin de tienda, es una suposicin razonable de que usted estar interactuando con algn tipo de sistema mercantil, como Authorize.net, Miva, o PayPal. Estos sistemas ofrecen las bibliotecas de terceros que puede conectarse fcilmente a su solicitud y se sabe que son seguros porque se han probado completamente en diferentes entornos.

198

Otros tipos de librerias de terceros


Estas bibliotecas externas no se limitan a la seguridad o la manipulacin de datos. Esto se debe al hecho de que Flash es un programa de diseo tambin. Hay muchos y excelentes bibliotecas de terceros disponibles para acelerar el desarrollo y el proceso de diseo. En algunos casos, estas libreras externas proporcionan una funcionalidad que no es posible, directamente en Flash/ActionScript.

Librerias comerciales Flash


Hay algunas bibliotecas que se est construyendo tienen licencias comerciales, lo que significa que tienen el cdigo ms extensamente desarrollado. Usted no tendr ningn problema para obtener soporte para estas bibliotecas. Por ejemplo, gskinner.com tiene una robusta biblioteca de verificacin y conjunto de componentes que est disponible para su compra. Esta biblioteca le permite construir en tiempo real un motor de correccin ortogrfico en su aplicacin con slo unas pocas lneas de cdigo. Usted puede encontrar ms informacin acerca de la biblioteca gskinner el corrector ortogrfico en el sitio Web de la empresa en www.gskinner.com/products/spl/.

Librerias Flash de cdigo abierto


Usted tambin encontrar una amplia seleccin de las bibliotecas de cdigo abierto libre para todos los aspectos del desarrollo y despliegue de aplicaciones. Un ejemplo de una biblioteca de cdigo abierto es AMFPHP, que se examina en detalle en la seccin "Echando un vistazo a AMFPHP". Hay muchas otras bibliotecas de cdigo abierto disponibles, como MCtweener, que es similar a la biblioteca de Tween incluido con mayor funcionalidad. Adems, la documentacin del proyecto contiene una gran cantidad de cdigo de ejemplo. Algunas otras bibliotecas de cdigo abierto disponible para ayudar en su proceso de desarrollo se muestran en la tabla 9.1. TABLA 9.1

Librerias de cdigo abierto


Red5 Papervision3D as3corelib Open Source Flash Server Open Source 3D engine AS3 library for several basic utilities http://osflash.org/red5 http://code.google.com/p/papervision3d/ http://code.google.com/p/as3corelib/

Esta es slo una pequea porcin de la lnea completa de las bibliotecas de cdigo abierto disponible para ActionScript 3. Se le debera dar una buena idea de no slo cmo ampliable ActionScript 3, sino tambin a los desarrolladores de cmo muchos han pasado largas horas en desarrollo de estas herramientas impresionante. An ms sorprendente es el hecho de que estas bibliotecas son gratuitos, lo que significa que los desarrolladores ms, incluido usted, puede crear contenido ms interesante y atractivo, sin costes adicionales.

199

Librerias en PHP
Hay tambin muchas bibliotecas disponibles para PHP, que incluyen la gestin de sesiones, la manipulacin de la imagen, conectividad de bases de datos, y la gestin de servidores en general para nombrar unos pocos. Bsicamente, PHP se construye utilizando bibliotecas de terceros ya que PHP en s mismo es un proyecto de cdigo abierto. Esto significa que muchos desarrolladores de diferentes contribuir con cdigo al proyecto. Algunas de las bibliotecas ms comunes de PHP incluye la librera GD, que se discute el captulo 12. Tabla 9.2 Las otras listas comunes de las bibliotecas de PHP que va a utilizar en su proceso de desarrollo. TABLA 9.2

Common PHP Libraries


Librera Pear ImageMagick PDF Library Descripcin Una librera estructurada de cdigo opensource Suite de software para crear, editar, y componer imagenes de mapa de bits Librera de creacin PDF para PHP Source http://pear.php.net/ www.imagemagick.org/ www.php.net/pdf .

Instalar librerias de terceros


Ahora debe tener una comprensin de lo bibliotecas de terceros estn disponibles para su uso en el desarrollo de ActionScript 3. El proceso de instalacin de estas bibliotecas de terceros es muy similar, no importa qu biblioteca es. NOTA Compruebe los requisitos de la versin de las bibliotecas para asegurarse de que trabajar con ActionScript 3 o la versin de PHP que se est utilizando.

Instalar librerias en Flash CS3


Despus de seleccionar las bibliotecas de terceros que desea utilizar, el siguiente paso es la instalacin de estos. El proceso de instalacin de una biblioteca de cdigo en CS3 depende de la clase especfica.

Instalar como un archivo MXP


Una forma de una biblioteca o un conjunto de componentes puede ser distribuido para la portabilidad es en el formato MXP. Estos archivos se cargan en el Extension Manager que se incluye con Flash CS3 y muchas otras aplicaciones de Adobe (ver Figura 9.1). La ventaja de usar esta aplicacin es incluir sus libreras para gestionar y se puede activar, desactivar o actualizar las libreras individuales en un agradable interfaz grfica de usuario manejable. Esta aplicacin tambin contiene enlaces directos al sitio Web del desarrollador de apoyo o de documentacin en lnea.

200

FIGURA 9.1 Extensin de los buques Manager con Flash CS3 y otras aplicaciones de Adobe.

Instalar como un paquete de clase estndar


El otro mtodo de instalacin ms comn es aadir manualmente las clases a la ruta de clases de Flash CS3. Tambin necesita copiar la clase de archivos en los directorios de intercambio de que Flash sabe que buscar en las bibliotecas de terceros. Es una buena idea crear una nueva carpeta en una parte separada de su equipo para que accidentalmente no modificar las clases por defecto que vienen con Flash CS3. Crear una ruta de clases personalizadas Con el fin de agregar una ruta de clase personalizado, primero debe crear un directorio en su computadora para almacenar sus clases. Despus de determinar que el directorio que va a utilizar, aadir esta nueva ruta de acceso a la ruta de listas de clases existentes. Para aadir una nueva ruta de clases a la lista existente, siga estos pasos: 1. Seleccione Editar Preferencias (Windows). En un Mac, selecciona Flash Preferencias para abrir el cuadro de dilogo Preferencias. 2. Haga clic en ActionScript en la lista Categora y, a continuacin, haga clic en Configuracin de ActionScript 3.0. 3. Haga clic en Examinar con el Path, y busque el directorio que desee agregar. Haga clic en Aceptar. Usted tambin puede agregar una ruta de clase para el proyecto especfico de Flash mediante la modificacin de la configuracin de ActionScript en el cuadro de dilogo Configuracin de publicacin. Agregar la ruta de 201

clase a un proyecto tiene la ventaja de que se mover con la FLA, que significa que este archivo puede ser compartida y la rutas de clases global no deben ser modificados. Ruta de clases (classpaths) por defecto La ruta de clases por defecto de todos los documentos de Flash puede ser modificado para que no tenga que actualizar cada archivo Flash individuales. Los siguientes son los lugares donde Flash espera encontrar los archivos de clases, basada en una instalacin por defecto. Windows: Disco duro\Documents and Settings\user\Local Settings\Application Data\Adobe\Adobe Flash CS3\language\Configuration\Classes. Macintosh: Disco duro/Users/user/Library/Application Support/Adobe/Adobe Flash CS3/language/Configuration/Classes. NOTA No elimine la ruta de clases global absoluta. Flash utiliza esta ruta de clases de acceso integrado en las clases. Si elimina esta ruta de clases puede volver a agregar mediante el siguiente trozo de cdigo como una ruta nueva de clase: $(LocalData)/Classes.

Instalar librerias en PHP


Bibliotecas de PHP se han compilado directamente en el proceso de instalacin de PHP. Sin embargo, con el uso de PEAR y otros sistemas comunes de biblioteca estructurado, puede instalar nuevas bibliotecas tras la instalacin inicial que ha completado. Un ejemplo de una biblioteca externa que se utiliza comnmente y se puede agregar despus de instalar PHP es la biblioteca de MySQL. Esta biblioteca se utiliza para comunicarse con una base de datos directamente en PHP. El primer paso es abrir el archivo php.ini, elimine el archivo de biblioteca de mysql, y modificar la ubicacin de la ruta de MySQL y el conector de puerto si elige otro diferente cuando se instala MySQL. NOTA Es necesario reiniciar el servidor Apache despus de modificar el archivo php.ini. Si una vez que reinicie Apache, MySQL y todava no est funcionando adecuadamente, entonces usted puede tener una versin antigua instalada. Esto significa que usted puede tener que volver a compilar PHP. CROSS--REF Para obtener informacin acerca de volver a compilar PHP, vase el Captulo 1.

Uso de librerias de terceros


El primer paso para trabajar con bibliotecas de terceros es descargar los archivos de biblioteca en el sitio web del desarrollador. Una vez que haya descargado los archivos de biblioteca de clases, el siguiente paso es instalar y configurar la librera de terceros. Normalmente, la biblioteca viene con un kit de prueba para asegurarse de que todo est funcionando correctamente. Este paso no es obligatorio, pero minimiza la depuracin necesaria en su aplicacin final. Si la biblioteca no viene con un kit de prueba, usted puede crear rpidamente una, que se explica en la siguiente seccin. 202

Trabajar con librerias en Flash CS3


Para determinar si las clases se carga correctamente, puede crear una aplicacin de prueba de una parte especfica de una clase que figura en la librera. Para este ejemplo, se utiliza la biblioteca as3CoreLib de Adobe. Esta clase contiene una serie de clases de utilidad para todo, incluyendo la manipulacin de imgenes todo el camino a la seguridad tales como herramientas de creacin de valor hash MD5. Aqu est un ejemplo de aplicacin utilizando la funcionalidad de MD5:
import com.adobe.crypto.MD5; function createHash(e:MouseEvent):void { responseTxt.text = MD5.hash(origStrTxt.text); } createBtn.addEventListener(MouseEvent.CLICK, createHash);

La primera parte de esta aplicacin importa las clases necesarias. En este ejemplo, que sera la clase MD5 en el paquete de cifrado. La funcin se llama cuando se pulsa el botn. Una vez que se llama la funcin, el siguiente paso es crear un hash de nuevo llamando al mtodo hash esttico de la clase MD5. Por ltimo, la cadena de nueva creacin se devuelve al componente TextInput responseTxt encontrada en la escena. Esa es la aplicacin completa. Se trata de un uso muy simple, pero le informa cuando las clases adecuadas estn instaladas y funcionan correctamente. Trabajan en este tipo de unidad es muy comn en el desarrollo porque si una aplicacin se hace demasiado grande es mucho ms difcil de depurar y gestionar.

Trabajar con librerias en PHP


Bibliotecas en PHP son muy similares a las porciones compiladas de PHP, pero an debe probar que despus de instalar una nueva biblioteca. Normalmente, tambin tendr que reiniciar Apache para que los nuevos cambios de PHP para tener efecto. Muchas veces las instrucciones de instalacin de una biblioteca se habla de esto, pero en cualquier caso hay que hacer.

Probar la librera MySQL


Para la prueba de apoyo de MySQL usted no tiene que crear un ejemplo elaborado, de hecho, puede crear un script que garantiza que no funciona bien, pero le informar si MySQL se ha instalado correctamente o no. Esto no es una prctica muy comn, pero en el inters de la prueba rpida funciona muy bien. NOTA Despus de ejecutar el cdigo que usted sabe que va a fallar es una buena idea para limpiar los registros de errores para que no se confunda ms adelante en el camino. 203

Aqu est el cdigo de la prueba simple.


<?php // no password is sure to fail, // unless it is a default installation mysql_connect(localhost, root, ); ?>

Los intentos de sencilla aplicacin para conectarse a la base de datos, y si se muestran de usuario no vlido o la base de datos no seleccionada entonces usted sabe MySQL est instalado correctamente. Sin embargo, si usted ve un error grave: funcin no encontrado ... significa que MySQL no ha sido adecuadamente configurado o instalado para trabajar con PHP. Usted puede crear un archivos phpinfo rpida para determinar si MySQL se ha instalado y para rastrear el error especfico.

Instalar la librera de MySQL


La biblioteca de MySQL se incluye normalmente con PHP, pero no viene activado por defecto. El primer paso es abrir el archivo php.ini para la versin de PHP que tiene instalado. Usted encontrar una seccin en el archivo php.ini con el ttulo de [mysql] .Aqu es donde debe configurar la instalacin de MySQL. Una vez finalizada la configuracin, el siguiente paso es eliminar la lnea en la lista de bibliotecas que tiene el nombre "mysql" dentro de ella. En este punto, la configuracin se ha completado, el ltimo paso es reiniciar Apache y probar el script anterior, una vez ms, que debera mostrar un error de conexin y no el error fatal de PHP.

Echando un vistazo a AMFPHP


AMFPHP es una implementacin de cdigo abierto de la Action Message Format (AMF). AMF permite la serializacin binaria de objetos de ActionScript para ser enviados al servidor de secuencias de comandos.

AMFPHP para desarrolladores de AS3 y PHP


Los desarrolladores de PHP pueden aprovechar su experiencia en PHP mediante la conexin a datos, tales como servicios Web y bases de datos. AMF permite tipos de datos nativos y la cartografa de objeto complejo entre el cliente y el servidor. AMFPHP es una de las ms populares y de ms rpido servidor de los protocolos de cliente de comunicacin disponibles para los desarrolladores de Flash Player. Comunicacin se organiza en formato binario, que generalmente es ms compacta que otras representaciones.

204

AMFPHP y ActionScript 3
ActionScript 3 permite la compresin de las comunicaciones, lo que significa la salida ms rpida de las llamadas y, en general un mejor rendimiento. Adems, AMF3, que est disponible en ActionScript 3, tambin comprime la comunicacin binaria para un mayor rendimiento.

Instalar AMFPHP
Instalacin de AMFPHP es simple. Las secuencias de comandos requiere un servidor PHP y no necesitan los servicios adicionales o de las bibliotecas instaladas. Esto ofrece la ventaja de la configuracin de casi instantnea, que permite al desarrollador a concentrarse en la aplicacin real en lugar de preocuparse por lo que est ocurriendo detrs de las escenas. Para instalar AMFPHP, primero descarga la ltima versin, que est disponible gratuitamente desde el sitio web SourceForge en http://sourceforge.net/project/showfiles.php?group_id=72483#files. SourceForge es la mayor Web de cdigo abierto de desarrollo del sitio Web que aloja una serie de diferentes proyectos como AMFPHP. El contenido de los archivos descargados se colocan en la raz de su servidor Web en un nuevo directorio como flashservices o cualquier nombre que elija. AMFPHP est casi listo para ir a la derecha de la caja. El nico archivo que debe modificar es gateway.php, que se encuentra en la raz del directorio de instalacin. En este caso, el camino sera flashservices/gateway.php. En algunos casos, puede dejar todos los ajustes en el valor predeterminado, que es lo que se utiliza para este ejemplo.

Probar la instalacin
Cuando todo est correctamente instalado, usted puede probar la instalacin de AMFPHP mediante la apertura de la gateway.php en su navegador Web. Por ejemplo, suponiendo que la instalacin se realiza a nivel local, la URL sera http://localhost/flashservices/gateway.php. Una pantalla, como se muestra en la Figura 9.2, debe aparecer que le informa de que la instalacin se realiz correctamente. Si ocurre un error, un error de PHP o una serie de errores, parece que le ayudar a determinar lo que posiblemente fue mal.

Herramientas de depuracin AMFPHP


Antes de comenzar cualquier desarrollo, vistazo a alguna depuracin y herramientas de visualizacin que se suministran con AMFPHP. Estas distintas herramientas se puede utilizar para depurar sus servicios. PRECAUCIN Asegrese de quitar estas herramientas de depuracin en un servidor en vivo para reducir al mnimo los problemas de seguridad.

205

FIGURA 9.2 Ejemplo del mensaje de bienvenida AMFPHP visto desde gateway.php llamando desde tu navegador Web

Navegador de servicios AMFPHP


El navegador de servicio AMFPHP, como se muestra en la Figura 9.3, es una aplicacin basada en Flash que te permite ver los distintos servicios y examinar de cerca sus mtodos y propiedades. Tambin puede utilizar el navegador de servicio para probar el nuevo cdigo antes de escribir el cdigo ActionScript en Flash. Usando estas herramientas de depuracin aadidas le permite desarrollar aplicaciones ms rpidamente y prueba de nuevos conceptos, con menos sobrecarga. Tambin ayudan en la depuracin de su cdigo.

Depurar gateway de AMFPHP


La depuracin de Gateway es script que se encuentra entre Flash y el gateway.php archivo para envolver errores. Es una buena prctica de utilizar esta secuencia de comandos durante la depuracin o el desarrollo a nivel local. El nico cambio en su cdigo es para sealar a la debuggateway.php archivo en lugar de la gateway.php archivo estndar.

206

FIGURA 9.3 He aqu un ejemplo de servicio, visto desde el servicio de navegador de AMFPHP.

Los siguientes son algunos puntos importantes a tener en cuenta con el uso de este portal especializado:     Las sesiones no funcionarn correctamente. cURL deben estr habilitadas en PHP. El servidor experimenta un descenso en el rendimiento. Slo se debe utilizar en un sistema de desarrollo.

Probar AMFPHP con un servicio personalizado


Con AMFPHP correctamente instalado, puede probar un servicio muy sencillo con el navegador de servicios. Ms tarde, a construir una pequea aplicacin de bsqueda en Flash y PHP. Un servicio de AMFPHP es un archivo estndar de PHP que se construye en un orden conocido. Por ejemplo, la primera parte de un archivo de servicio es la tabla de mtodos, que se utiliza para exponer los mtodos disponibles y definir las restricciones de acceso de ese servicio. Un cuadro de mtodos es una matriz multidimensional que contiene cada uno de los mtodos. En esta tabla se define el mtodo de muestreo del mtodo getDate, que devuelve el timestamp UNIX actual de PHP. La tabla de mtodos se encuentra en el constructor de la clase visto en la parte siguiente de cdigo. 207

$this->methodTable = array ( getDate => array ( access => remote, description => Example, returns Unix timestamp ) );

Siguiendo con este ejemplo, creara la muestra de clase PHP, que se convertir en el servicio de AMFPHP. Esta es la clase de muestra, que contiene un mtodo y el constructor.
<?php class Example { function Example() { $this->methodTable = array ( getDate => array ( access => remote, description => Returns the current date. ) ); } /** * Returns Current Date */ function getDate() { // return current date return Current Date: . date(F j, Y, time()); } } ?>

NOTA El comentario sobre la funcin getDate ser visto por el servicio de navegador y lo mostrar a continuacin el mtodo. Esto no es necesario, pero ayuda a entender lo que es un servicio no de un vistazo. Guardar este archivo como Example.php en el directorio /services que se encuentran en la raz del directorio de AMFPHP. Aqu est la ubicacin de este archivo si instala AMFPHP en la raz de su servidor Web: http://localhost/flashservices/services/Example.php. Ahora que este servicio simple se crea que puede probar yendo al navegador de servicio. Usted podr ver su nuevo servicio, ubicado en la lista del lado izquierdo junto con otros servicios ya instalados. Si usted no ve el servicio, haga clic en Actualizar o volver a cargar la pgina mediante la actualizacin de su navegador. Para probar el servicio, haga clic en el nombre en la lista del lado izquierdo, que carga el servicio en el panel de exploracin a la derecha. El nombre del mtodo se encuentra en la ficha de prueba, que en este ejemplo se denomina getDate. 208

Haga clic en el botn de Call (llamada) para ejecutar el servicio. Ver la salida de los servicios en la ficha Resultados se encuentra en la parte inferior del panel de exploracin. La salida del servicio del ejemplo debe ser la fecha actual en formato de cadena, tales como.
Current Date: October 5, 2007

Las otras pestaas son para ver los datos de servicio, que se utiliza para la depuracin y el seguimiento general de sus servicios. Este ejemplo es bastante simple. No tiene parmetros y no crea ningn cdigo real. Usted puede ampliar en el servicio anterior mediante la adicin de otro mtodo, que capitaliza la primera letra de cada palabra en la cadena. La parte de la capitalizacin del cdigo se hace usando una funcin integrada de PHP llamada ucwords. Esta funcin acepta un parmetro y devuelve la cadena en maysculas.
<?php class Example { function Example() { $this->methodTable = array ( getDate => array ( access => remote, description => Returns the current date. ), upperCaseWords => array ( access => remote, description => Converts arg to uppercase ) ); } /** * Returns Current Date */ function getDate() { // return current date return Current Date: . date(F j, Y, time()); } function upperCaseWords($str) { return ucwords($str); } } ?>

209

Despus de que el nuevo mtodo se aade que es visible en el navegador de servicio (despus de una actualizacin). Despus de buscar en el navegador de servicio, usted se dar cuenta de una ventaja del mtodo es que el cuadro AMFPHP agrega automticamente cuadros de texto con el nombre de la variable para cada argumento encontrado. El nuevo mtodo acepta un argumento tal como se define en el cdigo de servicio. Si escribe algn texto en el cuadro de texto y ejecutar el mtodo, se capitaliza la cadena. Por ejemplo, si utiliza la cadena "hello world", ver la salida del siguiente:
Hello World

Servicios de AMFPHP puede, por supuesto, tienen ms de un argumento en un mtodo. Crear otro nuevo mtodo que tiene tres argumentos. El primer argumento es una cadena, el segundo una palabra a buscar, y la tercera es la palabra de sustitucin. Bsicamente, usted est creando una bsqueda basada en PHP y reemplazar el mtodo. Comience por la actualizacin de la tabla de mtodos.
$this->methodTable = array ( getDate => array ( access => remote, description => Returns the current date. ), upperCaseWords => array ( access => remote, description => Converts arg to uppercase ), searchAndReplace => array ( access => remote, description => Searches and replaces text ) );

Cuando se actualiza la tabla de mtodos, se aade el nuevo mtodo. Usted no est limitado al cdigo en el mtodo. AMFPHP le permite llamar a otros mtodos y propiedades de la misma clase o incluso incluir otros ficheros PHP para mayor funcionalidad.
/** * Searches and replaces text */ function searchAndReplace($haystack, $needle, $replacement) { $string = str_replace($needle, $replacement, $haystack); return $this->upperCaseWords($string); }

NOTA Si crea un nuevo mtodo, y no se aade en la tabla de mtodos, no va a ser exportados para su remota. Esto es til cuando se quiere disponer de mtodos privados, tales como conectividad de bases de datos, o capas de seguridad global. 210

Despus de que el nuevo mtodo, se aade, se puede comprobar por actualizacin del navegador de servicios. Notificacin de los mtodos que se enumeran en orden alfabtico. El nuevo mtodo se encuentra en la mitad de la lista horizontal. El navegador de servicio agrega un campo de texto para cada argumento, en este caso hay tres. Escriba una cadena en el primer campo de texto, elija una de las palabras de esa cadena como la aguja, a continuacin, que entrar en la segunda TextField. Por ltimo, el tipo de reemplazo en el campo de texto de terceros. Despus de los tres campos de texto se rellenan, puede hacer clic en el botn de llamada y ver el resultado en la ficha Resultados. Suponiendo que se utilice la cadena "hola mundo" con la aguja de "mundo" y la sustitucin de la "tierra", debera ver el siguiente resultado. La palabra es reemplazada y la primera letra de cada palabra en maysculas utilizando el mtodo de upperCaseWords. Hello Earth Ahora que ha probado a fondo los servicios de AMFPHP, puede pasar a la instalacin de las clases necesarias requeridas para Flash para realmente ser capaz de hacer uso de esta instalacin. Ese proceso se explica en la siguiente seccin.

Uso de AMFPHP en Flash


A diferencia de versiones anteriores, ActionScript 3 tiene todas las clases necesarias para la interaccin remota e interactuar con AMFPHP ya instalado. Simplemente cargue las clases y escribir en el cdigo ActionScript, que es todo bastante sencillo. Esta seccin le gua a travs del proceso de construccin de una aplicacin Flash simple para entender mejor el proceso de trabajo con AMFPHP en Flash.

Cargar clases remoting


El primer paso para trabajar con AMFPHP en Flash es para cargar las clases.Esto es necesario para cualquier proyecto AMFPHP a construir, ya que contiene el ncleo del sistema remoto.
import flash.net.*;

When the classes are loaded, you can define a variable that points to the AMFPHP gateway file.
var gatewayURL:String = http://localhost/flashservices/gateway.php;

El siguiente paso es crear la instancia de NetConnection, que se asigna a la variable de puerta de enlace. En este punto, tambin puede configurar el mtodo de los acontecimientos que se llama cuando se hace clic en un botn.
var gateway:NetConnection; getDateBtn.addEventListener(MouseEvent.CLICK, getDate); searcBtn.addEventListener(MouseEvent.CLICK, searchAndReplace); upperCaseWordsBtn.addEventListener(MouseEvent.CLICK, upperCaseWords); debugTxt.wordWrap = false;

211

Aqu est el esqueleto de los controladores de botn que se crear en la parte siguiente. Cada una de estas funciones hace una llamada al servicio de AMFPHP.
function getDate(e:MouseEvent):void { ... } function searchAndReplace(e:MouseEvent):void { ... } function upperCaseWords(e:MouseEvent):void { ... }

El primer mtodo en el cual concentrarse es getDate, que har una llamada al servidor sin argumentos y recibe una cadena de la fecha actual. Responder a la clase se utiliza para controlar la respuesta de objeto para el xito y el fracaso tanto de la llama.
var responder:Responder = new Responder(onResult, onFault);

La siguiente parte de la funcin asigna una nueva instancia de la clase NetConnection. Una llamada al mtodo connect se llama paso en la puerta de entrada variable url. Una vez establecida la conexin, se realiza una llamada cuando el primer argumento es el nombre del servicio y el mtodo. La segunda variable es una referencia a la instancia de clase Responder.
gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(Example.getDate, responder);

Esta es la funcin getDate completo la responsabilidad de establecer la conexin AMFPHP y llamando al servicio solicitado.
function getDate(e:MouseEvent):void { var responder:Responder = new Responder(onResult, onFault); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(Example.getDate, responder); }

Las otras dos funciones son muy similares, con excepcin del nombre del mtodo y los argumentos pasados al servicio. La funcin searchAndReplace acepta tres argumentos.    arg1: La cadena (string) a buscar en arg2: La palabra para buscar arg3: La palabra a remplazar

212

El servicio ubicado en la configuracin de AMFPHP es responsable de ejecutar el mtodo searchAndReplace, pero tambin hace una llamada al mtodo de maysculas antes de regresar a la cadena.
function searchAndReplace(e:MouseEvent):void { var responder:Responder = new Responder(onResult, onFault); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(Example.searchAndReplace, responder, hello world, world, earth ); }

La funcin final es upperCaseWords, que tiene un argumento y devuelve una nueva cadena con la primera letra de cada palabra en maysculas. El resto de la funcin es la misma que las dos anteriores. Este es un buen ejemplo de AMFPHP ser capaz de lograr algo que no es nativo de ActionScript, que, por supuesto, es la parte en maysculas.
function upperCaseWords(e:MouseEvent):void { var responder:Responder = new Responder(onResult, onFault); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(Example.upperCaseWords, responder, hello world); }

Una vez que las tres funciones de responsable de llamar a los servicios que estn definidos, la siguiente parte es el resultado de la depuracin y funciones que son llamadas cuando el servicio devuelve una respuesta vlida. La funcin onResult se llama cuando se recibe un mensaje de xito. En este sencillo ejemplo, el contenido en bruto de la produccin son enviados a la componente TextArea situado en el escenario. Tambin puede reemplazar la porcin de TextArea del cdigo con simples trace() para los estados ms rpidode la prueba.
function onResult(responds:Object):void { debugTxt.text = Response: + responds; }

Si ocurre un error, la funcin onFault se llama, que contiene el error especfico. Para ver mejor el error, el contenido del objeto se ejecutan a travs de una bucle for..in, que muestra cada elemento. Esta funcin tambin borra el rea de texto para asegurar que los datos anteriores no se mezclen en el que podra causar confusin al tratar de depurar una aplicacin. El mtodo de appendText AS3 es la sustitucin de la forma "+ =" de la concatenacin de cadenas en las versiones anteriores de ActionScript. Este mtodo es mucho ms rpido, lo que significa ms rpida ejecucin de cdigo. 213

function onFault(responds:Object):void { debugTxt.text = ; debugTxt.appendText(Debug::Error\n); for(var i in responds) { debugTxt.appendText( + responds[i] + \n); } }

Figuras 9.4, 9.5, y 9.6 muestran ejemplos de las respuestas de las aplicaciones de muestra dentro de AMFPHP. Usted puede ampliar en estos ejemplos para construir una aplicacin ms completa, que se realiza en la siguiente seccin. El primer ejemplo se muestra la respuesta del mtodo getDate de las clases de la muestra AMFPHP. Este ejemplo devolver la fecha actual en el formato de cadenas. FIGURA 9.4

Aqu hay una respuesta del ejemplo a partir del primer mtodo AMFPHP servicio.

214

El segundo ejemplo acepta un argumento y reemplaza el texto. Todo esto es un ejemplo sencillo, mostrando el proceso de trabajo con los argumentos en AMFPHP. FIGURA 9.5 Aqu hay una respuesta del ejemplo a partir del segundo mtodo AMFPHP servicio.

El tercer y ltimo ejemplo es una respuesta de carbono. Bsicamente se toma la cadena passed-in y devuelve exactamente como fue enviado.

215

FIGURA 9.6 Aqu hay una respuesta del ejemplo a partir del tercer mtodo AMFPHP servicio.

Construir una aplicacin del mundo real usando AMFPHP


Ahora que ha visto el uso del servicio AMFPHP y cmo aplicarla en Flash, se puede continuar la construccin de una aplicacin real. Un buen ejemplo de una aplicacin en el mundo real es un Flash de aplicaciones basadas en lista de lbumes, que se explica en las siguientes secciones. La base de datos utilizada para este ejemplo es la misma que se crea en el captulo 2. Si usted no ha completado el captulo para este punto, recomiendo empezar por ah.

Servicios de AMFPHP
Los servicios de AMFPHP necesarios para este ejemplo es responsable de consultar la base de datos basada en los argumentos passed-in. Esto tambin requiere un sistema de conexin de base de datos que deben ser seguras. Esto significa que los mtodos no sern exportables o visible por AMFPHP.

216

Para simplificar, toda esta funcionalidad se incluye en uno de servicios. Sin embargo, en una aplicacin ms completa, usted desea separar las clases en los diferentes servicios de una solucin ms porttil. Figura 9.7 muestra la aplicacin completa. FIGURA 9.7 Aqu est la aplicacin completa del ejemplo del mundo real.

La primera parte de la aplicacin son los servicios de AMFPHP. Aqu est el esqueleto de clase para el servicio de lbum, que le da una mejor comprensin de la funcionalidad.
<?php class Albums { function Albums() { ... } function connect() { ... } function getAlbumByGenreID($genreID) {

217

... } } ?>

El comienzo de cualquier proyecto AMFPHP debe ser la tabla de mtodos ya sea incluido en el archivo de un mismo servicio o en un archivo separado que se incluye. La ventaja de usar el mismo archivo se puede crear rpidamente los cambios y no tienen que mantener un archivo diferente. La tabla de mtodo en este ejemplo se incluye en la funcin constructora de servicios. El mtodo de conexin es privado para garantizar un mayor nivel de seguridad.
function Albums() { $this->methodTable = array ( connect => array ( access => private ), getAlbumByGenreID => array ( access => remote ) ); }

El mtodo de conexin comprueba en primer lugar para una conexin existente de limitar los recursos. Si una conexin existente no se encuentra, una nueva se crea y almacena en la variable privada _connection.
/** * @access private * @desc Connect to database - **PRIVATE** */ function connect() { if($this->_connection == null) { $this->_connection = mysql_connect( $this->dbHost, $this->dbUser, $this->dbPass ); mysql_select_db($this->dbName, $this->_connection); } }

Los parmetros de conexin se almacenan en las variables privadas dentro de la clase. Para un nivel adicional de seguridad, las variables se hizo privado a prohibir el acceso exterior de la base de datos de las credenciales sensibles. 218

// Database info private $dbHost = private $dbUser = private $dbPass = private $dbName =

localhost; username; password; database name;

private $_connection = null;

El ltimo mtodo de la clase de servicio es la getAlbumByGenreID, que devuelve una matriz de datos de disco basado en el gnero ID pasa como un nico argumento. La parte de la funcin establece una conexin con la base de datos con el sector privado mtodo connect() definido en el paso anterior.
function getAlbumCatID($genreID) { $this->connect(); ... }

Una vez establecida la conexin de base de datos, el siguiente paso es la construccin de la cadena $sql.
$sql = SELECT g.name, a.artist, a.albumName FROM albums a, genre g WHERE a.genreID=g.id AND g.id= . $genreID;

La cadena $sql se pasa a mysql_query() con la conexin de base de datos como el segundo argumento.
$result = mysql_query($sql, $this->_connection);

El ltimo paso de la funcin es la de crear la matriz asociativa de datos del lbum.


$rows = array(); while($row = mysql_fetch_array($result, MYSQL_ASSOC)) { array_push($rows, $row); } return $rows;

Una alternativa a la creacin de la matriz en PHP usando un bucle while es pasar el identificador de recurso de vuelta a Flash y el uso de un registro conjunto personalizado de clase para analizar los datos de la fila a fila. Hacer esto en Flash tiene parte de la carga fuera del servidor y hace un mejor uso de la mquina del cliente. Las versiones anteriores de Flash tena una clase RecordSet nativo. En AS3, usted tendra que crear su propia clase. Esta clase ha sido aadido a los contenidos extra disponibles en el sitio Web del libro y adecuadamente imita la clase RecordSet de AS2. El primer paso en el trabajo con la clase recordSet es de modificar el mtodo de disco (lbum).
/** * List of albums for RecordSet */ function getAlbumByGenreID($genreID) {

219

$this->connect(); $sql = SELECT g.name, a.artist, a.albumName FROM albums a, genre g WHERE a.genreID=g.id AND g.id= . $genreID; return mysql_query($sql, $this->_connection); }

Aqui esta la clase Album completo:


<?php class Albums { // Database info private $dbHost = private $dbUser = private $dbPass = private $dbName = localhost; username; password; db name;

private $_connection = null; function Albums() { $this->methodTable = array ( connect => array ( access => private ), getAlbumByGenreID => array ( access => remote, description => List of albums from category ID. ) ); } /** * @access private * @desc Connect to database - **PRIVATE** */ function connect() { if($this->_connection == null) { $this->_connection = mysql_connect( $this->dbHost, $this->dbUser, $this->dbPass );

220

mysql_select_db($this->dbName, $this->_connection); } } /** * List of albums from genre ID. */ function getAlbumByGenreID($genreID) { $this->connect(); $sql = SELECT g.name, a.artist, a.albumName FROM albums a, genre g WHERE a.genreID=g.id AND g.id= . $genreID; $result = mysql_query($sql, $this->_connection); $rows = array(); while($row = mysql_fetch_array($result, MYSQL_ASSOC)) { array_push($rows, $row); } return $rows; } /** * List of albums for RecordSet */ function getAlbumByGenreID_recordset($genreID) { $this->connect(); $sql = SELECT g.name, a.artist, a.albumName FROM albums a, genre g WHERE a.genreID=g.id AND g.id= . $genreID; return mysql_query($sql, $this->_connection); } } ?>

Integracin de ActionScript para AMFPHP


El siguiente paso es la construccin de la parte Flash de la aplicacin, que se encarga de mostrar los datos del lbum en un componente DataGrid precompilados. Los cambios de la funcin slo estn dentro de la funcin onResult para este ejemplo ms completo.
function onResult(responds:Object):void

221

{ albumsDG.removeAll(); for(var i:uint=0; i < responds.length; i++) { albumsDG.addItem(responds[i]); } }

Borrar resultados viejos


La funcin onResult borra todos los datos existentes en el DataGrid haciendo una llamada al mtodo removeAll del componente DataGrid.
albumsDG.removeAll();

Despus que se ha limpiado el DataGrid un for..loop es usado para insertar los datos de la fila de la base de datos. El addItem acepta un objeto como argumento. El control DataGrid es tambin lo suficientemente inteligente como para emparejar los nombres de objeto para ser usado como los ttulos de la columna.
for(var i:uint=0; i < responds.length; i++) { albumsDG.addItem(responds[i]); }

El resto del ejemplo es la misma que la prueba de la aplicacin de conceptos. Aunque no es una adicin a la aplicacin, el nombre del mtodo del servicio debe ser modificado si usted decide utilizar el camino de RecordSet (registros) de mostrar la fila de datos. Aqu est el cdigo fuente completo del ejemplo de aplicacin del lbum.
import flash.net.*; var gatewayURL:String = http://localhost/flashservices/gateway.php; var gateway:NetConnection; function loadAlbumData(e:MouseEvent):void { var responder:Responder = new Responder(onResult, onFault); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(Albums.getAlbumByGenreID, responder, 4); } function onResult(responds:Object):void { albumsDG.removeAll(); for(var i:uint=0; i < responds.length; i++) {

222

albumsDG.addItem(responds[i]); } } function onFault(responds:Object):void { for(var i in responds) { trace([ + i + ]\t + responds[i]); } } loadAlbumBtn.addEventListener(MouseEvent.CLICK, loadAlbumData);

Como puede ver, trabajar con datos dinmicos usando AMFPHP tiene muchas ventajas sobre los mtodos normales de trabajo con los datos. Esta seccin debera haber dado una buena comprensin de cmo trabajar con AMFPHP en ActionScript 3. Usted puede tomar los conceptos aprendidos en esta seccin y basarse en la informacin de otros en este libro para crear una aplicacin muy robusta.

Resumen
Usted aprendi el proceso de trabajar con bibliotecas de terceros en la primera parte del captulo. Luego, en la segunda parte que fueron introducidos a cmo instalar correctamente las bibliotecas de terceros. Una vez completada la instalacin inicial y el proceso de instalacin, el siguiente paso fue crear cdigo personalizado para trabajar con las bibliotecas instaladas. La parte final del captulo se centr en el trabajo con AMFPHP para crear aplicaciones ms robustas y fortalecer los conceptos de trabajo con las bibliotecas.

223

Capitulo 10 Uso de Programacin Orientada a objetos


Este captulo se centra en las clases y programacin orientada a objetos. La comprensin de cmo trabajar con las clases y en el que se debe utilizar le ayudar a escribir cdigo ms eficiente. La clave para la escritura en un objeto de formato de la programacin orientada a objetos (OOP) es para evaluar correctamente la aplicacin que ser escrito. Este captulo comienza por explicar los aspectos individuales de la POO en Flash y PHP. La ltima seccin de este captulo es la construccin de una clase de ejemplo para mejorar su comprensin de las prcticas aprendidas en las secciones anteriores. Es importante sealar que esta no es una gua detallada de programacin orientada a objetos, que en realidad necesitara su propio libro, pero es ms una visin general para apoyar a los usos de este libro.

Entender la programacion orientada a objetos (OOP)


La clave para la comprensin de la programacin orientada a objetos (OOP) es pensar de cada elemento como una pieza separada. En la programacin tradicional, el cdigo de los flujos de la lnea 1 hasta que llega al final del documento, con la funcin de vez en cuando para llevar a cabo tareas repetitivas. El problema con este enfoque es la escalabilidad, o la habilidad de dejar crecer es un programa que evoluciona en el futuro. Estoy seguro de que usted se est preguntando por qu debera importar si la aplicacin es escalable o no. En realidad, es una preocupacin muy importante que suele pasarse por alto en las aplicaciones. Hacer un programa escalable desde el principio significa reelaboracin menos cdigo y la edicin en el futuro. En cierto modo, programacin orientada a objetos y el cdigo escalable en realidad van de la mano bastante bien cuando se usan correctamente.

Informacin general de las prctica de OOP


Ahora que tiene una comprensin de lo que la OOP es y cmo puede beneficiar a su cdigo, puede ver lo que est involucrado en la redaccin. El primer o en programacin orientada a objetos es "objeto" o un conjunto de informacin contenida en una pieza fcil de administrar.

224

Clases
Una clase es una definicin de todos los objetos de un tipo especificado. La clase define la estructura de los objetos y el comportamiento. Este enfoque no slo permite que el cdigo para ser distribuido, pero tambin le permite mantener un cierto nivel de seguridad. Para entender mejor las clases, aqu es un ejemplo muy bsico:
public class Hello { function Hello() { } public function getSaying():String { return Hello World!; } }

El cdigo anterior es un ejemplo simple de una clase y no es ms que la intencin de demostrar visualmente cmo se construye una clase. El public antes de la clase define la clase entera como globalmente accesible. En algunos casos, esto no es el resultado deseado. Usted tambin puede asignar a cada mtodo y la propiedad como los tipos de pblico (public), privado (prvate), o de otro dependiendo de los requisitos. Aqu est un ejemplo comn de la aplicacin de protecciones a una clase para garantizar la seguridad:
public class UserLogin { function UserLogin() { } public function login():void { callDatabase(); } private function callDatabase():void { } }

Es seguro asumir que usted no desea que el mtodo callDatabase ser llamado directamente, porque una llamada realmente malicioso que podra perjudicar a su base de datos y debilitar la integridad general de la aplicacin. Forzar el mtodo como privado garantiza el mtodo no puede ser llamado. El usuario debe llamar al mtodo de ingreso donde se puede validar la solicitud antes de que se llama la base de datos. Esto es, por supuesto, un uso muy simple de los tipos de pblicos y privados, pero debera ayudar a entender por qu son importantes.

Constructor
El primer mtodo en una clase es generalmente el constructor. El constructor es llamado automticamente por el sistema y no pueden devolver los datos. Por lo general, cuando las tareas de inicializacin se llevara a cabo, como el dibujo de un objeto en el escenario o llamando a una base de datos.

225

Paquetes (Packages)
Los paquetes son los contenedores para varias clases que ofrecen la posibilidad de compartir la informacin dentro del contenedor global. Esto es similar a los empleados en una oficina que comparten informacin dentro de su propio departamento, pero al mismo tiempo puede pasar informacin a lo largo de la alta direccin sin que tener que abandonar la organizacin. En cierto modo, un paquete es una organizacin de clases. Hay dos maneras de definir un paquete. El primero es el directorio actual, que slo se convierte en:
package { class Example { function Example() { } } }

La otra opcin es definir una estructura del paquete, por lo general definido por el desarrollador o el nombre de dominio de la empresa en orden inverso, como:
com.companywebsite.projectname

La estructura se coloca despus de la palabra clave package.


package com.companywebsite.projectname { class Example { function Example() { } } }

Un ruta reversa del paquete de dominio se utiliza para asegurarse de que el paquete es nico.Tambin se utiliza para definir adecuadamente la solicitud o de la biblioteca. Otra ventaja de utilizar este enfoque es que se detenga las colisiones de clase, que es cuando dos clases diferentes tienen el mismo nombre. Esto ocurre ms a menudo cuando bibliotecas de terceros se utilizan en una aplicacin, ya que no tenemos control sobre los nombres utilizados en las clases. Si la biblioteca est bien construido, que tendr una estructura de paquete nico para evitar colisiones.

Importar
Importacin cuando se trabaja con las clases se refiere a la carga, o la conectar clases juntos. Por ejemplo, en la escena de Flash es una instancia de la clase DisplayObject. Sin embargo, cuando se crea un movieclip, que es una instancia de la clase MovieClip, tambin se carga en una instancia de DisplayObject, junto con un montn de otras clases y paquetes. Puede colocar las importaciones dentro de la clase por lo que slo son visibles para esa clase, o usted puede cargarlos en el paquete que les permitan ser compartidos a travs de todo el paquete. Por ejemplo, si tiene una clase de miembros, es seguro asumir que siempre se quiere que las credenciales de los miembros es visible 226

para validarlos en diversas partes de la aplicacin. Usted podra comenzar por definir la clase de miembros, y luego importar la clase UserCredentials para la validacin, como:
import UserCredentials; public class Member { function Member() { } }

Esto permitira a UserCredentials para ser vista por cualquier mtodo o propiedad en la clase de Member (miembros). Sin embargo, hay algunos casos en los que se desea que todas las clases para compartir otra clase.
package { import UserCredentials; public class Member { function Member() { } } }

En ActionScript 3 no tiene que preocuparse por la importacin de una clase ms de una vez porque el compilador como es lo suficientemente inteligente como para importar slo una vez. PHP, por el contrario, arroja un error si se intenta cargar una clase ms de una vez. Esta realidad no es algo malo y puede evitarse fcilmente mediante la carga de todas las clases en un archivo. Basta pensar en esta clase magistral como el padre de todos los dems. La siguiente seccin se centrar en las diferencias y similitudes de la clase en PHP y Flash.

Mtodos y propiedades estticas


Un mtodo esttico es uno que no requiere una instancia de clase a ser llamado. Tambin permite que el cdigo para conseguir un cierto nivel de coherencia. Por ejemplo, hay una clase Date (Fecha), y en que un mtodo que devuelve los das de la semana. Es seguro asumir los das de la semana no va a cambiar, as que usted puede tener acceso a este mtodo simplemente llamando directamente.
Date.getDaysOfWeek();

Un mtodo esttico que se llama de la siguiente manera: Class.method. No hay necesidad de un nombre de instancia o el constructor, de hecho, un constructor no es ni siquiera necesario en este tipo de clase. Sin embargo, es una buena prctica para tener un constructor para la complete compatibilidad. Una propiedad esttica es similar a un mtodo esttico en que se puede acceder sin una instancia. Sin embargo, tiene un atributo especial, su tipo y los datos no se puede cambiar, con la obvia excepcin de una matriz o un objeto, que no puede tener elementos aadidos a la misma.
trace(Days in Week: + Date.daysInWeek);

227

El cdigo anterior es acceder a la propiedad esttica daysInWeek, lo que devuelve un valor numrico que representa el total de das en una semana. Una propiedad esttica es til cuando usted tiene un valor que nunca cambia, como una URL o una compaa de informacin que se utilizar en una aplicacin.

Singletons
Un singleton es un patrn de diseo. El tema de los patrones de diseo requiere de su propio libro, pero bsicamente son las reglas y las prcticas se forman entre varios desarrolladores. Usted no est obligado a seguir un patrn de diseo, pero hacerlo ms limpio y ofrece un cdigo ms escalable. El Singleton es probable que el patrn de diseo ms comunes. Es comnmente usado para pasar alrededor de una pieza de informacin que no cambia nunca y ser necesario un poco durante una aplicacin. NOTA En la mayora de lenguajes de programacin que es comn a declarar el constructor de una Singleton privado. Esto evita que los desarrolladores de forma accidental la creacin de ms de una instancia de un singleton. Sin embargo, no es compatible con ActionScript constructores privados. Como ha aprendido anteriormente, una instancia de una clase se realiza mediante la nueva palabra clave. Esa es una manera usted puede acceder a una clase y otra es la reutilizacin de la instancia existente, tales como:
public class User { private static instance:User; function User(){} public static function getInstance():User { if(instance == null) { instance = new User(); } return instance; } public function exampleName():String { return Joey; } }

La mayora de esta clase es el mismo que los ejemplos anteriores, con la excepcin de la adicin del mtodo getInstance. Este mtodo se utiliza para asegurar que una instancia nica de la clase se utiliza siempre. Cualquier llamada a esta clase se realiza mediante el mtodo getInstance, tales como:
import User; trace(Example Call: + User.getInstance().exampleName);

La primera vez que la clase se hace referencia a la instancia nica se genera. Cualquier llamada desde ese punto simplemente devuelve la instancia existente. Esto asegura que cualquier cambio a esta clase ser visto por todos los participantes. La magia detrs de esta clase es el mtodo y las propiedades estticas, que se utilizan esencialmente para poner una puerta entre los mtodos y la persona que llama. Todas las llamadas van a travs de getInstance tambin te permiten poner un control de autorizacin para todas las llamadas.

228

NOTA Un producto nico slo debe utilizarse cuando sea necesario. Haciendo de cada clase que cree en un aislado no es una buena prctica, de hecho, la mayora de los programas tienen un producto nico que almacena toda la informacin necesaria.

Captadores (Getters) y definidores (setters)


Usted puede haber notado que mucha de la utilizacin de la clase se centra en pasar los datos de ida y vuelta. De hecho, eso es precisamente lo que toda la programacin es, en cierto modo. La idea detrs de un getter y setter es para obtener acceso a las propiedades privadas. De hecho, es una apuesta bastante segura de que la mayora de sus propiedades sern privadas, debido a que es una especie de la idea de una clase. Aqu hay un ejemplo de un get y set, con un esqueleto de la clase como un ejemplo:
class People { private var _person:String; public function get person():String { return _person; } public function set person(u:String):void { if(u.length > 0 && u.length < 25) { _person = u; } } }

El cdigo anterior simplemente devuelve el valor actual de la propiedad privada_person. O bien, una llamada a la persona que modificar la propiedad privada si el nuevo valor es de al menos 1 y no ms de 25 caracteres de longitud. Usted puede agregar cualquier nivel de seguridad o de modificacin de datos a estos setters. La ventaja de utilizar un regulador es la capacidad de bloquear el acceso a las propiedades privadas, tambin llamada encapsulacin. Esto asegura que el cdigo no puede ser roto por pasar en los datos incorrectos, o peor an, poner en peligro un sistema debido a una clase abierta. Ahora que usted entiende lo que es un getter y setter, probablemente es una apuesta segura decir que probablemente tambin quieren saber cmo llamar a ellos. Esto se hace mediante el acceso a la variable pblica, tales como:
var people:People = new People(); people.person = Timmy; trace(The new person is: + people.person);

Como la mayora de los aspectos de la programacin, es responsabilidad del desarrollador para determinar dnde y cundo el uso de un getter/setter es una buena idea. La forma ms fcil de determinar esto es, en primer lugar la creacin de un esquema de la correcta aplicacin.

229

Uso de clases en PHP


Ahora que tiene una comprensin de lo que la OOP es y cmo funciona, el siguiente paso es analizar las diferencias de clase en Flash y PHP. Para empezar, he aqu un ejemplo rpido de una clase en PHP:
<?php class Example { public $sample = Hello, World!; function Example() { return $sample; } } ?>

Esa es la forma bsica de crear una clase en PHP. Los principales aspectos son definiciones que empiezan con la propiedad pblica, privada o protegida. Una propiedad seguir siendo necesario $, al igual que en el cdigo estndar de PHP. La diferencia real slo otro es el hecho de PHP no declarar el tipo de cambio. De hecho, PHP realmente no importa lo estrictamente tipo de una variable se mantiene, que no es realmente una buena cosa. El desarrollador puede perder la capacidad de saber qu tipo de datos tiene una variable.

Importar clases en PHP


Importacin de una clase en PHP se realiza mediante la carga del archivo con Include (incluir) o require (requieren). Usando include intentar cargar el archivo, pero continuar si el archivo no se encuentra. Require, por otra parte, tambin busca el archivo, pero sale de la secuencia de comandos con un error grave si el archivo no se encuentra, como se muestra en la Figura 10.1. Usar require ofrece la posibilidad de poner fin a una secuencia de comandos si los archivos adecuados no se encuentran. He aqu un ejemplo de la carga de una clase por que lo requieran:
<?php if(!file_exists(Interface.php)) { print Class Interface not loaded, exiting script!; } @require(Interface.php); class Example { function Example() { $i = new iExample(); print My i: . $i->samplr(); } } $example = new Example();

230

?>

Una sentencia if se utiliza para comprobar primero la existencia del archivo, ya que require crear un error fatal, lo que significa que el script puede informar cualquier mensaje de error apropiado. Si por alguna razn el archivo no se encuentra, el mensaje se enva al navegador y el script termina en silencio cuando llega a la lnea de exigir (require). La @ se utiliza para silenciar a los errores internos que ms a menudo entonces no causa un problema de seguridad porque presentan rutas de archivo crucial. Una forma alternativa para ocultar los errores es para deshabilitar el informe de errores, que se explica en el captulo 13.

Instanciacin
Creacin de instancias de clase es el acto de hacer una instancia de clase. La accin es la misma en cualquier lenguaje de programacin orientada a objetos, pero cada idioma tiene una forma diferente de que lo crea. En PHP, primero debe crear una variable y luego asignar la clase a esa variable. Una vez que la nueva instancia es creada, puede acceder a los mtodos y las propiedades pblicas de esa clase.
$myNewInstance = new Example();

FIGURA 10.1 Aqu est el mensaje de error mostrado en el navegador, que es el resultado de la clase que no se encuentra.

231

Mtodos en PHP se tiene acceso utilizando:


$instance->methodName();

Sin embargo, cuando se desea acceder a un mtodo dentro de la misma clase, puede sustituir la variable de instancia y el uso de $this. As que, suponiendo que usted desea tener acceso al mtodo helloWorld en la clase Speak (de hablar), tendra este aspecto:
$this->helloWorld();

Tambin puede usar el operador de resolucin de alcance (tambin llamado Paamayim Nekudotayim, que en hebreo significa dos puntos-dobles) el acceso a los mtodos y propiedades. La diferencia est en lugar de usar $this, debera utilizar el nombre de clase real. Este planteamiento hace que el cdigo sea ms fcil de leer.
Speak::helloWorld();

Clases mltiples
PHP permite una secuencia de comandos de clase para mantener varias clases. Esto es tanto una buena y mala idea, porque a muchas clases en uno de los resultados de archivo en el cdigo de hinchada que es difcil de manejar. Por otra parte, con las clases de todos en un archivo es ms fcil de distribuir. Estoy seguro de que te ests preguntando cmo las clases son exactamente las mltiples definido en un archivo, aqu est un ejemplo de un pseudo-paquete de la clase.
<?php class Animals { function Animal() { } public function speak($word) { print $word; } } class Dog extends Animals { function Dog($word) { $this->speak($word); } } // Create a new Dog $dog = new Dog(Hello.. Woof!); ?>

De hecho, PHP realmente no segui todas las prcticas estndar de programacin orientada a objetos, que creo que va a cambiar a medida que las versiones ms recientes se han desarrollado. Por ahora, puede crear su propia versin de un paquete y obtener la misma funcionalidad bsica. Es importante sealar que un pseudo-

232

paquete no ofrece el mismo nivel de separacin y la seguridad de que un paquete real hace, pero con algo de programacin creativa y la creacin adecuada de sus clases, usted puede mantener el cdigo de seguridad. CROSS--REF Vase el Captulo 6 para obtener ms informacin en profundidad sobre la seguridad del cdigo. Eso es todo lo que hay que utilizar y entender las clases en PHP, hasta el punto necesario para este libro. Usted puede, por supuesto, prorrogar el presente nuevos conocimientos y comenzar a explorar los aspectos ms avanzados de las clases en PHP. NOTA PHP ofrece una gran cantidad de "magia" los mtodos y propiedades hacen que las clases sean ms divertido y menos doloroso para trabajar.

Uso de clases en Flash


Como se indic anteriormente, las clases en Flash y PHP son similares en la mayora de aspectos. Vamos a ver cmo utilizar y modificar las clases en ActionScript Flash.

Importar
Importacin de una clase en ActionScript es un poco menos perdonar si la clase no se encuentra. De hecho, el compilador que se ejecuta cuando se exporta una pelcula se detiene si una clase no se encuentra. Esto bsicamente significa que usted no necesita mensajes de error si una clase no est cargado, porque la pelcula nunca es capaz de ser visto por el pblico en general. La excepcin a esta comprobacin compilador es si la clase es dinmica, lo que significa que su estructura general puede cambiar, pero que est ms all del alcance de este libro. Ahora, de regreso a la importacin de clases, que se creara como este:
import com.organization.project.Example; var example:Example = new Example(); trace(Call a method: + example.methodName());

Usted puede haber notado el uso de la importacin, en vez de exigir o incluir. La diferencia obvia en el ejemplo anterior es: Ejemplo de definicin de tipo. Esto realmente no es necesario, pero permite un mejor control de error cuando la pelcula se est compilado o se est ejecutando.

Clase de documento
La clase de documento se utiliza como la clase principal para una aplicacin. Piense en ello como la clase de lnea de tiempo, similar a los das de la adicin de cdigo de base en el fotograma 1 de una pelcula. Esos das han terminado y es una buena cosa, tambin. Sin embargo, hay algunas cosas que debe saber acerca de cuando se utiliza una clase de documento, como se muestra en la Figura 10.2. En primer lugar, mire lo que una clase de documentos parece:
package { import flash.display.MovieClip; public class DocRoot extends MovieClip { function DocRoot

233

{ trace(I am the Document Class); } } }

FIGURA 10.2 La clase de documentos, que se puede encontrar en el inspector de propiedades

La asignacin de la clase de documento es bastante singular. Usted puede agregar o editar el archivo de clase utilizando los pasos siguientes: 1. Haga clic en el escenario, para asegurar no hay nada seleccionado. 2. Abra el inspector de propiedades si no est abierto. 3. Haga clic en el cuadro de texto clase de documento y aadir el nombre de la clase. Usted puede haber notado la clase de documento extiende la clase MovieClip, sino que tambin puede extender la clase Sprite. De hecho, esta ampliacin es necesaria porque la clase de documento es en realidad un MovieClip.

234

Biblioteca de clases
Una biblioteca de clases es la nueva manera de ActionScript para conectar a un MovieClip en la lnea de tiempo. En versiones anteriores de Flash que se asigna un identificador de vinculacin a su MovieClip. En ActionScript 3, de tomar los mismos pasos bsicos de la apertura del inspector de Propiedades, seleccione la opcin Exportar para ActionScript, y aadir el nombre de clase, como se muestra en la Figura 10.3. FIGURA 10.3 El inspector de propiedades con la opcin Exportar para ActionScript seleccionados

Al igual que la clase de documento, es necesario asegurarse de que la clase personalizada MovieClip se extiende la clase MovieClip. De hecho, el Documento de la Biblioteca y las clases son muy similares en la que fueron creados.

235

Uso de Flash y PHP para construir clases personalizadas


Usted puede haber notado que hay menos de explicar con el uso de clases en Flash que hay en PHP. Esta seccin se centra en una clase completa ejemplo basado en Flash y PHP. Se utiliza para reforzar los conceptos aprendidos en las pginas anteriores. Vamos a empezar con PHP que se utiliza en este ejemplo. La idea es construir una aplicacin bsica que permite a PHP y Flash para comunicarse, aprovechando al mismo tiempo de clases personalizadas.
<?php class Communication { public $MESSAGE_NOTIFY = Hi, from PHP! You said: ; function Communication() { } public function respond($str) { return $this->MESSAGE_NOTIFY . $str; } } $communication = new Communication(); if($_GET[a] == newMessage) { // send message back to Flash print resp= . $communication->respond(); } ?>

La parte de PHP de este ejemplo permite a Flash comunicarse al pasar a lo largo de una peticin para llamar el mtodo respond(). Dentro de la clase, PHP y entonces construye una cadena y devuelve a la Flash, en donde en ese momento que se lee y aparece en el escenario. El siguiente paso es construir la clase de documentos y de llamadas en Flash.Esta es la clase de documento:
package { import flash.display.MovieClip; import flash.text.TextField; import Communicator; public class Document extends MovieClip { function Document() {

236

makeCall(); } public function makeCall():void { var mc:MovieClip = new MovieClip(); var txt:TextField = new TextField(); mc.addChild(txt); addChild(mc); var communicator:Communicator = new Communicator(); communicator.action = newMessage; communicator.container = mc; communicator.callServer(); } } }

El constructor es responsable de llamar al mtodo makeCall(). Este mtodo crea un TextField, concede al escenario mediante addChild, y, finalmente, establece la llamada a la clase communicator (comunicador) personalizada. Como la llamada a la clase del comunicador se est instalando, tambin es responsable de asignar la instancia de TextField y la accin. La accin en este ejemplo se utiliza para indicar que el cdigo PHP para correr. Por supuesto, en este ejemplo slo hay una accin asignada. Sin embargo, es fcil de pronto tienen diez o ms acciones en una aplicacin real. La clase TextField es similar al mtodo createNewTextField que se han utilizado en ActionScript 2. El cambio en el cdigo de ActionScript 3 se ha hecho para ser coherente con la coleccin de artculos personalizados, como los de la seccin anterior. El siguiente paso es crear la clase personalizada, que se utiliza para comunicarse con PHP en el servidor Web.
package{ import import import import import flash.net.URLRequest; flash.net.URLLoader; flash.net.URLVariables; flash.display.MovieClip; flash.events.*;

public class Communicator { private var _action:String; private var _txtBoxContainer:MovieClip; function Communicator() {} public function callServer():void { var variables:URLVariables = new URLVariables(); variables.a = _action;

237

var request:URLRequest = new URLRequest(http://localhost/flashphp/Communicate.php); request.data = variables; var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, serverHandler); loader.load(request); } public function serverHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); _txtBoxContainer.text = variables.resp; } public function set action(a:String):void { _action = a; } public function set container(mc:MovieClip):void { _txtBoxContainer = mc; } } }

La clase es bastante sencillo y tiene los conceptos que han sido utilizados en los ejemplos anteriores. Los puntos de enfoque principal de esta clase son los mtodos callServer y serverHandler, que se encarga de llamar y hacer frente a la respuesta del servidor. El primer mtodo, CallServer, establece la variable _action que se pasa a PHP usando el valor que se estableci en la clase de documentos en la seccin anterior. Usted puede haber notado el _ antes de que el nombre de la variable, que se utiliza para definir claramente una variable privada. No es necesario, pero hace que tu cdigo sea ms fcil de leer. Los dos ltimos mtodos de esta clase son responsables de establecer el contenedor de TextField y la accin. Estos dos setters son llamados desde la clase de documento. Como puede ver, la creacin de esta aplicacin como una clase personalizada ofrece la posibilidad de actualizar rpidamente o ampliarlo a otra aplicacin y lo mejor de todo tiene todo seguro. Esta solicitud de base es slo una muestra de lo que pueden ofrecer las clases, sino que debe darle una mejor comprensin de cmo la clase de documento se establece. La siguiente tabla 10.1, es una tabla de forma rpida y grfica que explica las diferencias de clases en PHP y Flash. Siempre puede regresar a esta pgina si usted tiene una pregunta de si una caracterstica existe en el lenguaje que estn trabajando.

238

TABLA 10.1

Diferencias entre Clases en PHP y Flash


Class Instantiation Multiple classes in one file Importing Constructor Packages Static methods and properties PHP X X X include or require X X Flash X X X X X .

Resumen
Una gran cantidad de informacin se tratan en este captulo y en este punto usted debe tener un buen entendimiento de cmo funciona programacin orientada a objetos y cundo usarlo. Como usted puede notar, las clases y programacin orientada a objetos en general, ofrecen muchas ventajas. Sin embargo, tambin puede notar el desarrollo OOP tiene ms tiempo. Esto no es necesariamente una mala cosa, porque a la larga, te dars cuenta de menos tiempo de desarrollo en futuras actualizaciones. Tambin ofrece la ventaja menos evidente de cdigo ms seguro que el desarrollador puede controlar. En este punto, usted sabe cmo configurar y utilizar las clases en PHP y Flash, y es probable que quieran experimentar con algunos de los temas ms avanzados que no estn cubiertos en este captulo.

239

Parte IV Desarrollo de Aplicaciones

240

Capitulo 11 Desarrollo de aplicaciones Bsicas


En este captulo, se desarrolla una serie de aplicaciones completas. El objetivo de este captulo es el de acabar con las aplicaciones completas al explicar los errores comunes y cmo superarlos. Usted investigar algunos conceptos nuevos, as como los controladores de eventos mltiples, clases personalizadas, y servicios a distancia. En este captulo tambin se centra en la mejor forma de trabajar con MySQL de una manera eficiente y segura. El captulo concluye con la evaluacin de las mejores prcticas para el mantenimiento de las aplicaciones y permitiendo la posibilidad de aadir nuevas funcionalidades.

Entender los elementos de una aplicacin


Crear aplicaciones no slo en saltar en Flash o tu editor favorito y la lnea de escritura despus de la lnea de cdigo. El mejor lugar para empezar en el desarrollo de aplicaciones es la etapa de evaluacin. Este es el punto para mirar la lista de lo que su aplicacin debe hacer, quin es la audiencia, y cmo va a desarrollar la aplicacin. Tabla 11.1 ilustra los tres puntos de la etapa de evaluacin. TABLA 11.1

Los tres puntos de la Etapa de Evaluacin


Qu Quin Cmo Definir lo que har la aplicacin El pblico objetivo de su aplicacin Tcnicas a utilizar para desarrollar su aplicacin

Los siguientes ejemplos saltarse el paso "cmo" porque este es un libro de Flash y PHP. Una vez que el "cmo" se define usted puede pensar en el "quin". Esto es, por supuesto, su pblico objetivo. Una aplicacin no siempre tendr un rgidamente definidas, que, sobre todo si se trata de un servicio de sitio Web, pero es mejor definir uno. La mejor manera de determinar su pblico objetivo es pensar sobre el tipo de aplicacin. Por ejemplo, va a ser una aplicacin de comercio electrnico o tal vez un reproductor de vdeo. Saber quin va a utilizar la aplicacin es crucial para su xito. Ahora que el "cmo" y "quin" se define, se puede pensar acerca qu es exactamente lo que la aplicacin va a hacer. Nunca ira a la ferretera, comprar todos los materiales, y luego decidir qu construir. Lo mismo es cierto para el desarrollo de aplicaciones. Al comenzar a seguir estas prcticas se conviertan en una segunda naturaleza. 241

Entender el diseo de una aplicacin


Con la fase de evaluacin completa, naturalmente, pasar a la fase de diseo. Pero, al igual que la etapa de evaluacin, siempre es una buena idea para el primer plan. Este sera un boceto con lpiz y papel o con flash con formas primitivas. Por ejemplo, la figura 11.1 muestra un ejemplo de esquema.

Trabajar con pseudo-cdigo


Despus de que haya la disposicin general de la aplicacin desarrollada, se puede pasar a la funcionalidad. Este sera el punto en empezar a escribir pseudo-cdigo, tales como las funciones, variables, eventos, y cualquier otro concepto que va a utilizar en su aplicacin. El siguiente es un ejemplo de pseudocdigo para un programa de gestin de usuarios.
// Pseudo-code function loadUser(id:uint):void { // make call to server passing // along the id as the user id } function handleServerResponse(e:Event):void { // capture server response // make necessary calls to application } function drawInterface():void { // paint draw the interface that // the user will interact with } function redraw():void { // redraw interface as info is loaded, // to keep things up to date } // Assign event handlers

Usted notar que pseudo-cdigo no es una aplicacin completa, pero es el esqueleto de la aplicacin en general. Esto le permite desarrollar rpidamente la forma en que la aplicacin funcionar y lo que har. Escritura de pseudo-cdigo se convierte en mucho ms importante en el desarrollo de aplicaciones a gran escala, pero es una buena prctica para evaluar, dibujo, y el plan no importa cun grande es el proyecto.

242

FIGURA 11.1 Un bosquejo ejemplo de aplicacin con formas primitivas en Flash

Finalizacin de la etapa de planificacin


El ltimo paso para la planificacin de una aplicacin no es definitiva, ya que puede concluir la etapa de planificacin o comenzar el proceso de desarrollo. Esta eleccin puede a veces ser determinado por el cliente o el director creativo si le ha sido asignado. En este punto, en el proceso de planificacin, que ha determinado lo que har la aplicacin, que va a utilizar, y cmo va a ser construido. Tambin han diseado un esquema y comenzado el proceso de programacin. El siguiente paso depende de usted como el desarrollador. Puede continuar y finalizar el proceso de diseo o de comenzar a desarrollar el cdigo de la aplicacin utilizar. Normalmente, se diseo la aplicacin suficiente para empezar en la programacin, porque las cosas son ms que probable que va a cambiar a medida que sigan desarrollndose. Sin embargo, con la cantidad apropiada de la planificacin puede minimizar estas fases de revision.

243

Desarrollo de un cliente de Chat


Ahora que han estudiado las mejores prcticas para el desarrollo de aplicaciones ya puede comenzar a desarrollar su aplicacin completa en primer lugar. Esta aplicacin ser un cliente de chat Flash usando PHP para interactuar con una base de datos MySQL. Despus de desarrollar la aplicacin de base se seguir para agregar caractersticas y ver la mejor manera de construir una aplicacin escalable. Una aplicacin escalable es desarrollado teniendo en cuenta que dos usuarios pueden utilizar la aplicacin al principio, pero podra fcilmente ser utilizado por millones en el tiempo. La idea es dar cuenta de esta y desarrollar la aplicacin de una manera que permite la expansin.

La porcin de Flash
De comenzar este proyecto mediante el diseo de la aplicacin. Para esta aplicacin, el diseo es siempre, pero se siente libre para modificarlo. De hecho, le animamos a ampliar a todos los ejemplos, que es la forma de familiarizarse con nuevos conceptos y tambin cmo crecer como desarrollador. La figura 11.2 muestra la interfaz de la aplicacin de chat. Bsicamente, la interfaz consta de un componente TextArea, que se utiliza para mostrar los mensajes de chat, dos componentes TextInput para el mensaje y los elementos nombre de usuario y una instancia del botn para el botn de envo.

244

FIGURA 11.2 El diseo de su aplicacin de chat construido utilizando componentes precompilados en Flash

Tabla 11.2 muestra los nombres de instancia para cada componente. TABLA 11.2

Instance Names for the Components


Componente TextArea TextInput TextInput Button Nombre de instancia messagesTxt newMsgTxt usernameTxt sendBtn Resultado Mostrar los mensajes del chat Nuevo mensaje Nombre de la persona del chat Enva un nuevo mensaje al servidor .

Se le hace referencia a los nombres de instancia durante el desarrollo de la ActionScript para su aplicacin de chat. Con la interfaz de usuario "diseo" parte ya realizada o en este caso cargada, se puede comenzar el desarrollo del cdigo. La primera parte del cdigo de la aplicacin de chat es un bloque de variables que se utilizan en todo. La primera variable es la ruta absoluta a los archivos PHP. Luego dos prximas variables son los archivos PHP encargados de enviar y la carga de los mensajes de chat de la base de datos. Despus de que son dos variables 245

booleanas para las llamadas de mensajes mltiples no se puede hacer. El ltimo conjunto de variables es una referencia al objeto Timer y el destructor de cach.
var phpPath:String = http://localhost/ch10/chatClient/; var phpSendMessage:String = phpPath + message.php; var phpLoadMessages:String = phpPath + getMessages.php; var loadingMessages:Boolean = false; var sendingMessage:Boolean = false; var timer:Timer; var cacheBuster:String = ?cb=1;

La primera funcin que vas a construir es el init() o la funcin de inicializacin. Esto se llama una sola vez, cuando se inicia la aplicacin. Es responsable de la creacin de un controlador de temporizador para la carga de los mensajes del servidor y hacer la primera llamada a un destructor (buster) de la cach, que se explica en la siguiente seccin. La ltima accin de la funcin init() es llamar a la funcin loadMessages y rellenar la lista de mensajes.
function init():void { // start timer for loading of messages timer = new Timer(5000, 0); timer.addEventListener(TimerEvent.TIMER, timerHandler); timer.start(); cacheBuster = getCacheBuster(); loadMessages(); // first time }

Los buques de clase Timer con Flash y tiene un montn de grandes aplicaciones. En este ejemplo se aprovecha el evento Timer, que es llamado cada vez que la cuenta regresiva se ha alcanzado. El tiempo de cuenta y el nmero de repeticiones se pasan al constructor. Establecer la cuenta regresiva a 5000 o 5 segundos y se repite a 0, lo que realmente le dice a ActionScript para repetir continuamente. Despus de una instancia de Timer se crea una nueva que asigna el controlador de eventos y de iniciar el temporizador de inmediato. El controlador de temporizador, simplemente hace una llamada a la funcin de loadMessages. Esta parte del cdigo podra ser condensado mediante la colocacin de la funcin loadMessages en lugar de la timerHandler, pero hacerlo de esta manera nos permite agregar ms funcionalidad en el futuro. Todo es buena prctica de desarrollo para crear controladores de eventos adecuado para lo que el cdigo puede ser actualizado, y lo hace en general mucho ms fcil de leer.
function timerHandler(e:TimerEvent):void { loadMessages(); }

La funcin de loadMessages es responsable de llamar y el manejo de la respuesta del servidor. La llamada al servidor es muy similar a otros ejemplos con algunos elementos nuevos. Un elemento nuevo es la variable CacheBuster, que se utiliza para asegurar que no recibe un resultado almacenado en cach.

246

Detener el almacenamiento en cach con datos dinmicos


Usted acaba de crear una variable para detener el almacenamiento en cach, pero qu es eso? El almacenamiento en cach en el servidor es cuando los datos dinmicos se almacena para su rpida carga en todas las futuras convocatorias. A primera vista parecera una buena idea, y en la mayora de los casos lo es. Sin embargo, en el ejemplo de la carga de chat de datos que cambia constantemente, es probablemente seguro decir que desea que estos datos sean frescos. Esto se logra mediante la adicin de una variable conocida como un "destructor de cach" ( cache buster ), el cual engaa al navegador en el pensamiento de cada llamada para el mismo archivo es diferente. Aqu hay un ejemplo muy simple de un destructor de la memoria cach y la cadena real que se enva al servidor:
function getRandom(length:uint):void { return Math.round(Math.random() * (length - 1)) + 1; } var rand:String = ?cb= + getRandom(8); var php:String = http://localhost/ch04/getMessages.php + rand; trace(URL: + phpFile); // getMessages.php?cb=65378426

PRECAUCIN busters cach aade el tiempo de descarga y la fuerza de cualquier archivo con un destructor de cach que se descargan cada vez que se solicita. Todo despus del? en la URL es decir el navegador y el servidor que la llamada es dinmica y los resultados en el archivo no est almacenado en cach. La siguiente parte del proceso de enviar el mensaje es asegurar el mensaje es por lo menos tres caracteres de largo. Si el mensaje no es por lo menos tres personajes, un mensaje de error. Hay dos maneras que usted puede escribir este control condicional. La primera opcin es:
if(newMsgTxt.text.length > 2) { }

La segunda opcin, que es ms fcil de entender rpidamente:


if(newMsgTxt.text.length >= 3) { }

Ambas opciones de lograr el mismo resultado, pero la segunda opcin es mucho ms fcil de leer desde un punto de vista lgico. Ahora bien, suponiendo que tiene un mensaje de la longitud correcta se puede continuar con el proceso de enviar el mensaje al servidor. La siguiente parte es la construccin de la llamada al servidor.
var variables:URLVariables = new URLVariables(); variables.user = usernameTxt.text;

247

variables.msg = newMsgTxt.text; var urlRequest:URLRequest = new URLRequest(phpSendMessage + getCacheBuster()); urlRequest.method = URLRequestMethod.POST; urlRequest.data = variables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, sendMessageHandler); urlLoader.load(urlRequest);

Al llamar al servidor, debe crear un objeto URLVariables con el fin de transmitir el nombre de usuario y el mensaje que se introdujo. Un llamado tambin a la funcin personalizada Buster cach para asegurar que los datos siempre es fresco. El ltimo paso en la funcin de envo es de inmediato y un mensaje del usuario en lugar de esperar a que la lista de mensajes para actualizar desde el servidor. Esto da a la solicitud de una sensacin de mayor capacidad de respuesta y lo hace de modo que el mensaje no parece haber sido ignorada.
addMessage(usernameTxt.text, newMsgTxt.text);

Esta funcin acepta dos argumentos: el nombre de usuario y el mensaje de recogida de sus respectivos componentes. Esta informacin es luego incorporarse a una cadena de HMTL que se asigna a la TextArea messagesTxt. El nombre de usuario se encuentra dentro de las etiquetas en negrita para resaltar el nombre. De hecho, usted puede utilizar una gran cantidad de etiquetas comunes HTML dentro de cuadros de texto HTML habilitado.
function addMessage(user:String, msg:String):void { messagesTxt.htmlText += <b> + user + </b> + : + msg + \n; }

Tabla 11.3 muestra las etiquetas HTML compatible que puede ser utilizado. TABLA 11.3

Etiquetas HTML soportadas


Etiqueta (Label) Anchor Tag Bold Tag Break Tag Font Tag Image Tag Italic Tag List Item Tag Paragraph Tag Span Tag Underline Tag Etiqueta HTML <a> <b> <br> <font> <img> <i> <li> <p> <span> <u> .

La funcin sendMessageHandler se llama una vez que el mensaje se envi con xito al servidor. La nica parte importante de esta funcin es la ltima lnea, el que abre el cuadro de mensaje y permite que el usuario escriba un mensaje nuevo. Usted puede borrar el mensaje en la funcin de envo, pero hacerlo de esta manera se asegura el mensaje permanece intacto hasta que est seguro de que se ha aadido. 248

NOTA El PHP no le avise a un error si el SQL falla, slo si la pgina no se carga. Por supuesto que puede aadir ms avanzadas de error de manipulacin a este ejemplo. Por supuesto que puede aadir ms avanzadas de error de manipulacin a este ejemplo.
function sendMessageHandler(e:Event):void { ... newMsgTxt.text = ; }

Ahora que ha completado el cdigo de envo y gestin de las llamadas al servidor, usted puede comenzar la funcin que gestiona los mensajes y los muestra en TextArea. El loadMessages () es llamado desde dos puntos diferentes. El primer punto es la funcin init(), que vimos anteriormente, el segundo es el controlador de temporizador. La funcin de control para ver si otra llamada ya se ha hecho para cargar los mensajes. La adicin de esta verificacin asegura que no se pueden inundar el servidor y, potencialmente, la fuerza para que no responda. Si otro de carga ya ha comenzado, simplemente a salir de la funcin y dejar de procesar. Suponiendo que otra carga ya no est en curso, se establece la variable loadingMessages, que es similar a cerrar la puerta despus de entrar en una habitacin. La mayora de la funcionalidad de loadMessages es similar al proceso de envo. Es bsicamente, definir el archivo PHP correcta para cargar y configurar un controlador de eventos para que el servidor devuelva los datos del mensaje.
function loadMessages():void { if(loadingMessages) return; loadingMessages = true; var urlRequest:URLRequest = new URLRequest(phpLoadMessages + getCacheBuster()); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, loadMessagesHandler); urlLoader.load(urlRequest); }

Manejo de respuesta XML


La funcin de respuesta de carga es responsable de trabajar con los datos XML y de pasar los mensajes que se mostrarn.
function loadMessagesHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var xml:XML = new XML(loader.data); messagesTxt.htmlText = ;

249

for each(var item in xml..message) { addMessage(item.name, item.msg); } cacheBuster = getCacheBuster(); loadingMessages = false; }

NOTA Los nombres de elementos dentro de la respuesta XML distinguen entre maysculas y minsculas. El caso de la norma est en minscula, o camello, de mltiples palabras. Despus de que el XML se ha cargado correctamente y listo para usar, configurar un bucle for..each al igual que lo utiliza en el ejemplo al cargar el cdigo XML en el Captulo 3. El bucle se basa en todos los nodos del mensaje encontrado en la respuesta de ejemplo. Una muestra de la respuesta pasa de nuevo sera algo como esto:
<messages> <message id=29> <name>guest1</name> <msg>Flash is a lot of fun</msg> </message> <message id=30> <name>guest2</name> <msg>PHP and Flash is better</msg> </message> <message id=32> <name>guest1</name> <msg>You can do so many things with it</msg> </message> <message id=33> <name>guest2</name> <msg>For sure, just look at this cool chat client</msg> </message> </messages>

El paso final de la funcin de loadMessagesHandler es crear un nuevo destructor de cach y establecer la variable loadingMessages a false, lo que permite a las futuras convocatorias para obtener los ltimos mensajes. Busters cach se ha explicado anteriormente en la seccin. Sin embargo, hay varias maneras de crear una cadena nica. La fecha est siempre cambiando y ActionScript tiene un mtodo getTime que devuelve los milisegundos desde 1 de enero de 1970. Este mtodo utiliza la fecha, ya que est cambiando constantemente y nunca se repite, lo que deja una cadena nica cada vez que se llama. En este punto, usted ha completado el cdigo ActionScript para su aplicacin de chat. Aqu est el cdigo completo de referencia:
var phpPath:String = http://localhost/ch10/chatClient/; var phpSendMessage:String = phpPath + message.php; var phpLoadMessages:String = phpPath + getMessages.php; var loadingMessages:Boolean = false; var sendingMessage:Boolean = false; var chatMessages:Array = new Array();

250

var timer:Timer; var cacheBuster:String = ?cb=1; function init():void { // start timer for loading of messages timer = new Timer(5000, 0); timer.addEventListener(TimerEvent.TIMER, timerHandler); timer.start(); cacheBuster = getCacheBuster(); loadMessages(); // first time } function sendMessage(e:MouseEvent):void { if(usernameTxt.text == ) { trace(Username required); return; } if(newMsgTxt.text.length >= 3) { var variables:URLVariables = new URLVariables(); variables.user = usernameTxt.text; variables.msg = newMsgTxt.text; var urlRequest:URLRequest = new URLRequest(phpSendMessage + getCacheBuster()); urlRequest.method = URLRequestMethod.POST; urlRequest.data = variables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, sendMessageHandler); urlLoader.load(urlRequest); // force message into display addMessage(usernameTxt.text, newMsgTxt.text); } } function sendMessageHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); trace(Response: + variables.resp); // clear message box newMsgTxt.text = ; } function loadMessages():void { if(loadingMessages) return; loadingMessages = true;

251

var urlRequest:URLRequest = new URLRequest(phpLoadMessages + getCacheBuster()); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, loadMessagesHandler); urlLoader.load(urlRequest); } function loadMessagesHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var xml:XML = new XML(loader.data); loadingMessages = false; messagesTxt.htmlText = ; for each(var item in xml..message) { addMessage(item.name, item.msg); } cacheBuster = getCacheBuster(); } function getCacheBuster():String { var date:Date = new Date(); cacheBuster = ?cb= + date.getTime(); return cacheBuster; } function addMessage(user:String, msg:String):void { messagesTxt.htmlText += <b> + user + </b> + : + msg + \n; } function timerHandler(e:TimerEvent):void { trace(Timer hit); loadMessages(); } sendBtn.addEventListener(MouseEvent.CLICK, sendMessage); init();

PHP para la aplicacin de chat


En este punto, usted ha completado la parte de ActionScript de la aplicacin de chat. El segundo paso es desarrollar el cdigo PHP, que es llamado desde el cdigo ActionScript. El cdigo PHP est dividido en tres archivos, que se ilustran en la tabla 11.4.

252

TABLA 11.4

Desglose de los archivos PHP


Archivo de cdigo PH getMessages.php messages.php dbConn.php Accin . Coge todos los mensajes en los ltimos 15 minutos Se encarga de la redaccin de un nuevo mensaje a la base de datos La conexin de base de datos compartida con los otros archivos

El primer archivo trabajar con getMessages.php. La primera parte de la carga de cdigo o incluye el archivo de conexin de bases de datos, que usted va a mirar en un momento. La siguiente parte es el llamado SQL, que consulta la base de datos MySQL y coge todos los ltimos mensajes publicados en los ltimos 15 minutos.
$sql = SELECT * FROM flashChat WHERE dateAdded > . (time() - (60 * 15)); $result = mysql_query($sql);

La condicin de los ltimos 15 minutos se determina por el cdigo siguiente. El time() devuelve un timestamp UNIX que se resta un 60 y multiplicado por 15. El 60 es para los segundos en un minuto y el 15 es la cantidad de minutos que usted se refiere. Tambin puede escribir esta ecuacin matemtica bsica mediante la eliminacin de la etapa de multiplicacin. Si lo hace, lo hace ms difcil de leer el cdigo, sino que tambin aumenta la velocidad de la aplicacin.
time() - 900

Esta cadena SQL se pasa a la funcin real que hace la llamada al servidor mysql_query(), que se asigna a la variable $result. Ahora que ha realizado con xito la llamada a la base de datos MySQL, el siguiente paso es generar un bucle que construye los mensajes. La figura 11.3 muestra la pantalla de consultas en MySQL Query Browser, que est disponible de forma gratuita en www.mysql.com. Este bucle se realiza mediante un tiempo, que tiene una duracin prevista hasta que una fila vlida no se devuelve desde la base de datos. Tambin puede colocar esto en un bucle y el uso mysql_num_rows() para determinar cuntas filas se devuelven.

253

FIGURA 11.3 La consulta SQL devuelto dentro de el MySQL Query Browser

La funcin mysql_fetch_array() agarra la de una sola fila de la tabla de base de datos en un formato de matriz asociativa y la asigna a la variable $row. El contenido del bucle se crean para generar nodos XML que contienen los datos del mensaje, que se mir en el captulo anterior. while($row = mysql_fetch_array($result)) { $xmlData .= <message id= . $row[id] . >\n; $xmlData .= <name> . $row[username] . </name>\n; $xmlData .= <msg> . $row[message] . </msg>\n; $xmlData .= </message>\n; } En este punto, usted tiene una llamada efectuada SQL en el servidor y un bucle para generar el mensaje de datos XML, que se devuelve a la Actionscript en Flash. Envo de los datos de vuelta a ActionScript es muy sencilla, solo asignar la variable $xmlData a la declaracin de impresin.
print $xmlData;

La declaracin de impresin envuelve su archivo messages.php, que se muestra en su totalidad aqu.


<?php

254

include dbconn.php; $sql = SELECT * FROM flashChat WHERE dateAdded > . ( time() - (60 * 15)); $result = mysql_query($sql); $xmlData = <messages>\n; while($row = mysql_fetch_array($result)) { $xmlData .= <message id= . $row[id] . >\n; $xmlData .= <name> . $row[username] . </name>\n; $xmlData .= <msg> . $row[message] . </msg>\n; $xmlData .= </message>\n; } $xmlData .= </messages>; print $xmlData; ?>

El archivo PHP siguiente que debe ser desarrollado es messages.php, que es responsable de la insercin de nuevos mensajes en la base de datos MySQL. La primera parte de este archivo PHP comienza el mismo que el anterior por la carga del archivo dbconn.php, que es responsable de manejar la informacin de acceso y conexin a la base de datos MySQL.
include dbconn.php;

El siguiente paso es comprobar que el mensaje enviado desde ActionScript es de hecho mayor que 0 caracteres cadena vaca. En PHP, strlen() devuelve la longitud de una cadena que se pasa como argumento.
if(strlen($_POST[msg]) > 0) { ... }

Asumiendo que tiene un mensaje de longitud vlido, asigna tres variables: una es el nombre de usuario, el segundo es el mensaje, y la tercera es la fecha en formato timestamp UNIX.
$username = $_POST[user]; $message = $_POST[msg]; $date = time();

El siguiente paso en el desarrollo de este archivo es tomar realizar la llamada MySQL real, que se realiza utilizando mysql_query(). Esta funcin tiene la instruccin SQL como argumento y devuelve un identificador de recursos o genera un error. La instruccin SQL real es bastante similar a otros utilizados en los ejemplos anteriores. Hay una mesa de FlashChat dentro de la base de datos que pasa a tener cuatro columnas, pero una de ellas es una auto_increment y no necesita ser definido en una sentencia INSERT. NOTA En una aplicacin ms robusta, que se desea aadir una capa de seguridad en los datos pasados en el de otra fuente. No importa si se trata de Flash, el navegador, o de un servicio de terceros, siempre es importante.
mysql_query(INSERT INTO flashChat (username, message, dateAdded)

255

VALUES ( . $username . , . $message . , . $date . ));

PRECAUCIN El nombre dateAdded fue utilizado porque la fecha es una palabra reservada en MySQL y se producir un error en la mayora de los casos. Nunca es una buena idea utilizar las palabras reservadas para su uso en cualquier otro lenguaje de desarrollo. El ltimo paso en este archivo es devolver una respuesta a la notificacin de Flash que el mensaje se ha aadido otro mensaje y ahora puede ser aadido a partir de ese usuario. En general, el archivo messages.php es bastante simple, pero hace el trabajo. Aqu est el archivo de messages.php de referencia completa.
<?php include dbconn.php; if(strlen($_POST[msg]) > 0) { $username = $_POST[user]; $message = $_POST[msg]; $date = time(); mysql_query(INSERT INTO flashChat (username, message, dateAdded) VALUES ( . $username . , . $message . , . $date . )); print resp=MESSAGE_ADDED; } ?>

Usar PHP para conectar a MySQL


El archivo PHP pasado en su versin de Flash aplicacin de chat es el archivo de dbconn.php. Este archivo es responsable de conectar a MySQL y proporcionar un vnculo a las tablas contenidas en la base de datos. NOTA Slo puede haber una conexin a una base de datos nica a la vez. La mejor prctica es el plan de SQL se conecta a ser ms eficientes. Esto le impide tener que ir adelante y atrs. Este archivo es bastante pequeo, pero tiene un requisito muy importante, que es en honor a las medidas de seguridad en la mayor medida. Una buena parte de estos artculos han sealado que la seguridad es importante. Se vea en muchos ejemplos anteriores, en este ejemplo, la seguridad no se excluye de la simplicidad. La primera parte de el archivo es asignar las variables de la base de datos que se pasarn a lo largo de la conexin. A menudo las aplicaciones ms avanzadas tendrn un archivo separado para las variables de 256

configuracin. Ese archivo de configuracin que se carga slo cuando la aplicacin se inicia y se hace referencia en todo. Sin embargo, debido a esta aplicacin es bastante pequeo, slo se asignan las variables de la base de datos de conexin dentro de la conexin del archivo dbconn.php.
$host = HOST_NAME; $user = SQL_USERNAME; $pass = SQL_PASSWORD; $database = SQL_DATABASE_NAME;

La primera variable es a menudo localhost o la direccin IP del servidor donde MySQL se ejecuta si se pasa a estar en ejecucin remota del servidor donde est corriendo PHP. No haba que esperar para ver una instalacin remota de MySQL en sistemas ms pequeos, pero es muy comn en aplicaciones de mayor tamao. Las otras tres variables son nombre de usuario, contrasea y el nombre de la base de datos a la que desea conectarse. Esta informacin de conexin proporcionada por su administrador de sistema o de acogida, si no ya lo saben. NOTA MySQL crea una instalacin por defecto con el nombre del usuario "root" y sin contrasea, pero es muy inseguro de esta manera y se debe cambiar inmediatamente. Ahora que las variables son definidas correctamente, puede realizar una conexin real a MySQL. Esto se logra por la funcin mysql_connect() dentro del PHP. Esta funcin acepta tres argumentos: host, nombre de usuario y una contrasea definida hace un momento.
$link = mysql_connect($host, $user, $pass);

La funcin mysql_connect() devuelve un identificador de recurso que se almacena en la variable $link. Esto se hace referencia a cuando se va a seleccionar la base de datos. Seleccin de la base de datos es simplemente una cuestin de hacer referencia el nombre de la base de datos a la que desea conectarse y pasando por el enlace recibido en el paso de la conexin.
mysql_select_db($database, $link);

El paso final y ms importante es destruir las variables que contienen la informacin de conexin de MySQL. La destruccin o eliminacin de una variable se hace pasando la la variable de referencia a la funcin unset(), que elimina la existencia de esa variable.
unset($host); unset($user); unset($pass); unset($database); unset($link);

Es importante que este paso para garantizar que los futuros aspectos de una aplicacin no puede obtener acceso a estas variables. Esto es especialmente importante cuando la introduccin de aplicaciones de terceros en su aplicacin personalizada.

257

Una alternativa ms segura que el mtodo anterior es envolver todo esto en una clase. Esto es similar a trabajar con un componente cerrado en Flash. El acceso est permitido slo a lo que usted quiere que otros vean, y el resto est oculto. Aqu hay un ejemplo de una conexin de base de datos con una clase:
<?php // simple mysql connection class class MysqlConnection { public $link; private private private private $host = localhost; $user = SQL_USERNAME; $pass = SQL_PASSWORD; $database = SQL_DB_NAME;

function MysqlConnection() {} public function connect() { $this->link = mysql_connect( $this->host, $this->user, $this->pass ); mysql_select_db($this->database, $this->link); } public function setConnectionDetails($h=, $u=, $p=, $d=) { $this->host = $h; $this->user = $u; $this->pass = $p; $this->database = $d; } public function getLink() { return $this->link; } } $sql = new MysqlConnection(); $sql->connect(); ?>

A primera vista no parece muy diferente de la conexin de ejemplo anterior, sin embargo, la seccin importante es la definicin de las variables.
public $link;

258

private private private private

$host = localhost; $user = SQL_USERNAME; $pass = SQL_PASSWORD; $database = SQL_DB_NAME;

Como vimos en el captulo 9, las variables de clase de PHP se puede dar una designacin pblica y privada. En esta clase de ejemplo, las variables de conexin se definen como privadas, el bloqueo con fuerza dentro de la clase. Esto garantiza esas variables no pueden ser descubiertos por accidente, y tambin ofrece otro beneficio. Digamos que tienes un nuevo proyecto y desea conectarse a una base de datos; hacerlo sera tan simple como el siguiente bloque de cdigo.
<?php include MysqlConnection.php; $mysqlConn = new MysqlConnection(); $mysqlConn-> setConnectionDetails(host, user, pass, db); $mysqlConn->connect(); $query = SELECT * FROM our_table; $result = mysql_query($query, $mysqlConn->getLink()); ?>

Tenga en cuenta que se utiliza la clase de conexin personalizada, informacin nueva conexin, y finalmente pasar el enlace de la base de datos en la convocatoria de la consulta. En ningn momento de este cdigo es la informacin de conexin de acceso o expuestos al pblico en general. NOTA Cuando se conecte a una base de datos en un servidor de vivir es una buena idea deshabilitar el informe de errores, o al menos suprimir cualquier error de conexin. Aqu est el archivo de conexin original en su totalidad:
<?php $host = localhost; $user = SQL_USERNAME; $pass = SQL_PASSWORD; $database = SQL_DB_NAME; $link = mysql_connect($host, $user, $pass); mysql_select_db($database, $link); unset($host); unset($user); unset($pass); unset($database); unset($link); ?>

Crear una tabla de base de datos


En este punto, todos los ActionScript y PHP es escrito. Sin embargo, si intenta probar la aplicacin no se ejecutar porque no se ha definido la tabla de SQL que interactan con el PHP para enviar y la carga de mensajes.

259

La sintaxis SQL es muy fcil de seguir, pero es importante para construir cuidadosamente. El desempeo de un cuadro de construccin deficiente sufrir ms y ms a medida que comienza a crecer. Este SQL crea una tabla de FlashChat, y agrega las filas que se utiliza en el PHP. Notificacin de la fila de identificacin, que no se utiliza en el cdigo PHP, sino que se utiliza internamente para la indizacin y la asignacin de teclas. Otra forma de pensar acerca de la ID es la llave que abre el misterio para que sus datos se encuentra dentro de esta mesa grande. El mensaje de la filas que usted usa en el PHP son nombre de usuario, y dateAdded. La fila de mensaje es ms importante porque se establece como TEXT, lo que da una composicin abierta, la capacidad de longitud. Esto significa bsicamente un mensaje puede ser de cualquier longitud. Ese registro tambin podra haber sido asignado un varchar(), que obliguen a la longitud de un lmite previamente determinada, como la:
message varchar(150) NOT NULL default

Esta nueva definicin de la fila mensaje obligara a cualquier mensaje de chat ms de 150 caracteres que se trunca o terminado. Establecer como texto es ms conveniente, pero tiene problemas potenciales de rendimiento como la base de datos y mesa de crecer.
CREATE TABLE flashChat ( id int(11) not null auto_increment, username varchar(20) NOT NULL default , message text NOT NULL, dateAdded int(11) NOT NULL default 0, PRIMARY KEY (id) ) ENGINE=MyISAM;

Tom un montn de cdigo, pero su PHP-impulsado Flash Chat aplicacin est completa. Tome el tiempo para revisar el cdigo y extender el ejemplo, para aadir ms caractersticas. Aqu estn algunas ideas para comenzar. Caracterstica de la primera y probablemente ms evidente que se podra agregar algo de mayor nivel de seguridad entre PHP y Flash. Tambin puede aadir un panel de moderacin o como un bono de un script de moderacin de base haya sido proporcionada en el contenido adicional disponible para este libro. En este punto, usted debe tener un buen entendimiento de cmo construir una aplicacin completa usando Flash, PHP y MySQL. En la siguiente seccin, se utiliza Flash y PHP para construir una galera de fotos completa con las categoras y los controles de navegacin.

Uso de PHP para el desarrollo de una galleria de fotos


Qu es mejor que una galera de Flash? Qu tal una galera Flash dinmico en PHP alimenta autoupdating archivos XML? Esta seccin es una gua paso a paso sobre cmo desarrollar eso. El desarrollo comenzar con el cdigo ActionScript y luego mudarse a la parte de PHP. El ltimo paso ser evaluar la aplicacin de acabados y explicar la manera de avanzar. Como aprendimos en el comienzo de este captulo, cada buena aplicacin est diseada y evaluada antes de que la programacin comienza. Tome un momento para mirar a la aplicacin de acabado, que est disponible en la fuente de material para este libro. Figura 11.4 se muestra la aplicacin completa.

260

FIGURA 11.4 La galera de fotos Flash/PHP completado que muestra contenido cargado

El cdigo ActionScript para la aplicacin completa automticamente para rellenar una lista de categoras. Carga dinmica de las imgenes y permitir una navegacin anterior y siguiente a travs de cada categora de las imgenes.

El desarrollo de ActionScript
Ahora que sabes lo que har la aplicacin, puede comenzar a colocar las variables.
var phpPath:String = http://localhost/ch10/photoGallery/; var phpFile:String = phpPath + gallery.php; var images:Array = new Array(); var imageHolder:MovieClip; var categoryHolder:MovieClip;

Las dos primeras variables hace referencia al archivo PHP que genera la categora y los datos de la imagen. La variable de las imgenes se utiliza para almacenar los datos de las imgenes enviadas desde el PHP, que se utiliza para cargar las imgenes. Las dos ltimas variables en esta seccin son MovieClips titular para la imagen 261

principal y la navegacin. Ambas variables se rellenan en tiempo de ejecucin una vez que se carga la imagen y los datos de la categora. El siguiente conjunto de variables que se necesita es especficamente para navegar alrededor de las imgenes y las categoras.
var var var var currentID:uint; currentImage:Number = 0; imageDir:String = photos/; cacheBuster:String = ?cb=1;

El currentID se usa para recordar que la imagen se est viendo. Esto ser utilizado en las funciones de navegacin anterior y siguiente. El imageDir es una referencia al directorio de la imagen, que es donde est el directorio de la categora. La ltima variable es un destructor de la cach, que como se explic al comienzo de este captulo se utiliza para asegurar la carga de datos es siempre fresca y no en cach. Ahora que ha completado el proceso de establecimiento de todas las variables necesarias, puede pasar al ncleo de la aplicacin, que es de las funciones. La funcin init() es responsable de crear los dos MovieClips holder (titular). El MovieClips se crean dinmicamente, colocado, y adjunta a la lista de visualizacin. Esto se hace realizando una llamada a addChild y pasando a lo largo de la referencia de MovieClip. La funcin init tambin es donde genera el Buster cach. El ltimo paso de la funcin de inicio es para hacer una llamada a la loadCategories() la funcin. Es importante que esta funcin slo se le llama en el inicio, porque los objetos y las categoras sera indefinido o duplicado.
function init() { imageHolder = new MovieClip(); imageHolder.x = 212; imageHolder.y = 49; addChild(imageHolder); categoryHolder = new MovieClip(); categoryHolder.x = 15; categoryHolder.y = 50; addChild(categoryHolder); cacheBuster = getCacheBuster(); loadCategories(); }

Una vez que la fase de inicializacin de init se ha completado la funcin loadCategories() es llamado. Esta funcin se llama al archivo PHP para cargar en la lista de categoras usando URLRequest y pasando a lo largo de una accin personalizada que le dice a la secuencia de comandos que desea que la lista de categoras. Esto es importante porque la gallery.php maneja tanto las categoras y la seleccin de fotos. En general, la funcin de loadCategories es bastante similar a otros cargadores utilizados en este libro.
function loadCategories():void { var action:String = action=cat; var urlRequest:URLRequest = new URLRequest(phpFile + getCacheBuster() + & + action); var urlLoader:URLLoader = new URLLoader();

262

urlLoader.addEventListener(Event.COMPLETE, drawCategories); urlLoader.load(urlRequest); }

La funcin de drawCategories se llama una vez la lista de categoras se ha enviado desde el PHP. Los datos se cargan en un objeto XML y analizado utilizando un bucle for..each. Para comprender mejor el ciclo, mira un ejemplo de XML resultado pasa de nuevo desde el PHP. Uno de estos nodos XML se crea para cada categora en la galera.
<category id=2 name=Landscapes copyright=Other/>

El texto de la categora que se muestra en el escenario es un campo de texto dinmico creado en el bucle for..each. Tambin puede adjuntar un clip de pelcula de la biblioteca, pero al hacerlo da lugar a una aplicacin ms fragmentada y se pierden algunas opciones de formato.
function drawCategories(e:Event):void { ... for each(var item in xml..category) { ... } }

Antes de continuar con la aplicacin mirada cdigo especfico en lo que exactamente se est haciendo para crear el TextField.
var txt:TextField = new TextField(); txt.selectable = false; txt.width = 200; txt.text = Sample Text;

La primera lnea es la creacin de una nueva instancia de TextField y el establecimiento de una referencia a la variable txt. La siguiente lnea es asegurarse de que el texto no se puede seleccionar con el ratn. NOTA No siempre se establece la propiedad seleccionable en false. Los usuarios a menudo como para copiar el contenido, sobre todo bloques de texto. La segunda a la ltima lnea de cdigo es responsable de establecer la anchura del TextField a 200 pxeles para acomodar el texto. Luego de la ltima lnea es simplemente aplicar el texto que ser visible en el cuadro de texto. Una vez creado el campo de texto, se adjunta un detector de eventos para cargar una categora de las imgenes cuando el texto se hace clic.

Funciones Anonimas
Una funcin annima est directamente ligado a la llamada addEventListener. Una funcin annima no puede ser llamado por su nombre porque no tiene uno, es usado como una alternativa a una funcin habitual cuando la tarea es sencilla y no requiere una gran cantidad de cdigo. Siendo realistas funciones annimas se utilizan para hacer el cdigo ms compacto, o si necesita acceder a una variable que est en el mbito local en el mtodo de llamada. 263

Aqu hay un ejemplo de una funcin annima similar a la que se ubica dentro de la funcin drawCategories.
txtContainer.addEventListener(MouseEvent.CLICK,function(e:Event): void { trace(Anonymous function here, I dont have a name.); });

Usted puede notar una de las razones posibles para evitar las funciones annimas (aparte de no ser multifuncional) es un cdigo que hace mucho ms difcil de leer de un vistazo. Esto se debe principalmente al hecho de la definicin de la funcin est enterrado en el addEventListener. Adems, una funcin annima no puede ser eliminado, lo que puede causar un potencial de prdidas de memoria. La ltima tarea de la funcin drawCategories es la de conectar el campo de texto a la etapa mediante addChild, como se hace para la categora.
txtContainer.addChild(txt); categoryHolder.addChild(txtContainer);

Aqu est la funcin drawCategories completo de referencia.


function drawCategories(e:Event):void { var loader:URLLoader = URLLoader(e.target); var xml:XML = new XML(loader.data); for each(var item in xml..category) { var txtContainer:MovieClip = new MovieClip(); var txt:TextField = new TextField(); txt.selectable = false; txt.width = 200; txt.text = item.attribute(name); txt.y = uint(item.attribute(id) + 4) * 2; txt.name = text_ + item.attribute(id); txtContainer.addEventListener(MouseEvent.CLICK, function(e:Event):void { loadImages(e.target.name.substring(5)); }); txtContainer.addChild(txt); categoryHolder.addChild(txtContainer); } }

La siguiente funcin es centrarse en loadImages. Esta es la funcin que carga los datos de imagen desde el PHP. El resultado pasa de nuevo es casi idntica a la encontrada en la funcin (category) categora. La variable de medida se establece para las fotos, y tambin agregar un id de dejar de PHP saber qu fotos para cargar.
function loadImages(id:uint):void { var action:String = action=photos&id= + id; var urlRequest:URLRequest = new URLRequest(phpFile + getCacheBuster() + & + action); var urlLoader:URLLoader = new URLLoader();

264

urlLoader.addEventListener(Event.COMPLETE, imagesLoaded); urlLoader.load(urlRequest); currentID = id; }

Una respuesta se enva de nuevo cuando se carga el PHP, y la funcin imagesLoaded es llamada. Los datos de imagen se devuelve en formato XML y manejado con un bucle for..each. Este ciclo de los procesos de cada nodo de fotos en los datos XML y construye un objeto, que se aade "empujado" ( pushed ) a las imgenes de matriz.
function imagesLoaded(e:Event):void { for each(var item in xml..photo) { images.push({name:, src:item.attribute(src)}); } ... }

He aqu el objeto por s mismo y un mtodo alternativo y ms legible de la creacin del objeto.
{ name:, src:item.attribute(src) }

Aqu est el mtodo alternativo para definir el objeto.


var obj:Object = new Object(); obj.name = ; obj.src = item.attribute(src);

La ltima tarea de la funcin de imagesLoaded es establecer la variable de currentImage y hacer una llamada a la funcin DisplayImage pasando la fuente de imagen. El origen de la imagen se carga desde la matriz de imgenes usando currentImage como el ndice de la matriz.
function imagesLoaded(e:Event):void { ... currentImage = 0; displayImage(images[currentImage].src); }

Esta es la funcin imagesLoaded completa:


function imagesLoaded(e:Event):void { var loader:URLLoader = URLLoader(e.target); var xml:XML = new XML(loader.data); images = new Array(); for each(var item in xml..photo) { images.push({name:, src:item.attribute(src)}); } currentImage = 0; displayImage(images[currentImage].src); }

265

Con las categoras y las imgenes cargadas, puede mostrar la imagen. Esto se hace mediante la asignacin de un URLRequest construccin del directorio de imagen, id de la categora actual, y el nombre de la foto. La clase cargador se coloca directamente en una llamada addChild, que maneja la visualizacin de la imagen una vez que est completamente cargada. Usted no notar ningn tiempo de carga a nivel local, pero puede ser en lnea. NOTA Es buena prctica colocar preloaders donde los datos se cargan. Esto informa al usuario de que algo est pasando.
function displayImage(src:String):void { var loader:Loader = new Loader(); loader.load(new URLRequest(imageDir + currentID + / + src)); imageHolder.addChild(loader); }

Navegacion de galeria de fotos


La parte de navegacin de la galera de fotos est construida con dos clips de pelcula en el escenario. Cada uno de los clips se asigna a un controlador de eventos que, o bien de cargar la imagen siguiente o la anterior.

Navegacin de Imagen
Usted notar que la funcin nextImage() tiene algo de lgica condicional. Esta es la comprobacin para ver si la variable currentImage es un nmero mayor que el total de las imgenes, lo que dara lugar a un error de carga. El mismo proceso bsico se hace para la funcin prevImage() con la excepcin de que el cheque condicional es garantizar el valor no sea inferior a cero. NOTA Las funciones de la imagen anterior y siguiente se bloquear si una categora no ha sido elegido.
function nextImage(e:MouseEvent):void { currentImage++; if(currentImage > images.length-1) { currentImage = 0; } displayImage(images[currentImage].src); } function prevImage(e:MouseEvent):void { currentImage--; if(currentImage <= 0) { currentImage = images.length-1; } displayImage(images[currentImage].src); }

La ltima funcin en el script de galera de fotos se utiliza para generar su buster cach, que se utiliza para asegurar las llamadas al servidor nunca se almacenan en cach. Esta funcin es idntica a la utilizada en el Flash aplicacin de chat que construy anteriormente en este captulo. 266

La ltima parte de la aplicacin es llamar a init() en el inicio de la aplicacin y asignar los manejadores de eventos que utiliza los botones de navegacin.
function getCacheBuster():String { var date:Date = new Date(); cacheBuster = ?cb= + date.getTime(); return cacheBuster; } init(); prevMC.addEventListener(MouseEvent.CLICK, prevImage); nextMC.addEventListener(MouseEvent.CLICK, nextImage);

Aqu est el cdigo ActionScript completo para la aplicacin galera de fotos:


var phpPath:String = http://localhost/ch%2010/photoGallery/; var phpFile:String = phpPath + gallery.php; var images:Array = new Array(); var imageHolder:MovieClip; var categoryHolder:MovieClip; var currentID:uint; var imageDir:String = photos/; var currentImage:uint = 0; var cacheBuster:String = ?cb=1; function init() { imageHolder = new MovieClip(); imageHolder.x = 212; imageHolder.y = 49; addChild(imageHolder); categoryHolder = new MovieClip(); categoryHolder.x = 15; categoryHolder.y = 50; addChild(categoryHolder); cacheBuster = getCacheBuster(); loadCategories(); } function loadCategories():void { var action:String = action=cat; var urlRequest:URLRequest = new URLRequest(phpFile + getCacheBuster() + & + action); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, drawCategories); urlLoader.load(urlRequest);

267

} function drawCategories(e:Event):void { var loader:URLLoader = URLLoader(e.target); var xml:XML = new XML(loader.data); for each(var item in xml..category) { var txtContainer:MovieClip = new MovieClip(); var txt:TextField = new TextField(); txt.selectable = false; txt.width = 200; txt.text = item.attribute(name); txt.y = uint(item.attribute(id) + 4) * 2; txt.name = text_ + item.attribute(id); txtContainer.addEventListener(MouseEvent.CLICK, function(e:Event):void { loadImages(e.target.name.substring(5)); }); txtContainer.buttonMode = true; txtContainer.addChild(txt); categoryHolder.addChild(txtContainer); } } function loadImages(id:uint):void { trace(Load Images: + id); var action:String = action=photos&id= + id; var urlRequest:URLRequest = new URLRequest(phpFile + getCacheBuster() + & + action); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, imagesLoaded); urlLoader.load(urlRequest); currentID = id; } function imagesLoaded(e:Event):void { var loader:URLLoader = URLLoader(e.target); var xml:XML = new XML(loader.data); images = new Array(); for each(var item in xml..photo) { images.push({name:, src:item.attribute(src)}); } currentImage = 0; displayImage(images[currentImage].src); }

268

function displayImage(src:String):void { trace(Load Image: + src); var loader:Loader = new Loader(); loader.load(new URLRequest(imageDir + currentID + / + src)); imageHolder.addChild(loader); } function nextImage(e:MouseEvent):void { currentImage++; if(currentImage > images.length-1) { currentImage = 0; } displayImage(images[currentImage].src); } function prevImage(e:MouseEvent):void { currentImage--; if(currentImage <= 0) { currentImage = images.length-1; } displayImage(images[currentImage].src); } function getCacheBuster():String { var date:Date = new Date(); cacheBuster = ?cb= + date.getTime(); return cacheBuster; } init(); prevMC.addEventListener(MouseEvent.CLICK, prevImage); nextMC.addEventListener(MouseEvent.CLICK, nextImage);

PHP para la galleria de fotos


La parte de PHP de esta aplicacin galera de fotos est construido de tres archivos. El primer archivo es categories.php, que es una representacin esttica de las categoras de ser enviado a ActionScript. La primera parte del cdigo es la categora en un formato de matriz multidimensional. Los elementos de categora tienen el nombre, id, y la informacin de derechos de autor para cada categora.
$categories = array( array(Boston, 1, M. Keefe), array(Landscapes, 2, Other), array(Las Vegas, 3, M. Keefe), array(Weddings, 4, Other), );

269

La primera funcin GetCategories() se establece una referencia global a la variable $categories. El siguiente paso es definir un bucle que se encargar de construir los datos XML que se reintegrar a ActionScript.
function getCategories() { global $categories; $xml = <categories>\n; for($i=0; $i < count($categories); $i++) { $xml .= <category id=\ . $categories[$i][1] . \ name=\ . $categories[$i][0] . \ copyright=\ . $categories[$i][2] . \ />\n; } $xml .= </categories>; return $xml; }

La longitud del bucle est determinado por cun grande es el array $categories pasa a ser.
count($categories)

El cuerpo del bucle no es ms que la construccin de los datos XML, similar a la muestra mir durante la parte de desarrollo de ActionScript.
$xml .= <category id=\ . $categories[$i][1] . \ name=\ . $categories[$i][0] . \ copyright=\ . $categories[$i][2] . \ />\n;

El ltimo paso de esta funcin es la de devolver los datos XML de ActionScript para el proceso.
return $xml;

Aqu est el archivo categories.php en su totalidad:


<?php $categories = array( array(Boston, 1, M. Keefe), array(Landscapes, 2, Other), array(Las Vegas, 3, M. Keefe), array(Weddings, 4, Other), ); function getCategories() { global $categories; $xml = <categories>\n; for($i=0; $i < count($categories); $i++)

270

{ $xml .= <category id=\ . $categories[$i][1] . \ name=\ . $categories[$i][0] . \ copyright=\ . $categories[$i][2] . \ />\n; } $xml .= </categories>; return $xml; } ?>

El archivo siguiente a desarrollar es getPhotos.php, que abre el directorio de foto y devuelve el archivo XML de poblacin con informacin de origen para cada una de las fotos. La carne de este archivo es la funcin getPhotosFromID(), que acepta un argumento, un id. Usted quiere asegurarse de que una identificacin vlida se pasa antes de continuar por lo que una sentencia condicional simple trabajar en este caso. Si un nmero de identificacin vlido se ha encontrado, entonces se puede continuar con la apertura de las mismas y el bucle while.
<?php $photo_dir = photos/; function getPhotosFromID($id=null) { global $photo_dir; if($id == null) { print ID Not Provided; return false; } $xml = <photos id=\ . $id . \>; $dir = opendir($photo_dir . $id); while(false !== ($file = readdir($dir))) { if($file != . && $file != ..) { $xml .= <photo name=\ . . \ src=\ . $file . \ />\n; } } closedir($dir); $xml .= </photos>; return $xml; } ?>

271

El bucle while est configurado para recorrer cada archivo en el directorio hasta que el puntero de archivo es falso, lo que significa que no se encontr archivo vlido.
while(false !== ($file = readdir($dir))) { ... }

Se utiliza un condicional si la declaracin de exclude .y .. que es punteros de directorio para el directorio actual y directorio padre. Si se excluye este control, habr al menos dos entradas falsas en el archivo XML, o peor an, el archivo puede error a cabo todos juntos, ya que podra poner el bucle while en un estado recursiva infinita. Despus de todas las imgenes en el directorio se reunieron, se desea cerrar el directorio para liberar recursos valiosos. Esto es especialmente importante si el archivo puede ser utilizado por otra persona al mismo tiempo.
closedir($dir);

El ltimo paso en este archivo es devolver el XML para el proceso de flash. Despus de haber creado la categora y los archivos de fotos, puede crear el archivo de gallery.php, que maneja las llamadas de PHP y devuelve el cdigo XML adecuado de acuerdo con lo que se.
<?php include categories.php; include getPhotos.php; header(Content-type: text/xml); if($_GET[action] == cat) { print getCategories(); } else if($_GET[action] == photos) { print getPhotosFromID($_GET[id]); } ?>

Este archivo se inicia mediante la inclusin de los dos archivos anteriores que has creado. Luego, un cabecera() header() es de obligar a la salida de todo el contenido en formato XML apropiado. Esta funcin de cabecera se puede utilizar para casi cualquier tipo de contenido. Es, bsicamente, fijarlo, y desde ese punto de la salida sigue a ese formato. Por ejemplo, suponga que desea exportar contenido como PNG.
header(Content-type: image/png);

NOTA Asegrese de utilizar el tipo de contenido correcto en su aplicacin. Usando el incorrecto puede provocar errores y, en raras ocasiones una aplicacin de accidente. El ltimo bloque de cdigo se utiliza para determinar el contenido que usted est solicitando. Los dos tipos de contenido disponibles en este ejemplo son la categora y la lista de fotos. La variable $_GET [ 'action'] se pasa de Flash en la direccin URL como una cadena de consulta. http://localhost/photoGallery/gallery.php?cb=1192408716823&action=cat 272

En este punto, la galera Flash impulsados por PHP es completa. Se puede extender este ejemplo, para aadir pginas, de las transiciones, o quizs algunos ttulos y descripciones para cada imagen. Esa es la cosa fresca sobre ActionScript: se puede extender a partir de ejemplos del libro, o simplemente use a su barco.

Uso de PHP para desarrollar un lector RSS


Los lectores de RSS es un tema muy popular, y las aplicaciones se pueden encontrar para casi todos los dispositivos que tengan habilitada su web. Se pueden encontrar de todo, desde un navegador en su escritorio para el telfono en tu bolsillo. El RSS es un grupo de canales web utiliza para publicar el contenido frecuentemente actualizado, como las entradas, titulares de noticias, podcasts, o el entretenimiento. Otra forma de pensar de alguien que RSS es la entrega de las noticias diarias directamente a usted, la nica diferencia es que no hay lmite a la cantidad de alimentos puede suscribirse a. Lo que sigue es un vistazo a la aplicacin de RSS que usted desarrollar y cmo va a funcionar, como se muestra en la Figura 11.5.

273

FIGURA 11.5 El lector de RSS con un sistema de distribucin de PHP

La aplicacin est construido con componentes prediseados que ya han sido colocados en el archivo de partida. Los tres elementos principales que interesan son la lista, TextArea, y componentes Enviar. Cada uno de estos componentes se le ha asignado un nombre de instancia que se hace referencia en el cdigo ActionScript.

Importar clases
La mayora de las clases que se incluyen con Flash no requieren volver a importarlos. Sin embargo, hay algunas excepciones, una de las cuales es la clase ListEvent.
import fl.events.ListEvent;

Cuando el evento es importado puede asignar las variables de la aplicacin de RSS. La nica variable global que se necesita para esta aplicacin es la referencia de PHP.
var phpPath:String = http://locahost/ch10/rssReader/; var phpFile:String = phpPath + rss.php;

274

Cargar el PHP
La funcin utilizada para cargar el PHP, que devuelve XML es muy similar a los ejemplos anteriores. Establecer un URLRequest, un URLLoader, y adjuntar un controlador al evento COMPLETE.
function loadFeeds():void { var urlRequest:URLRequest = new URLRequest(phpFile); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, feedHandler); urlLoader.load(urlRequest); }

La funcin feedHandler() es responsable de trabajar con la respuesta de la llamada de PHP. En esta aplicacin, el PHP devuelve XML, que se utiliza para rellenar el componente List. El RSS de las entradas se colocan en el componente de la lista utilizando la funcin addItem(). Esta funcin feedHandler acepta un objeto como argumento. El objeto necesita al menos una etiqueta de propiedad con el fin de aadir el elemento, pero por lo general, se agrega la propiedad de datos, as.
function feedHandler(e:Event):void { ... for each(var item in xml..entry) { topicsList.addItem({label:item..name, data:item..desc}); topicsList.addEventListener(ListEvent.ITEM_CLICK, listClickhandler); } }

Los elementos de la lista de carga el cuerpo del texto cuando se hace clic, de modo de crear la funcin que se encarga de este evento. El ListEvent se pasa desde el evento ITEM_CLICK, que contiene la propiedad del elemento. La propiedad es el punto donde se almacena la propiedad de datos. En este ejemplo, que los datos es el rgano de RSS, por lo que simplemente puede pasar que los datos directamente a la TextArea feedBody.
function listClickhandler(e:ListEvent):void { feedBody.htmlText = e.item.data; }

La ltima funcin en la aplicacin de RSS es el controlador de botn, que es llamado cada vez que el componente Button se hace clic. Esta funcin simplemente hace una llamada a la funcin loadFeeds.
function submitHandler(e:Event):void { loadFeeds(); }

Como puede ver, el ActionScript es bastante simple para este ejemplo. XML realmente acelera el desarrollo de aplicaciones web-enabled, y este es un ejemplo perfecto de ello.

275

Aqu est el cdigo de la aplicacin de RSS en su totalidad por referencia:


import fl.events.ListEvent; var phpPath:String = http://localhost/ch10/rssReader/; var phpFile:String = phpPath + rss.php; function loadFeeds():void { var urlRequest:URLRequest = new URLRequest(phpFile); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, feedHandler); urlLoader.load(urlRequest); } function feedHandler(e:Event):void { var loader:URLLoader = URLLoader(e.target); var xml:XML = new XML(loader.data); for each(var item in xml..entry) { topicsList.addItem({label:item..name, data:item..desc}); topicsList.addEventListener(ListEvent.ITEM_CLICK, listClickhandler); } } function listClickhandler(e:ListEvent):void { feedBody.htmlText = e.item.data; } function submitHandler(e:Event):void { loadFeeds(); } loadBtn.addEventListener(MouseEvent.CLICK, submitHandler);

Con la porcin de ActionScript del lector RSS terminado usted puede centrarse en el cdigo PHP. La conexin RSS que est siendo utilizado para este ejemplo, como se muestra en la figura 11.6, viene de Adobe y son las ltimas noticias e informacin sobre Adobe AIR.
<?php $rssFeed = http://weblogs.macromedia.com/mxna/xml/rss.cfm? . query=bySmartCategory&languages=1&smartCategoryId=28& . smartCategoryKey=F2DFD9E0-FBB6-4C2D-2AFE6AFD941FDDB1; ?>

276

FIGURA 11.6 Cmo se ve la fuente RSS en su navegador web, suponiendo que usted no tiene instalado un lector RSS

La variable $feed es un marcador de posicin para el XML generado que se construye una vez que la fuente RSS se carga correctamente. El RSS es leda en el uso de la biblioteca SimpleXML que se entrega con PHP 5. Esta no es la nica biblioteca de XML de anlisis disponibles para PHP, pero es el ms eficiente y ms fcil de usar.
$feed = ; $xml = simplexml_load_file($rssFeed);

En este punto, usted puede comenzar a construir el bucle foreach, que es responsable de construir el documento XML se reintegrar al ActionScript.
$feed .= <items>\n; foreach($xml->item as $item) { $desc = $item->description; $desc = preg_replace(/[...\[\]]/, , $desc); $feed .= <entry>\n; $feed .= <name> . $item->title . </name>\n; $feed .= <desc><![CDATA[ . $desc .]]></desc>\n;

277

$feed .= </entry>\n; } $feed .= </items>\n;

El ciclo de tomar cada elemento del XML y los lazos a travs de los nodos de elemento. Usted notar que la descripcin no est asignado a una variable $desc. La razn de esto es porque la descripcin tiene que ser limpiado antes de devolverlo. El proceso de limpieza se realiza mediante preg_replace(), una funcin de expresin regular que elimina los caracteres sin escapar e impropio.
$desc = preg_replace( /[...\[\]]/ , , $desc);

NOTA Este libro no ofrece un tutorial en profundidad sobre las expresiones regulares (regex), sin embargo, hay una gua muy bueno encontrar en http://php.net/manual/en/reference.pcre.pattern.syntax.php. La ltima parte del cdigo PHP establece el tipo de cabecera y los resultados del XML en ActionScript.
header(Content-type: text/xml); print <?xml version=1.0 encoding=UTF-8?> .\n; print $feed;

Usted notar que la requerida de PHP para generar la aplicacin de RSS no es en profundidad, mucho de eso se debe a SimpleXML ser tan gran biblioteca. Este ejemplo podra extenderse a tirar ms de la informacin contenida en el feed RSS. Por ejemplo, puede mostrar el ttulo de la entrada, la fecha, e incluso la direccin donde se encuentra la entrada original. Por ltimo, aqu est la referencia completa para PHP:
<?php $rssFeed = http://weblogs.macromedia.com/mxna/xml/rss.cfm? . query=bySmartCategory&languages=1&smartCategoryId=28& . smartCategoryKey=F2DFD9E0-FBB6-4C2D-2AFE6AFD941FDDB1; $feed = ; $xml = simplexml_load_file($rssFeed); $feed .= <items>\n; foreach($xml->item as $item) { $desc = $item->description; $desc = preg_replace(/[...\[\]]/, , $desc); $feed $feed $feed $feed } .= .= .= .= <entry>\n; <name> . $item->title . </name>\n; <desc><![CDATA[ . $desc .]]></desc>\n; </entry>\n;

$feed .= </items>\n; header(Content-type: text/xml); print <?xml version=1.0 encoding=UTF-8?> .\n;

278

print $feed; ?>

Uso de PHP, Flash, y MySQL para desarrollar un banner dinmico


Muchos de los diseadores utilizan Flash para crear anuncios para ser colocados en lnea. Estos van desde los anuncios de mini dentro de una pgina de anuncios de toda regla que se la pgina. El formato de anuncio ms comn es el anuncio de la bandera, que normalmente es 468 60, como se muestra en la Figura 11.7, los pxeles de tamao. Estas banderas son generalmente secuencias de comandos para cargar un sitio web al hacer clic. Qu pasa con el seguimiento de los clics? An mejor, por qu no crear un banner dinmico que carga un anuncio al azar y no requiere que el propietario de actualizar algo ms que un archivo XML y directorio de la imagen? Esta seccin ser el proceso de desarrollo de un banner dinmico en Flash. A continuacin, aadir el seguimiento a este banner utilizando slo unas pocas lneas de PHP. Este ejemplo no requiere los archivos de partida, porque cualquier imagen de trabajo para la bandera, y la aplicacin va a ser desarrollado 100 por ciento en el cdigo ActionScript. FIGURA 11.7 Ejemplo de la aplicacin de anuncios de banner en accin

La primera parte del cdigo es responsable de la inicializacin de las variables utilizadas en la aplicacin.
var phpPath:String = http://localhost/ch10/bannerAd/; var phpFile:String = phpPath + ads.php; var imageHolder:MovieClip; var cacheBuster:String = ?cb=1; var adURL:String;

Una vez que las variables se definen usted puede construir las funciones. El primero es responsable de la colocacin del titular de la imagen, aadiendo el controlador de eventos, y llamando a la funcin loadImage.
imageHolder = new MovieClip(); imageHolder.x = 0; imageHolder.y = 0; imageHolder.addEventListener(MouseEvent.CLICK, loadAdURL); imageHolder.buttonMode = true; addChild(imageHolder); cacheBuster = getCacheBuster(); loadImage();

279

La funcin loadImage() es responsable de cargar el archivo XML que contiene los datos de anuncios de banner. A continuacin, asigne una funcin de controlador que se llama despus de que el XML es completamente cargado.
function loadImage():void { var urlRequest:URLRequest = new URLRequest(phpFile + getCacheBuster()); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, imageLoaded); urlLoader.load(urlRequest); }

Despus de que el XML es a plena carga, se hace una llamada a imageLoaded. Esta funcin es responsable de cargar los datos XML, sacando la informacin de la imagen, y la carga de la imagen. Lo que sigue es un vistazo a cada parte, de una en una. El siguiente es el proceso de carga de los datos y crear el objeto XML:
function imageLoaded(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); ...

La siguiente parte de esta funcin es ayudar a introducir los datos de imagen y asignarle a las variables locales:
var var var var url:String = xml..banner.attribute(url); name:String = xml..banner.attribute(name); image:String = xml..banner.attribute(src); directory:String = xml..banner.attribute(dir);

adURL = url;

El ltimo paso en esta funcin es la de cargar la imagen y adjuntarlo a la lista de visualizacin:


var loader:Loader = new Loader(); loader.load(new URLRequest(directory + image)); imageHolder.addChild(loader);

Abrir una ventana del navegador


El proceso de cargar y mostrar el anuncio ha finalizado. El siguiente paso es asignar el controlador de eventos que se llama cuando se hace clic en el banner. Utilice navigateToURL() para abrir una nueva ventana del navegador y vaya a la pgina de anuncios predeterminados.
function loadAdURL(e:MouseEvent):void { navigateToURL(new URLRequest(adURL)); }

La ltima tarea del ActionScript es llamar a la funcin init() y comenzar el proceso.


init();

280

Aqu est el cdigo ActionScript para la referencia completa:


var phpPath:String = http://localhost/ch10/bannerAd/; var phpFile:String = phpPath + ads.php; var imageHolder:MovieClip; var cacheBuster:String = ?cb=1; var adURL:String; function init() { imageHolder = new MovieClip(); imageHolder.x = 0; imageHolder.y = 0; imageHolder.addEventListener(MouseEvent.CLICK, loadAdURL); imageHolder.buttonMode = true; addChild(imageHolder); cacheBuster = getCacheBuster(); loadImage(); } function loadImage():void { var urlRequest:URLRequest = new URLRequest(phpFile + getCacheBuster()); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, imageLoaded); urlLoader.load(urlRequest); } function imageLoaded(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); var var var var url:String = xml..banner.attribute(url); name:String = xml..banner.attribute(name); image:String = xml..banner.attribute(src); directory:String = xml..banner.attribute(dir);

adURL = url; var loader:Loader = new Loader(); loader.load(new URLRequest(directory + image)); imageHolder.addChild(loader); } function loadAdURL(e:MouseEvent):void { navigateToURL(new URLRequest(adURL)); } function getCacheBuster():String { var date:Date = new Date(); cacheBuster = ?cb= + date.getTime(); return cacheBuster; }

281

init();

Desarrollo del PHP


En este punto, el cdigo ActionScript est completo y usted puede centrarse en el PHP. El archivo ads.php se compone de dos variables globales y una funcin. La primera variable global es el directorio donde se encuentran las imgenes del anuncio. La segunda variable es la matriz que contiene los datos de los anuncios.
$adImageDir = ./adImages/; $bannerAds = array( array(Banner Name, randomimage1.jpg, http://localhost/), array(Banner Name, randomimage2.jpg, http://localhost/), );

La funcin getBannerAd asigna las dos variables como globales para que sean accesibles dentro de esta funcin.

Seleccin aleatoria
El banner solo se elige de la matriz mediante el uso de una clave aleatoria. Esta clave aleatoria se genera mediante la funcin mt_rand() y la longitud de la matriz $bannerAds ($anunciosdebanner).
$random = (mt_rand() % count($bannerAds));

El archivo XML es construido para dar salida una sola lnea de datos de imgenes que ActionScript procesa.
function getBannerAd() { ... $xml .= <banner id=\ . 0 . \ dir=\ . $adImageDir . \ url=\ . $bannerAds[$random][2] . \ name=\ . $bannerAds[$random][0] . \ src=\ . $bannerAds[$random][1] . \ />\n; $xml .= </banners>; return $xml; } print getBannerAd();

El PHP responsable de cargar el anuncio de la bandera ya est completa. Como puede ver, la cantidad de cdigo necesario para crear esta aplicacin es bastante pequeo. Este ejemplo bsico se puede ampliar fcilmente para agregar en categoras o imgenes, incluso varios que la transicin de la pelcula se sienta en un navegador.

282

Aqu est el cdigo de referencia para completar.


<?php $adImageDir = ./adImages/; $bannerAds = array( array(Banner 1, randomimage1.jpg, http://localhost/), array(Banner 2, randomimage2.jpg, http://localhost/), array(Banner 3, randomimage3.jpg, http://localhost/), array(Banner 4, randomimage4.jpg, http://localhost/), array(Banner 5, randomimage5.jpg, http://localhost/), array(Banner 6, randomimage6.jpg, http://localhost/), array(Banner 7, randomimage7.jpg, http://localhost/), array(Banner 8, randomimage8.jpg, http://localhost/) ); function getBannerAd() { global $bannerAds, $adImageDir; $xml = <banners>\n; $random = (mt_rand() % count($bannerAds)); $xml .= <banner id=\ . 0 . \ dir=\ . $adImageDir . \ url=\ . $bannerAds[$random][2] . \ name=\ . $bannerAds[$random][0] . \ src=\ . $bannerAds[$random][1] . \ />\n; $xml .= </banners>; return $xml; } print getBannerAd(); ?>

Ahora ha creado con xito un PHP totalmente funcional y de anuncios de banner Flash espectador. Los conceptos aprendidos en esta seccin se pueden adaptar fcilmente a otros proyectos. De hecho, le animamos a ampliar el ejemplo y crear una aplicacin ms robusta. Esta aplicacin tambin se puede simplificar al cargar un archivo XML esttico, sin embargo, esto es ms difcil de actualizar y no ofrece el mismo nivel de personalizacin. La aplicacin como PHP significa que usted puede adjuntar una capa de base de datos MySQL a ella y devolver los datos de la imagen de una base de datos, lo ms probable es que se actualizar de otra fuente.

Uso de PHP para desarrollar un contador de visitas


Un contador de visitas (hit counter) es usada para determinar cuntos visitantes van a un sitio. En general, el contador es visible para los visitantes en forma de texto o un grfico. Algunos sitios utilizan otras formas de control que no estn disponibles al pblico, para fines de seguimiento de estadsticas. El sorteo de importantes y las caractersticas de un golpe contra alguna representacin grfica. 283

Puede utilizar un archivo de texto plano o base de datos SQL para almacenar los datos del contador de visitas. Este ejemplo utiliza una base de datos SQL para un par de razones: la velocidad (la base de datos puede procesar la informacin mucho ms rpido) y el archivo se refiere a permiso. En casos raros, un servidor puede colocar un bloqueo en un archivo, lo que significa que ese archivo no se puede abrir. Esto forzara el contador de visitas a fallar y no es el resultado ideal que se busca.

Contador de visita lgico


La lgica detrs de el contador de visitas es bastante sencillo. En primer lugar, realizar una llamada a la base de datos para capturar el recuento de visitas actual y se incrementar por 1.
$oldCount = $row[amount]; $newCount = $oldCount + 1;

Cuando tenga el nuevo valor, enviarlo de nuevo en la tabla de SQL. Para ello, la actualizacin de la fila existente y el establecimiento de la columna de importe que el valor de la variable $newCount.
mysql_query(UPDATE counter SET amount= . $newCount);

El ltimo paso en el cdigo PHP es devolver el valor nuevo a Flash para que se muestre.
return resp= . $newCount;

Eso es todo el PHP las necesidades de la lgica de contador de visitas. El siguiente es el archivo completo.
<?php include dbConn.php; $query = SELECT amount from counter; $result = mysql_query($query); $row = mysql_fetch_array($result); $oldCount = $row[amount]; $newCount = $oldCount + 1; mysql_query(UPDATE counter SET amount= . $newCount); return resp= . $newCount; ?>

Desarrollo de contador de visitas en Flash


Con el PHP hecho, usted puede moverse sobre el desarrollo de Flash, que consiste en una aplicacin de todos los ActionScript. El contador tiene que llamar primero al archivo PHP, que sirve a dos propsitos. La primera es llamar al archivo PHP a la carga y el incremento de la cuenta. El segundo objetivo es devolver el nuevo valor, que se pasa a un campo de texto dinmico. La primera parte consiste en asignar la variable de phpfile, que es una referencia para el contador de archivo que se encuentra en el servidor. 284

var phpFile:String = http://localhost/ch10/hitCounter/;

La primera funcin es la de construir loadHitCounter(), que es responsable de llamar al servidor y asignar el manejador de la respuesta.
function loadHitCounter():void { var urlRequest:URLRequest = new URLRequest(phpFile); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, handleServerResp); urlLoader.load(urlRequest); }

Despus que la respuesta se ha cargado, el handleServerResp() se llama pasa a lo largo de los datos cargados. Esta informacin es posteriormente enviada a la clase URLVariables para sacar la propiedad resp. Esta propiedad es donde se encuentra la cuenta actual.
function handleServerResp(e:Event):void { var loader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(loader.data); var count:uint = variables.resp; ... }

El recuento es finalmente colocado en el campo de texto dinmico, que no tiene el formato de este ejemplo, pero usted puede agregar fcilmente esto por su cuenta.
var txt:TextField = new TextField(); txt.selectable = false; txt.width = 200; txt.text = count + visitors; }

La ltima lnea absoluta de cdigo en el ActionScript es la llamada a la funcin loadHitCounter, que comienza todo de encima.
loadHitCounter();

Resumen
En este captulo usted aprendi los elementos de desarrollo y diseo de una aplicacin. Luego, una vez entendido como la aplicacin debe ser construido se construy un cliente de chat usando PHP y Flash. En la siguiente seccin usted aprendi a desarrollar una galera de fotos basada en Flash con la categora dinmica y soporte de imgenes con XML. La ltima seccin se dedic al desarrollo de otras aplicaciones que utilicen Flash, PHP y MySQL para comprender mejor los conceptos. Usted debe ahora tener una buena idea de cmo construir aplicaciones robustas que se aprovechan de los datos dinmicos para la actualizacin y funcionalidad.

285

Capitulo 12 Desarrollo de las aplicaciones del mundo real


En este captulo, aprender acerca de cmo desarrollar aplicaciones completas de la tierra para arriba. La atencin se centra en la clase basado en los diseos que puede actualizar fcilmente ms adelante. El aspecto principal de este captulo ser cmo utilizar Flash y PHP para desarrollar estas aplicaciones. Este captulo est dividido en cuatro aplicaciones: un carro de PayPal, carrito de la compra personalizado, buscador de Amazon, Flickr y un buscador de galera de fotos. Cada seccin se inicia con la solicitud de cdigo PHP y contina con el ActionScript. Construccin de una aplicacin como esta hace que sea ms fcil de probar como se construye y reduce la cantidad de tiempo en el proceso de desarrollo. Los ejemplos en este captulo son construidos con clases personalizadas, que se tratan en el captulo 9. Si usted no ha ledo el captulo, sin embargo, os recomiendo que lo hagan antes de continuar en este captulo. Por supuesto, si usted ha utilizado las clases en el pasado, entonces por todos los medios continuar en.

Entender las aplicaciones del mundo real


Una aplicacin real es uno que ha sido diseado, probado y desplegado con la intencin de que los otros usuarios podrn utilizarlo. Al igual que en una aplicacin real que habr algunos sectores que utilizan una de tercero Application Programming Interface (API) para la carga y bsqueda de datos. Cuando se trabaja con un API es comn encontrar una lista de los mtodos y las llamadas permitido, como se muestra en la Figura 12.1.

286

FIGURA 12.1 La lista de API de Flickr, que muestra que los mtodos y propiedades estn pblicamente disponibles

Una API abierta no siempre significa que cualquiera puede tener acceso. Por ejemplo, en Flickr que estn obligados a pasar a lo largo de una clave que autoriza a una solicitud. Esto no es slo para bloquear ciertos aspectos de una API, pero tambin se detiene el correo basura y respuestas automticas que podra resultar en la API de ser discapacitado.

El Amazon y ejemplos de Flickr en este captulo utilizan las API, pero la primera cosa a mirar son las normas y requisitos para la API que est utilizando.

Uso de PayPal en Flash


Trabajar con PayPal en Flash es similar al HTML, porque PayPal ofrece un conjunto comn de conexin y capacidad de acceso. Sin embargo, una ventaja para desarrollar la solucin en Flash es la capacidad para mejorar la experiencia del usuario, Flash ofrece una comunicacin ms fluida con otros servicios, ya que no es necesario recargar toda la pgina o abrir las ventanas adicionales.

287

Registrarse en PayPal Premier


Antes de comenzar a escribir el cdigo para interactuar con PayPal, crear una cuenta PayPal Premier, que puede utilizar para el seguimiento de sus ventas y autenticar sus peticiones. Slo toma unos minutos para crear una cuenta, y no cuesta nada. Para configurar una cuenta PayPal Premier, siga estos pasos: 1. En el explorador Web, vaya a www.paypal.com. Seleccione Iniciar - Tipos de cuenta. 2. En la pgina Tipos de cuenta PayPal, haga clic en Regstrese ahora. Seleccione la cuenta de la pgina que aparezca Tipo. 3. Bajo Cuenta Premier, haga clic en Iniciar ahora. En Crear un formulario de cuenta PayPal que aparece (ver Figura 12.2), escriba la informacin solicitada. 4. Despus de enviar su formulario, usted recibi un correo electrnico de confirmacin. Usted debe responder al e-mail para activar su cuenta. 5. Entra y prueba de su nueva cuenta. NOTA Recuerde, usted debe activar la cuenta a travs de e-mail antes de que usted puede usar. FIGURA 12.2 La pantalla de registro de la cuenta de PayPal

288

En este punto, usted debe tener un inicio de sesin de trabajo de PayPal. Uso de la cuenta que acaba de registrar para que usted puede acceder a PayPal y empiece a configurar los detalles en cuenta. NOTA El sistema requiere un nombre de usuario y contrasea para generar contenido. Sin embargo, con el fin de presentar una solicitud de datos slo tiene que proporcionar su direccin de correo electrnico. Esto se utiliza para garantizar la solicitud es correcta. En ningn momento debe colocar la contrasea de PayPal en esta forma. Haga clic en el enlace de vendedor (Merchant) en la parte superior de la pgina para visitar la pgina Compre Ahora generador. Las otras opciones en la primera pantalla no son importantes en este punto. Por ltimo, haga clic en Crear botn, que se trasladar a la siguiente pgina, donde el cdigo HTML es que el botn Comprar ahora. Copia el cdigo HTML que es generado por PayPal para los botones Comprar ahora. Este cdigo se utiliza para construir el ejemplo de Flash. Lo que sigue es el cdigo de ejemplo copia de sistema generador de PayPal comerciante que usted acaba de visitar.
<form action=https://www.paypal.com/cgi-bin/webscr method=post> <input type=hidden name=cmd value=_xclick> <input type=hidden name=business value={email_address}> <input type=hidden name=item_name value={item_name}> <input type=hidden name=item_number value={item_number}> <input type=hidden name=amount value={item_amount}> <input type=hidden name=currency_code value=USD> <input type=hidden name=weight value=1> <input type=hidden name=weight_unit value=lbs> <input type=hidden name=lc value=US> </form>

NOTA Asegrese de que usted no tiene botn de encriptacin activada, ello hace que sea imposible coger la informacin necesaria para construir el botn de Flash. Como puede ver, el cdigo generado por el formulario HTML tiene todas las variables necesarias que se utilizarn para crear un botn de Flash. El siguiente paso es construir el cdigo de Flash que har que el botn Comprar ahora para la aplicacin. Aqu est el cdigo ActionScript necesario para la interfaz con PayPal, como se puede ver el cdigo es muy similar al cdigo HTML existente que ha generado en la pgina de PayPal. La primera parte es para centrarse en las variables de URL que se encargar de construir los datos POST. Estos datos POST se pasa a lo largo de PayPal cuando el usuario hace clic en Comprar ahora.
// Paypal variables var pp_cmd:String = _xclick; var pp_business:String = store@example.com; var pp_item_name:String = sample product; var pp_item_number:String = 0001; var pp_amount:String = 24.99; var pp_currency:String = USD; var pp_weight:String = 1; var pp_weight_unit:String = lbs; var pp_location:String = US;

289

A pesar de que se puede ver claramente los nmeros en el bloque de variables, todos los parmetros se definen como cadenas para ser compatible con el equivalente de HTML. El siguiente tema es el de establecer la direccin, que se usa para la interfaz con PayPal. Esta es esencialmente la misma variable como la accin, que se encuentra en el cdigo HTML original.
var paypalURL:String = https://www.paypal.com/cgi-bin/webscr;

Cuando se establecen las variables y los datos de PayPal, usted puede crear el cdigo que se llama cuando el se hace clic en el botn Comprar ahora. Esta es la funcin que se utiliza para llamar a PayPal. Este mtodo no requiere que las variables personalizadas a pasar porque ellos se definen fuera de la funcin. La definicin de una variable fuera de una funcin es de mbito de lo que cualquier funcin tiene acceso a ellos. Si esta variable se define dentro de la funcin que slo sera visible a la funcin en la que se define. La excepcin es, por supuesto, si la funcin es global o de la variable se devuelve desde la funcin creada.
function callPaypal(e:MouseEvent):void { var urlVariables:URLVariables = new URLVariables(); urlVariables.cmd = pp_cmd; urlVariables.business = pp_business; urlVariables.item_name = pp_item_name; urlVariables.item_number = pp_item_number; urlVariables.amount = pp_amount; urlVariables.currency_code = pp_currency; urlVariables.weight = pp_weight; urlVariables.weight_unit = pp_weight_unit; urlVariables.lc = pp_location; var urlRequest:URLRequest = new URLRequest(paypalURL); urlRequest.method = URLRequestMethod.POST; urlRequest.data = urlVariables; sendToURL(urlRequest); }

Uso de POST data


El mtodo de los datos enviados a PayPal est en formato POST. Esto significa que las variables se incluyen en la convocatoria, pero no en la direccin como se ve con GET. Utilizando el formato POST tiene algunas ventajas, la primera es la direccin est limpio y en realidad no puede ser alterado. El segundo es el nivel adicional de seguridad al pasar moderadamente sensibles a los datos del servidor. Si usted necesita enviar datos altamente sensibles, como la facturacin o tarjeta de crdito, es importante que usted utiliza una llamada de HTTPS. La razn de ello es POST en realidad slo se convierte en una de Seguridad por oscuridad y no es el resultado ms seguro. Este ejemplo hace uso de la variable POST constante que se encuentra en la URLRequestMethod. Por supuesto, usted puede simplemente utilizar la cadena literal POST porque esto es lo que realmente tiene la constante de una variable.
urlRequest.method = URLRequestMethod.POST;

290

Uso de sendToURL
En los ejemplos anteriores, usted puede haber notado el uso de navigateToURL, que pide una URL y ofrece la capacidad de enviar datos a travs de GET de la URL. En este ejemplo se pide que los datos POST, por lo que el uso de sendToURL es una mejor opcin. Es importante entender que el mtodo sendToURL enva la solicitud al servidor, pero ignora cualquier respuesta que se devuelve.
sendToURL(urlRequest);

Establecer una comunicacin de communication


El ltimo paso es asignar a la accin del botn que se adjunta al MovieClip Compre Ahora. Simplemente coloque un MovieClip en el escenario y le dan el nombre de instancia buyNowBtn. Si decide tener ms de un botn, le recomiendo una estructura de clases que transfiere los datos de PayPal, para minimizar la cantidad de cdigo necesario. La funcin callPaypal se inserta en el botn mediante un detector de eventos. El evento Click es utilizada, que se llama cuando el usuario hace clic en el botn.
buyNowBtn.buttonMode = true; byNowBtn.useHandCursor = true; buyNowBtn.addEventListener(MouseEvent.CLICK, callPaypal);

El ltimo paso es poner todo el cdigo y probarlo juntos.


// Paypal variables var pp_cmd:String = _xclick; var pp_business:String = store@example.com; var pp_item_name:String = sample product; var pp_item_number:String = 0001; var pp_amount:String = 24.99; var pp_currency:String = USD; var pp_weight:String = 1; var pp_weight_unit:String = lbs; var pp_location:String = US; var paypalURL:String = https://www.paypal.com/cgi-bin/webscr; function callPaypal(e:MouseEvent):void { var urlVariables:URLVariables = new URLVariables(); urlVariables.cmd = pp_cmd; urlVariables.business = pp_business; urlVariables.item_name = pp_item_name; urlVariables.item_number = pp_item_number; urlVariables.amount = pp_amount; urlVariables.currency_code = pp_currency; urlVariables.weight = pp_weight; urlVariables.weight_unit = pp_weight_unit; urlVariables.lc = pp_location; var urlRequest:URLRequest = new URLRequest(paypalURL); urlRequest.method = URLRequestMethod.POST; urlRequest.data = urlVariables; sendToURL(urlRequest);

291

} buyNowBtn.buttonMode = true; byNowBtn.useHandCursor = true; buyNowBtn.addEventListener(MouseEvent.CLICK, callPaypal);

En este punto, usted tiene un ejemplo de trabajo de un botn Comprar ahora de PayPal. Es slo una cuestin de agregar la informacin de elementos especficos. Tambin puede crear una clase para que este proceso sea ms fcil la creacin, como se mencion anteriormente. PayPal tambin ofrece un carrito de la compra un sistema basado en el que puede permitir al usuario elegir varios elementos y las cantidades. Este elemento de informacin se almacena en el mismo formato de los datos bsicos de POST, pero mantiene un registro de cada elemento individual. Ya sea que usted utilice la opcin de compra o en un elemento de solucin Compre Ahora slo tiene que enviar una solicitud. Este ejemplo en realidad no requiere el uso de cualquier PHP. Usted puede extender el ejemplo en primer lugar de enviar la informacin a fin de PHP y el almacenamiento de las compras para su orden propio sistema. PayPal, incluso ofrece a los desarrolladores de soluciones para conectar directamente a su sistema de pago y confirmacin de si el pedido pasa a travs de. Este servicio est fuera del alcance del libro, pero PayPal proporciona la documentacin adecuada para empezar.

Uso de Flash y PHP para construir una cesta de compras


La seccin anterior se centr en la construccin de un botn Comprar ahora en Flash utilizando PayPal como sistema de pago. Ese sistema funciona bastante bien, pero realmente no ofrece al diseador el control total del carro, el pago, y los componentes de almacenamiento. La mayora de las veces cuando usted decide construir una solucin personalizada que acabar con mejores resultados. Esto no quiere decir que todo el mundo puede desarrollar la interfaz de PayPal siguiente, pero cunto de ese sitio se utilizan? La construccin de una solucin personalizada es donde se llega a centrarse en las caractersticas que va a utilizar y excluir los que no se. Esta cesta de la compra se divide en cuatro partes: diseo, MySQL, PHP, y el ActionScript que rene todo.

Diseo de la cesta de compras


La aplicacin de carrito de la compra ser construido usando clases para reutilizacin. Esto tambin hace que sea ms fcil de modificar ms adelante. CROSS--REF Para obtener ms informacin sobre las clases de ActionScript, vase el captulo 9.

Desarrollar la clase StoreItem


La primera porcin de cdigo que se centrar en los elementos individuales de productos que se mostrar a la izquierda de la cesta de la compra. Los artculos de la tienda MovieClip ser aadido de forma dinmica al escenario y se le asignar una clase personalizada StoreItem. La clase es responsable de asignar las variables de la tienda tema y mostrar los valores necesarios. 292

Al igual que el captulo de clase, estas clases se componen de independiente paquetes para la simplicidad, lo que no hay necesidad de proporcionar una estructura de paquetes La primera parte del cdigo de las importaciones de las clases MovieClip y TextField. Esta clase personalizada se extiende la clase MovieClip y TextField necesita ser cargado, porque hay cuadros de texto en el movieclip.
import flash.display.MovieClip; import flash.text.TextField;

Hay cinco variables privadas que se utilizan para sostener el elemento de datos especficos. Estos datos son luego compartidos con el carrito de la compra, pero por ahora los datos slo tiene que ser almacenado.
private private private private private var var var var var albumName:String; albumDesc:String; albumThumb:String; albumPrice:String; storeItemID:uint;

El mtodo de StoreItem se deja vaca y en realidad no es necesario porque el compilador de ActionScript lo colocar automticamente, pero para la integridad es una buena idea tenerlo.
function StoreItem() {}

El mtodo personalizado primero es responsable de guardar los datos de posicin a las variables privadas que se acaba de definir. Los cinco argumentos definidos en esta funcin se pasan de la persona que llama y se mantendr los datos de elemento que se utiliza ms tarde.
public function setStoreData( id:uint, n:String, d:String, t:String, p:String):void { storeItemID = id; albumName = n; albumDesc = d; albumThumb = t; albumPrice = p; ... }

Los dos cuadros de texto que contienen el nombre y la descripcin de cada elemento son la ltima parte de esta clase de encargo. Los datos que se aprob se asigna a cada cuadro de texto. Normalmente, es probable que verificar si los datos vlidos, pero debido a que se est controlando el PHP que se devuelve puede estar seguro de los datos ser vlido.
nameTxt.text = albumName; descTxt.text = albumDesc;

El mtodo final de esta clase se utiliza para enviar los datos a quien llama. La accin de retorno devuelve un objeto personalizado que se llena con los datos del elemento en el mtodo anterior.
public function getItem():Object {

293

return { target:this, id:storeItemID, name:albumName, price:albumPrice }; }

El mtodo anterior tiene un tipo especial de retorno definido. El valor devuelto es un objeto en lnea que se utiliza para simplificar el cdigo mediante la exclusin de los nombres de variables innecesarias. Cada uno de los tipos: Array, Object, y String tienen una forma abreviada para definirlos. Por ejemplo, el tipo de objeto puede ser definido simplemente con:
var sampleObj:Object = {name:value};

La tabla 12.1 muestra el tipo y el equivalente a la abreviatura de ella. Usando los valores de taquigrafa puede ahorrar tiempo de desarrollo, ya que tiene que escribir menos. ADVERTENCIA La forma abreviada puede crear problemas, porque se crea un "dbil", escribi objeto. Por lo tanto, no pueden beneficiarse de la comprobacin de tipos en tiempo de compilacin. Usted puede acceder al objeto dinmico mal y no lo sabremos hasta que tiempo de ejecucin. Esto significa que usted debe tener cuidado al crear sus propiedades y las variables en taquigrafa. TABLA 12.1

Tipos de Taquigrafa y Equivalentes


Array Object String new Array() [] new Object() {} new String()

Ambos mtodos de aplicacin que se crearon son pblicos porque son llamados desde clases externas. Tambin puede crear una funcin intermedia que ofrece un mayor nivel de seguridad, que se encarga de llamar a los mtodos privados. Con la clase StoreItem construido, puede pasar a la ShoppingCartItem, que se adjunta a la partida cesta de la compra de MovieClip.

Desarrollar la clase ShoppingCartItem


Esta clase es bsicamente responsable del mantenimiento de la identificacin del tema, que ser utilizado en la clase ShoppingCart. Al igual que la clase anterior, ste tambin tiene que importar la clase MovieClip y TextField para alojar los elementos situados en este MovieClip.
package { import flash.display.MovieClip; import flash.text.TextField; public class ShoppingCartItem extends MovieClip { private var cartItemID:uint;

294

function ShoppingCartItem() { } public function getID():uint { return cartItemID; } public function setID(id:uint):void { cartItemID = id; } } }

La ltima parte de esta clase es responsable de obtener y establecer la cartItemID. Este valor se utiliza para vincular los productos con el carro de artculos. La clase de ActionScript personalizado ltima es la ShoppingCart. Esta clase es bastante grande, por lo que se rompa en pedazos para entenderlo mejor. El mejor lugar para empezar es a primera mirada a un esqueleto de clase, que muestra los mtodos que se utilizan en esta aplicacin. A menudo construir este primer esqueleto, que puede doblar como un esquema.
package { public class ShoppingCart extends MovieClip { function ShoppingCart() {} public function addProduct(product:Object):void {} public function removeProduct(e:MouseEvent):void {} public function updateList():void {} public function updateTotal():void {} public function checkout():void {} public function setGatewayURL(url:String):void {} private function round2D(n:Number):Number {} } }

El lugar ms lgico para empezar en esta clase es mediante la asignacin de las importaciones de clase que se necesitarn.
import import import import flash.display.MovieClip; flash.text.TextField; flash.events.MouseEvent; flash.net.*;

Las propiedades de esta clase consistir en todas las variables privadas para que no se puede acceder por otras clases.
private var cartItemCount:uint = 0; private var cartContents:Array; private var cartItemHeight:uint = 20; private var lineSpacing:uint = 30; private var gateway:String;

295

El constructor es responsable de la creacin en el botn Checkout y la inicializacin de la matriz de punto de compra.


function ShoppingCart() { cartContents = new Array(); cont = cartContents; checkoutBtn.addEventListener(MouseEvent.CLICK, function():void { var xml:String = <?xml version=1.0 ?>\n\r; xml += <products total=\ + totalTxt.text + \>; for(var i in cont) { xml += <product>; xml += \t<quantity> + cont[i].cartItem.quantityTxt.text + </quantity>; xml xml xml } xml += \t<name> + cont[i].name + </name>; += \t<price> + cont[i].price + </price>; += </product>; += </products>;

var variables:URLVariables = new URLVariables(); variables.action = checkout; variables.xml = xml; var urlRequest:URLRequest = new URLRequest(gateway); urlRequest.data = variables; urlRequest.method = GET; navigateToURL(urlRequest); }) }

El contenido del botn Checkout puede parecer abrumador, pero se trata simplemente de construir un documento XML personalizado que se pasarn a la PHP. La variable de XML comienza por asignar el cdigo XML apropiado partida. Sin esta partida, PHP asumira el expediente est incompleto y no cargar.
var xml:String = <?xml version=1.0 ?>\n\r;

El bucle for.. loop es el responsable de pasar por la matriz cartContents y sacar a cada elemento de la cesta. Una vez dentro del bucle, el cartItem es una referencia a la costumbre ShoppingCartItem que se cre en la seccin anterior. Estos elementos tienen la cantidad y la id de elemento, que ser colocado en esta costumbre documento XML.
cont = cartContents; for(var i in cont) { ... xml += \t<name> + cont[i].name + </name>; ... }

296

Una vez que el ciclo for.. se completa el proceso de construccin del XML, el archivo PHP se encuentra en el servidor puede ser llamado. La peticin es una base GET, pasando por los datos XML.
var variables:URLVariables = new URLVariables(); variables.action = checkout; variables.xml = xml; var urlRequest:URLRequest = new URLRequest(gateway); urlRequest.data = variables; urlRequest.method = GET; navigateToURL(urlRequest);

El cdigo PHP espera dos variables a ser transmitido. La accin en este caso es obtener, y los datos XML que se gener por los puntos de compra seleccionadas de compras en el carrito de la compra de cdigo. El siguiente paso es la construccin de los mtodos. El primer mtodo es responsable de aadir un producto a la cesta de la compra. El carrito de la compra est formado por instancias de la clase ShoppingCartItem, pero esta clase es en realidad un clip de pelcula en la biblioteca. El primer paso es crear una nueva instancia de este clip de pelcula. Despus de crear una nueva instancia, un detector de eventos se agrega al botn removeProduct, que se encuentra dentro del movieclip. La cantidad predeterminada de un nuevo punto se establece en 1, lo que puede ser actualizado, lo que se aprende en la siguiente seccin.
public function addProduct(product:Object):void { ... var cartItem:ShoppingCartItem = new ShoppingCartItem(); cartItem.removeItemBtn.addEventListener(MouseEvent.CLICK, removeProduct); cartItem.quantityTxt.text = 1; cartItem.nameTxt.text = product.name; ... }

El siguiente paso es crear una identificacin falsa que usted puede utilizar para agregar y eliminar la instancia ms tarde.
cartItem.setID(cartItemCount); // faux id for removal system

La colocacin de un nuevo carro de ejemplo el tema de la compra est determinado por primera multiplicando el cartItemCount por la altura y luego aadir un espacio.
cartItem.y = (cartItemCount * cartItemHeight) + lineSpacing;

Una vez que se coloca la nueva instancia, es temporalmente aadido al producto objeto de modo que las piezas futuro de cdigo puede acceder a ella sin la caza de ella. Luego se aade a la matriz cartContents.
product.cartItem = cartItem; cartContents.push(product);

La siguiente parte del mtodo de addProduct es responsable de aadir la instancia a la lista de visualizacin, incrementar la cuenta y, finalmente, hacer una llamada a la actualizacin de precios.
addChild(cartItem); cartItemCount++;

297

updateTotal();

En este momento, si tuviera que aadir un artculo a la cesta de la compra que permitira a los duplicados que se aade. Cuando el resultado deseado es incrementar la cantidad al bucle for.. se coloca en el principio del mtodo para cuidar de este.
public function addProduct(product:Object):void { // Look for product in list for(var i in cartContents) { if(cartContents[i].id == product.id) { var q:Number = cartContents[i].cartItem.quantityTxt.text; cartContents[i].cartItem.quantityTxt.text = q + 1; updateTotal(); return; } } ... }

El bucle se configura para comprobar el carro de un elemento de identificacin vlida. Si se encuentra una identificacin vlida, la cantidad se asigna a la variable q. Este se aade al valor del cuadro de texto la cantidad y una llamada a la actualizacin de precios se hace para asegurar que siempre es correcto. El retorno se utiliza para detener cualquier ulterior ejecucin de cdigo situado dentro de esta funcin. Este mtodo fue probablemente el ms grande, ya que es responsable de gran parte de la funcionalidad de esta aplicacin. El cdigo completo se facilite en una presentacin final al final de esta seccin, y por supuesto, tambin est disponible en el sitio Web del libro. El siguiente mtodo se utiliza para eliminar un elemento de la cesta de la compra. El mtodo getID que se cre en la clase ShoppingCartItem se utiliza en esta funcin para recuperar el ID. La referencia de los padres se usa para tomar la meta (botn Delete) e informar el cdigo de lo que el padre o el objeto superior es. Esto proporciona un vnculo slido a la instancia de clase ShoppingCartItem y en ltima instancia el mtodo para recuperar el ID.
public function removeProduct(e:MouseEvent):void { var id:uint = e.target.parent.getID(); ... }

Despus del ID, ste puede ser utilizado para eliminar el elemento de la serie de artculos de compra y de la lista de visualizacin. El mtodo de empalme se utiliza para eliminar el elemento de compra utilizando el ID, que es realmente la posicin del elemento puede encontrarse en la matriz. El segundo argumento en el mtodo de empalme es que exista un slo elemento se elimina.
cartContents.splice(id, 1); removeChild(e.target.parent); cartItemCount--;

298

NOTA Si el segundo argumento no se proporciona, el mtodo de empalme se eliminarn todos los elementos de ese punto. El archivo Flash se ha aadido una nota de forma automtica que se muestra para informar al usuario de que no hay productos en el carrito. Sin embargo, se elimina esta cuando se aade un elemento. El problema es, si el usuario elimina todos los artculos de la cesta que hay que mostrar una vez ms, por lo que una simple declaracin de si se aade al final de eliminar el mtodo para controlar este.
if(cartItemCount == 0) { noItemsTxt.visible = true; }

Por ltimo, una llamada a los mtodos updateTotal y updateList se hace para asegurar que los datos se mantiene constante y el precio se actualiza.
updateList(); updateTotal();

Los artculos de compra se aadirn a la matriz que el usuario hace clic en el botn Aadir al carro, sin embargo, puede recordar en la seccin anterior que el tema de compra se puede encontrar en la matriz mediante el carro de id. El problema es si un elemento se elimina de la lista ahora es mixto y un elemento incorrecto puede ser aadido o quitado. La solucin es presentar una identificacin nueva como se elimina un elemento. Esto se logra recorriendo todos los elementos restantes de compra y hacer una llamada para establecer una nueva identificacin.
public function updateList():void { for(var i:uint=0; i < cartItemCount; i++) { cartContents[i].cartItem.setID(i); } }

El otro efecto secundario a la eliminacin de un tema libremente es que puede crear un vaco en la lista. Esto no cambia la forma de las funciones de aplicacin, pero visualmente no es el ms limpio. La forma de evitar este problema es poco para realinear la lista como se quita un elemento.
public function updateList():void { for(var i:uint=0; i < cartItemCount; i++) { cartContents[i].cartItem.setID(i); } cartContents[i].cartItem.y = (i * cartItemHeight) + lineSpacing; }

En los mtodos anteriores no ha habido una llamada a updateTotal. Este mtodo es responsable de mantener el precio total actualizado como elementos aadidos y modificados. El proceso consiste en recorrer los elementos de compra, multiplicar el precio por la cantidad, y mostrar el resultado final. El resultado es entonces la prueba de nmeros vlidos y un decimal (.) Se proporciona si es necesario. 299

public function updateTotal():void { var total:Number = 0; for(var i:uint=0; i < cartItemCount; i++) { total += Number(cartContents[i].price) * Number(cartContents[i].cartItem.quantityTxt.text); } totalTxt.text = $ + String(round2D(total)); // tack on extra 0 if needed or two 0s if(totalTxt.text.indexOf(.) == -1) { totalTxt.appendText(.00); } else if(totalTxt.text.indexOf(.) + 2 == totalTxt.text.length) { totalTxt.appendText(0); } }

El mtodo de setGatewayURL establece la propiedad de puerta de enlace que se refiere a la direccin URL que se llama cuando el botn se hace clic en Realizar Pedido.
public function setGatewayURL(url:String):void { gateway = url; }

En este punto la clase ShoppingCart ha sido creado. La ltima porcin de cdigo que se necesita ser colocado en la lnea de tiempo. Este cdigo ser responsable de establecer todo y en ltima instancia el control de los elementos individuales. La lnea de tiempo de ActionScript tambin podra ser colocado en una clase de documentos, que se explica en el captulo 9. Sin embargo, para simplificar, se incluir directamente en el archivo Flash. La primera parte es para asignar el archivo PHP, que se construir en la siguiente seccin.
var phpFile:String = http://localhost/ch11/store/flashCart.php;

La cesta de la compra est ya en el escenario, con el nombre de instancia y se puede asignar a la variable cesta de la que se utilizar en el resto del cdigo. El siguiente paso es crear un movieclip vaco que tiene la tienda de artculos.
var cart:MovieClip = shoppingCart; cart.setGatewayURL(phpFile); var storeItems:MovieClip = new MovieClip(); storeItems.x = 25; storeItems.y = 80;

La solicitud de que el servidor es ms o menos el mismo proceso que se ha utilizado en el pasado. La nica porcin nica es la accin que se adjunta al final de la url. 300

var urlRequest:URLRequest = new URLRequest(phpFile + ?action=getproducts); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, productsLoaded); urlLoader.load(urlRequest);

Despus de cargar el servidor de datos, se llama la funcin de respuesta. Esta funcin se encarga de analizar el XML y agregar el artculo de la tienda al carro de la compra. Aqu tiene un ejemplo del cdigo XML que se devuelve y analiza.
<products> <product id=1 name=Cool Tracks desc=Another hot release thumbnail= /> </products>

Esta funcin tambin es responsable de cargar una nueva instancia del movieclip StoreItem, que contiene la informacin de cada producto. El botn en este caso tambin se adjunta a un evento que es responsable de aadir un nuevo elemento a la cesta de la compra.
function productsLoaded(e:Event):void { ... var id:uint = 0; for each(var xmlItem in xml..product) { var item:StoreItem = new StoreItem(); item.y = 85 * id; item.setStoreData( id, xmlItem.attribute(name), xmlItem.attribute(desc), xmlItem.attribute(thumbnail)); xmlItem.attribute(price)); item.addToCartBtn.addEventListener(MouseEvent.CLICK, addItemHandler); storeItems.addChild(item); id++; } addChild(storeItems); }

La funcin addItemHandler agarra el primer objeto nico y agrega el producto a la cesta. El objeto se encuentra cargando el objeto desde el contenedor primario, similar al cdigo que se utiliz en la seccin anterior. La declaracin trace() es simplemente para probar y nunca se muestran al usuario final de la aplicacin.
function addItemHandler(e:MouseEvent):void { var prod:Object = e.target.parent.getItem(); trace(Add Item: + e.target.parent); trace(Item ID: + prod.id); cart.addProduct(prod); }

301

Me tom un tiempo y dio lugar a una gran cantidad de cdigo nuevo, pero todo el cdigo ActionScript necesario para este ejemplo se ha completado. La siguiente parte es para centrarse en el cdigo PHP que es llamado por el botn Checkout. En realidad, el PHP y MySQL, van de la mano, as que es mejor para construir la tabla de SQL necesario antes de que se escriba el PHP. Esto hace que sea ms fcil de depurar a largo plazo.
CREATE TABLE flashStore_products ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(25), `category` int(3) NOT NULL DEFAULT 0, `description` TEXT, `thumbnail` varchar(200) NOT NULL DEFAULT , `price` varchar(10) NOT NULL, `active` int(1) NOT NULL DEFAULT 1, PRIMARY KEY (`id`) )

El SQL es responsable de mantener toda la informacin de cada elemento en la tienda. En una aplicacin completa, probablemente sera poblado por un sistema de gestin de contenido. Para este ejemplo, el cdigo de INSERT se proporciona para que usted pueda rpidamente probar el ejemplo.
INSERT INTO flashStore_products (name, description,price) VALUES (Cooler Music, Another new one);

Construir el PHP
Cuando el SQL es configurada el PHP puede ser escrito. El PHP es responsable de la carga de los artculos del almacn y manejo de una solicitud de pago. Estas dos tareas se pueden dividir en varios archivos, y es probablemente mejor de como las clases, pero para simplificar todo esto se encuentra dentro de un archivo PHP Este. Antes de la base de datos se puede utilizar, de una conexin debe ser establecida. Esto se logra mediante la carga de un archivo externo que contiene la informacin de conexin de base de datos.
include dbconn.php;

El contenido de este archivo dbconn.php se ven aqu.


<?php $host = localhost; $user = username; $pass = password; $database = database name; $link = mysql_connect($host, $user, $pass); mysql_select_db($database, $link); unset($host); unset($user); unset($pass); unset($database);

302

?>

Ahora usted puede determinar qu accin se est solicitando. Hay dos opciones posibles: getproducts, que devuelve un documento XML de artculos de la tienda, o la caja, que carga el XML de Flash y lo muestra.
if($_GET[action] == getproducts) { print getProducts(); } else if($_GET[action] == checkout) { $xml = new SimpleXMLElement($_GET[xml]); $nodeCount = count($xml->product); print print print print <table border=\1\ width=\500\>; <tr><td><strong>Quantity</strong></td>; <td><strong>Product</strong></td>; <td><strong>Price</strong></td></tr>;

for($x=0; $x < $nodeCount; $x++) { print <tr style=\background-color:#eeeeee;\>; print <td style=\width:60px;text-align:center;\> . $xml->product[$x]->quantity . </td>; print <td> . $xml->product[$x]->name . </td>; print <td> . $xml->product[$x]->price . </td></tr>; } print <tr>; print <td colspan=\3\>Total: <strong> . getAttribute($xml, total) . </strong></td></tr>; print </table>; print <br />Checkout code goes here<br />; }

La accin getproducts simplemente hace una llamada a otra funcin que devuelve el cdigo XML generados a partir de las entradas de base de datos. La accin de compra, como se muestra en la figura 12.3, es un poco ms complicado. Empieza agarrando los datos XML pasado de Flash. Este XML se carga en la biblioteca SimpleXML donde se analiza y cada uno de los artculos de la tienda se recupera.

303

FIGURA 12.3 Aqu est una muestra de la pgina de caja, cargada de Flash. Esta pgina es visible cuando se hace clic en el botn Checkout.

Esta funcin se llama desde la primera accin y es responsable de la construccin de un documento XML de los datos en la base de datos. Los artculos de la tienda se desglosan por id, name, desc, y en miniatura, que son visibles en el archivo de Flash. El resultado desde el MySQL devuelve cualquier elemento que est activo actualmente. Este resultado se pasa luego a un bucle while, que es donde se construye el de datos XML. Por ltimo, el XML es devuelto a la persona que llama y, en este ejemplo, se imprime en la pantalla para que se ejecute.
function getProducts() { global $link; $result = mysql_query(SELECT * FROM flashStore_products WHERE active=1, $link); $xml = <products>\n; while($row = mysql_fetch_array($result)) { $xml .= <product id=\ . $row[id] . \ name=\ . $row[name] .

304

\ desc=\ . $row[description] . \ thumbnail=\ . $row[thumbnail] . \ />\n; \ price=\ . $row[price] .\ />\n; } $xml .= </products>; return $xml; }

La ltima funcin es en realidad una funcin olvidada de SimpleXML. Esta funcin tiene dos argumentos, el XML y el nombre del atributo que est buscando. Primero se realiza un bucle a travs de todos los argumentos y los partidos de los argumentos en contra de la variable passed-in. Se devuelve el valor del atributo o falso, dependiendo de lo que el resultado es.
function getAttribute($xml, $name) { foreach($xml->attributes() as $key=>$val) { if($key == $name) { return (string)$val; } } return false; }

Ahora que todo el cdigo est completo, aqu estn las tres clases y el cdigo de lnea de tiempo previsto en un solo lugar para facilitar la visualizacin y la comparacin con el cdigo.

ShoppingCart
package { import import import import flash.display.MovieClip; flash.text.TextField; flash.events.MouseEvent; flash.net.*;

public class ShoppingCart extends MovieClip { private var cartItemCount:uint = 0; private var cartContents:Array; private var cartItemHeight:uint = 20; private var lineSpacing:uint = 30; private var gateway:String; function ShoppingCart() { cartContents = new Array(); checkoutBtn.addEventListener(MouseEvent.CLICK, function():void { var xml:String = <?xml version=1.0 ?>\n\r;

305

xml += <products total=\ + totalTxt.text + \>; for(var i in cartContents) { xml += <product>; xml += <quantity> + cartContents[i].cartItem.quantityTxt.text + </quantity>; xml += <name> + cartContents[i].name + </name>; xml += <price> + cartContents[i].price + </price>; xml += </product>; } xml += </products>; var variables:URLVariables = new URLVariables(); variables.action = checkout; variables.xml = xml; var urlRequest:URLRequest = new URLRequest(gateway); urlRequest.data = variables; urlRequest.method = GET; navigateToURL(urlRequest); }) } public function addProduct(product:Object):void { // Look for product in list for(var i in cartContents) { if(cartContents[i].id == product.id) { var quantity:Number = cartContents[i].cartItem.quantityTxt.text; cartContents[i].cartItem.quantityTxt.text = quantity + 1; updateTotal(); return; } } if(cartItemCount == 0) { noItemsTxt.visible = false; } var cartItem:ShoppingCartItem = new ShoppingCartItem(); cartItem.removeItemBtn.addEventListener( MouseEvent.CLICK, removeProduct); cartItem.quantityTxt.text = String(1); cartItem.nameTxt.text = product.name; cartItem.setID(cartItemCount);

306

cartItem.y = (cartItemCount * cartItemHeight) + lineSpacing; product.cartItem = cartItem; cartContents.push(product); addChild(cartItem); cartItemCount++; updateTotal(); } public function removeProduct(e:MouseEvent):void { var id:uint = e.target.parent.getID(); cartContents.splice(id, 1); removeChild(e.target.parent); cartItemCount--; if(cartItemCount == 0) { noItemsTxt.visible = true; } updateList(); updateTotal(); } public function updateList():void { for(var i:uint=0; i < cartItemCount; i++) { cartContents[i].cartItem.setID(i); cartContents[i].cartItem.y = (i * cartItemHeight) + lineSpacing; } } public function updateTotal():void { var total:Number = 0; for(var i:uint=0; i < cartItemCount; i++) { total += Number(cartContents[i].price) * Number(cartContents[i].cartItem.quantityTxt.text); } totalTxt.text = $ + String(round2D(total)); // tack on extra 0 if needed or two 0s if(totalTxt.text.indexOf(.) == -1) { totalTxt.appendText(.00); } else if(totalTxt.text.indexOf(.) + 2 == totalTxt.text.length)

307

{ totalTxt.appendText(0); } } public function setGatewayURL(url:String):void { gateway = url; } private function round2D(n:Number):Number { return Math.round(n * Math.pow(10, 2)) / Math.pow(10, 2); } } }

ShoppingCartItem
package { import flash.display.MovieClip; import flash.text.TextField; public class ShoppingCartItem extends MovieClip { private var cartItemID:uint; function ShoppingCartItem() { } public function getID():uint { return cartItemID; } public function setID(id:uint):void { cartItemID = id; } } }

StoreItem
package { import flash.display.MovieClip; import flash.text.TextField; public class StoreItem extends MovieClip { private var albumName:String; private var albumDesc:String; private var albumThumb:String; private var albumPrice:String; private var storeItemID:uint; function StoreItem() {}

308

public function setStoreData( id:uint, n:String, d:String, t:String, p:String):void { storeItemID = id; albumName = n; albumDesc = d; albumThumb = t; albumPrice = p; nameTxt.text = albumName; descTxt.text = albumDesc; } public function getItem():Object { return { target:this, id:storeItemID, name:albumName, price:albumPrice }; } } }

Timeline code
var phpFile:String = http://localhost/ch11/store/flashCart.php; var cart:MovieClip = shoppingCart; cart.setGatewayURL(phpFile); var storeItems:MovieClip = new MovieClip(); storeItems.x = 25; storeItems.y = 80; var urlRequest:URLRequest = new URLRequest(phpFile + ?action=getproducts); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, productsLoaded); urlLoader.load(urlRequest); function productsLoaded(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); trace(XML: + xml); var id:uint = 0; for each(var xmlItem in xml..product) { var item:StoreItem = new StoreItem(); item.y = 85 * id; item.setStoreData(id, xmlItem.attribute(name),

309

xmlItem.attribute(desc), xmlItem.attribute(thumbnail)); xmlItem.attribute(price)); item.addToCartBtn.addEventListener( MouseEvent.CLICK, addItemHandler); storeItems.addChild(item); id++; } addChild(storeItems); } function addItemHandler(e:MouseEvent):void { var prod:Object = e.target.parent.getItem(); trace(Add Item: + e.target.parent); trace(Item ID: + prod.id); cart.addProduct(prod); }

PHP code
<?php $host = localhost; $user = username; $pass = password; $database = database name; $link = mysql_connect($host, $user, $pass); mysql_select_db($database, $link); unset($host); unset($user); unset($pass); unset($database); ?> <?php include dbconn.php; function getProducts() { global $link; $result = mysql_query(SELECT * FROM flashStore_products WHERE active=1, $link); $xml = <products>\n; while($row = mysql_fetch_array($result)) { $xml .= <product id=\ . $row[id] . \ name=\ . $row[name] . \ desc=\ . $row[description] .

310

\ thumbnail=\ . $row[thumbnail] . \ />\n; \ price=\ . $row[price] .\ />\n; } $xml .= </products>; return $xml; } if($_GET[action] == getproducts) { print getProducts(); } else if($_GET[action] == checkout) { $xml = new SimpleXMLElement($_GET[xml]); $nodeCount = count($xml->product); print print print print <table border=\1\ width=\500\>; <tr><td><strong>Quantity</strong></td>; <td><strong>Product</strong></td>; <td><strong>Price</strong></td></tr>;

for($x=0; $x < $nodeCount; $x++) { print <tr style=\background-color:#eeeeee;\>; print <td style=\width:60px;text-align:center;\> . $xml->product[$x]->quantity . </td>; print <td> . $xml->product[$x]->name . </td>; print <td> . $xml->product[$x]->price . </td></tr>; } print <tr><td style=\text-align:right;\ colspan=\3\>Total: <strong> . getAttribute($xml, total) . </strong></td></tr>; print </table>; print <br />Checkout code goes here<br />; } function getAttribute($xml, $name) { foreach($xml->attributes() as $key=>$val) { if($key == $name) { return (string)$val; } } return false; } ?>

El ejemplo se ha completado, es slo una cuestin de poner el PHP en un servidor Web activo. Desde este punto se puede extender el ejemplo para tener varias categoras, productos, y las imgenes. 311

Siendo realistas, la construccin de la aplicacin en un formato de clase que ofrece una mayor capacidad de expansin, pero no acaba de tomar mi palabra para ella. Experimenta y extender el ejemplo.

Uso de PHP y Flash para construir una aplicacin de busqueda del Amazon
Amazon ofrece un conjunto muy poderoso de herramientas diseadas para trabajar con los datos de su sitio. Esta seccin abarca la construccin de una aplicacin de bsqueda utilizando Amazon.com como la fuente de datos. Este ejemplo utiliza el ECS (Amazon E-Commerce Service), que proporciona acceso directo a Amazon increble la bsqueda y el sistema de inventario. Con el fin de utilizar la ECS tiene que tener una identificacin de acceso vlida del Amazon, que se proporciona cuando se crea una cuenta de desarrollador. Este proceso de registro es rpido y gratuito, todo lo que necesita es una direccin vlida de correo electrnico y una cuenta activa.

Uso del servicio web de Amazon


Para empezar con los desarrolladores la creacin de una cuenta, visite el servicio Web de Amazon (AWS) en la pgina de www.amazon.com/gp/aws/landing.html. NOTA Asegrese de activar la cuenta por correo electrnico antes de empezar a usarlo. AWS est configurado para ser accesible desde diferentes medios. El formato utilizado para este ejemplo es Representational State Transfer (REST), que es bsicamente una direccin URL con formato con toda la informacin necesaria siempre en la Versin GET. Aqu est una muestra de enviar a la Amazona, como se muestra en la figura 12.4, para devolver informacin acerca del libro de posibles coincidencias para una palabra clave o serie de palabras clave.
http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService&AWS AccessKeyId={AWS_ACCESS_KEY}&Operation=ItemSearch&SearchIndex= Books&ResponseGroup=Medium&Keywords={SEARCH_TERMS}

El AWS_ACCESS_KEY es la identificacin de acceso que es proporcionado por Amazon, y la SEARCH_TERMS sera la palabra clave (s) que se transmiten a lo largo de la bsqueda. Como te habrs dado cuenta, la respuesta XML de Amazon es bastante complejo. Sin embargo, para este ejemplo, la atencin se centrar en el ttulo del libro, autor, y la ruta en miniatura. Amazonas es realmente muy agradable para proporcionar la cantidad de detalle que lo hace. Usted puede construir algunas aplicaciones muy interesantes con el sistema de AWS.

312

FIGURA 12.4 Aqu est la respuesta XML de Amazon, despus de una bsqueda de "PHP".

De hecho, la URL enviada a Amazon puede ser modificado para la bsqueda de diferentes elementos o temas todos juntos. AWS est configurado para devolver mensajes de error incluso vlido similar a ste si no ofrecen un parmetro de operacin.
AWS.InvalidOperationParameterThe Operation parameter is invalid. Please modify the Operation parameter and retry. Valid values for the Operation parameter include TagLookup, ListLookup, CartGet, SellerListingLookup, CustomerContentLookup, ItemLookup, SimilarityLookup, SellerLookup, ItemSearch, VehiclePartLookup, BrowseNodeLookup, CartModify, ListSearch, CartClear...

El sistema de bsqueda ofrece un montn de tipos y modificadores, y usted no tiene que depender de este "create an error " a ver qu hay disponible. Amazon pasa a proporcionar la documentacin muy slido en el centro del desarrollador. Entra en el acceso.

313

Simplificar la respuesta XML


Cuando la respuesta XML se ha cargado en la seccin anterior, el resultado fue abrumador. Hay muchos nodos XML y datos que simplemente no son aplicables a esta aplicacin. Usted podra pasar estos datos en bruto en Flash, pero lo que si usted quiere almacenar los resultados? Usted tiene un montn de informacin no utilizada obstruyendo su base de datos. La idea es construir una respuesta XML personalizada que contiene nicamente los datos necesarios para esta aplicacin.
<?php $terms = ; define(AWS_ACCESS_KEY, {AWS_KEY_GOES_HERE});

Es importante comprobar las etiquetas vlidas antes de una respuesta se enva al Amazonas. Realmente no daa nada, pero se podra considerar una solicitud fraudulenta.
if(!empty($_GET[terms])) { ... }

Suponiendo etiquetas vlidas encontrado, construir la peticin que se enviar a la AWS.


if(!empty($_GET[terms])) { $terms = $_GET[terms]; $request = http://ecs.amazonaws.com/onca/xml . ?Service=AWSECommerceService& . AWSAccessKeyId= . AWS_ACCESS_KEY . &Operation=ItemSearch . &SearchIndex=Books . &ResponseGroup=Medium . &Keywords= . $terms; }

Tiene la palabra la AWS, pasando por los parmetros de bsqueda.


$rawXml = file_get_contents($request);

La respuesta de la AWS se carga utilizando file_get_contents, que dice en todo el archivo solicitado en una cadena. En este ejemplo, la cadena se guarda en la variable $ rawXML. Una llamada a la biblioteca SimpleXML se hace para construir un objeto XML con formato correcto.
$xmlResponse = simplexml_load_string($rawXml);

El siguiente paso es crear el documento XML personalizado que ser enviado de vuelta a Flash cuando se solicita. La variable nodeCount no es modificable a 4 de manera que se guardan slo cuatro resultados libro. Incluso si vuelve la Amazona miles, Flash slo ve cuatro.
$nodeCount = 4;

314

$xml = <?xml version=\1.0\ ?>\n<books>; for($i=0; $i < $nodeCount; $i++) { ... } $xml .= </books>;

El contenido del bucle for.. es donde la mayora del proceso de construccin se produce XML. Por ejemplo, para cargar el ttulo del libro actual, acceder por primera vez en el nodo Elementos. Una vez dentro de ese nodo, el nodo de elemento seleccionado es acceder utilizando la variable $i para determinar qu nio debe ser de referencia. Dentro del nodo hijo en vigor, hay otro nio con el nombre ItemAttributes de nodo, que contiene un nodo de ttulo y en ltima instancia se convierte en el nombre del libro para este nio seleccionado.
$xmlResponse->Items->Item[$i]->ItemAttributes->Title

Como puede ver, Amazon paquetes de este archivo XML completo de la informacin, que en este caso hace que sea difcil especie de carga de la informacin deseada. El proceso de carga y datos del autor en miniatura es prcticamente el mismo slo el acceso de cada nio y referencia el nodo deseado.
$xml .= \t<book>; $xml .= \t\t<title><![CDATA[ . $xmlResponse->Items ->Item[$i]->ItemAttributes->Title . ]]></title>; $xml .= \t\t<author><![CDATA[ . $xmlResponse->Items ->Item[$i]->ItemAttributes->Author . ]]></author>; $xml .= \t\t<price><![CDATA[ . $xmlResponse->Items ->Item[$i]->ItemAttributes->ListPrice ->FormattedPrice . ]]></price>; $xml .= \t\t<thumb> . $xmlResponse->Items->Item[$i] ->SmallImage->URL . </thumb>; $xml .= \t</book>;

PRECAUCIN Los datos para generar el XML es una lnea por la variable $xml; el envoltorio es adaptar esta pgina y, potencialmente, puede romper el cdigo. La ltima parte del PHP para este ejemplo crea un tipo de cabecera para que los lectores conocen el formato XML que se est enviando. Entonces, finalmente los resultados a la pantalla.
header(content-type: text/xml); print $xml;

El Flash (ActionScript) necesarias para la aplicacin en todas las clases externas. Esto se hace porque es ms fcil de gestionar y mantener para avanzar. CROSS--REF Si necesita una explicacin ms a fondo de las clases, os recomiendo que lea el captulo 9. El archivo Flash (FLA) para esta aplicacin consta de un diseo simple con un cuadro de bsqueda y el botn. La clase principal, Booksearch, se asigna como la clase de documento y es responsable de la gestin de la aplicacin en general. Aqu est el esqueleto de la clase, que da una idea de qu mtodos y propiedades se utilizan para crear esta aplicacin.

315

package { import flash.display.MovieClip; import flash.events.*; import flash.net.*; public class BookSearch extends MovieClip { public var webServiceURL:String; private var bookItems:Array; private var bookItemsContainer:MovieClip; public function BookSearch() {} public function searchHandler(e:MouseEvent):void {} public function loadSearchResults(terms:String):void {} public function loadedResultsHandler(e:Event):void {} private function removeOldResults():void {} } }

El mtodo constructor se utiliza para inicializar la matriz, crear un movieclip contenedor, y agregue el detector de eventos para el botn de bsqueda.
public function BookSearch() { bookItems = new Array(); bookItemsContainer = new MovieClip(); bookItemsContainer.y = 100; searchBtn.addEventListener(MouseEvent.CLICK, searchHandler); }

El ltimo paso del mtodo constructor es aadir el contenedor nuevo libro a la lista de visualizacin, que en ltima instancia, lo hace visible.
public function BookSearch() { bookItems = new Array(); bookItemsContainer = new MovieClip(); bookItemsContainer.y = 100; searchBtn.addEventListener(MouseEvent.CLICK, searchHandler); addChild(bookItemsContainer); }

El siguiente mtodo es centrarse en la searchHandler (). Este mtodo se llama cuando el usuario hace clic en el botn Buscar. Cuando se llama a este mtodo, primero comprueba la longitud de los datos de la caja de bsqueda para asegurar una bsqueda vlida va a suceder. Si el valor es de longitud vlido, una llamada a eliminar los resultados de bsqueda de edad se hace.
public function searchHandler(e:MouseEvent):void { if(searchTxt.text.length > 0) { removeOldResults();

316

loadSearchResults(searchTxt.text); } }

Una vez que se encuentra un trmino de bsqueda vlido, el siguiente paso es configurar y realizar la llamada al PHP, que es responsable de la interfaz con la AWS. La convocatoria de este ejemplo es muy similar a los ejemplos anteriores. En primer lugar, establecer las variables de objeto, que asigna a la URLRequest, crear una instancia de cargador nuevo, y, finalmente, asignar un detector de eventos.
public function loadSearchResults(terms:String):void { var urlVariables:URLVariables = new URLVariables(); urlVariables.terms = terms; var urlRequest:URLRequest = new URLRequest(webServiceURL); urlRequest.data = urlVariables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, loadedResultsHandler); urlLoader.load(urlRequest); }

Usted puede haber notado que este mtodo se ha hecho pblico. Esto se hace lo que otras aplicaciones pueden utilizar la capacidad de buscar, porque eso es lo que la reutilizacin se trata. Por supuesto, si usted permite que otros para llamar a este mtodo directamente, lo ms probable es que quiera colocar otro plazo de verificacin para asegurarse de que los datos errneos no va a ser enviado. Una vez que devuelve el servidor Web de los datos, se enva al mtodo loadedResultsHandler(). La respuesta se enva en formato XML y, utilizando un bucle for..each cada elemento se extrae y se enva a una instancia nica de clase BookItem.
var xml:XML = new XML(urlLoader.data); for each(var item in xml..book) ...

El BookItem hace referencia a un movieclip en la biblioteca. Este movieclip est precargado con entradas ficticias que se rellenan con los datos reales antes de que se muestran en el escenario.
var bookItem:BookItem = new BookItem(); bookItem.setValues( item..title, item..author, item..price, item..thumb ); bookItem.y = (bookItems.length * (bookItem.height + 30)); bookItems.push(bookItem); bookItemsContainer.addChild(bookItem);

El controlador de eventos siguiente completado:


public function loadedResultsHandler(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target);

317

var xml:XML = new XML(urlLoader.data); for each(var item in xml..book) { var bookItem:BookItem = new BookItem(); bookItem.setValues( item..title, item..author, item..price, item..thumb ); bookItem.y = (bookItems.length * (bookItem.height + 30)); bookItems.push(bookItem); bookItemsContainer.addChild(bookItem); } }

El ltimo mtodo para la clase de documento se utiliza para eliminar los casos elemento existente libro. Este mtodo es llamado cada vez que comienza una nueva bsqueda, para asegurar que los datos no accidentalmente apilar hasta.
private function removeOldResults():void { if(bookItems.length > 0) { bookItems = new Array(); removeChild(bookItemsContainer); bookItemsContainer = new MovieClip(); bookItemsContainer.y = 100; addChild(bookItemsContainer); } }

La primera parte del mtodo de los controles para las entradas vlidas porque la primera vez que se ejecuta la aplicacin, no habra productos existentes en el escenario.
if(bookItems.length > 0) { ... }

Si hay elementos existentes, una nueva matriz se crea que limpia los objetos existentes. Luego, utilizando removeChild, el contenedor de edad se elimina y se crea uno nuevo. Esto se hace para liberar recursos y eliminar los productos existentes.
bookItems = new Array(); removeChild(bookItemsContainer); bookItemsContainer = new MovieClip();

El ltimo paso es aadir el contenedor nuevo libro a la lista de visualizacin, que se hace llamando addChild() y pasar la nueva instancia del contenedor como un argumento.
addChild(bookItemsContainer);

Ahora puede seguir adelante y crear la clase BookItem, que se utiliza para cada producto que se aade al escenario. Es responsable de almacenar los datos fuera de la carga de los productos y en la miniatura de libro. 318

Antes de que cualquier desarrollo de la clase comienza es una buena idea buscar en el esqueleto, como en el ejemplo anterior. Si lo hace, le permite entender mejor cmo se pretende trabajar.
package { import flash.display.MovieClip; import flash.text.TextField; import flash.display.Loader; import flash.net.URLRequest; public class BookItem extends MovieClip { public function BookItem() { } public function setValues(t:String, a:String, p:String, i:String):void {} public function loadThumb():void {} public function getValues():Object {} } }

El primer mtodo en la mayora de las clases es el constructor, y esto no es una excepcin, salvo por el hecho de que este constructor est vaco. El siguiente mtodo es setValues, que se encarga de almacenar los valores pasados. Estos valores sern los datos del libro que es extrado de Amazon. Usted tambin puede pasar esta informacin como un objeto, pero para este ejemplo, es ms fcil de entender el uso de variables independientes.
public function setValues(t:String,a:String,p:String,i:String):void { title = t; author = a; price = p; thumb = i; titleTxt.text = title; authorTxt.text = author; priceTxt.text = price; loadThumb(); }

Una vez que todas las variables que se almacenan fuera, una llamada a loadThumb hecho es, que es responsable de recuperar la imagen de la portada del libro. Cuando se utiliza la clase Loader, puede pasar que en el addChild, que elimina la necesidad de un detector de eventos, pero ms importante an, se carga por s sola, porque la portada del libro no es necesario. Tambin puede crear un gestor visual para informar al usuario de que algo es realmente la carga. El resto del mtodo es slo una URLRequest estndar, que debe estar familiarizado con los de los ejemplos anteriores.
public function loadThumb():void { var thumbLoader:Loader = new Loader(); var thumbURL:String = thumb; var thumbURLRequest:URLRequest = new URLRequest(thumbURL); thumbLoader.load(thumbURLRequest); thumbLoader.x = 10; addChild(thumbLoader);

319

El ltimo mtodo es para el retorno de los datos BookItem que fue poblada en los mtodos anteriores.
public function getValues():Object { return {title:title, author:author, price:price}; }

En este punto, usted ha completado una aplicacin de bsqueda de Amazon con PHP y Flash. Tambin han obtenido una gran cantidad de informacin sobre el sistema de AWS y debe ser bombeado a construir su propio servicio de Web-habilitado. Algunos proyectos posibles a construir son la aplicacin de bsqueda de CD, sistema de concordancia de gnero, o incluso una galera a la que utiliza la biblioteca de iTunes local o reproductor de msica similar a la construccin de una nube visual de msica que ha escuchado. Consulte el sitio Web para este libro para ver otros ejemplos de aplicaciones creadas usando el sistema de Amazon AWS.

Desarrollar una galleria de fotos usando flickr


La galera de fotos es una aplicacin muy popular que se construye a menudo usando Flash. Ofrece una manera muy nica para exhibir su trabajo o en algunos casos se utiliza como una aplicacin de entrega de informacin, como por ejemplo en juegos y sitios de noticias. En esta seccin, usted aprender a desarrollar una galera de fotos usando el servicio de fotos en Flickr proporcionados por Yahoo. La aplicacin Flash se hace una llamada a PHP, que interactan con los servicios Web de Flickr y, finalmente, volver de nuevo a que los datos de Flash para mostrarlos. Antes de comenzar el desarrollo de la aplicacin, registrarse para obtener una clave de API de Flickr, que es un proceso de dos pasos. El primer paso es crear una cuenta de Flickr, visite la pgina de registro en www.flickr.com/signup/. Una vez que tenga una cuenta de Flickr, solicitur una API, por visitar www.flickr.com/services/api/keys/apply/. NOTA Si selecciona la opcin no comercial que autoriza su solicitud de forma casi instantnea. En este ejemplo se utiliza una clase de documentos para manejar la mayora de la carga y visualizacin de proceso. De hecho, la mayor parte de esta clase es similar al del ejemplo anterior. Si usted complet este ejemplo, puede copiar los archivos de clase y hacer los cambios que sean necesarios. Aqu est el esqueleto de la clase, que le dar una mejor idea de cmo la clase trabaja.
package { import flash.display.MovieClip; import flash.events.*; import flash.net.*; public class PhotoGallery extends MovieClip { public var webServiceURL:String;

320

private var photos:Array; private var photosContainer:MovieClip; public public public public function function function function PhotoGallery() {} searchHandler(e:MouseEvent):void {} loadSearchResults(terms:String):void {} loadedResultsHandler(e:Event):void {}

private function removeOldPhotos():void {} } }

El primer mtodo es realmente el constructor, que en esta aplicacin se encarga de la creacin de un nuevo contenedor, y tambin inicializa la matriz de elemento.
public function PhotoGallery() { photos = new Array(); photosContainer = new MovieClip(); photosContainer.y = 75; }

Despus de que se crea un nuevo movieclip, es necesario que se aada a la lista de visualizacin, y un controlador de eventos debe ser asignada al botn de bsqueda situado en el escenario.
searchBtn.addEventListener(MouseEvent.CLICK, searchHandler); addChild(photosContainer);

El siguiente mtodo es centrarse en searchHandler(). Cuando este mtodo se le llama comprueba en primer lugar por un trmino de bsqueda vlido. Si el valor es vlido, una llamada a eliminar las imgenes antiguas que se haga.
public function searchHandler(e:MouseEvent):void { if(searchTxt.text.length > 0) { removeOldPhotos(); loadSearchResults(searchTxt.text); } }

El siguiente mtodo es para llamar al PHP, que es responsable de la interfaz con Flickr. La variable de etiquetas se pasa desde el controlador de bsqueda y se enva al PHP a travs de una peticin GET.
public function loadSearchResults(tags:String):void { var urlVariables:URLVariables = new URLVariables(); urlVariables.tags = tags; var urlRequest:URLRequest = new URLRequest(webServiceURL); urlRequest.data = urlVariables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, loadedResultsHandler); urlLoader.load(urlRequest); }

321

El PHP est configurado para devolver un conjunto de resultados XML, que es una versin reducida de lo que se devuelve desde Flickr. Esto es muy similar al del ejemplo del Amazon, porque los servicios Web tienden a devolver una gran cantidad de informacin que no es necesario para una aplicacin como esta. Los datos XML se carga por primera vez en un objeto XML para analizar adecuado para ser posible. Una vez creado el objeto XML, se ejecuta a travs de un bucle for..each de sacar cada foto nodo de.
public function loadedResultsHandler(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); for each(var item in xml..photo) { ... } }

Uso de cada foto nodo es necesario crear una instancia de PhotoItem, que es donde se carga la imagen de flickr. Piense en este caso como un contenedor para cada imagen. Esta instancia tambin es donde los datos de imagen se almacena para uso futuro.
var photoItem:PhotoItem = new PhotoItem(); photoItem.setValues(item..title, item..thumb);

Cuando se crea una nueva instancia de la PhotoItem, debe estar alineado en el contenedor. Esta posicin se determina en funcin de la longitud de la matriz de fotos y multiplicando el resultado por la altura de la photoItem nuevo. Ese valor se increment en un 50 pixels para permitir espacio para la imagen en miniatura.
photoItem.y = (photos.length * (photoItem.height + 50));

Otra solucin ms elegante es la de crear un controlador de eventos que se suman las fotos una vez que se carga. Esto ofrece la posibilidad de tener mltiples imgenes a tamao y ser ms dinmico. La ltima tarea de este mtodo consiste en agregar la nueva instancia en la matriz de fotos y finalmente mostrarlo.
photos.push(photoItem); photosContainer.addChild(photoItem);

Cada vez que una nueva bsqueda se lleva a cabo, una llamada al mtodo removeOldPhotos se hace. Este mtodo es responsable de la eliminacin de las imgenes existentes y asegurar que los datos no se cruzaron.
private function removeOldPhotos():void { if(photos.length > 0) { photos = new Array(); removeChild(photosContainer); photosContainer = new MovieClip(); photosContainer.y = 75; addChild(photosContainer); } }

322

Este mtodo private se establece en el cdigo para que no pueden borrar accidentalmente las imgenes. Si desea permitir la eliminacin externa de las imgenes que puede crear un mtodo que los controles que delega cierto nivel de autorizacin. Si la peticin es vlida, las imgenes pueden ser removidos. La siguiente clase para crear, ahora que se ha completado la clase de documento, es la PhotoItem. Esta clase contiene la informacin para cada imagen que se carga desde Flickr. Tambin es responsable de cargar la posicin de la miniatura de la instancia en el escenario.
package { import flash.display.MovieClip; import flash.text.TextField; import flash.display.Loader; import flash.net.URLRequest; public class PhotoItem extends MovieClip { private var title:String; private var thumb:String; public public public public } } function function function function BookItem() { } setValues(t:String, i:String):void {} loadThumb():void {} getValues():Object {}

Cuando una nueva instancia de esta clase se crea, una llamada a la setValues se hace para almacenar los datos de la imagen. Este mtodo acepta dos argumentos: ttulo y la ruta en miniatura. Ambas variables se guardan en variables privadas para que accidentalmente no se pueda acceder y modificar.
title = t; thumb = i;

Una vez que se carguen los datos, el ttulo se aade al componente titleTxt situado en el movieclip. El ttulo tambin se desplaza a cabo para dar cabida a la imagen en miniatura.
titleTxt.text = title; titleTxt.x = 100;

La pieza final es hacer una llamada al mtodo loadThumb.


loadThumb();

El mtodo de loadThumb es responsable de cargar la imagen que se encuentra en el documento XML.


public function loadThumb():void { var thumbLoader:Loader = new Loader(); var thumbURL:String = thumb; var thumbURLRequest:URLRequest = new URLRequest(thumbURL); thumbLoader.load(thumbURLRequest); thumbLoader.x = 10; addChild(thumbLoader); }

323

El ltimo mtodo es responsable de pasar de nuevo la informacin de la imagen.


public function getValues():Object { return {title:title}; }

Usted puede haber notado el gestor de miniatura es el mismo cdigo que se utiliz en el libro de ejemplo de la bsqueda. Tambin puede haber notado que el cdigo de gestor a travs de todo este libro es muy similar. Lo que debera decir es una clase que se han construido para manejar esta tarea, y una importacin sencilla sustituira diez lneas de cdigo que se han duplicado en todas las aplicaciones. Esto no es realmente notable para una pequea aplicacin, pero que sera si estuviera desarrollando un proyecto a gran escala largerscale. Reutilizacin de la clase se explica en mayor detalle en el captulo 9. Pero bsicamente, lo que viene abajo es cuando eres capaz de hacer algo modular, es probablemente una buena idea para hacerlo.

Interfaz con el servicio Web


El siguiente paso en la galera de fotos es para construir el cdigo PHP que se encargar de la conexin a flickr y analizar la respuesta XML. El primer paso es definir el API clave de Flickr que se proporciona desde Flickr.
<?php define(FLICKR_ACCESS_KEY, {FLICKR_API_KEY});

Flickr tiene una manera nica parte de la construccin de las URLs de la imagen. La manera ms fcil trabajar con este formato es usando la funcin sprintf. Esta funcin acepta una cadena con las variables de marcador de posicin que luego se rellenan con las variables reales utilizando valores proporcionados en los otros.
$flickrURLTemplate= http://farm%s.static.flickr.com/ %s/%s_%s_s.jpg;

Para evitar solicitudes errneas, una simple declaracin if se utiliza para asegurarse de que las etiquetas de variable que viene de Flash, de hecho, tiene un trmino de bsqueda. Si por alguna razn, la variable est vaca, el script y no ms de cdigo se ejecuta desde ese punto.
if(empty($_GET[tags])) { exit(); }

Si se encuentra un valor de etiqueta vlido, el siguiente paso es recoger la informacin de la etiqueta y hacer la llamada a Flickr para iniciar el proceso de bsqueda.
$apiMethod = flickr.photos.search; $request = http://api.flickr.com/services/rest/ . ?method= . $apiMethod . &tags= . $searchTags . &api_key= . FLICKR_ACCESS_KEY. &per_page=5;

324

$rawXml = file_get_contents($request);
El servicio de fotografa devuelve un documento XML que se almacena en la variable $rawXml. Una vez cargado el XML, se pasa a lo largo del mtodo simplexml_ load_string(), que crea un objeto propio que PHP puede analizar.

$xmlResponse = simplexml_load_string($rawXml);

Cuntas imgenes para mostrar son determinados por la carga del valor que se encuentra en el documento XML.
$nodeCount = getAttribute($xmlResponse->photos, perpage);

Construir un document XML personalizado


El proceso de construccin del documento XML personalizado se realiza mediante un bucle que se agarra a cada nodo de fotos y recoge la informacin requerida.
$xml = <?xml version=\1.0\ ?>\n<photos>; for($i=0; $i < $nodeCount; $i++) { $farmID= getAttribute($xmlResponse->photos->photo[$i], farm); $serverID= getAttribute($xmlResponse->photos->photo[$i], server); $photoID= getAttribute($xmlResponse->photos->photo[$i], id); $secret= getAttribute($xmlResponse->photos->photo[$i], secret); $xml .= \t<photo>; $xml .= \t\t<title><![CDATA[ . getAttribute($xmlResponse>photos ->photo[$i], title) . ]]></title>; $xml .= \t\t<thumb> . sprintf($flickrURLTemplate, $farmID, $serverID, $photoID, $secret) . </thumb>; $xml .= </photo>; }

La primera parte del circuito es para la construccin de la ruta de la imagen, que se pasa a la funcin sprintf. Despus de que el documento XML en general se crea, el ltimo paso es la salida a la persona que llama, que en este caso sera Flash.
header(content-type: text/xml); print $xml;

Ahora que el PHP se ha completado y la aplicacin general se ha desarrollado, se puede comprobar, como se muestra en la Figura 12.5.

325

FIGURA 12.5 Aqu est la aplicacin final, que muestra las imgenes de una bsqueda usando la etiqueta de color naranja.

Resumen
En este captulo usted aprendi cmo conectar Flash a los servicios Web de PayPal, para desarrollar un carrito de la compra personalizada. Una vez que se complet la parte de desarrollo de PayPal que aprendi a desarrollar un carrito de la compra personalizado en Flash utilizando clases para simplificar el proceso de desarrollo. A continuacin, aprendi a desarrollar un sistema de bsqueda que utiliza la API de bsqueda de Amazon.com, y obtuvo una comprensin de cmo los datos en el tercer partido los servicios de regreso. En la ltima parte del captulo que desarroll una aplicacin de la imagen usando la API de Flickr. En el proceso, que ha aprendido algunas de las caractersticas ms robustas de PHP para desglosar los datos y construir las solicitudes utilizando sprintf. El siguiente paso es extender este ejemplo y, posiblemente, crear un script de galera de fotos con las categoras y la posibilidad de aadir/editar fotografas. Incluso podra incluir esta pequea porcin en una aplicacin mayor, mientras que a travs de Flickr como la interfaz grfica o el punto de almacenamiento de fotos. 326

Capitulo 13 Uso Avanzado de las aplicaciones Del mundo real


Aplicaciones del mundo real estn destinados a ser productos completos que han sido probados y estn listos para ser desplegados para el pblico en general a disfrutar de ellos. Este captulo se centra en la construccin de una serie de aplicaciones que hacen precisamente eso. Los archivos de partida se han previsto para que pueda centrarse en el ncleo de las aplicaciones, lo que sera el proceso de desarrollo. Cada ejemplo se divide en sus clases individuales, archivos, y los paquetes en funcin de lo que se requiere. Si usted nunca ha trabajado con las clases, te recomiendo que lea el captulo 10. Esto asegurar los ejemplos y los estilos de codificacin son fciles de seguir.

Construir una aplicacin de dibujo en Flash


Esta aplicacin toma el dibujo (vase la figura 13.1) y usa PHP para crear un formato de imagen exportable. La primera parte del cdigo es responsable de la parte de dibujo de la aplicacin.

327

FIGURA 13.1 Aqu est la aplicacin de dibujo terminado.

API de dibujo en Flash


La API de dibujo que se incluye con Flash ofrece una amplia gama de herramientas, como lneas, crculos, cuadrados, y degradados. Este ejemplo se centra en la lnea para crear un flash basado en la herramienta de dibujo. Una vez abierto el archivo de inicio {START_FILE}, se puede comenzar a establecer las variables de inicializacin que se mantenga el color del lpiz y el tamao por defecto, as como el contenedor de referencia.
var penMC:MovieClip; var isDrawing:Boolean = false; var penTipSize:uint = 1; var penColor:Number = 0x000000;

La aplicacin de dibujo se cre para elaborar la lnea cuando el botn se mantiene presionado y se detendr cuando se suelta el botn del ratn. Durante el tiempo que el botn del ratn se establece un llamado persistente a una funcin de desplazamiento del ratn se produce al colocar el punto de la pluma en una ubicacin diferente. La pluma est programado para trazar la lnea donde se encuentra el puntero del ratn. 328

El siguiente paso es la construccin de los controladores de eventos que se utilizar para determinar el estado de la pluma y habilitar o deshabilitar la capacidad de dibujo. La variable isDrawing se alterna para definir el estado actual de la aplicacin. Este mtodo startDrawing () slo es llamado cuando el ratn hace clic. Es importante que una lnea nueva se crea en caso de que el color o el tamao de las variables han cambiado.
function startDrawing(e:MouseEvent):void { trace(Start Drawing); isDrawing = true; penMC.graphics.lineStyle(penTipSize, penColor, 1.0); penMC.graphics.moveTo(mouseX, mouseY); }

Despus de la bandera de dibujo se establece que puede comenzar a dibujar el trazo de lpiz reales (s). La posicin de la pluma est determinado por la ubicacin actual del puntero del ratn.
function drawing(e:MouseEvent):void { if(isDrawing) { penMC.graphics.lineTo(mouseX, mouseY); } }

Ahora que la lnea est siendo debidamente elaborados, es una buena idea para evitar que una vez que se suelta el botn del ratn. Esto se hace colocando un controlador para el evento de ratn.
function stopDrawing(e:MouseEvent):void { trace(Stop Drawing); isDrawing = false; }

El ltimo mtodo en este ejemplo es bastante complejo. Es responsable de la construccin de la caja de herramientas y de inicializar el evento de controladores de ratn.
function init():void { penMC = new MovieClip(); stage.addEventListener(MouseEvent.MOUSE_DOWN, startDrawing); stage.addEventListener(MouseEvent.MOUSE_UP, stopDrawing); stage.addEventListener(MouseEvent.MOUSE_MOVE, drawing); addChild(penMC); ...

La caja de herramientas est formado por clips de pelcula que ya estn en el escenario y convenientemente identificado dentro de un movieclip contenedor.
toolsMC.swatchPurpleMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0x9999CC; }); toolsMC.swatchBlueMC.addEventListener(MouseEvent.CLICK, function():void {

329

penColor = 0x0000FF; }); toolsMC.swatchRedMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0xFF0000; }); toolsMC.swatchGreenMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0x00FF00; }); toolsMC.swatchOrangeMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0xFF9900; }); toolsMC.swatchBlackMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0x000000; }); toolsMC.brushSize1MC.addEventListener(MouseEvent.CLICK, function():void { penTipSize = 1; }); toolsMC.brushSize2MC.addEventListener(MouseEvent.CLICK, function():void { penTipSize = 2; }); toolsMC.brushSize4MC.addEventListener(MouseEvent.CLICK, function():void { penTipSize = 4; }); toolsMC.brushSize6MC.addEventListener(MouseEvent.CLICK, function():void { penTipSize = 6; });

Cuando todas las herramientas estn en su lugar, los canjes de contenedores en las profundidades con el movieclip pluma para asegurarse de que no se puede querer aprovechar la interfaz de la herramienta.
swapChildren(toolsMC, penMC); }

Ahora que se establece el cdigo ActionScript para la aplicacin de dibujo, aqu est el cdigo completado:
var penMC:MovieClip; var isDrawing:Boolean = false; var penTipSize:uint = 1;

330

var penColor:Number = 0x000000; function init():void { penMC = new MovieClip(); stage.addEventListener(MouseEvent.MOUSE_DOWN, startDrawing); stage.addEventListener(MouseEvent.MOUSE_UP, stopDrawing); stage.addEventListener(MouseEvent.MOUSE_MOVE, drawing); addChild(penMC); toolsMC.swatchPurpleMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0x9999CC; }); toolsMC.swatchBlueMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0x0000FF; }); toolsMC.swatchRedMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0xFF0000; }); toolsMC.swatchGreenMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0x00FF00; }); toolsMC.swatchOrangeMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0xFF9900; }); toolsMC.swatchBlackMC.addEventListener(MouseEvent.CLICK, function():void { penColor = 0x000000; }); toolsMC.brushSize1MC.addEventListener(MouseEvent.CLICK, function():void { penTipSize = 1; }); toolsMC.brushSize2MC.addEventListener(MouseEvent.CLICK, function():void { penTipSize = 2; }); toolsMC.brushSize4MC.addEventListener(MouseEvent.CLICK, function():void { penTipSize = 4; }); toolsMC.brushSize6MC.addEventListener(MouseEvent.CLICK,

331

function():void { penTipSize = 6; }); swapChildren(toolsMC, penMC); } function startDrawing(e:MouseEvent):void { trace(Start Drawing); isDrawing = true; penMC.graphics.lineStyle(penTipSize, penColor, 1.0); penMC.graphics.moveTo(mouseX, mouseY); } function drawing(e:MouseEvent):void { if(isDrawing) { penMC.graphics.lineTo(mouseX, mouseY); } } function stopDrawing(e:MouseEvent):void { trace(Stop Drawing); isDrawing = false; } init();

Eso es todo lo que hay es una aplicacin de dibujo bsico en Flash. Puede ampliar este ejemplo, dando consejos de lpiz diferente o tal vez algunos de diferentes colores para permitir el sombreado de estilos de pintura y otros. La siguiente seccin se basa en este ejemplo y usa PHP para hacer y guardar la imagen en el servidor.

Uso de la libreria GD en PHP


La librera GD de PHP es una coleccin de funciones que te dan la habilidad para manipular y crear imgenes. GD tambin tiene soporte de texto siempre que usted haya instalado las bibliotecas correctas. Trabajar con la biblioteca GD es bastante sencillo, ya sea crear una imagen o abrir una imagen existente como base y modificarlo segn sea necesario. Uno de los usos ms comunes de la biblioteca GD incluye la creacin automtica de marcas de agua que se aplican a una galera de imgenes. Algunos lo utilizan para crear miniaturas dinmicas, similar a la forma en que su editor de imgenes locales hara.
http://www.php.net/manual/en/ref.image.php

La biblioteca GD ofrece una lista enorme de funciones, pero algunos de ellos requieren de libreras adicionales. De hecho, es una buena idea ejecutar un cdigo, como el siguiente, para determinar lo que est instalado.
<?php var_dump(gd_info()); ?>

332

Este cdigo imprime lo que la situacin de los diferentes componentes de GD son, como lo que es y no est instalado. Este es el resultado de la muestra de la llamada var_dump.
array(9) { [GD Version] => string(24) bundled (2.0 compatible) [FreeType Support] => bool(false) [T1Lib Support] => bool(false) [GIF Read Support] => bool(true) [GIF Create Support] => bool(false) [JPG Support] => bool(false) [PNG Support] => bool(true) [WBMP Support] => bool(true) [XBM Support] => bool(false) }

El cdigo anterior le permite saber que usted no tiene FreeType (fuente) y JPG (imagen) el apoyo habilitado o instalado. Con esta informacin, usted puede continuar e instalar las libreras necesarias. Tenga en cuenta que la instalacin de aplicaciones en un entorno de lnea de comandos no es tan simple como un doble clic. Se trata de construir extensa de herramientas y, a veces requiere de otras bibliotecas, lo que significa que puede tomar un montn de trabajo para obtener el kit completo de trabajo GD. Si usted es presionado por el tiempo y estn trabajando a nivel local se puede echar un vistazo a las opciones de inicio rpido disponible en el captulo 1, que vienen con una versin completa de PHP y GD. Si est ejecutando desde un sistema remoto lo mejor es ponerse en contacto con su host web para las solicitudes de instalacin. PRECAUCIN La biblioteca GD (bsicos) no viene con cada versin de PHP. Consulte con su servidor o instalar segn sea necesario. Desde este punto avanza paquete GD debe estar instalado con al menos apoyo JPG a fin de completar los ejemplos. Antes de construir la aplicacin final, es mejor para familiarizarse con la biblioteca GD mirando algunos ejemplos. He aqu un ejemplo GD simple que crea un rectngulo de color rosa y los resultados al explorador como un archivo JPG (vase la figura 13.2).
$image = imagecreate(250, 80); $bgColor = imagecolorallocate($image, 255, 0, 120); header(Content-Type: image/jpeg); imagejpeg($image);

333

FIGURA 13.2 Aqu est la imagen que fue generada por la librera GD, utilizando el cdigo simple.

Esta es una continuacin del ejemplo anterior, pero esta vez se guarda el archivo JPG al el servidor Web. Al agregar un segundo argumento a la funcin imagejpeg(), que es un nombre de archivo, la imagen se guarda con el nombre de archivo sample.jpg en lugar de ser una salida en el navegador.
$image = imagecreate(250, 80); $bgColor = imagecolorallocate($image, 255, 0, 120); header(Content-Type: image/jpeg); imagejpeg($image, ./sample.jpg);

Si bien estos ejemplos son bastante simples que deben dar una idea de cmo trabajar con la librera GD. Si usted tiene otras bibliotecas instalado, puede representar el texto en las imgenes, entre otros muchos resultados muy interesantes. La biblioteca GD es una gran caracterstica de PHP y ha llegado realmente til para muchas tareas, no importa cun grande. Ahora, vamos a pasar a la aplicacin real que se inici en la seccin anterior. El ActionScript es permitir a los usuarios dibujar una imagen y cambiar la configuracin, y todo funciona a la perfeccin, sin embargo, el usuario no es capaz de guardar la imagen, a menos que lo imprime. La idea es inspeccionar la imagen y enviar los datos a PHP, que ser responsable de la creacin de un pxel por pxel de la imagen y guardarla en el servidor Web. 334

Generar una imagen en la libreria GD


Esta seccin se centra en el uso de PHP para hacer que la imagen que se dibuja en la aplicacin Flash. Normalmente, se comienza con el cdigo PHP en primer lugar, pero en esta aplicacin, el PHP se utiliza solamente como un renderizador de lo que tiene sentido comenzar con la parte de Flash. La mayora de la aplicacin se escribi en la seccin anterior, usted simplemente tomar ese cdigo y ampliar para agregar las acciones necesarias. El cdigo PHP se encarga de la carga del passed-in XML en un objeto que se utiliza para generar, o hacer, la imagen final. La anchura, altura, y XML son todos pasaron a partir de datos POST porque una solicitud GET fracasaria.
$width = $_POST[width]; $height = $_POST[height]; $points = simplexml_load_string($_POST[pointData]);

Cuando los datos se ha cargado correctamente, puede configurar la base de la imagen renderizada. Esto se hace utilizando la funcin imagecreatetruecolor(), que es parte de la librera GD.
$img = imagecreatetruecolor($width, $height);

La imagen real se genera un bucle a travs de todos los datos XML que est sacando los valores de color que fueron capturados en Flash.
$limit = count($points->point); for($j=0; $j < $limit; $j++) { $x = $points->point[$j]->x; $y = $points->point[$j]->y; $color = $points->point[$j]->c; $color = hexdec($color); imagesetpixel($img, $x, $y, $color); }

Los datos de los pxeles se colocan en un patrn de cuadrcula de una lnea a la vez, la $x y $y son el punto de cada color se va a colocar. Todos estos datos se pasa a la funcin Imagesetpixel en cada paso del bucle interior. El ltimo paso del PHP una vez creada la imagen para representar la imagen como PNG, tal como se muestra en la Figura 13.3, y gurdelo en el sistema de archivos.
header(Content-Type: image/png); imagepng($img, render_ . time() . .png);

335

FIGURA 13.3 Una imagen de muestra representa como un PNG

PRECAUCIN El proceso de construccin de un pxel de la imagen por pxeles es intensivo del procesador y puede tomar mucho tiempo, dependiendo del tamao de la imagen. Aqu est el cdigo PHP completado:
<?php $width = $_POST[width]; $height = $_POST[height]; $points = simplexml_load_string($_POST[pointData]); $img = imagecreatetruecolor($width, $height); $limit = count($points->point); for($j=0; $j < $limit; $j++) { $x = $points->point[$j]->x; $y = $points->point[$j]->y; $color = $points->point[$j]->c;

336

$color = hexdec($color); imagesetpixel($img, $x, $y, $color); } header(Content-Type: image/png); imagepng($img, render_ . time() . .png); ?>

Recoleccin de datos de pixel en Flash


Hay slo algunas actualizaciones necesarias para el cdigo de Flash de la seccin anterior, pero por ahora se centran en la recopilacin de los datos de la imagen utilizando la clase BitmapData. El primer paso en esta funcin es determinar las dimensiones de la imagen.
var width:uint = penMC.width; var height:uint = penMC.height;

La siguiente variable a definir es la referencia de archivo PHP.


var phpFile:String = http://localhost/ch12/DrawingGD/ImageGenerator.php;

El siguiente paso es construir un nuevo mapa de bits utilizando el mtodo draw() de la clase BitmapData. El mtodo draw realiza un argumento, que es el objetivo. Este mtodo toma el argumento y copia los datos de los pxeles al nuevo mapa de bits.
var bmp:BitmapData = new BitmapData(width, height, true, 0xFFFFFF); bmp.draw(penMC);

Despus de que el nuevo mapa de bits es creado, usted puede construir un bucle que se analizar el mapa de bits y agarrar el color de cada pxel.
var xml:String = <points>; for(var i:uint=0; i < width; i++) { for(var j:uint=0; j < height; j++) { var color:String = bmp.getPixel(i, j).toString(16); if(color == 0) { color = FFFFFF; } xml xml xml xml xml } } += += += += += <point>; \t<x> + i + </x>; \t<y> + j + </y>; \t<c> + color + </c>; </point>;

337

xml += </points>;

Los datos de color se almacena un elemento en el documento XML personalizado que se enva fuera de PHP, una vez escaneado toda la imagen. Las variables se almacenan en una nueva instancia de la URLVariables objeto y se pasa a PHP en el formato de datos POST.
var urlVariables:URLVariables = new URLVariables(); urlVariables.width = width; urlVariables.height = height; urlVariables.pointData = xml; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.method = URLRequestMethod.POST; urlRequest.data = urlVariables; sendToURL(urlRequest);

La respuesta es enviada a PHP usando el mtodo de sendToURL. Este silencio, llama al servidor web y no espera ninguna respuesta. La razn para usar este mtodo es porque la solicitud ser bastante grande si la imagen se ha prestado una gran cantidad de datos de pxeles.

Uso de Flash para construir un monitor del sitio web


Cuando se posee u opera un sitio web que a veces puede ir fuera de lnea, pero probablemente nunca se sabr si se establecen slo por un breve momento, a menos que se est consultando en el sitio. Qu sucede si usted opera muchos sitios Web y estn ocupados trabajando mientras que su sitio se cae? Ms probable es que su sitio se desconecta y no son conscientes de ello. Esta seccin contiene la explicacin y el desarrollo de un seguimiento basado en Flash de la web que registra los intentos fallidos de acceder al servidor. Incluso puede ser configurado para el administrador de e-mail si el sistema encuentra un sitio que no ha respondido despus de cierto punto (configurable por el operador).

El esquema de tabla de MySQL (esquema) es el siguiente:


CREATE TABLE siteMonitor ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) DEFAULT NOT NULL, uri TEXT NOT NULL, active VARCHAR(1) DEFAULT 1 NOT NULL, PRIMARY KEY (id) );

CROSS--REF Hay muchas maneras que usted puede cargar el esquema de MySQL en su base de datos. Para obtener una explicacin, vase el captulo 2.

Desarrollar el PHP para el monitor del sitio web


La primera parte de la carga en PHP es la informacin de conexin para la base de datos. Este se coloca en un archivo externo, por lo que puede ser compartida a travs de proyectos. De hecho, si usted est utilizando la misma base de datos como ejemplos anteriores de este libro, se puede reutilizar el viejo dbconn.php, porque no ser cambiado para esta aplicacin. 338

Si usted an no ha creado el dbconn.php, aqu estn los contenidos. Se llena la informacin real para su servidor, que se pueden obtener del administrador del servidor Web si usted no es el propietario, o su proveedor de alojamiento si usted es dueo de su servidor.
<?php $host = localhost; $user = USERNAME; $pass = PASSWORD; $database = DATABASE_NAME; $link = mysql_connect($host, $user, $pass); mysql_select_db($database, $link); unset($host); unset($user); unset($pass); unset($database); ?>

Despus de la conexin de la base de datos se establece puede continuar el desarrollo del archivo monitor.php. La $action se pasa a lo largo de la direccin, pero debe ser vlido para que la secuencia de comandos para saber qu estado debe estar en ejecucin.
$action = (isset($_GET[action])) ? $_GET[action] : ;

Suponiendo que la accin es vlida y el valor es getsites, que est configurado para devolver una lista de los sitios que estn siendo monitoreadas. El proceso de recuperar la lista de sitios se lleva a cabo mediante un bucle que se carga en la informacin de la base de datos MySQL. La lista de sitios se devuelve a Flash como un objeto XML que definen cada uno de los sitios y donde se encuentran. El SQL para recuperar la lista est configurado para cargar todas las entradas donde el valor de activo es igual a 1.
SELECT * FROM siteMonitor WHERE active=1

Despus que los datos de SQL se recupera, se pasa a un bucle while, que es responsable de la apropiacin cada fila y la construccin de una lnea de XML que define la informacin del sitio.
$result = mysql_query(SELECT * FROM siteMonitor WHERE active=1); $xml = <?xml version=\1.0\ ?>\n; $xml .= <sites>\n; while($row = mysql_fetch_array($result)) { ... } $xml .= </sites>;

La lnea de XML est construido utilizando los datos $row, que se transmite en la funcin sprint(). El sprintf se utiliza para rellenar automticamente el cdigo XML necesario atributos utilizando la fila de datos de SQL.
$xml .= sprintf(\t<site name=\%s\ uri=\%s\ />\n,

339

$row[name], $row[uri]);

Ahora que se ha construido los datos XML, es enviada al navegador y regres a Flash. Esto se logra estableciendo el tipo de contenido de la respuesta al texto/xml, que es el tipo de MIME de XML. Entonces, el ltimo paso es utilizar una declaracin de hecho la salida de impresin a los datos.
header(Content-type: text/xml); print $xml;

Aqu est una muestra de la respuesta que se devolvera a Flash:


<?xml version=1.0 ?> <sites> <site name=Adobe uri=http://www.adobe.com /> <site name=AIRPlayground uri=http://www.airplayground.com /> <site name=mkeefeDESIGN uri=http://www.mkeefedesign.com /> <site name=Google uri=http://www.google.com /> </sites>

Uso de PHP para e-mail del administrador


Cuando un sitio ha sido inalcanzable para una cierta cantidad de tiempo, es probablemente una buena idea para notificar a alguien. La notificacin se enva utilizando el construido en funcin mail(). El e-mail alertas al administrador de un servidor de lo que el sitio est experimentando el corte y en qu momento se envi el informe, en el caso raro el correo electrnico se retrasa o no es notado de inmediato. El primer paso es verificar la accin anterior se establece en e-mail al administrador. De lo contrario, este bloque de cdigo completo sera ignorado.
else if($action == emailadmin) { ... }

Si la accin (action) es vlido, el siguiente paso es construir el mensaje de correo electrnico y recuperar los valores pasados de Flash que definir el sitio experimentando el apagn.
$from = sitemonitor@yoursite.com; $to = admin@yoursite.com; $site = $_GET[site]; $siteURI = $_GET[siteURI]; $date = date(F j, Y \\a\\t h:i a, time()); // todays date

El cuerpo del e-mail se define como una serie de variables $emailInfo concatenados con el punto (.), Que se utiliza para que PHP conocer esta variable es una continuacin.
$emailInfo $emailInfo $emailInfo $emailInfo $emailInfo $emailInfo = ; .= **This is an automated response**.\n\n; .= The site status monitor has been informed\n; .= the following site is not responding:\n; .= -----------------------------------------\n; .= Site: . $site . [ . $siteURI . ]\n;

340

$emailInfo .= Date Sent: . $date . \n\n; $emailInfo .= -----------------------------------------\n;

El encabezado del correo electrnico debe seguir la especificacin que define cmo el e-mail se va a construir y el $from de valor tiene que ser vlido, a pesar de que la actual direccin de correo electrnico no es utilizada.
// Mail headers, do not alter $mailHeaders = From: . $from . <> \n\n;

Cuando todas las variables y la informacin de correo electrnico se han creado, el correo electrnico reales pueden ser enviados. Esto se hace realizando una llamada a la funcin mail(), pasando por la informacin que fue construido en los pasos anteriores.
if(mail( $to, Automated response from Site Monitor, $emailInfo, $mailHeaders)) { print result=success; }

NOTA La funcin mail() devuelve un mensaje de xito si la funcin es llamada correctamente. La funcin no sabe el estado del envo efectivo del e-mail. Aqu est el cdigo PHP completado para monitor.php:
<?php require(dbconn.php); $action = (isset($_GET[action])) ? $_GET[action] : ; if($action == getsites) { $result = mysql_query(SELECT * FROM siteMonitor WHERE active=1); $xml = <?xml version=\1.0\ ?>\n; $xml .= <sites>\n; while($row = mysql_fetch_array($result)) { $xml .= sprintf(\t<site name=\%s\ uri=\%s\ />\n, $row[name], $row[uri]); } $xml .= </sites>; header(Content-type: text/xml); print $xml; } else if($action == emailadmin) { $from = sitemonitor@yoursite.com; $to = admin@yoursite.com;

341

$site = $_GET[site]; $siteURI = $_GET[siteURI]; $date = date(F j, Y \\a\\t h:i a, time()); // todays date $emailInfo $emailInfo $emailInfo $emailInfo $emailInfo $emailInfo $emailInfo $emailInfo = ; .= **This is an automated response**.\n\n; .= The site status monitor has been informed\n; .= the following site is not responding:\n; .= -----------------------------------------\n; .= Site: . $site . [ . $siteURI . ]\n; .= Date Sent: . $date . \n\n; .= -----------------------------------------\n;

// Mail headers, do not alter $mailHeaders = From: . $from . <> \n\n; print $emailInfo; if(mail( $to, Automated response from Site Monitor, $emailInfo, $mailHeaders )) { print result=success; } } ?>

Desarrollo del ActionScript para el monitor del sitio web


En este punto, el cdigo de PHP ha sido completado, y la siguiente seccin se centra en el proceso de desarrollo de ActionScript. El archivo Flash se ha previsto para este ejemplo en el sitio Web del libro, que tiene todos los elementos de diseo en el lugar, como se muestra en la figura 13.4, para que pueda centrarse en el desarrollo.

342

FIGURA 13.4 Aqu est la solicitud completa con uno de los lugares con indicacin de un fracaso.

Aqu est el esqueleto de clase para la clase de documento.


package { import flash.display.MovieClip; import flash.net.*; import flash.events.*; public class SiteMonitor extends MovieClip { public function SiteMonitor() {} private function loadSites():void {} private function loadSiteHandler(e:Event):void {} } }

El constructor de la clase de documento es responsable de asignar el movieclip siteContainer, y agreg que movieclip a la lista de visualizacin y, finalmente, hacer una llamada al mtodo loadSites().
siteContainer = new MovieClip(); siteContainer.y = 80; siteContainer.x = 20;

343

addChild(siteContainer); loadSites();

El mtodo loadSites() es el responsable de cargar la lista de sitios para ver. Un evento se une a la secuencia de carga, que se llama cuando los datos de la web es recuperado con xito.
var variables:URLVariables = new URLVariables(); variables.action = getsites; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = variables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, loadSiteHandler); urlLoader.load(urlRequest);

El siguiente mtodo se llama cuando los datos del sitio se carga correctamente. Un evento es pasado como un argumento que contiene la respuesta de PHP.
private function loadSiteHandler(e:Event):void { ... }

La respuesta es XML, lo que es necesario crear primero un objeto XML que se utiliza un bucle for..each.
var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); var i:uint = 0; for each(var item in xml..site) { ... } }

El contenido del bucle for..each crea una nueva instancia de la clase SiteMonitorItem que se adjunta a un clip de pelcula en la lnea de tiempo del mismo nombre.
var siteItem:SiteMonitorItem = new SiteMonitorItem(); siteItem.phpFile = phpFile; siteItem.siteURI = item..attribute(uri); siteItem.siteNameTxt.text = item..attribute(name); siteItem.statusMC.gotoAndStop(2); siteItem.y = (i * (siteItem.height + 10)); siteContainer.addChild(siteItem); i++;

La variable siteItem tiene la instancia de clase de nueva creacin, que se utiliza para asignar el phpfile, siteURI, y el nombre del sitio. El uri y el nombre del sitio se analizan desde el objeto XML utilizando el mtodo attribute(), que tiene un argumento que es el nombre del atributo que est buscando. La colocacin del objeto siteItem est determinado por una ecuacin simple, utilizando la altura del objeto y el valor de la variable i, luego de tomar esa suma y aadiendo un relleno 10px. 344

En este punto se termina la clase de documento. Aqu est el cdigo completado:


package { import flash.display.MovieClip; import flash.net.*; import flash.events.*; public class SiteMonitor extends MovieClip { public var siteContainer:MovieClip; public var phpFile:String = http://localhost/SiteMonitor/monitor.php; public function SiteMonitor() { siteContainer = new MovieClip(); siteContainer.y = 80; siteContainer.x = 20; addChild(siteContainer); loadSites(); } private function loadSites():void { var variables:URLVariables = new URLVariables(); variables.action = getsites; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = variables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, loadSiteHandler); urlLoader.load(urlRequest); } private function loadSiteHandler(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); var i:uint = 0; for each(var item in xml..site) { var siteItem:SiteMonitorItem = new SiteMonitorItem(); siteItem.phpFile = phpFile; siteItem.siteURI = item..attribute(uri); siteItem.siteNameTxt.text = item..attribute(name); siteItem.statusMC.gotoAndStop(2); siteContainer.addChild(siteItem); siteItem.y = (i * (siteItem.height + 10)); siteItem.checkSite();

345

i++; } } } }

La prxima clase a centrarse es SiteMonitorItem, que se asigna al movieclip en la biblioteca del mismo nombre. Aqu est el esqueleto de la clase de esa clase:
package { public class SiteMonitorItem extends MovieClip { public function SiteMonitorItem() {} public function checkSite():void {} private function noResponse(event:IOErrorEvent):void {} private function siteResponsedHandler(e:Event):void {} private function stopChecking():void {} public function get attempts():uint {} public function set attempts(num:uint):void {} } }

El constructor de esta clase est vaca, por lo que puede dejar fuera y contine con el mtodo siguiente, que es checkSite(). Este mtodo es llamado por la clase de documento cuando el temporizador expira esperar. El objetivo de este mtodo consiste en comenzar la accin de control del sitio y el controlador correcto en funcin de la respuesta recibida.
public function checkSite():void { var urlRequest:URLRequest = new URLRequest(siteURI); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, siteResponsedHandler); urlLoader.addEventListener(IOErrorEvent.IO_ERROR, noResponse); urlLoader.load(urlRequest); }

La mayora de este mtodo es el mismo que los ejemplos anteriores, con la excepcin de que el segundo evento listener (oyente). Este detector de eventos se asigna a la IO_ERROR, que ocurre cuando un archivo no se carga correctamente o llamado. El mtodo noResponse() ser llamado cuando el sitio no puede ser cargado, como se muestra aqu:
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, noResponse);

El mtodo noResponse() es responsable de incrementar la variable failedAttempts, pero utilizando un mtodo setter en lugar de acceder directamente a la variable.
private function noResponse(event:IOErrorEvent):void { attempts = attempts + 1; }

346

Si se carga el sitio, una llamada a siteResponsedHandler() se hace para borrar los intentos anteriores fracasaron y, bsicamente, restablecer la cuenta de errores.
private function siteResponsedHandler(e:Event):void { failedAttempts = 0; }

Una llamada a stopChecking() se produce cuando un sitio no responde despus de un nmero determinado de veces, fijada por la constante MAX_ATTEMPTS.
private function stopChecking():void { stopCheck = true; }

Los dos ltimos mtodos de esta clase son el getter y set para la variable failedAttempts. El captador (getter) simplemente devuelve el valor actual del valor failedAttempts. El setter no slo los incrementos de variable failedAttempts, sino que tambin determina si todos los controles futuro debe interrumpirse segn el recuento actual fracaso.
public function get attempts():uint { return failedAttempts; } public function set attempts(num:uint):void { if(num == undefined) { failedAttempts++; } else { failedAttempts = num; } if(failedAttempts == MAX_ATTEMPTS) { statusMC.gotoAndStop(1); stopChecking(); } }

Si failedAttempts es igual a la constante MAX_ATTEMPTS, una llamada a stopChecking() se hace y se mueve el indicador de estado para el primer cuadro que muestra un crculo rojo. En este punto la clase SiteMonitorItem ya est completo y la pelcula de Flash pueden ser examinados para asegurarse de que funciona correctamente con el cdigo PHP por escrito antes. Lo que sigue es la clase de archivo completado SiteMonitorItem que se adjunta a la movieclip del mismo nombre:
package {

347

import import import import

flash.display.MovieClip; flash.net.*; flash.events.*; flash.text.TextField;

public class SiteMonitorItem extends MovieClip { public var phpFile:String; public var siteURI:String; private var stopCheck:Boolean = false; private var failedAttempts:uint = 0; private const MAX_ATTEMPTS:uint = 3; public function SiteMonitorItem() { } public function checkSite():void { var urlRequest:URLRequest = new URLRequest(siteURI); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, siteResponsedHandler); urlLoader.addEventListener(IOErrorEvent.IO_ERROR, noResponse); urlLoader.load(urlRequest); } private function noResponse(event:IOErrorEvent):void { attempts = attempts + 1; } private function siteResponsedHandler(e:Event):void { failedAttempts = 0; } private function stopChecking():void { stopCheck = true; } public function get attempts():uint { return failedAttempts; } public function set attempts(num:uint):void { if(num == undefined) { failedAttempts++; } else { failedAttempts = num;

348

} if(failedAttempts == MAX_ATTEMPTS) { statusMC.gotoAndStop(1); stopChecking(); } } } }

Uso de Flash para construer un reproductor de video


Reproductores de vdeo, como el que se ilustra en la figura 13.5, son cada vez ms popular como la Internet sigue para llegar ms rpido. La idea detrs de esta seccin es desarrollar un reproductor de vdeo que se interconecta con PHP para cargar en la lista de vdeos, as como el seguimiento de la obra cuenta. Flash ya los buques con un muy verstil reproductor de vdeo por componentes, pero an se puede ampliar, lo que es exactamente lo que esta seccin le ayudar a alcanzar. La aplicacin est construida con un componente ComboBox VideoPlayer y que ya se ha colocado en el escenario. El archivo de inicio {START_FILE} se presta para que usted pueda centrarse en el desarrollo y rpidamente puede poner a prueba a medida que avanza.

349

FIGURA 13.5 Un reproductor de vdeo con un vdeo cargado y reproduciendo

NOTA Usted necesita un archivo de vdeo FLV a fin de probar esta aplicacin. Uno se incluye con el material encontrado en el sitio Web del libro. Muchas de las aplicaciones desarrolladas en Flash constar de unos ActionScript. La complejidad de la ActionScript se determinar sobre la base de lo que la aplicacin ser. En este ejemplo va a utilizar una clase externa para desarrollar el reproductor de vdeo. La primera parte de la aplicacin a desarrollar es el cdigo ActionScript, que se divide en clases de una mayor escalabilidad. El ActionScript principal se adjuntar a la aplicacin utilizando la clase de document. Para empezar, examine la estructura de clase, que le dar una mejor idea de cmo la aplicacin fluye.
package { public class VideoPlayer extends MovieClip { public function VideoPlayer(){} public function loadData():void {} private function dataLoaded(e:Event):void {}

350

private function comboHandler(e:Event):void {} } }

El mtodo constructor de la clase de documento es responsable de asignar la instancia VideoPlayer. Tambin es el punto donde se definen los detectores de eventos necesarios.
_player = this[player]; this[videoListCombo].addEventListener(Event.CHANGE, comboHandler);

La ltima parte del mtodo constructor es llamar al mtodo LoadData y recoger los datos XML.
loadData();

El mtodo LoadData() es para cargar los datos de vdeo, que se devuelve en formato XML.
public function loadData():void { var urlVariables:URLVariables = new URLVariables; urlVariables.a = getvideos; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = urlVariables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, dataLoaded); urlLoader.load(urlRequest); }

Aqu est una muestra de la respuesta XML, que tiene los atributos de poblacin en lugar de los nodos.
<videos> <video name=Sample <video name=Sample <video name=Sample <video name=Sample <video name=Sample <video name=Sample </videos> Video Video Video Video Video Video 1 2 3 4 5 6 src=color1.flv src=color2.flv src=color3.flv src=color4.flv src=color5.flv src=color6.flv playCount=7 playCount=3 playCount=5 playCount=4 playCount=1 playCount=2 /> /> /> /> /> />

Despus de los datos objeto XML se carga, una llamada a dataLoaded() se hace, que es responsable de llenar el ComboBox. Un bucle for..each se utiliza para analizar los datos de vdeo, que se aade al componente ComboBox.
this[videoListCombo].addItem({label:Choose Video..., data:1}); for each(var item in xml..video) { var name:String = item..attribute(name); var src:String = item..attribute(src); this[videoListCombo].addItem({label:name, data:src}); }

351

El ltimo mtodo de la clase de documento es un controlador de eventos para el componente ComboBox.


private function comboHandler(e:Event):void { if(e.target.selectedItem.data == -1) return; trace(Load Video: + e.target.selectedItem.data); _player.source = videos/ + e.target.selectedItem.data; }

Este mtodo controlador de eventos se utiliza para cargar el archivo de vdeo, pero slo si se encuentra un valor de datos vlidos. Una simple declaracin de if (si) se utiliza para determinar si se selecciona la etiqueta.
if(e.target.selectedItem.data == -1) return;

Eso es todo lo que hay a esta clase. Esta es la clase de documento terminado:
package { import flash.display.MovieClip; import flash.events.*; import flash.net.URLVariables; import flash.net.URLRequest; import flash.net.URLLoader; import flash.media.Video; public class VideoPlayer extends MovieClip { public var phpFile:String = http://localhost/ ch12/VideoPlayer/videoManager.php; private var _player:FLVPlayback; public function VideoPlayer() { _player = this[player]; this[videoListCombo].addEventListener( Event.CHANGE, comboHandler); loadData(); } public function loadData():void { var urlVariables:URLVariables = new URLVariables; urlVariables.a = getvideos; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = urlVariables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, dataLoaded); urlLoader.load(urlRequest); } private function dataLoaded(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data);

352

this[videoListCombo].addItem({ label:Choose Video..., data:-1}); for each(var item in xml..video) { var name:String = item..attribute(name); var src:String = item..attribute(src); this[videoListCombo].addItem({ label:name, data:src}); } } private function comboHandler(e:Event):void { if(e.target.selectedItem.data == -1) return; trace(Load Video: + e.target.selectedItem.data); _player.source = videos/ + e.target.selectedItem.data; } } }

El siguiente paso es desarrollar el cdigo PHP que se utiliza para devolver un objeto XML. Para este ejemplo, los datos de vdeo es un conjunto esttico, pero que puede actualizar fcilmente para utilizar una base de datos MySQL similares a los ejemplos anteriores.
$videos = array( array(Sample Video array(Sample Video array(Sample Video array(Sample Video array(Sample Video array(Sample Video ); 1, 2, 3, 4, 5, 6, color.flv, color.flv, color.flv, color.flv, color.flv, color.flv, 0), 0), 0), 0), 0), 0)

Este ejemplo slo tiene una accin, que es recuperar la lista de vdeo y crear un objeto XML que se pasa de nuevo a Flash.
if($action == getvideos) { $xml = <videos>; for($i=0; $i < count($videos); $i++) { $xml .= \t<video; $xml .= name=\ . $videos[$i][0] . \; $xml .= src=\ . $videos[$i][1] . \; $xml .= playCount=\ . $videos[$i][2] . \; $xml .= />\n; } $xml .= </videos>;

Despus de que el objeto XML se crea, un tipo de encabezado de XML es emitida, el ltimo paso es la salida el cdigo XML real.
header(Content-type: text/xml); print $xml;

353

Eso es todo el cdigo PHP que se necesita para desarrollar este programa de vdeo. Aqu est el PHP completado:
<?php $action = (isset($_GET[a])) ? $_GET[a] : ; $videos = array( array(Sample Video array(Sample Video array(Sample Video array(Sample Video array(Sample Video array(Sample Video ); 1, 2, 3, 4, 5, 6, color.flv, color.flv, color.flv, color.flv, color.flv, color.flv, 0), 0), 0), 0), 0), 0)

if($action == getvideos) { $xml = <videos>; for($i=0; $i < count($videos); $i++) { $xml .= \t<video; $xml .= name=\ . $videos[$i][0] . \; $xml .= src=\ . $videos[$i][1] . \; $xml .= playCount=\ . $videos[$i][2] . \; $xml .= />\n; } $xml .= </videos>; header(Content-type: text/xml); print $xml; } ?>

Desarrollar una aplicacin de encuesta


Una encuesta es una caracterstica muy comn de cualquier sitio Web, pero una persona con frecuencia utiliza un servicio que administra la encuesta en lugar de crear su propia cuenta. El principal problema con este enfoque es que sus datos estn en algn otro servidor. Un problema menos comn es la falta de libertad con el diseo de la aplicacin de encuesta.

Creando el PHP y MySQL


Esta aplicacin consiste en el diseo, el desarrollo de PHP y ActionScript para desarrollar una aplicacin plena de votacin funcionales, como la que se muestra en la Figura 13.6. El foco inicial est en el cdigo SQL que almacena los datos de las encuestas.

354

FIGURA 13.6 Una aplicacin de encuesta completa muestra algunos datos del ejemplo

Para ofrecer ms de una encuesta, un nmero de identificacin nico asignado a cada respuesta que determina que la pregunta que se asocia con.
CREATE TABLE poll ( id INT NOT NULL DEFAULT 0, pollValue TEXT NOT NULL, pollType VARCHAR(20) DEFAULT NOT NULL, pollVotes INT(11) NOT NULL, active VARCHAR(1) DEFAULT 1 NOT NULL );

Este esquema de la tabla est poniendo las preguntas y respuestas en una tabla de la simplicidad. Sin embargo, en una aplicacin ms robusta que usted desea colocar las preguntas y respuestas en dos tablas separadas para una mejor escalabilidad. Esta es la manera de hacer una base de datos ms eficiente. Despus de escribir el SQL, puede pasar a desarrollar el cdigo PHP. Esta aplicacin tiene dos acciones: la capacidad de obtener datos de las encuestas y votar. En una aplicacin ms avanzado que lo ms probable es que tenga un editor y sistema de eliminacin.

355

La accin y la encuesta de identificacin son aprobadas por la direccin (URL), as que la primera parte del cdigo es responsable de almacenar la informacin.
$action = (isset($_GET[a])) ? $_GET[a] : ; $pollID = (isset($_GET[id])) ? $_GET[id] : ;

El siguiente paso es cargar los datos de una encuesta de la base de datos mediante una instruccin SELECT simple.
$sql = SELECT * FROM poll WHERE id= . $pollID; $query = mysql_query($sql);

Cuando se carga los datos de SQL, se pasa en un bucle while que es responsable de la construccin de los datos XML. Una declaracin de if se utiliza para determinar si un voto vlido est disponible, si lo es, se aade el atributo XML.
$xml = <poll id=\ . $pollID . \>\n; while($row = mysql_fetch_array($query)) { $xml .= \t<element; $xml .= type=\ . $row[pollType] . \; $xml .= value=\ . $row[pollValue] . \; if($row[pollType] == answer) { $xml .= votes=\ . $row[pollVotes] . \; } $xml .= />\n;

La segunda accin consiste en emitir un voto mediante el ID de encuesta y el valor de la pregunta como una manera nica de determinar el valor correcto a la encuesta de actualizacin.
else if($action == vote) { $votes = (isset($_GET[v])) ? $_GET[v] : ; $question = (isset($_GET[q])) ? $_GET[q] : ; $votes = $votes + 1; $sql = UPDATE poll SET pollValue= . $votes . WHERE id= . $pollID . AND pollValue= . $question; mysql_query($sql); }

El ltimo paso del PHP es generar una cabecera XML y el objeto XML creado para el navegador, donde Flash, la cargar.
header(Content-type: text/xml); print $xml;

356

Aqu est el archivo PHP concluido que se utilizar en la aplicacin de encuesta:


<?php require dbconn.php; $action = (isset($_GET[a])) ? $_GET[a] : ; $pollID = (isset($_GET[id])) ? $_GET[id] : ; if($action == getpolldata) { $sql = SELECT * FROM poll WHERE id= . $pollID; $query = mysql_query($sql); $xml = <poll id=\ . $pollID . \>\n; while($row = mysql_fetch_array($query)) { $xml .= \t<element; $xml .= type=\ . $row[pollType] . \; $xml .= value=\ . $row[pollValue] . \; if($row[pollType] == answer) { $xml .= votes=\ . $row[pollVotes] . \; } $xml .= />\n; } $xml .= </poll>; header(Content-type: text/xml); print $xml; } else if($action == vote) { $votes = (isset($_GET[v])) ? $_GET[v] : ; $question = (isset($_GET[q])) ? $_GET[q] : ; $votes = $votes + 1; $sql = UPDATE poll SET pollValue= . $votes . WHERE id= . $pollID . AND pollValue= . $question; mysql_query($sql); } ?>

Desarrollo de ActionScript para la encuesta


El cdigo ActionScript para la aplicacin de encuesta est dividida en dos partes. La primera pieza es una clase de documentos que controla la mayora de la solicitud de votacin. El segundo es un PollItem que se duplica por cada respuesta en la encuesta de carga.

357

Los datos que se cargan desde PHP se devuelve en formato XML. Aqu est una muestra de la respuesta:
<poll> <element type=question value=What is your favorite color? /> <element type=answer value=Black votes=0 /> <element type=answer value=Blue votes=0 /> <element type=answer value=Orange votes=0 /> <element type=answer value=Red votes=0 /> </poll>

La primera clase es a centrarse en la PollItem porque va a ser cargado por la clase de documento, y es el siguiente paso para trabajar en un orden lgico. Aqu est el esqueleto de clase para el PollItem:
package { public class PollItem extends MovieClip { public function PollItem() {} public function get data():Object {} public function setData(i:uint, a:String, v:uint):void {} } }

La primera parte de la clase son las variables, que en esta clase son el id, la respuesta, y el valor de la votacin para cada elemento de encuesta ejemplo.
private var ID:uint; private var answer:String; private var votes:uint;

Esta clase en realidad slo haba dos mtodos. El primer mtodo es un captador que devuelve un objeto lleno con el tema de datos.
public function get data():Object { return {id:ID, answer:, votes:votes}; }

El segundo mtodo es responsable de asignar los datos a cada partida de la encuesta. Las variables almacenadas se ajustan a privados, lo que permite al desarrollador para controlar el acceso y mantenga consistente durante el proceso de aplicacin.
public function setData(i:uint, a:String, v:uint):void { ID = i; answer = a; votes = v; }

358

Eso es todo lo que hay a la clase PollItem, que se muestra aqu completa:
package { import flash.display.MovieClip; import flash.text.TextField; public class PollItem extends MovieClip { private var ID:uint; private var answer:String; private var votes:uint; public function PollItem() {} public function get data():Object { return {id:ID, answer:, votes:votes}; } public function setData(i:uint, a:String, v:uint):void { ID = i; answer = a; votes = v; } } }

La ltima clase es la clase de documentos, que se adjunta a la etapa de establecer el valor en el inspector de propiedades. Aqu est el esqueleto de la clase:
package { public class Poll extends MovieClip { public function Poll() {} public function loadPollData():void {} public function dataLoaded(e:Event):void {} } }

El primer mtodo se llama desde el constructor y es responsable de cargar los datos de la encuesta en formato XML basado en la encuesta de identificacin que se pasa en una peticin GET.
public function loadPollData():void { var urlVariables:URLVariables = new URLVariables; urlVariables.a = getpolldata; urlVariables.id = POLL_ID; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = urlVariables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, dataLoaded); urlLoader.load(urlRequest); }

359

Despus de cargar los datos, una llamada al mtodo dataLoaded() se hace, que se encarga de mostrar los datos de encuesta con las instancias PollItem. La respuesta del servidor se enva en formato XML, que se analiza y se utiliza para construir la encuesta de grficos. Cada elemento de los datos de la encuesta se almacena como un atributo en lugar de un nodo en un intento de mantener el cdigo de peso ligero.
var type:String = item..attribute(type); var value:String = item..attribute(value); var total:uint = uint(xml..attribute(total));

La variable de type (tipo) se utiliza para determinar si un elemento es una pregunta o una respuesta.
if(type == question) { this[questionTxt].text = value; continue; } if(type == answer) { var votes:uint = uint(item..attribute(votes)); }

Las tiendas pollItem variable de la instancia de la clase PollItem, que contiene los grficos para cada elemento de la encuesta. El porcentaje se determinar con un poco de matemticas muy bsicas, que se divide el recuento de votos por el total y que se multiplica por 100 para generar un porcentaje.
var pollItem:PollItem = new PollItem(); pollItem[percentTxt].text = Math.round(votes / total * 100) + %; pollItem[barMC].width = (votes / total * 100) * 4;

El ltimo paso en el mtodo es para la alineacin de cada pollItem, adjuntando el pollItem a la lista de visualizacin, y, finalmente, aadiendo a la matriz pollItems.
pollItem.y = (pollItems.length * (pollItem.height + 20)); container.addChild(pollItem); pollItems.push(pollItem);

En este punto, la clase de documento est construido, y se muestra en su totalidad aqu:


package { import flash.display.MovieClip; import flash.events.*; import flash.net.URLVariables; import flash.net.URLRequest; import flash.net.URLLoader; import flash.text.TextField; public class Poll extends MovieClip { public var POLL_ID:uint = 1; public var phpFile:String =

360

http://localhost/ch12/Poll/poll.php; public var container:MovieClip; public var pollItems:Array; public function Poll() { pollItems = new Array(); container = new MovieClip(); container.x = 15; container.y = 100; addChild(container); loadPollData(); } public function loadPollData():void { var urlVariables:URLVariables = new URLVariables; urlVariables.a = getpolldata; urlVariables.id = POLL_ID; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = urlVariables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, dataLoaded); urlLoader.load(urlRequest); } public function dataLoaded(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var xml:XML = new XML(urlLoader.data); for each(var item in xml..element) { var type:String = item..attribute(type); var value:String = item..attribute(value); var total:uint = uint(xml..attribute(total)); if(type == question) { this[questionTxt].text = value; continue; } if(type == answer) { var votes:uint = uint(item..attribute(votes)); } var pollItem:PollItem = new PollItem(); pollItem[percentTxt].text = Math.round(votes / total * 100) + %;

361

pollItem[barMC].width = (votes / total * 100) * 4; pollItem.y = (pollItems.length * (pollItem.height + 20)); container.addChild(pollItem); pollItems.push(pollItem); } } } }

Construir un simple editor de archivos


En este punto usted ha visto una amplia seleccin de aplicaciones del mundo real, pero todava hay uno que no se ha hablado. Eso, por supuesto, sera un sistema de gestin de contenidos. Un sistema completo de gestin de contenido sera un proyecto masivo, pero esta seccin se centra en un aspecto de la aplicacin. El editor de archivo, que se utiliza para aadir y editar los archivos, es una pieza fundamental para cualquier sistema de gestin de contenido. Es probable que en algn momento el administrador va a necesitar actualizaciones realizadas. En lugar de descargar el material de origen, es mucho ms eficiente de utilizar un editor de archivos dinmico. La aplicacin de esta seccin es slo eso: un editor de archivos dinmico que est conectado a PHP para que realmente salvar y cargar los archivos. Normalmente usted puede utilizar el flash para cargar los archivos, pero PHP ofrece la posibilidad de cargar los archivos que no se almacenan en la raz Web. Esta es una buena idea para los archivos de plantilla, porque no tienen que acceder directamente por un husped. El diseo del editor de archivos es un rea de texto bsicos, el botn Enviar, TextField y ComboBox. Nada de emocionante para disear el editor de archivos, en cambio, la verdadera sustancia de la solicitud se encuentra dentro del cdigo ActionScript y PHP. Comenzando con el cdigo PHP le permite probar la parte de Flash a medida que comienza a desarrollarlo. El PHP es realmente muy simple para este ejemplo. Primero, comprobar que un archivo es vlido, porque si usted va guardar o cargar, se necesita un archivo vlido.
if(!empty($_GET[file])) { $file = ./files/ . $_GET[file]; ... }

Despus de determinar que es un archivo vlido, el siguiente paso es comprobar si la accin est en blanco. Si la accin est en blanco, el cdigo cargar automticamente la accin, si la accin contiene un valor que se compara mediante una declaracin if comunicado interno.
if($_GET[action] == save) { ... } else {

362

... }

Este ejemplo slo permite cargar y guardar los archivos. En una aplicacin ms robusta que lo ms probable es que desee tener una accin de eliminar o moverla. La accin de guardar es responsable de cargar el archivo solicitado, reemplazando el texto actual, y, finalmente, volver a guardar el archivo. Es importante sealar que el ejemplo es con vistas a una pieza fundamental para cualquier aplicacin en el mundo real, que es escapar de los datos que se envan desde Flash. Usted tambin puede agregar una clave de acceso de cdigo de forma arbitraria no puede ejecutarse en el navegador a travs de una peticin GET. La variable $fileContents recupera desde el principio los datos enviados por Flash.
$fileContents = $_GET[fileContents];

El archivo se carga mediante la funcin fopen con acceso de escritura a sobrescribir. Esto significa que el contenido original se elimina y slo la nueva versin se guarda.
$handle = fopen($file, w+);

Una vez que el archivo se carga, una llamada a fwrite () se hace, que en realidad escribe el contenido en el archivo y guarda el archivo. El ltimo paso de la accin de guadar es cerrar el archivo de recursos y liberar la memoria.
fwrite($handle, $fileContents); fclose($handle);

La carga de un archivo es mucho ms fcil. Bsicamente, se hace referencia en el archivo y cargar el contenido mediante file_get_contents(), que devuelve todo el archivo como una cadena, como se muestra en la Figura 13.7.
$loadedFile = file_get_contents($file); print fileContents= . $loadedFile;

Aqu est el archivo PHP completo, que debe ser guardado con el nombre fileManager.php:
<?php error_reporting(0); if(!empty($_GET[file])) { $file = ./files/ . $_GET[file]; if($_GET[action] == save) { $fileContents = $_GET[fileContents]; $handle = fopen($file, w+); fwrite($handle, $fileContents); fclose($handle); } else { $loadedFile = file_get_contents($file);

363

print fileContents= . $loadedFile; } } ?>

El siguiente paso es desarrollar el cdigo ActionScript. La parte de diseo ha sido creado previamente para poder mover directo al cdigo. El primer paso es definir las variables utilizadas para este ejemplo.
var phpFile:String=http://localhost/ch12/FileEditor/fileEditor.ph p; var files:Array = [sample.txt, anotherfile.txt, readme.txt]; var storedFileData:String;

FIGURA 13.7 El contenido del archivo en bruto pas de PHP como se ve desde un navegador Web

Una vez definidas las variables, puede pasar a las funciones. La primera funcin es responsable de llenar la lista de archivos cuadro combinado. 364

function populateFileList():void { ... }

El mtodo AddItem del cuadro combinado (comb box) acepta un objeto como argumento, que define los datos de la etiqueta y los datos. Para esta aplicacin, el fichero se utiliza tanto para la etiqueta y el valor de los datos.
for(var i:uint=0; i < files.length; i++) { fileListCombo.addItem({label:files[i], data:files[i]}); }

El mtodo loadFile se llama cuando se hace clic en el loadbtn. Este controlador crea un archivo de solicitud con una variable de archivo que PHP utiliza para cargar el archivo real.
function loadFile(e:MouseEvent):void { var variables:URLVariables = new URLVariables(); variables.file = fileListCombo.selectedItem.data; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = variables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, fileLoaded); urlLoader.load(urlRequest); }

Despus de que el archivo solicitado se carga y se devuelve el contenido de PHP, es enviado en el rea de texto bodyTxt y tambin a la variable storedFileData. Esta variable se utiliza para almacenar en cach los resultados sin modificar. Puede volver a estos resultados ms adelante haciendo clic en el botn Restablecer.
function fileLoaded(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(urlLoader.data); bodyTxt.text = unescape(variables.fileContents); storedFileData = bodyTxt.text; }

El mtodo de restablecimiento simplemente reemplaza el contenido del cuerpo con los datos modificados que se almacena en el archivo original se carga.
function resetHandler(e:MouseEvent):void { bodyTxt.text = storedFileData; }

El ltimo mtodo necesario en esta aplicacin es responsable de guardar el contenido editado. Antes de que se guardan los datos, se almacena en cach, lo que elimina la necesidad de volver a cargar los datos.
function saveHandler(e:MouseEvent):void { var body:String = bodyTxt.text;

365

storedFileData = body; ... }

Las variables pasadas al PHP definir la accin, el nombre del archivo, y el contenido de primas que reemplazar el archivo de datos existente. El nombre del archivo es obtenida del ComboBox acceso al objeto de selectedItem.
var variables:URLVariables = new URLVariables(); variables.file = fileListCombo.selectedItem.data; variables.action = save; variables.fileContents = body;

Esta URLRequest particular, no requiere de un detector de eventos porque el proceso de guardar que pasa por su propia cuenta y se completa una vez que PHP recibe todos los fileContents. NOTA En una aplicacin remota es una buena idea para notificar al usuario del proceso de ahorro, ya que un archivo grande puede tomar tiempo para salvar.
var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = variables; var urlLoader:URLLoader = new URLLoader(); urlLoader.load(urlRequest);

La ltima tarea del ActionScript es el registro de los eventos de los botones y hacer una llamada a la funcin populateFileList() para el archivo de perfil ComboBox.
// Register Events loadFileBtn.addEventListener(MouseEvent.CLICK, loadFile); saveBtn.addEventListener(MouseEvent.CLICK, saveHandler); resetBtn.addEventListener(MouseEvent.CLICK, resetHandler); populateFileList();

366

FIGURA 13.8 El editor de archivos completada con una muestra de archivo cargado

La aplicacin, como se muestra en la figura 13.8, se ha efectuado. El siguiente es el cdigo fuente de ActionScript completo:
Var phpFile:String=http://localhost/ch12/FileEditor/fileEditor.ph p; var files:Array = [sample.txt, anotherfile.txt, readme.txt]; var storedFileData:String; function populateFileList():void { for(var i:uint=0; i < files.length; i++) { fileListCombo.addItem({label:files[i], data:files[i]}); } } function loadFile(e:MouseEvent):void { var variables:URLVariables = new URLVariables();

367

variables.file = fileListCombo.selectedItem.data; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = variables; var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, fileLoaded); urlLoader.load(urlRequest); } function fileLoaded(e:Event):void { var urlLoader:URLLoader = URLLoader(e.target); var variables:URLVariables = new URLVariables(urlLoader.data); bodyTxt.text = unescape(variables.fileContents); storedFileData = bodyTxt.text; } function resetHandler(e:MouseEvent):void { bodyTxt.text = storedFileData; } function saveHandler(e:MouseEvent):void { var body:String = bodyTxt.text; storedFileData = body; var variables:URLVariables = new URLVariables(); variables.file = fileListCombo.selectedItem.data; variables.action = save; variables.fileContents = body; var urlRequest:URLRequest = new URLRequest(phpFile); urlRequest.data = variables; var urlLoader:URLLoader = new URLLoader(); urlLoader.load(urlRequest); } // Register Events loadFileBtn.addEventListener(MouseEvent.CLICK, loadFile); saveBtn.addEventListener(MouseEvent.CLICK, saveHandler); resetBtn.addEventListener(MouseEvent.CLICK, resetHandler); populateFileList();

368

Resumen
En este captulo usted aprendi cmo desarrollar avanzadas aplicaciones del mundo real, tales como la utilizacin de Flash y PHP para construir un editor de archivos, reproductor de vdeo y monitor de sitio. Si bien el desarrollo del sitio monitor que aprendieron los nuevos eventos que hacen que sea ms fcil trabajar con datos incorrectos, as como la vinculacin de PHP, MySQL y Flash juntos. La aplicacin se ha mejorado mediante la adicin de acciones personalizadas, tales como el proceso de e-mail al administrador cuando un sitio no responde. En la aplicacin de votacin aprendi a desarrollar una aplicacin completa usando Flash como medio de visualizacin. La solicitud general fue escrito para ser muy escalable y, de hecho, cambiar la variable de ID en la clase de documento se carga una pregunta de la encuesta totalmente diferente (siempre existe uno). En este punto, usted debe entender completamente la forma de desarrollar aplicaciones del mundo real que son fciles de actualizar y mantener. De hecho, la mayora de este captulo pueden sumarse para crear un sistema de gestin o basadas en otro mdulo de aplicaciones.

369

Capitulo 14 Depurar Aplicaciones


Cuando se construye una aplicacin, es casi seguro que algn elemento que deje de funcionar o tal vez nunca trabajo desde el principio. Esto puede ser un punto en cualquier momento el bono de un ciclo de desarrollo puede tener que desaparecer. La idea es crear su aplicacin con la depuracin en la mente. La adicin de comentarios en realidad puede acelerar la depuracin de la lnea. Por supuesto, aadiendo a medida que avanza la depuracin es similar a escribir un esquema. Piensa en ello como te das cuenta de que es demasiado tarde. La clave es no dejar que un proyecto de llegar a este punto. Este captulo se centra en la mejor forma de depurar aplicaciones. Se empieza por las herramientas integradas y luego progresar y algunas aplicaciones externas y prcticas que hacen que sea menos dolorosa.

Uso de informes de errors en PHP


Empecemos con mirar a la depuracin de una aplicacin PHP. De forma predeterminada, la depuracin habilitada de buques PHP con un cierto nivel. Es creado para informar de los errores fatales (accidentes de programa) y las advertencias (archivos que faltan y argumentos). Este nivel de informe de errores est bien para un servidor de desarrollo, pero un gran problema con la instalacin por defecto es que los errores se imprimen en la pantalla y cada usuario puede ver. La alternativa y la opcin ms segura es permitir el registro de errores en un registro de error de archivo similar a cmo se configura Apache. Habilitar el registro de errores se realiza editando el archivo php.ini. Si usted no tiene acceso de administrador de su servidor, usted necesita ponerse en contacto con alguien que tiene este acceso. El archivo php.ini se encuentra normalmente en el directorio /etc/ en UNIX y C:\WINDOWS\, que es generalmente slo accesible por el administrador del servidor. El archivo php.ini se almacena en varios lugares dependiendo de la configuracin del servidor. Sin embargo, lo bueno es que PHP puede indicar dnde est almacenado. Basta con crear un nuevo archivo, el nombre de info.php, y agregar el siguiente cdigo:
<?php phpinfo(); ?>

Al ejecutar este archivo en un explorador que se presentan con una gran cantidad de informacin especfica de su versin actual de PHP. Uno de los primeros bloques de informacin es el camino ini, que se ve algo como esto:
Configuration File (php.ini) Path /usr/local/php5/lib/php.ini

PRECAUCIN Modificacin incorrecta del archivo php.ini puede resultar en su servidor no funciona. Tenga cuidado al editar este archivo. 370

Despus de xito encontrar el archivo php.ini, y abrirlo en el editor de texto favorito o usar vi si est utilizando la lnea de comandos. Usando vi, un comando para abrir un archivo, se ve as:
vi /usr/local/php5/lib/php.ini

Con el archivo abierto, desplazarse a travs hasta llegar a una seccin que se parece a este:
; Log errors to specified file. ;error_log = filename

Las lneas que comienzan con ; (punto y coma) son comentarios en los archivos ini. Como puede ver, el error_log no est definido y por lo tanto no es salvar a cualquier archivo. El mtodo para activar esta opcin es quitar el punto y coma (;) y reemplazar el nombre de archivo con una ruta y el nombre real del archivo, tales como
error_log = /usr/local/debug/php_errors

Despus de realizar los cambios y guardar el archivo php.ini, es necesario reiniciar el servidor Web para permitir a PHP para leer el archivo ino. Esto es necesario porque el PHP slo lee el archivo ini(s) en el inicio para maximizar el rendimiento. Despus de empezar a generar errores del archivo de registro comienza a llenarse. Si usted lee el archivo de registro que debe ver cadenas como la siguiente. Muy probablemente, los errores que usted recibe en realidad le dir lo que est mal, debido a un error que proporciona informacin incorrecta no es realmente tan til.
[18-Jul-2007 20:51:17] PHP Fatal error: file.php on line 30 [09-Aug-2007 21:23:37] PHP Fatal error: file.php on line 13 [03-Nov-2007 23:10:21] PHP Fatal error: file.php on line 56 ...

Un servidor de produccin slo debera registrar los errores, lo que significa que los errores tambin se debe dar salida con discapacidad en el archivo php.ini. Abra el archivo ini y cambiar el valor a Off output_errors y reiniciar Apache de nuevo.
display_errors = Off

Mostrando los errors para depurar


Con el servidor de registro de errores de forma segura sin mostrar a los usuarios en general, se puede ver lo que los informes de errores en PHP ofrece el promotor. Desde el punto de vista de la depuracin, el informe de errores en PHP es muy robusto. Ah estn los errores estndar, tales como errores fatales, los archivos que faltan, advertencias, etc. An ms importante es la capacidad de crear su propio error. Con el fin de crear un error personalizado, simplemente llame a trigger_error (), que toma dos argumentos. El primer argumento es la cadena de error para mostrar y el segundo (opcional) El argumento es lo que el nivel de error de error debe ser reportado como. Esta es una llamada trigger_error simple:
trigger_error(Cannot load non-existent user data, E_USER_WARNING);

371

Depurar variables
El cdigo de depuracin no es siempre acerca de los errores de sintaxis, de hecho, la mayora de veces no lo es. A menudo se encuentra una variable fuera de alcance o no inicializado, lo que no se producir un error. Por supuesto, PHP tiene muchas funciones y los mtodos que se adapten a la depuracin. Posiblemente se haya impreso o echo antes, pero cranlo o no las funciones son realmente muy til para depurar una aplicacin. Bsicamente, usted puede rastrear las variables y tener una mejor idea de cmo est funcionando un programa.

Depurar arrays
Trabajar con una matriz es un poco diferente porque una impresin simple mostrar Array. Sin embargo, puede utilizar la funcin print_r() para ver una matriz. Incluso se mostrar una matriz dentro de una matriz y as sucesivamente, tambin conocida como una matriz multidimensional. Aqu es el resultado del ejemplo muestra de la llamada print_r:
Array ( [0] => Array ( [one] => 1 ) [1] => Array ( [two] => 2 ) )

Entender los niveles de error


Si bien usando trigger_error puede observar que el segundo parmetro es una constante. Esta constante se define un nivel de error determinado. PHP ofrece una amplia gama de niveles de error e incluso permite a los desarrolladores para cambiar el nivel como el cdigo avanza. Aqu es cmo el cambio de manera pragmtica el nivel de error, en este caso, haciendo que incluso se inform sobre esto AVISOS:
error_reporting(E_ALL);

Tabla 14.1 muestra los niveles de error y una descripcin del nivel de lo que el error se refiere. TABLE 14.1

Niveles de Error y Descripciones


Error
E_ERROR E_WARNING E_PARSE E_NOTICE

Descripcin
Errores fatales en tiempo de ejecucin. Estos indican errores que no pueden recuperarse, tales como un problema de asignacin de memoria. La ejecucin del script se detiene. Advertencias Tiempo de ejecucin (errores no fatales). La ejecucin del script no se detiene. Errores de compilacin analizar el tiempo. Errores de anlisis slo debe ser generada por el analizador. Anuncios de Tiempo de ejecucin. Indica que el guin ha topado con algo que podra indicar un

372

error, pero tambin podra ocurrir en el curso normal de ejecucin de un script. Errores fatales que ocurren durante el arranque inicial de PHP. Esto es como un E_ERROR, excepto que es generado por el ncleo de PHP. E_CORE_WARNING Advertencias o errores no fatales que ocurren durante el arranque inicial de PHP. Esto es como un E_WARNING, excepto que es generado por el ncleo de PHP. E_COMPILE_ERROR Fatal errores de compilacin. Esto es como un E_ERROR, excepto que es generado por el Motor de Scripting de Zend. E_COMPILE_WARNING Advertencias en tiempo de compilacin o errores no fatales. Esto es como un E_WARNING, excepto que es generado por el Motor de Scripting de Zend. E_USER_ERROR Mensaje de error generado por el usuario. Esto es como un E_ERROR, excepto que es generado desde cdigo PHP usando la funcin trigger_error(). E_USER_WARNING Generado por el usuario mensaje de advertencia. Esto es como un E_WARNING, excepto que es generado desde cdigo PHP usando la funcin trigger_error(). E_USER_NOTICE Generada por el usuario previo aviso. Esto es como un E_NOTICE, excepto que es generado desde cdigo PHP usando la funcin trigger_error(). E_STRICT Anuncios de Tiempo de ejecucin. Habilitar para que PHP sugiera cambios en su cdigo que velarn por la mejor interoperabilidad y por mantener la compatibilidad de su cdigo. E_ALL Todos los errores y advertencias, como el apoyo, excepto por el nivel E_STRICT en PHP < 6. E_CORE_ERROR

Como puede ver, PHP ofrece un montn de opciones de depuracin dar salida ms all de la bsica y la explotacin forestal. De hecho, usted puede personalizar un montn de errores que se encuentran en el archivo php.ini para depurar las aplicaciones ms diversas. Si usted desea conseguir un nivel grave de depuracin de cdigo y herramientas de observacin, entonces puede que desee echar un vistazo a Zend Studio IDE (ver figura 14.1), construido en la cima de la infraestructura Eclipse. Esta aplicacin no es gratuito, sin embargo, es el editor de PHP ms robusto y un depurador de perfil en el mercado en el momento de escribir este artculo. Una licencia de Zend Studio para rangos de $150 a $300 dependiendo de la versin que usted compra. NOTA Zend Studio no es el nico editor de PHP, sin embargo tiene el depurador ms robusto. Adems puede utilizar PHPEclipse que tiene caractersticas similares a Zend. Sin embargo, el proceso de instalacin es un poco ms complicado.

373

FIGURA 14.1 El IDE de Zend Studio con los paneles de depuracin visible

374

Depurar en Flash
Similar a PHP, Flash ofrece una serie de herramientas muy tiles para la depuracin. De hecho, el IDE de Flash tiene un sistema de depuracin completo construido en el derecho en el que puede inspeccionar su cdigo (vase la figura 14.2), se aplican puntos de interrupcin, y la actividad en torno a un bloque de cdigo para ver los detalles y encontrar un error. FIGURA 14.2 Aqu est el panel que se utiliza para inspeccionar una aplicacin.

Flash tambin tiene un panel de salida (ver figura 14.3) que se utiliza para ver declaraciones trace() los estados llamados desde el cdigo. La sentencia trace es una funcin bsica que acepta una cadena como un argumento. Esto se enva al panel de la produccin y ofrece la posibilidad de mostrar los elementos de una aplicacin, que se est ejecutando.
trace(Here is a very basic debug message);

Una pregunta comn con el uso de las instrucciones de seguimiento es la voluntad que siguen a la produccin de una pelcula compilado? Lo harn, pero usted puede seleccionar la opcin "Omitir acciones de seguimiento" en el cuadro de dilogo Configuracin de publicacin para deshabilitarlo.

375

El simple mtodo trace (seguimiento) puede ser til cuando se depuren los ejemplos de cdigo de base. Sin embargo, para las aplicaciones ms completa, lo ms probable es que quiera construir su propio gestor de depuracin. Esto se puede hacer de forma bastante sencilla. FIGURA 14.3 Este es un ejemplo del panel de salida como se ve en Flash.

En primer lugar, crear un componente de TextArea en el escenario con el nombre de instancia debugTxt. Luego, crear una nueva funcin de seguimiento que llenarn de que TextArea. Utilizando el mtodo appendText agregar en el texto existente, en lugar de eliminarlo.
function tracer(debug:String):void { debugTxt.text.appendText(debug); }

Tambin podra crear una clase personalizada que cualquier porcin de su cdigo es capaz de llamar. Sin embargo, encontrar rpidamente que el nivel de seguimiento no es perfecto. Por ejemplo, no de manera pragmtica puede borrar la pantalla o de la prioridad lugar en ciertos eventos. De hecho, la depuracin en Flash no es tan avanzada como las posibilidades en PHP, pero todava hace el trabajo. 376

En este punto, usted ha visto cmo Flash se puede utilizar para depurar una aplicacin y cmo PHP puede ser usado para la misma tarea. Ahora mira algunas opciones de terceros y las bibliotecas para que este proceso sea an ms fcil. La mayora de los datos que se pasa de ida y vuelta en Flash es hecho utilizando las llamadas remotas, tambin conocido como Remoting o Flash Remoting. Este mtodo de intercambio de datos se ha vuelto bastante popular, pero no se presta a que se est depurando o visto. Parte de esto es debido al hecho de un objeto es autnomo y tambin el modo Flash interacta con un origen remoto. Utilizando una herramienta de terceros llamado Charles o Charles Web Debugging Proxy, que se puede descargar desde http://xk72.com/charles/, hace que sea muy fcil de ver estos datos a medida que pasa alrededor. Carlos no es freeware, pero ofrece una demostracin completa. En el momento de escribir este documento, una licencia es de $50. Para m, vale la pena. Figuras 14.4 y 14.5 muestran datos remotos y cmo se ve a Carlos. FIGURA 14.4 Esta es la solicitud que se enva al servicio remoto.

377

FIGURA 14.5 Esta es la interfaz de Charles normalizado en la que una respuesta XML de un sistema remoto.

Otra gran herramienta es un plug-in para el navegador web Firefox llamada LiveHTTPHeaders que vigila el trfico de red. La desventaja parcial a esta aplicacin es que slo los relojes de trfico del explorador. Si est probando o la depuracin de la aplicacin a nivel local no va a ver las llamadas. Ms informacin acerca de LiveHTTPHeaders se puede encontrar en http://livehttpheaders.mozdev.org/.

Uso alternativo de Trace


El ltimo tema en este captulo ser la construccin de una nueva traza que permite a los colores, as como otras caractersticas. Este trazado alternativo se construye como un stand-alone SWF y puede ser llamado por cualquier otro SWF en el mismo dominio (local es su equipo). El cdigo de seguimiento de esta alternativa se basa en la clase LocalConnection, que es una clase de pre-compilados que permite a varias pelculas en las comunicaciones de compartir el tiempo que estn en el mismo dominio. La primera parte del cdigo es responsable de construir el objeto de conexin local y el registro de la funcin de devolucin de llamada.
var receivingLC:LocalConnection = new LocalConnection(); receivingLC.client = this;

378

function debug(str:String, level:String):void { var debugLevel:String = ((typeof(level) == undefined) ? NORMAL : level); var color:String = null; switch(debugLevel) { case NORMAL: color = #000000; break; case ERROR: color = #E60000; break; case NOTE: color = #77C0FD; break; case WARNING: color = #FBF400; break; case RESPONSE: color = #27C201; break; case REGISTER: color = #FC8AFF; break; case CLASS: color = #FD779F; break; case ATTENTION: color = #FF6600; break; case URGENT: color = #FF0000; break; case STATUS: color = #CCFF00; break; } if(color == null) { color = #000000; } debugTxt.htmlText += (<font color=\ + color + \> + str + </font> + \n); var scrollPos:uint = debugTxt.verticalScrollPosition var maxScroll:uint = debugTxt.maxVerticalScrollPosition; if(scrollPos + 5 > maxScroll) { debugTxt.verticalScrollPosition = maxScroll; //debugTxt.scroll = max_scroll; } };

379

Despus de la devolucin de llamada y el objeto de conexin local estn construidas, es el momento para iniciar la conexin. Esto se hace mediante una llamada al mtodo connect() de la instancia local objeto de conexin.
receivingLC.connect(remoteDebug);

El resto del cdigo es exclusivamente para la visualizacin de la ventana de depuracin y no es necesario para los propsitos de la funcionalidad.
function clearHandler(e:MouseEvent):void { debugTxt.htmlText = ; } clearBtn.addEventListener(MouseEvent.CLICK, clearHandler); // Resize Code stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.addEventListener(Event.RESIZE, function():void { debugTxt.width = stage.stageWidth - 25; debugTxt.height = stage.stageHeight - 75; clearBtn.x = (stage.stageWidth - 12) - clearBtn.width; clearBtn.y = (stage.stageHeight - 12) - clearBtn.height; });

Eso es todo el cdigo necesario para crear una traza alternativa, y usarlo requiere muy poco cdigo. La llamada al seguimiento personalizado parece un poco a esto. El mtodo send() requiere cuatro argumentos, que son los siguientes. El primero es el objeto de conexin local, el segundo es el mtodo al que llamar, la tercera es la cadena de rastrear, y el cuarto es el nivel de error.
var sendingLC:LocalConnection = new LocalConnection(); sendingLC.send(remoteDebug, debug, Object Not Found!, ERROR);

Resumen
Ahora debe tener un conocimiento bastante slido de las herramientas y prcticas disponibles para depurar correctamente sus aplicaciones en Flash y PHP. Estas no son las nicas herramientas y prcticas disponibles para depurar una aplicacin. Los desarrolladores estn subiendo con mejores maneras todo el tiempo, en parte porque es una tarea importante y tambin porque es el ms temido en el ciclo de desarrollo. En este captulo usted aprendi a crear sus propios errores personalizados y cmo trabajar con los tipos de error estndar que se encuentran en PHP. Tambin ha aprendido a depurar el cdigo dentro de Flash utilizando el panel de salida y las instrucciones de seguimiento. La ltima seccin del captulo se centr en el desarrollo de un controlador personalizado de depuracin en ActionScript, que muestra los mensajes en un cdigo de color scrollbox para identificar mejor sus mensajes de depuracin.

380

Parte V Mantenimiento del Servidor, Aplicacin, y de la base de datos

381

El proceso de mantenimiento de una aplicacin se logra simplemente siguiendo algunas reglas. Estas normas se han establecido a travs del tiempo como las aplicaciones siguen desarrollndose a diario. Este captulo se centra en estas reglas individuales. Al final del captulo, usted comprender no slo la manera de seguir, pero tambin cmo pueden hacer su trabajo ms fcil. La ltima seccin se centra en trabajar en un entorno de equipo, utilizando la nota comn que, comentando, y control de versiones desde la perspectiva de un nico promotor. Incluso despus de que se escribe una aplicacin, no es raro que volver y hacer cambios. Si este plan durante el proceso de la escritura original y seguir algunos pasos simples, hace que las actualizaciones mucho ms fcil de administrar y ejecutar avanzar. A menudo, un intento de reescribir se hace en lugar de corregir algunos problemas leves. Esto generalmente se debe a la mala planificacin en el inicio y los resultados en el tiempo de desarrollo adicional que no siempre pueden explicarse.

Capitulo 15 Mantenimiento de una aplicacin

Comentando cdigo
Cdigo de comentar que es ms importante como un proyecto sigue creciendo, o como los desarrolladores adicionales se introducen en el proyecto. El proceso de comentar el cdigo no es una parte necesaria de una aplicacin por escrito, pero es til cuando se busca en un proyecto que ha estado en desarrollo durante algn tiempo. A menudo el estilo de los comentarios es bien definido en un perfil del proyecto o establecidos por el lder del proyecto. Comentando incluso puede ser beneficioso al escribir el cdigo que usted posee, ya que pueden dejar notas a volver a un pedazo de cdigo en una fecha posterior. Esto es especialmente importante si alguna vez la intencin de distribuir el cdigo como un proyecto de cdigo abierto o vender la aplicacin. Comentando el cdigo tambin hace que sea ms fcil escribir o generar la documentacin con la modificacin adicional escaso o nulo que necesita el desarrollador.

Entender los estilos para comentar cdigo


Cada lenguaje tiene su propio estilo de comentar cdigo. Por ejemplo, una forma muy comn de los comentarios es visto en los documentos HTML, que se parece a este:
<!-- This is an HTML comment -->

382

HTML slo ofrece un estilo de comentar, en otros lenguajes de scripting completa tienen distintos estilos de comentar. stos son algunos ejemplos de los estilos de comentarios ms comunes que se encuentran en Flash, PHP y MySQL.

Bloque de comentarios
PHP, ActionScript (Flash), y MySQL permite comentarios en bloque.
/* * * This is a block style comment, * which can have any number of lines. * */

Comentarios en lnea en MySQL


MySQL permite comentarios en lnea usando un -- al comienzo de una lnea.
-- This is a MySQL comment; the database will not read this.

Comentarios en lineas
Tambin puede usar un comentario en lnea para extraer una determinada seccin de cdigo. Esto le permite probar rpidamente una seccin de cdigo y localizar errores ms rpidamente. Aqu hay un comentario en lnea que elimina la clusula de la seccin WHERE de una consulta SQL.
SELECT name, status FROM users/* WHERE id=1004 AND status=active*/;

Los resultados de un comentario anterior en la consulta se mostrarn todos los usuarios en la base de datos porque la parte condicional se ha comentado. NOTA Lnea con formato incorrecto y comentarios en lnea puede crear en ocasiones difciles de rastrear los errores a menos que su editor de cdigo se utiliza color resaltado de sintaxis.

Comentarios del compilador


Algunos lenguajes de desarrollo y aplicaciones use los comentarios del compilador. Estos comentarios especializados de decirle a un compilador de aplicaciones de cmo manejar ciertos tipos de datos. Estos comentarios no deben ser removidos manualmente a menos que la intencin de eliminar esa funcionalidad.

Comentarios en XML
Algunas de las diversas aplicaciones que se han desarrollado en anteriores captulos de acuerdo con XML. Es importante darse cuenta de que XML puede actuar de una forma desconocida cuando los comentarios son utilizados indebidamente. Esto slo se convierte en un problema cuando un -- se utiliza dentro de un comentario como el siguiente:
<!-- Person, contains all info -- globally used --> <person>

383

<name>Alex</name> <age>27</age> <gender>Male</gender> </person>

Como puede ver, la -- imita la etiqueta de cierre y confundir al analizador XML hasta el punto donde se cree que el XML est mal formado y en algunos casos raros no lo cargar.

Comentarios en Apache
El uso de comentarios en el Apache se limita generalmente a los archivos .htaccess para determinar la configuracin del sitio. Es importante tener en cuenta que los comentarios en los archivos de Apache puede causar problemas de renderizado. Si por alguna razn una directiva no est funcionando correctamente, vea los comentarios como el primer culpable de la cuestin. Aqu hay un ejemplo de un comentario en un archivo .htaccess de.
# Force PHP to render .html files AddType application/x-httpd-php .html .htm

Mezcla de comentarios
Se pueden mezclar varios estilos de comentarios cuando sea necesario. Esto es comn a la hora de explicar una seccin de cdigo, como una funcin o definicin del mtodo. Como se puede ver, un comentario de bloque se utiliza para describir la funcin y un comentario de lnea explica el cdigo de la funcin.
/* @num1: first number @num2: second number @return: sum of two arguments @author: developers name @description: static function that multiplies two numbers */ static function multiplyBy(num1:Number, num2:Number):Number { // return the sum of num1 & num2 return (num1 * num2); }

Comentar correctamente el cdigo puede tener ventajas evidentes. Ms editores de cdigo populares ofrecen caractersticas que se pueden ocultar o colapso comentarios por lo que slo estn en el camino cuando se quiere que sean. Es posible incluso encontrar algunos editores que la sintaxis de comentarios sea resaltado. Algunos editores profesionales utilizan la informacin para crear archivos de ayuda en lnea llamado sugerencias de cdigo (ver figura 15.1). Estas sugerencias son las cajas en lnea de cdigo que aparecen a medida que comienza a escribir. Ellos proporcionan los elementos disponibles posibles basadas en el cdigo introducido hasta el momento. 384

Un editor de ActionScript ms avanzado, como FDT por Powerflasher, tiene la capacidad de aprender el cdigo y muestra sus comentarios personalizados en su versin de sugerencias para el cdigo. FIGURA 15.1 Ejemplo de una pista de cdigo muestra en Flash CS3 para las propiedades de MovieClip

Eliminar comentarios y depurar ayuda


Los comentarios se quitan a menudo debido al tamao del archivo, que puede ser una preocupacin vlida en un programa de gran tamao. Sin embargo, la mayora de las veces, los comentarios se eliminan automticamente cuando una aplicacin se compila o construiye. Dependiendo de la aplicacin que utilice, instrucciones de depuracin tambin debe ser eliminado. Por ejemplo, el IDE nativo de Flash que se enva con CS3 tiene una opcin de configuracin en el cuadro de dilogo Configuracin de publicacin. Si selecciona Omitir acciones de seguimiento, que se encuentra en la ficha Flash de la Configuracin de publicacin, seguimiento de las llamadas se quitan de la aplicacin. NOTA Si las acciones Omitir Trace est habilitado durante la depuracin no podr ver ningn seguimiento de las llamadas que aparece en la ventana de salida. 385

Si decide utilizar una clase personalizada o depuracin de un paquete, entonces puede utilizar Find (Buscar) y Replace (reemplazar) para eliminar esas instancias. Sin embargo, tenga cuidado de no borrar accidentalmente la aplicacin de cdigo especfico. Como puede ver, los comentarios pueden ser beneficiosa desde el punto de vista de la legibilidad del cdigo. Tambin sabemos ahora que comentar correctamente el cdigo tiene ventajas adicionales para utilizar algunos de los editores de cdigo disponibles hoy en da ms slida.

Administrar un cambio de registro


Un cambios de los registros es un bloque de formato o entradas de registro colocado en un archivo personalizado. Estos archivos suelen tener los cambios de nombre o actualizaciones. Esta seccin se utiliza para tomar notas sobre las caractersticas de una aplicacin o para comunicar los avances con el resto de un equipo de desarrollo. Una de las ventajas de utilizar un ChangeLog es que algunas aplicaciones pueden leer este formato de registro y automticamente, como se muestra en la Figura 15.2. Esto, por supuesto, depende de la aplicacin que est utilizando, pero puede ser muy beneficioso como una aplicacin empieza a crecer.

Seguimiento de errores
Hay muchos desarrolladores que utilizan este formato para realizar un seguimiento de cambios dinmicos errores. Este es un proceso que muchas aplicaciones comerciales y gratuitos, tales como Jira y Bugzilla, se utiliza para crear una alternativa ms grfica para el texto bsico de archivo.

Uso de seguimiento de errores con los equipos (teams)


El seguimiento de errores es especialmente importante cuando se trata de equipos. Por ejemplo, muchas de las tecnologas de cdigo abierto compuesto por desarrolladores de todo el mundo. Imagnese cmo sera tedioso para rastrear errores en e-mails o llamadas telefnicas a travs de todos estos desarrolladores. Aqu es donde el seguimiento de errores es especialmente importante. Eso no significa que un nico promotor no puede beneficiarse de un mismo sistema.

386

FIGURA 15.2 Aqu hay una pgina web que muestra un ChangeLog que se generan de forma dinmica.

Usos adicionales
Un ChangeLog no se limita a unas pocas lneas de texto. Siendo realistas, como se puede ver, puede contener las correcciones de errores, las notas a otros desarrolladores, y la informacin sobre un elemento especfico. Por ejemplo, si usted decide usar un error de seguimiento de la aplicacin, es una buena idea incluir el ID del error en la entrada de cambios o dejar que la aplicacin para el seguimiento de manejar este. Correctamente la documentacin de los identificadores siguientes hace ms fcil el seguimiento de un error ms tarde, durante el desarrollo de aplicaciones, o si regresa a un proyecto una vez se haya completado.

Creacin dinmica de cambios


Aplicaciones de control de versin, que se discuten en la seccin siguiente, incluso tienen la capacidad de generar automticamente una lista de cambios. La ventaja de este enfoque es que el desarrollador no tiene que gastar el tiempo de edicin del proyecto o la actualizacin del registro. Sin embargo, una desventaja de esto es el archivo se vuelve menos personalizado y, a veces hace ms difcil de comprender plenamente.

387

Administracin de mltiples versiones


El control de versiones es la gestin de mltiples versiones de cdigo o archivos de una aplicacin. Estas aplicaciones son utilizados en los equipos de desarrollo, pero puede ser fcilmente utilizado por un nico promotor. La ventaja de utilizar el control de versiones es el seguimiento y el cdigo de seguridad que se almacena como a desarrollar o mantener una aplicacin. Este nivel adicional de seguridad en un proyecto puede permitir que el desarrollador de experimentar con una idea y todava tienen la capacidad de volver a una versin estable. Tambin permite a los desarrolladores mantener el cdigo consistente a travs de plataformas de desarrollo. Esta caracterstica es un uso muy comn para los desarrolladores que viajan solas y el cdigo en un sistema mvil. Simplemente conecte al servidor de desarrollo, descargar la ltima versin, y estn dispuestos a ir. Cuando regresan, una simple actualizacin que se haga en el mismo servidor y la aplicacin est de vuelta en sincrona.

Aplicacin de control de versiones


Existen varias aplicaciones de control de versin disponible para sus entornos de desarrollo de hoy en da. Seleccionar las aplicaciones de control de versiones a utilizar es determinado por mirar a las caractersticas y requisitos de su proceso de desarrollo. El ms comn es la aplicacin de control de versiones SVN (Subversion). Otra aplicacin muy popular es CVS (Concurrent Versions System). Soporte para el control de versiones es a menudo construidos directamente en un editor de cdigo, como el editor de cdigo abierto Eclipse.

Apoyar el control de version de CS3


Nuevo para Adobe Flash CS3 es la posibilidad de utilizar Version Cue directamente en Flash. Version Cue (vase la figura 15.3) es el control de Adobe versin de la aplicacin que se encuentran dentro de sus otras aplicaciones.

Uso de Version Cue en Flash CS3


Va a encontrar un elemento de men " Check In..." en el men Archivo. Este elemento se utiliza para abrir el cuadro de dilogo de gestin de Version Cue y es donde usted puede guardar versiones de su aplicacin. Usted encontrar una entrada de Check In... situado en el men Archivo. La ventaja de utilizar Version Cue es que los buques con CS3 y est integrado en la suite de aplicaciones. Esto es especialmente importante si usted es el desarrollo de los activos en una sola aplicacin, el cdigo en otro, y la gestin del sitio en un tercero. Usted puede incluso permitir a su equipo para iniciar sesin en el servidor de Version Cue de forma remota y hacer cambios. Esto significa, por ejemplo, el desarrollador puede ser prcticamente en la misma oficina que el resto de su equipo.

388

FIGURA 15.3 Captura de pantalla de Version Cue, que se suministra con los programas de Creative Suite 3

Configurar el control de versiones


El proceso de creacin de control de versiones depende del sistema de su entorno de desarrollo de carreras. Una gua de instalacin ms completo se incluye, con la aplicacin que usted decide utilizar. La instalacin bsica que incluira descomprimir el contenido de la solicitud de control de versiones, modificando el archivo de configuracin de Apache y alerta a la existencia de la aplicacin.

Usar version de control


Normalmente, el proceso de utilizacin de control de versiones es integrado en su editor de cdigo. Sin embargo, hay aplicaciones disponibles para el uso de control de versiones directamente dentro de su sistema operativo. Dos gerentes de control de versiones para Windows y Mac OS X se muestran en la tabla 15.1. TABLA 15.1

Gerentes de Control de la versin para Windows y Mac OS X


Nombre TortoiseSVN SCPlugin URL http://tortoisesvn.tigris.org/ http://scplugin.tigris.org/ 389 OS Windows Mac OS X

NOTA Para una configuracin de desarrollo ms seguro y final, lo mejor es instalar la aplicacin de control de versiones en un equipo diferente.

Copia de seguridad de control de versiones


Los sistemas de control ms popular versin de oferta integrada de soluciones de copia de seguridad, pero muchas veces usted encontrar que la copia de seguridad de la aplicacin que est escribiendo se incluyen los datos de control de versiones. Normalmente, estos archivos se definen como ocultos y nunca se debera modificar manualmente si por alguna razn no se permite el acceso. PRECAUCIN Edicin de un control de versin de archivo de forma manual puede resultar en copias de seguridad de corrupcin e incluso daar la integridad del cdigo de su aplicacin.

Uso adicional de control de versin


El uso adicional de control de versiones es la posibilidad de publicar la estructura de archivos a la Web para compartir. Esto no es siempre el resultado deseado, pero puede encontrar compaas como Adobe, Google y Microsoft que este enfoque. Uso de los cortes de control de versiones abajo en la cantidad de trabajo adicional necesario publicar el cdigo fuente de la aplicacin y permite a otros para mantener actualizado el cdigo con slo conectarlos a su sistema de control de versiones de forma remota.

Uso de librerias personalizadas


Colecciones personalizadas pueden hacer que el cdigo de fcil mantenimiento. En antiguas versiones de ActionScript (antes de AS3), los paquetes en realidad no exista, as que era difcil de mantener adecuadamente y compartir la fuente de una aplicacin de cdigo. ActionScript 3 introdujo una prctica de codificacin ms comn que se llama paquetes. Esto ofrece la posibilidad de crear una instancia de la clase y compartirlo entre todos los proyectos contenidos en una sola carpeta o archivo. CROSS--REF Una mirada ms a fondo de bibliotecas personalizadas se pueden encontrar en el captulo 9.

Uso de librerias personalizadas con el control de versin


Si se crea una instalacin independiente para su sistema de control de versiones puede usar la misma mquina para almacenar bibliotecas personalizadas y luego incluirlos de forma remota en su archivo de Flash (s). La ventaja de este enfoque es la capacidad de actualizar un paquete y todas las aplicaciones que tienen que utilizar el paquete de actualizacin, as.

390

Publicar un SWC
Usted puede crear un SWC en Flash, que le permite distribuir los componentes y las clases de ActionScript. Para publicar un SWC, seleccione la opcin de exportacin de SWC en el cuadro de dilogo Configuracin de publicacin. El archivo contiene un clip de SWC compilado y los archivos de clases de ActionScript que lo apoyan. NOTA Es una buena idea de documentar los cambios de clase y el paquete ya que las aplicaciones existentes pueden dejar de funcionar. El proceso de usar las bibliotecas personalizadas no puede parecer un aspecto muy importante de desarrollo de aplicaciones. Sin embargo, una vez que comiencen a desarrollar aplicaciones de mayor escala que compartan atributos comunes que usted se dar cuenta de cunto se ahorra tiempo al no tener que reescribir el cdigo.

Resumen
En este captulo usted aprendi a comentar el cdigo y por qu se hace para una mejor aplicacin en general. Tambin ha aprendido este aspecto es especialmente importante al desarrollar una aplicacin con los dems. Tienes una introduccin sobre cmo incorporar un Registro de cambios en su desarrollo y cmo algunas aplicaciones de terceros pueden utilizar esta informacin para mostrar de seguimiento de fallos ms detallado. En la ltima seccin aprendi a utilizar el control de versiones y se introdujeron a Version Cue, que es una nueva adicin a Flash CS3.

391

Capitulo 16 Mantenimiento de un servidor escalables y ms eficiente


Este captulo se centra en las mejores prcticas para el mantenimiento de su servidor de tiempo que se introducen tcnicas de mejora ms avanzados de aplicaciones como el almacenamiento en cach, bases de datos eficiente, copias de seguridad, y cdigo escalable. Despus de aprender y aplicar esta informacin a sus aplicaciones, pronto se dar cuenta de que funcione ms eficientemente. Si sigues estos pasos en mente al inicio del proceso de desarrollo de aplicaciones, usted no tendr que volver a trabajar despus de la aplicacin.

Ejecutar un servidor actualizado


Uno de los mtodos ms simples, pero ignorado por el mantenimiento de un servidor ms eficaz es mantener las bibliotecas y el servidor central el cdigo del lado actualizado. A menudo estos programas que son responsables de ejecutar las aplicaciones se actualizan a medida que los desarrolladores siguen encontrando maneras de acelerar hacia arriba o hacerlas ms eficientes. Este proceso de actualizacin no se refiere a su cdigo personal, pero las bibliotecas y los servicios depende de su cdigo. La actualizacin de su servidor, no slo ofrece mejoras de rendimiento, pero tambin puede asegurarse de que su servidor Web es ms seguro. PHP, por ejemplo, se actualiza con frecuencia como las mejoras ms y se introducen cambios de codificacin. Esto es debido a nuevos problemas de seguridad descubiertos, lo que resulta en una mejor aplicacin en general. Antes de actualizar su sistema, asegrese de sus aplicaciones sern compatibles. Por ejemplo, las aplicaciones desarrolladas en PHP 4 no siempre son compatibles con PHP 5. Usted encontrar algunos casos en que otra pieza de software en el servidor puede requerir una versin especfica. Un buen ejemplo de esto es que los clientes de correo, como una versin especfica de la multitud (una popular aplicacin de correo electrnico) requiere PHP 4 y no simplemente en una versin ms reciente. Esto no significa que no pueda actualizar, sino todo lo contrario en realidad. Slo hace falta un pequeo trabajo de investigacin y antes de instalar las nuevas versiones.

Uso de actuaizaciones automticas


Como ustedes saben, la instalacin de nuevas versiones de las aplicaciones en su servidor no es siempre la mejor opcin. Usted necesita ser ms consciente de esto con los actualizadores automticos. Por ejemplo, usted encontrar 392

las actualizaciones automticas son ms propensos a ofrecer marca una nueva funcionalidad, pero al mismo tiempo que tambin ofrecen el cdigo que no se ha probado tan a fondo. Usted encontrar que no todas las aplicaciones de tu lado del servidor ofrecen actualizaciones automticas, pero lo mejor es comprobar de antemano y asegurarse de que estas opciones estn desactivadas. Algunos proveedores de hosting realizar actualizaciones peridicas de seguridad, a veces sin su permiso, o incluso que le informa de la actualizacin. Esta es una de las muchas razones que prefiero correr un autogestionado, servidor dedicado en lugar de pagar un poco menos y dejar que el proveedor de hosting manejar la seguridad y la versin actualizaciones.

Plataforma Zend
La excepcin a no instalar las actualizaciones automticas es cuando se utiliza la plataforma Zend. Este conjunto de herramientas asegura que su sistema est correctamente al da con todas las ltimas mejoras de seguridad, mientras que asegurarse de que su secuencia de comandos existentes seguirn funcionando correctamente.
El costo de Zend Platform puede causar un dilema para las organizaciones ms pequeas y desarrolladores individuales, pero el tiempo total guardado en el largo plazo es una razn vlida para comprarlo.

Trabajar con Development Installs


Instalacin de nuevas aplicaciones o bibliotecas no es una prctica bien cuando se trabaja con un servidor en vivo. Sin embargo, esto no significa que no puede experimentar con el nuevo cdigo de la instalacin de un sistema de desarrollo. Usted puede construir o adquirir su alojamiento en un nuevo servidor para obtener una configuracin de sistema de desarrollo, pero esto no puede ser la solucin ms eficaz, especialmente si usted es un hombre de una tienda.

Construir otra version de Apache en el mismo sistema


La alternativa es instalar una versin independiente de Apache en el servidor en vivo. Por defecto, Apache slo puede tener una versin que se ejecuta porque cada versin que trata de compartir el mismo puerto del servidor. Sin embargo, puede modificar esta configuracin modificando el archivo httpd.conf. Usted encontrar este archivo de configuracin en el directorio conf/ de su nueva instalacin de Apache. Abrir este archivo en su editor de texto favorito o vi, si est ejecutando un servidor remoto, y modificar las siguientes categoras:
# Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses (0.0.0.0) # #Listen 12.34.56.78:80

393

Listen 80

La mayor parte de ese bloque de cdigo es un comentario que explica lo que este parmetro es responsable. Usted puede modificar el puerto en el que su sistema de desarrollo se puede encontrar al cambiar este nmero a algo similar a lo siguiente:
... # #Listen 12.34.56.78:80 Listen 9004

Despus de guardar y reiniciar Apache, puede acceder a esta nueva instalacin, visite http://localhost:9004. NOTA Aplicaciones en su equipo utilizan diferentes puertos, as que es mejor para comprobar el puerto antes de elegir uno nuevo.

Trabajar con tecnologa de punta


Cuando tenga el nuevo sistema instalado, puede empezar a experimentar con sangrado nueva tecnologa de punta sin daar la configuracin de su vida. Sangrado software de borde como se muestra en la figura 16.1 es recin lanzado versiones que no se han probado tanto como versiones estables sera. Esto le permite trabajar con los ms avanzados y nuevas caractersticas, pero tambin significa que podran llegar a los errores y cuestiones de desarrollo utilizando estas versiones. A medida que contine para probar esta nueva tecnologa se puede determinar si se debe utilizar en un entorno viven y se mueven por encima de cuando est listo.

Dependencias
Muchas bibliotecas y herramientas que utilizar en su servidor Web dependen de otras bibliotecas. Por ejemplo, la librera GD de PHP para la manipulacin de imgenes requiere la biblioteca libjpeg con el fin de editar las imgenes correctamente. Al actualizar el servidor, usted necesita estar consciente de estas dependencias, porque la actualizacin de una parte puede dar lugar en las instalaciones rotas o incompletas. Frecuentemente usted encontrar informacin sobre el sitio del desarrollador de actualizacin en materia de informacin especfica o se puede consultar php.net en la seccin de comentarios. All usted podr encontrar a otros desarrolladores para informar de sus resultados en diferentes situaciones de desarrollo.

394

FIGURA 16.1 Un ejemplo de sangrado borde emisiones de php.net

Almacenamiento en cache y optimizacin


Mantener el servidor hasta la fecha es slo una manera de ejecutar un servidor eficiente. De hecho, las prcticas, hay mucho ms importante para seguir en primer lugar. Una de estas prcticas ms importante es la optimizacin de su cdigo de servidor y el sistema que se ejecute. No slo hay que seguir las mejores prcticas en el desarrollo de sus aplicaciones, tambin debe mantener su servidor que se optimiza en funcin de sus necesidades especficas.

Optimizacin de PHP
Tras los pasos para la optimizacin de su instalacin de PHP que permite llevar a cabo una mejor general del servidor. Estas medidas de optimizacin es bastante fcil de seguir y fcilmente se puede repetir como usted trabaja en varios servidores.

395

Procesador versus RAM


A diferencia de la mayora de aplicaciones que requieren ms memoria, PHP se basan ms en el procesador en su servidor. Esto significa que un sistema de doble-procesador es ms eficiente que un procesador con ms memoria. Eso no significa que la memoria no es importante, porque algunas partes de PHP utilizan una cantidad considerable de la memoria. El bfer de salida y la base de datos de plug-ins requieren ms memoria que se accede a ellos, ya que tienden a almacenar la mayora de la informacin para un acceso ms rpido la prxima vez. Esto significa que la primera solicitud es lento, pero las siguientes solicitudes que son ms rpidas si tiene suficiente memoria para manejar adecuadamente las solicitudes para ser almacenados. Esto no significa que usted debe salir corriendo y de inmediato adquirir ms memoria o ms procesadores, porque hay maneras de optimizar su servidor sin gastar dinero en software o hardware adicional.

Diez consejos para optimizar el cdigo


La siguiente es una lista de diez consejos a seguir que producir un mejor rendimiento en su cdigo, as como limitar la tensin en el servidor Web. Que aparecen aqu en orden de menor importancia a la ms importante. 1. Limite la cantidad de control de errores de sus aplicaciones de manejar. Menos manipulacin de error significa un mejor rendimiento general, a menos que estn experimentando ya los cuellos de botella. Entonces, el manejo de errores puede ser importante. 2. Usar la funcion included; no crear uno propio. Siempre que sea posible, trate de usar las funciones previstas en PHP, ya que estn precompilados y se han optimizado para funcionar ms eficientemente. Tambin han sido probados una y otra vez para asegurarse de que el trabaja. 3. Utilice una selecta declaracin en lugar de mltiples if/else. No slo se utiliza un cdigo ms limpio, seleccione producir, sino que tambin resultar en un mejor rendimiento cuando el PHP se ejecuta la parte de su cdigo. 4. Evitar mitos como el eco es ms rpido que el de impresin. Como con la mayora de lenguajes de programacin, PHP tiene varios mitos, como todo el cdigo debe estar en una lnea. Uno de los mitos ms comunes es que el eco es ms rpido que el de impresin al enviar el cdigo para el bfer de salida o de la pantalla. Esto simplemente no es cierto. Puede utilizar cualquiera de declaracin. Yo personalmente prefiero de impresin, ya que se est imprimiendo a la pantalla o buffer. 5. Conexiones de base de datos Cerrar el uso de funciones como mysql_close (para MySQL) cuando no se utiliza. Conexiones de base de datos final, cuando la secuencia de comandos completa, pero esto no siempre es la mejor manera. Por ejemplo, si usted tiene un programa que realiza llamadas de base de datos y modifica estos resultados, la conexin de bases de datos se mantiene activa (a menos que lo cierre) todo el tiempo que su guin est trabajando en el conjunto de resultados. 6. Utilice unset () para eliminar las variables cuando ya no se utiliza. Eliminacin de variables, en grandes series y los objetos cuando ya no est en uso, se traduce en un mejor rendimiento general. 7. Trate de limitar las expresiones regulares y el uso de funciones de cadena estndar siempre que sea posible. Las expresiones regulares, mientras que ms robusto, puede consumir una considerable cantidad de memoria. Frecuentemente usted encontrar una funcin de cadena sencilla (por ejemplo, strstr) produce el mismo resultado y con un aumento de rendimiento significativo en la mayora de los casos. 396

8. Sea inteligente sobre el uso de la clase. Las tareas simples sufrirn de programacin orientada a objetos innecesarios. Va a encontrar ms simples tareas consumen ms memoria que las prcticas desarrolladas con OOP. Es importante no slo saber que existen tcnicas, sino tambin cuando se debe utilizar. 9. Controla tus aplicaciones para determinar los cuellos de botella. Ralentizacin en el rendimiento del cdigo se remonta a un lugar especfico, conocido como un cuello de botella. Piense en una botella real, donde el cuello se hace ms lento el flujo del lquido a medida que los grupos que pasar por la parte superior estrecha de la botella. Lo mismo es cierto para el cdigo como la mayora de las bibliotecas y los guiones tienen un punto en el que todos deben cumplir. Un cuello de botella en su aplicacin pueden existir en el cdigo, pero tambin podra ser en una llamada de base de datos o un archivo de interaccin del sistema. La supervisin de su aplicacin se exponen los problemas y le permitir solucionar el problema de rendimiento. 10. Cach de su cdigo PHP, siempre que sea posible. Despus de optimizar el cdigo, pero todava necesitamos mejorar ms, el cach puede ser una opcin. Usted puede desarrollar una solucin personalizada o utilizar un sistema existente, tales como memcached, que se examina en la seccin siguiente. Usted tambin puede almacenar en cach el script PHP adquirido precompilar, lo que acelera las solicitudes posteriores. PHP por defecto compila las pginas de sus archivos .php cada vez que se solicitan. El almacenamiento en cach evita este almacenando el cdigo precompilado. Esto es mucho ms eficiente y significa un rendimiento ms rpido. Dichas recomendaciones no son las nicas maneras de optimizar el cdigo, pero proporcionan una lista de desaceleracin comunes y mitos en el desarrollo de sus aplicaciones. Como usted puede ver, con pocas modificaciones en el cdigo y la atencin a cmo el servidor Web se ocupa de sus secuencias de comandos, usted puede asegurar un mejor desempeo, manteniendo la funcionalidad final. He visto algunas aplicaciones eliminar funciones cuando el programa comienza a expandirse, y esto es simplemente el enfoque equivocado. Extraccin de caractersticas de una aplicacin lenta es similar a lanzar cantidades salvajes de nuevo hardware para resolver un problema de rendimiento.

Optimizar Zend
El optimizador de Zend es un producto que se utiliza para optimizar y la cach de su cdigo, sino que tambin proporciona un resultado seguro, ya que el cdigo se compila y cifrado. El cifrado se realiza mediante la ejecucin de su cdigo fuente a travs de Zend, como se muestra en la Figura 16.2, que ofusca el cdigo abierto. Esta herramienta no es gratuita, pero a medida que contine el desarrollo de aplicaciones ms robustas, usted aprender que el coste se ve compensado por el aumento en el rendimiento a alcanzar.

397

FIGURA 16.2 Zend Guard con un proyecto activo cargado

Zend Studio Un servidor ms optimizado se remonta al proceso de desarrollo de aplicaciones. Zend ofrece un estudio de desarrollo que pueden perfilar y depurar el cdigo, lo que le permite localizar los cuellos de botella antes de implementar el cdigo de. El Zend Studio, como se muestra en la Figura 16.3, permite incluso la depuracin remota, que le permite probar sus aplicaciones en el servidor de vivir al mismo tiempo ser capaces de controlar y depurar cuando sea necesario. Usted puede encontrar ms informacin acerca de estas herramientas en el sitio web de Zend en www.zend.com/en/products/guard/optimizer/ y www.zend.com/en/products/studio/.

398

FIGURA 16.3 El editor de cdigo se encuentra en el Zend Studio IDE

Optimizacin de Apache
El proceso de optimizacin de Apache est dividido en cuatro pedazos. Esto permite al desarrollador a concentrarse en cada paso especfico en lugar de obligarlos a modificar todos los aspectos del servidor. En raros casos, slo ver las actualizaciones de rendimiento mnimo, pero se dar cuenta ms que la aplicacin y la demanda continuar creciendo.

Hardware
El primer lugar de mirar al tratar de optimizar Apache es el hardware que puede correr. Por ejemplo, Apache consume una gran cantidad de memoria en el tiempo. Ms memoria puede ser una ventaja aqu, porque ser capaz de mantener adecuadamente la propia.

Servidor dedicado

399

Hacer seguro Apache se ejecuta en un servidor dedicado. Esta tcnica incluye el desarrollo de instalar que usted aprendi en la seccin anterior. Es importante entender el desarrollo de instalar la versin de Apache que no consume muchos recursos, siendo un producto de un solo usuario. Es mejor dejar que Apache tiene todo el servidor para ejecutar ms eficientemente. La empresa (grande) muchas veces las aplicaciones se ejecuta un servidor independiente para gestionar el trfico web.

Archivos de configuracin
Modificacin de los archivos de configuracin (*.conf) puede producir un aumento de rendimiento si se quita las directivas que no estn siendo utilizados. A medida que aprenda el diseo de configuracin, puede eliminar los comentarios, que har ms fcil mirar en el largo plazo. Apache ofrece una serie de archivos de configuracin de arranque, pero trate de evitar la versin de alto rendimiento ya que en realidad se vuelve menos eficiente en el largo plazo. La razn es porque esta versin excesivamente optimiza Apache, que lo obliga a correr menos eficaz a menos que est experimentando un trfico muy alto. Registros y los errores Siempre que sea posible tratar de limitar la cantidad de uso de registro. Usted puede desactivar el registro completo o limitar la cantidad de informacin que se escribe en los registros. Los errores son ms difciles de rastrear debido a Apache no informar de estas cuestiones. En la mayora de los casos, sin embargo, cuando un servidor est funcionando correctamente esto no es un problema. Si decide habilitar el registro, asegrese de editar los archivos en un equipo diferente, porque el proceso de apertura y anlisis de estos archivos a veces muy grandes puede tener un impacto en el rendimiento.

Nmero maximos de clientes


Puede modificar la directiva MaxClients en el archivo de configuracin httpd.conf para aumentar el rendimiento, sino ser conscientes de que cualquier cliente intenta conectarse despus de que el lmite es alcanzado no podr ver su sitio. En casos raros, esto puede no ser algo malo porque va a mantener el rendimiento para los usuarios existentes.
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 MaxClients 150 MaxRequestsPerChild 1000 </IfModule>

NOTA La directiva MaxClients slo se aplica cuando el mdulo prefork est configurado y habilitado. Hay otras maneras de optimizar Apache, pero corto de agregar hardware adicional y el costo para su organizacin, esta lista tendr su servidor en funcionamiento mucho ms eficiente.

Optimizacin de MySQL
Ahora que ha optimizado PHP y el servidor Web Apache, el lugar ms lgico para optimizar es MySQL. Usted puede optimizar MySQL despus de ser instalado, pero hay algunas buenas prcticas a tener en cuenta antes de la instalacin, cuando sea posible. 400

Mejor rendimiento de la instalacin


Elegir el mejor compilador para el sistema cuando se genera normalmente MySQL puede conseguirle 10 a 30 por ciento de mejor rendimiento. Compilar MySQL con slo los conjuntos de caracteres y las opciones que vayan a utilizar. A menudo, una evaluacin rpida de su uso previsto puede resultar en un mejor rendimiento, porque a simple vista se puede determinar qu caractersticas que usted usa y no va a usar. La documentacin de MySQL tiene varios consejos sobre la mejora del rendimiento, y como seguir aplicando ms de ellos tendr que ejecutar el binario compilado utilizando la prueba de referencia de MySQL para realmente determinar si las modificaciones se traducir en un mejor rendimiento. MySQL es una aplicacin de largo camino. Esto significa que usted desea un mejor rendimiento general y no slo para acciones muy rpido. Por ejemplo, suponga que tiene una tabla con 100.000 lneas, que no es poco comn en aplicaciones grandes. Realizacin de una bsqueda en esta tabla llevar algn tiempo, por lo que MySQL en sintona con un acceso rpido en la mente realmente ser el cuello de botella. Es mejor disponer de MySQL en sintona con los procesos a largo plazo en mente para trabajar con datos en estos volmenes.

Registro de consultas lentas


Una de las mejores maneras de localizar los cuellos de botella en su base de datos MySQL es habilitar el registro cuando sea necesario. Es importante entender que registros en s mismo es un asesino en el rendimiento, pero a veces es necesario fijar otras cuestiones. MySQL registra las consultas de lento a un archivo de registro. Si la cola de este archivo, que se utiliza para vigilar activamente el flujo, se le inform de las consultas lentas. Tambin puede dejar que este registro de relleno y luego pruebe ms tarde, dependiendo de qu tan activo es su sistema.
tail -f /var/lib/mysql/192-168-1-107-slow.log

El camino de la lentitud de archivo de registro de consultas ser diferente dependiendo de su entorno. NOTA Windows no ofrece una "cola" de comandos por defecto, pero puede instalar el servidor de las herramientas disponibles en Microsoft. NOTA Es posible que necesite para que "el registro de consultas lentas" en los archivos de configuracin de MySQL.

Comprobacin de tablas
Otra manera de asegurar una base de datos se est ejecutando correctamente es para controlar la salud de mesa, al emitir el comando siguiente en el smbolo del sistema. Table_name Reemplazar con el nombre real de la tabla que desea consultar.
CHECK TABLE table_name

Por ejemplo: mysql> check table poll; 401

+-------------+---------+---------------+--------------+ | Table | Op | Msg_type | Msg_text | +-------------+---------+---------------+--------------+ | book.poll | check | status | OK | +-------------+---------+---------------+--------------+ 1 row in set (0.00 sec)

Limitar las opciones de inicio


Otra forma de obtener un mejor rendimiento de MySQL es limitar las opciones que se cargan cuando se inicia. Los buques de MySQL con varias opciones para cada caso de uso, pero es seguro decir que no har uso de todos ellos. Similar a Apache, si modifica los archivos de configuracin de MySQL, usted notar un mejor rendimiento.

Herramientas adicionales
El grupo de desarrollo de MySQL proporciona perfiles libre y herramientas de administracin. Estas herramientas pueden ser descargadas desde el sitio web principal de MySQL y le ayudar a optimizar y controlar sus bases de datos de forma remota. La ventaja de usar estas herramientas es no tener que controlar tu servidor usando el comando herramientas de lnea de base. Estos interfaz grfica permite que las herramientas le permiten entender lo que su servidor web est haciendo desde una perspectiva visual, como se muestra en la Figura 16.4. FIGURA 16.4 The MySQL Query Browser

402

Almacenamiento en cache
El tema de la cach es normalmente una vez que mir a experimentar cuellos de botella en una aplicacin, pero se puede instalar las soluciones de almacenamiento en cach antes de que surja algn problema.

Trabajar con memcached


Uno de los cuellos de botella en los scripts de servidor es la base de datos. Usted tiene la habilidad de ajustar la configuracin, lo que hizo en la seccin anterior. A veces, esto slo puede ir tan lejos como un sistema sigue creciendo. La respuesta a este problema es instalar un software para ayudar a lidiar con la desaceleracin de base de datos, tales como memcached, que es una memoria de alto rendimiento objeto de sistema de almacenamiento en cach. Este sistema est construido con la intencin de acelerar las aplicaciones web dinmicas mediante la eliminacin de la carga de base de datos, que se encuentra ms a menudo como el sistema sigue creciendo. Puede descargar la ltima versin de memcached de danga.com en www.danga.com/memcached/.

Instalar memcached en Linux


La siguiente seccin cubre el proceso de instalacin de memcached en un servidor Web de Linux. Esta versin requiere de otra biblioteca que se instalen, que tambin estarn cubiertos. 403

Instalacin de libevent
Antes de instalar memcached, necesita instalar una biblioteca de la dependencia. Esta es la libevent, que puede descargarse en www.monkey.org/~provos/libevent/. Descomprimir el archivo y realizar los mismos pasos de instalacin que ha visto en los ejemplos anteriores, cuando la instalacin de aplicaciones.
$ tar -xvf libevent-1.3b.tar.gz

Cambie el directorio actual a la recin creada libevent para continuar el proceso de instalacin.
$ cd libevent-1.3b

El ltimo paso para la creacin de la dependencia es configurar y construir el necesario instalar los archivos e instalar la biblioteca libevent.
$ ./configure $ make $ make install

Instalacin de memcached
Una vez que se instala libevent, puede continuar con la instalacin de memcached.
$ gunzip memcached-x.x.x.tar.gz

Empieza por descomprimir el archivo que acaba de descargar.


$ tar -xvf memcached-x.x.x.tar

A continuacin, cambiar el directorio actual para continuar la instalacin.


$ cd memcached-x.x.x

El ltimo paso del proceso de instalacin es la de crear el script de instalacin e instalar la aplicacin.
$ ./configure $ make $ make install

Con memcached instalado, ponerlo en marcha y pasar a la extensin de PHP.


$ ./memcached -d -m 2048 -l 127.0.0.1 -p 11211

Descargar la extension memcached para PHP


En este punto, el siguiente paso es instalar la extensin de PHP que se utiliza para interactuar con memcached. El primer paso es descargar memcached desde el repositorio de paquetes PECL.
$ wget http://pecl.php.net/get/memcache-x.x.x.tgz

404

NOTA El nmero de versin se ha eliminado para asegurarse de que descarga la versin correcta, no por la fuerza una versin en el lector. Lo mejor es leer la documentacin antes de descargar una versin de.

Instalacin de la extensin memcached de PHP


Una vez que el archivo se descarga, descomprimir y desempaquetar el archivo de almacenamiento.
$ gzip -df memcache-x.x.x.tgz $ tar -xvf memcache-x.x.x.tar

Cambie al directorio que el archivo ha creado memcached.


$ cd memcache-x.x.x

Una llamada a phpize se hace para crear los archivos descomprimidos en una extensin de PHP compatibles.
$ phpize

El siguiente paso es configurar la instalacin, hacer que los archivos de instalacin, y finalmente instalar la aplicacin que utiliza los siguientes tres comandos:
$ ./configure $ make $ make install

Cuando la instalacin est completa, se necesita modificar el archivo php.ini y aadir la nueva extensin.
extension=memcache.so

Instalar memcached en Windows


El primer paso para la instalacin de memcached es descargar la versin binaria directamente de http://jehiah.cz/projects/memcached-win32/ 1. Descomprimir los archivos binarios en el directorio deseado (e.g., c:\memcached). 2. Instalar el servicio: c:\memcached\memcached.exe -d instalar desde el smbolo del sistema. 3. Inicie el servidor de Microsoft Management Console. 4. Utilice el servidor, por defecto escuchando en el puerto 11211. Ahora que ha instalado y arrancado memcached, el siguiente paso es configurar PHP. Comience por comprobar las extensiones de directorio de PHP (C:\php\ext) para la extensin memcached (php_memcache.dll). Si usted no ve la extensin de ese directorio se puede visitar el repositorio de PECL y descargarla desde all: http://pecl4win.php.net/ext.php/php_memcache.dll El siguiente paso es abrir el archivo php.ini y aadir la extensin memcached a la lista existente de las extensiones.
extension=php_memcache.dll

El ltimo paso es reiniciar Apache. 405

Terminando la instalacin para Linux y Windows


El ltimo paso es reiniciar PHP reiniciar Apache y ejecutar la funcin phpinfo para ver si memcached se ha aadido correctamente.

Guardar los datos en la cach


El poder de memcached no puede ser explicado en una seccin pequea, pero el siguiente es un buen resumen de cmo cargar y guardar datos en el sistema de almacenamiento en cach. El primer paso es crear una nueva instancia de la biblioteca de objetos Memcache.
$cache = new Memcache;

Despus de crear el objeto, crear una nueva conexin. Para este ejemplo, todo lo que se est ejecutando en el mismo servidor, pero memcached realmente brilla cuando est instalado en varios servidores. El segundo argumento en el mtodo connect es el nmero de puerto en el que se est ejecutando memcached.
$cache->connect(localhost, 11211);

Despus de realizar la nueva conexin, puede crear algunos datos de la muestra, que probablemente sera un bloque de ms avanzada de datos en una aplicacin real.
$sampleData = array(apples, oranges bananas, waffles);

Despus de crear los datos de la muestra, que en este ejemplo es una matriz bsica, es necesario enviar los datos al sistema de almacenamiento en cach. Esto se hace realizando una llamada al mtodo conjunto de la clase Memcached. El primer argumento es el nombre de la clave, que debe ser nico, porque es la forma en que usted va a recuperar esta informacin.
$cache->set(uniquekey, $sampleData, false, 86400);

El segundo argumento es la muestra de datos para almacenar en la memoria cach.


$cache->set(uniquekey, $sampleData, false, 86400);

Memcached tiene la capacidad de almacenar los datos en un formato comprimido, que es fijado por el tercer argumento. Esta opcin es una bandera de verdadero o falso.
$cache->set(uniquekey, $sampleData, false, 86400);

El cuarto y ltimo argumento determina el tiempo que los datos en cach debe permanecer vivo en segundos. En este ejemplo, los datos se va a quedar por 24 horas.
$cache->set(uniquekey, $sampleData, false, 86400);

NOTA La opcin caducar de datos memcached no puede exceder de 2592000 (30 das).
$cache->set(uniquekey, $sampleData, false, 86400);

406

Como puede ver, el cdigo necesario para guardar los datos en la cach es bastante simple y hace que sea muy fcil de adaptar a las aplicaciones existentes. Aqu est el script de ejemplo completo para guardar los datos en la cach.
<?php $cache = new Memcache; $cache->connect(localhost, 11211); $sampleData = array(apples, oranges bananas, waffles); $cache->set(uniquekey, $sampleData, false, 86400); ?>

Carga de datos en cach


Una vez que almacenar informacin en la cach, el proceso para recuperar esa informacin es una cuestin de llamar a uno de los mtodos de la clase Memcache. Este mtodo acepta un argumento, que es la clave que utiliz para guardar los datos en la cach.
$result = $memcache->get(uniquekey);

Eso es todo lo que hay que cargar la informacin almacenada en cach. Como puede ver, la carga de datos de la cach es muy similar al proceso general de trabajo con la base de datos. Esto significa que no es difcil integrar sin problemas en su cdigo.

Adminitrar servidores
El sistema de almacenamiento en cach memcached se puede instalar en la misma mquina que el servidor Web se ejecuta en. Sin embargo, funciona mejor si se aade a una serie de otras mquinas. Estas mquinas adicionales no tienen que estar en el mismo dominio, ubicacin, o incluso ser todo lo que de gran alcance, desde una perspectiva de hardware.

Agregar nuevos servidores


Usted puede utilizar connect() para agregar nuevos servidores, pero hay una funcin mejor, addServer (), que no utiliza tantos recursos y slo establece una conexin de red cuando sea necesario. Puedes aadir tantos servidores como desee, pero slo se utilizar cuando sea requerido por el sistema.

Cerrar una conexin


El proceso de cierre de una conexin de servidor cach se realiza mediante una llamada al mtodo close(). Este mtodo no cerrar conexiones persistentes. Estas conexiones se cierran slo cuando el servidor Web se apaga o se reinicia.
$cache = new Memcache; $cache->close();

407

Eliminacin de un elemento en la cach


Artculos ser automticamente eliminado de la cach cuando su expiracin, pero no es raro que a usted lo desea, puede eliminar los datos inmediatamente. El mtodo delete () acepta dos argumentos. El primer argumento es la clave del partido y eliminar. El segundo argumento es un retraso de tiempo de espera cuando el servicio de almacenamiento en cach a esperar esta cantidad de tiempo antes de extraer el valor. Usted puede utilizar este mtodo para acelerar el proceso de eliminacin de ciertos elementos, estableciendo el tiempo de espera de unos minutos u horas, en el futuro.

Avanzando con memcached


Ahora que tiene una comprensin de cmo instalar, modificar y utilizar memcached debera ver un aumento sustancial del rendimiento. La ventaja de trabajar con memcached se puede aadir ms servidores que la carga se vuelve ms exigente. Este sigue siendo eliminar el estrs de la base de datos y hace que sus aplicaciones sean ms sensibles. La clase Memcached ofrece algunos otros mtodos que pueden ser tiles, dependiendo de su uso previsto. Tambin puede utilizar este sistema de almacenamiento en cach memcached con mltiples lenguajes de programacin, pero el foco en esta seccin ha sido PHP 5.

Manejo de copias de seguridad (Backups)


Copia de seguridad de sus datos no es slo una las mejores prcticas para asegurar que sus datos se almacenan de forma segura, copias de seguridad tambin se puede utilizar para limpiar peridicamente el sistema y limitar los archivos que estn disponibles en el sistema. A menudo usted tendr muchos archivos Oldfilename.php o test.php a travs de su servidor como prueba de los conceptos ms cdigo. El problema con estos archivos extra se ralentiza el directorio analiza y hace ms difcil gestionar los archivos que la material.

Administrar archivos
Ejecutar un servidor ms eficiente puede incluir la reduccin de lo que est instalado en su servidor. En la siguiente seccin usted aprender cmo excluir archivos no utilizados para limitar la sobrecarga.

Administra archivos necesarios


Si limita el servidor para que slo tenga el cdigo de activa y salir de la experimentacin de un servidor de desarrollo o de la seccin, usted se dar cuenta de un directorio de exploracin y la bsqueda de aumentar el rendimiento. Esto no significa que los archivos innecesarios que debe suprimirse. De hecho, eso es exactamente lo contrario de lo que debe hacer. La mejor prctica es crear copias de seguridad programado que buscan estos archivos o simplemente tener un sistema de copia de seguridad que respalda todo el servidor y lo mueve a una ubicacin remota.

Lmite de archivos largos


408

Trate de limitar el uso de los archivos ms grandes siempre que sea posible. Estos archivos tardan ms tiempo para abrir y requieren ms memoria cuando se abre. Si no se excluyen, sino que tambin ralentizar el proceso de copia de seguridad, que obtiene una mirada ms a fondo en la siguiente seccin. NOTA No almacene los datos de backup en la misma unidad, ya que tendr un problema an mayor de los recursos.

Aministrar copias de seguridad


Ejecutar copias de seguridad en su sistema asegurarse de no perder los archivos necesarios. Esto puede incluir los archivos de usuario cargado o configuraciones de servidor bsico.

Copias de seguridad temporizado


Servidores web UNIX ofrecen un servicio llamado cron, que puede ser configurado para ejecutarse en un momento determinado sobre la base de la informacin de configuracin. Usted puede encontrar ms informacin sobre el servicio cron consultando la pgina de manual para que.
man cron

Este es el formato de un archivo crontab, donde se repite la ltima lnea para cada nuevo comando. # # # # # # +---------------- minute (0 - 59) | +------------- hour (0 - 23) | | +---------- day of month (1 - 31) | | | +------- month (1 - 12) | | | | +---- day of week (0 - 6) (Sunday=0 or 7) | | | | | * * * * * command to run

Todos los trabajos de cron se encuentran en el mismo archivo, que normalmente se cargan al escribir el siguiente comando:
crontab -e

En Windows, puede usar el Programador de tareas, que pueden proporcionar la misma funcionalidad bsica.

Directorios de copia de seguridad usando PHP


Con el sistema de cron, que se puede ejecutar un comando en un momento dado, a su disposicin se puede construir un sistema de copia de seguridad automtica que es llamado por el cron. Estas copias de seguridad se pueden ejecutar en cualquier momento, pero a menos que haya un requisito especial, es mejor correr cuando el servidor se encuentra con la menor cantidad de estrs. La primera parte de la secuencia de comandos de copia de seguridad es definir el directorio de copia de seguridad. Esta parte est construido como una matriz, que se utiliza para permitir que ms de un directorio a ser respaldada. 409

$dirs = array(/var/www/vhosts/example.org/myfiles);

El backupDir define en el archivo de almacenamiento se guarda despus de su creacin.


$backupDir = /var/www/vhosts/example.org/backups;

A la fecha es almacenado que se utiliza como el nombre de archivo. Puede modificar el nombre del archivo para incluir las horas y minutos si decide crear ms de una copia de seguridad por da.
$date = date(m-d-y);

El ncleo de la secuencia de comandos de copia de seguridad dentro de un bucle foreach. Este lazo es el responsable de realizar copias de seguridad de cada directorio definido en la matriz. Para este ejemplo, slo hay un directorio definido, por lo que este ciclo slo se ejecutar una vez.
foreach($dirs as $dir) { ... }

Continuando con la secuencia de comandos, la seccin siguiente est todo en el bucle foreach. La primera parte consiste en usar preg_replace para eliminar todos, pero el nombre del directorio de la variable $dir. Esto es pasado a travs de otro preg_replace para definir el nombre del archivo.
$dir = preg_replace(/\/$/, , $dir); $archiveName = preg_replace(/^(.*)\/.*?/, , $dir);

Despus de definir el nombre del archivo, el siguiente paso es construir el comando que crear el archivo de almacenamiento.
$tgzName = {$archiveName}-{$date}.tgz; $tgzFile = {$backupDir}/{$tgzName}; $backupCmd = tar czf {$tgzFile} {$archiveName};

La variable $backupCmd se pasa al comando del sistema, que informa de PHP para ejecutar el passed-in el mando a nivel de sistema de su servidor Web. Este sera el mismo que ejecutar el comando en la lnea de comandos o terminal.
$result = system($backupCmd . 2>&1);

Para propsitos de depuracin es posible que desee a la salida del comando en caso de que se produce un error, as como el mando original para asegurar la estructura est bien definida.
print Command: . $backupCmd . <br />; print Result: . $result;

Este es el final de la secuencia de comandos de copia de seguridad de archivos. Como puede ver, la estructura de este script es sencillo y el nico aspecto importante es la funcin del sistema, que puede ser desactivado en algunos entornos. Aqu est el script completo, que se hace referencia en el archivo crontab para automatizar el proceso.
<?php

410

// File Backup $dirs = array(/var/www/vhosts/example.org/myfiles); $backupDir = /var/www/vhosts/example.org/backups; $date = date(m-d-y); foreach($dirs as $dir) { $dir = preg_replace(/\/$/, , $dir); $archiveName = preg_replace(/^(.*)\/.*?/, , $dir); $tgzName = {$archiveName}-{$date}.tgz; $tgzFile = {$backupDir}/{$tgzName}; $backupCmd = tar czf {$tgzFile} {$archiveName}; $result = system($backupCmd . 2>&1); print Command: . $backupCmd . <br />; print Result: . $result; } ?>

Copia de seguridad de tus archivos importantes es una manera de mantener un sistema eficaz. Sin embargo, la base de datos es otro aspecto que debe ser limpiado peridicamente. Usted nunca quiere borrar accidentalmente informacin importante por lo que es una buena idea de establecer un sistema de copia de seguridad de este, as. Con la excepcin de unos pocos comandos, la secuencia de comandos de copia de seguridad de base de datos es muy similar a la secuencia de comandos de copia de seguridad de archivos y se pueden combinar en un script de copia de seguridad que se explica en la siguiente seccin. Si opta por combinar las dos secuencias de comandos que puede limitar los directorios de copia de seguridad. De lo contrario, las copias de seguridad puede resultar en un rendimiento ms lento.

Uso de PHP para copia de seguridad de base de datos


Como aprendimos en la seccin anterior, se puede asignar scripts de copia de seguridad automtica en el fichero crontab. Otro script de copia de seguridad comn es la que se ocupa de sus bases de datos. Al igual que la copia de seguridad de archivos, entonces debe mover a un directorio remoto para asegurar el tamao del archivo aadido no afecta a su servidor en vivo. Usted encontrar que a medida que el sistema comienza a crecer es posible que desee invertir en un servidor de copia de seguridad que no necesita muchos recursos, ya que se utilizaran exclusivamente para el almacenamiento. Este no es un elemento necesario, pero te da un nivel adicional de proteccin con sus datos, as como su servidor hace vivir ms eficiente. La primera parte de la secuencia de comandos de copia de seguridad de base de datos es definir los detalles de la conexin MySQL.
$dbHost = localhost; $dbUsername = root; $dbPassword = pass;

411

La base de datos para este ejemplo es una aplicacin de tienda de libros, pero puede modificar la base de datos para que coincida con alguna de las muchas bases de datos se puede tener todo en su sistema.
$dbName = bookStore;

Si se han definido estas variables en otra parte de su aplicacin, usted simplemente puede cargar dicho archivo de configuracin para asegurarse de que los nicos valores deben actualizarse una vez. Reemplaza los ltimos cuatro lneas con una simple llamada de incluir o requerir.
require /path/to/configuration/dbConnection.php;

El directorio de almacenamiento de copia de seguridad de $ backupDir se define como una cadena en este ejemplo, pero usted puede modificarlo para que un arreglo como lo hizo en la secuencia de comandos de copia de seguridad de archivos. Esto es importante si usted tiene ms de una base de datos, como la mayora de los sistemas de hacer.
$backupdir = /var/www/vhosts/example.org/dbBackups;

NOTA Define el directorio de copia de seguridad fuera de la ruta de acceso del pblico siempre que sea posible para garantizar el navegador Web no puede tener acceso a las copias de seguridad. El nombre del archivo debe ser nico para los archivos no se escriben uno al otro. Usted puede crear un hash al azar usando el tiempo, que sera nico, sino que hara imposible determinar qu archivo ha creado. Una solucin mucho ms elegante es anexar partes de la fecha al nombre del archivo, lo que crea un nombre de archivo legible y nico. En lugar de hacer llamadas mltiples hasta la fecha se puede utilizar la funcin getdate(), que devuelve una matriz de informacin actualizada que se puede hacer referencia a los nombres de las teclas.
$today = getdate();

Para asegurar que la fecha se puede leer en la mejor manera posible, una serie de sentencias if se utiliza para garantizar los valores de fecha son siempre dos dgitos. Esto no es un requisito de programacin, pero ms importante, una coherencia que hace que sea ms fcil de leer la fecha en el nombre de archivo.
$month = $today[mon]; if($month < 10) { $month = 0 . $month; } $day = $today[mday]; if($day < 10) { $day = 0 . $day; } $year = $today[year];

La creacin de archivo real se divide en tres partes, pero todos en el mismo comando. La primera parte hace una llamada a la base de datos mediante la aprobacin en la informacin de acceso necesaria. 412

$mysqlCommand = mysqldump --opt -h %s -u %s -p%s %s;

La segunda parte del comando acepta los datos de MySQL y lo empuja a la funcin gzip, que es donde se crea el archivo real.
$gzipCommand =gzip > %s/%s-%s-%s-%s.gz;

La tercera y ltima parte del comando tiene las variables definidas en los apartados anteriores y crea la cadena de comandos usando sprintf limpiamente crear el comando. La funcin sprintf utiliza marcadores de posicin y acepta los argumentos adicionales para cubrir los marcadores de posicin. Este es el mismo que crear una cadena en lnea, sino que crea una cadena ms limpio y ms fcil.
$run_command = sprintf($mysqlCommand . | . $gzipCommand, $host, $user, $pass, $db, $backupdir, $db, $month, $day, $year);

El tubo | personaje (pipe | character) es un comando especial que indica al sistema para capturar la salida del comando a la izquierda de la tubera e introducir en la funcin definida en el lado derecho de la tubera. En este ejemplo, los datos de MySQL es capturado y pasado en la llamada gzip. El ltimo paso en la secuencia de comandos de copia de seguridad de base de datos es realmente hacer la llamada al sistema, que rene los datos de MySQL y crea el archivo de almacenamiento.
system($run_command);

NOTA El comando system() no est disponible si est incapacitado en el archivo php.ini o si est habilitado el modo seguro. Aqu est el script completo, que usted puede rpidamente modificar y agregar a su crontab existentes. Usted puede incluso combinar las dos secuencias de comandos de copia de seguridad y agregar ms funcionalidad. Los ejemplos anteriores son para empezar.
<?php #!/usr/bin/php //require connectfile.php; $dbHost = localhost; $dbUsername = root; $dbPassword = pass; $dbName = bookStore; $backupdir = /var/www/vhosts/example.org/dbBackups; $month = $today[mon]; if($month < 10) { $month = 0 . $month; } $day = $today[mday];

413

if($day < 10) { $day = 0 . $day; } $year = $today[year]; $mysqlCommand = mysqldump --opt -h %s -u %s -p%s %s; $gzipCommand =gzip > %s/%s-%s-%s-%s.gz; $run_command = sprintf($mysqlCommand . | . $gzipCommand, $host, $user, $pass, $db, $backupdir, $db, $month, $day, $year); system($run_command); ?>

Resumen
En este captulo, usted aprendi diversas tcnicas sobre cmo mantener un servidor Web escalable y ms eficiente. El estudio abarc los temas de la modificacin de los archivos de configuracin de Apache, lo que limita lo que se carga, y deshabilitar el registro de errores para mejorar el rendimiento global. A continuacin, aprendi cmo optimizar MySQL, que puede dar cuenta de la gran mayora de los cuellos de botella en una aplicacin y puede incluso suben a consumir los recursos del servidor Web. En la parte final del captulo, que se introdujeron para memcached, que fue utilizado para construir un sistema de alto rendimiento que elimina el almacenamiento en cach de la mayora de los gastos generales de la base de datos. Uso de cada una de estas tcnicas en cualquiera de sus proyectos de desarrollo se traducir en un mejor rendimiento. Nuevo hardware no tiene por qu ser la nica solucin, si bien optimizar su servidor Web utilizando estas tcnicas. Tambin aprendi sobre las nuevas herramientas que pueden ayudarle a optimizar su sistema utilizando un mtodo grfico en lugar del comando del sistema tradicional.

414

Capitulo 17 Construir aplicaciones completamente avanzadas


En lugar de tener el final libro con una descripcin bsica, pens que desarrollar una aplicacin reproductor de vdeo que le permiten comprender el proceso de construccin de una aplicacin. En este captulo se utiliza diversos conceptos y tecnologas aprendidas en los captulos anteriores. Recomiendo la lectura de esos primero a menos que simplemente tienen curiosidad acerca de los tipos de aplicaciones que puede desarrollar el uso de Flash y PHP o ya tienen alguna familiaridad con Flash y PHP. Este captulo est dividido en cinco partes, cada edificio en la seccin anterior y que resulta en un reproductor de vdeo completo, PHP conducido. Tambin puede tomar los conceptos y los componentes desarrollados en este captulo y utilizarlos en sus propios proyectos. Por ejemplo, el componente de acceso ser desarrollado como un mdulo independiente, que le permite caer en otra aplicacin con la modificacin de muy poco.

Construir un reproductor de video bsico


Flash ofrece una gran variedad de funcionalidad. Las posibilidades de lo que se puede desarrollar la utilizacin de Flash slo estn limitadas por el tiempo y la imaginacin. El vdeo es un activo muy valioso en la Internet con el avance de las conexiones de banda ancha de alta velocidad. Flash es la mejor manera de transmitir vdeo a causa de la amplia disponibilidad de Flash Player para todos los navegadores web ms populares. Flash permite a los desarrolladores a construir un reproductor de vdeo y estar seguro de que la mayor audiencia posible ser capaz de verla. Adems, no hace dao que Adobe ha desarrollado un completo y funcional reproductor de vdeo nica que permite a los desarrolladores incorporar fcilmente en un proyecto existente. De hecho, la construccin de un reproductor de vdeo bsico en Flash, como se muestra en la Figura 17.1. requiere de muy pocas lneas de cdigo. Comience arrastrando un componente FLVPlayback del panel Componentes al escenario. Dar a este nuevo jugador el nombre de instancia myPlayer y abrir el panel de Acciones. Para simplificar, utilice uno de los archivos de muestra de vdeo que Adobe ofrece para las pruebas:
www.helpexamples.com/flash/video/water.flv

415

FIGURA 17.1 Componente de vdeo FLVPlayback aparece en el escenario

El siguiente paso es establecer la propiedad de origen del reproductor de vdeo, sealando la muestra del archivo FLV:
myPlayer.source = http://helpexamples.com/flash/video/water.flv;

Pruebe la pelcula y usted debera ver la carga de vdeo de muestra, a continuacin, se inicia automticamente la reproduccin. Felicitaciones, ha desempeado un FLV en Flash, utilizando el reproductor de componentes vdeo prediseados. El reproductor de vdeo tiene una coleccin bastante grande de los mtodos y propiedades, pero algunos de los ms comunes estn relacionados con el control de la reproduccin. Por ejemplo, recuerda cmo el video reproduce una vez que se carg? Esto no puede ser el resultado deseado todo el tiempo, de modo que el reproductor de vdeo te permite modificar este comportamiento, establezca la propiedad autoPlay a false.
myPlayer.source = http://helpexamples.com/flash/video/ water.flv; myPlayer.autoPlay = false;

Ahora, cuando se carga el vdeo, espera a una llamada al mtodo de juego antes de que comience la reproduccin. Esta funcionalidad es ms comnmente utilizado en sitios de Internet interactivos para garantizar el vdeo o el sonido no conseguir a nadie en problemas mientras se visualiza un sitio. Normalmente, iniciado por el usuario hace clic en un botn o algo similar, vamos a mejorar la funcionalidad y aadir un evento de ratn para iniciar el vdeo. Usted puede empezar por aadir un botn al escenario y le da el nombre de instancia de myPlayBtn. A continuacin, modifique el cdigo y aadir la funcin de controlador de ratn:
myPlayer.source = http://helpexamples.com/flash/video/ water.flv; myPlayer.autoPlay = false; myPlayBtn.addEventListener(MouseEvent.CLICK,

416

beginPlaybackHandler); function beginPlaybackHandler(e:MouseEvent):void { myPlayer.play(); }

Tambin quiere que sus usuarios puedan para detener la reproduccin de un vdeo. Esto es casi idntico al proceso de reproduccin de un vdeo. Empiece por agregar otro botn para el escenario, con el nombre de instancia myStopBtn. Luego se agrega el nuevo controlador de eventos y asignar al botn Stop, tales como:
myPlayer.source = http://helpexamples.com/flash/video/water.flv; myPlayer.autoPlay = false; myPlayBtn.addEventListener(MouseEvent.CLICK, beginPlaybackHandler); function beginPlaybackHandler(e:MouseEvent):void { myPlayer.play(); } myStopBtn.addEventListener(MouseEvent.CLICK, stopPlaybackHandler); function stopPlaybackHandler(e:MouseEvent):void { myPlayer.stop(); }

Para simplificar, el componente de un reproductor de vdeo tiene la capacidad de ser de piel, lo que significa que usted no tiene que disear una interfaz personalizada. Esto carga la costumbre de la piel en un conjunto predeterminado de los controles de reproduccin. De hecho, Adobe ofrece una gran lista de skins, cada una en diferentes colores o con varias selecciones de botones y funcionalidad. Por ejemplo, aqu es el ejemplo ms comn utilizada. Esta piel es un conjunto completo de controles que se coloca debajo de la componente de reproductor de vdeo. Viendo que esta piel tiene controles de reproduccin bsica, puede reemplazar el controlador de ratn existentes y utilizar la versin interna:
myPlayer.source = http://helpexamples.com/flash/video/ water.flv; myPlayer.autoPlay = false; myPlayer.skin = SkinUnderPlayStopSeekMuteVol.swf;

NOTA La piel de un reproductor de vdeo debe estar en el mismo directorio que el SWF. Tambin puede establecer la piel utilizando el Inspector de componentes. La piel se puede encontrar en el mismo directorio que la pelcula Flash una vez que seleccione al menos una piel de el inspector de propiedades.

417

Como puede ver, la funcionalidad del reproductor de vdeo componente permite crear un jugador de base con bastante rapidez. El problema con este componente se encuentra cuando se desea jugar ms de un vdeo o incluso aadir categoras de videos. Afortunadamente, Adobe desarroll un componente maravilloso e incluso hizo fcil de usar en los proyectos de desarrollo personalizados, que se aprende a hacer ms adelante en este captulo. Va a crear y agregar la funcionalidad adicional que desee.

Construir un reproductor de video en Flash y PHP


En la seccin anterior aprendi a desarrollar un reproductor de vdeo de base, con un archivo de fuente no modificable, y ha funcionado bastante bien. El problema no es, este resultado es escalable y realmente no ofrece ningn tipo de reutilizacin, que es crucial cuando se construye una aplicacin.

Como empezar
La aplicacin de reproductor de vdeo que se desarrollan en esta seccin ha sido diseada, como se muestra en la figura 17.2, de modo que usted pueda centrarse en la parte de desarrollo. El reproductor de vdeo precompilados est disponible en el sitio Web del libro, donde tambin se puede encontrar la aplicacin completa para tener una idea de lo que ser el edificio como un producto acabado. Este reproductor de vdeo est dividido en tres partes. La primera parte es el componente de MySQL, que almacena las referencias de vdeo y las categoras.

418

FIGURA 17.2 Ejemplo del diseo del reproductor de vdeo que va a trabajar en este captulo

Construccin de tablas de la base de datos y MySQL Comience por abrir el editor de base de datos favorita y crear una nueva base de datos para este proyecto. Usted puede nombrar a esta base de datos nada que usted prefiera. Yo book_videoplayer, pero eso es slo una sugerencia. Despus que la base de datos es creada, puede empezar a aadir la estructura del esquema de la tabla para los videos y las categoras de datos. Para esta aplicacin los cuadros ya han sido definidos, pero no dude en buscar los entreg a una mejor comprensin de lo que son responsables. Los cuadros de esta aplicacin se dividen para asegurarse de que se optimizan y entender fcilmente que el cuadro es el responsable de cada tarea. Es mejor dividir la funcionalidad en varias tablas, tambin conocida como la normalizacin. As, asegura que su base de datos ser la ms eficiente y le permite ampliar. La estructura de la tabla en esta aplicacin es sencilla. Por ejemplo, el nombre del vdeo, la descripcin, y la fuente de referencias se encuentran en la tabla de videos, que se construye similar a la siguiente:
CREATE TABLE `videos` ( `id` int(11) NOT NULL auto_increment, `catId` int(11) default NULL, `name` varchar(200) default NULL,

419

`src` varchar(200) default NULL, `description` text, `count` int(11) default 0, `active` varchar(1) default 1, PRIMARY KEY (`id`) ) ENGINE=MyISAM;

Como puede ver, este cuadro no es nada especial, pero maneja el ncleo de la gestin de aplicaciones. Usted puede agregar ms columnas si usted decide que quiere ampliar la aplicacin original. Como puede ver, este cuadro no es nada especial, pero maneja el ncleo de la gestin de aplicaciones. Una base de datos no es la nica opcin de almacenamiento. Usted puede utilizar un archivo XML o incluso codificar los caminos de vdeo en Flash, pero la idea es desarrollar una aplicacin ampliable. Esto significa que la base de datos es la opcin ms lgica para almacenar el vdeo y los datos de categora. La base de datos tambin ofrece la capacidad de expandirse y crecer a medida que agrega ms caractersticas para su aplicacin. El segundo cuadro tiene que agregar es la tabla de categoras, que almacena un identificador usado en el cdigo PHP en la siguiente seccin y el nombre de la categora que se muestra en la aplicacin Flash.
CREATE TABLE `categories` ( `id` int(11) NOT NULL auto_increment, `name` varchar(100) default NULL, `active` varchar(1) default 1, PRIMARY KEY (`id`) ) ENGINE=MyISAM;

Adicin de datos de ejemplo para las tablas Ahora puede rellenar a las tablas a prueba de todo, como se muestra en la Figura 17.3. Usted puede utilizar su editor favorito de la base de datos y agregar los datos de ejemplo a mano, o utilizar el comando INSERT siguiente muestra que aadir unas pocas categoras y vdeos:
INSERT INTO categories (name) VALUES (Category 1); INSERT INTO categories (name) VALUES (Category 2); INSERT INTO videos (catId, name, src, description) VALUES (1, Sample Video 0:1, sample.flv, Cool Video Here); INSERT INTO videos (catId, name, src, description) VALUES (2, Sample Video 0:2, sample.flv, Cool Video Here);

420

FIGURA 17.3 Datos de la tabla de ejemplo se muestra en el MySQL Query Browser

Probar la base de datos Despus de cargar los datos en la base de datos que puede probarlo. Esto puede hacerse mediante la creacin de un archivo PHP simple que se conecta a la base de datos y ejecuta una consulta muy simple. Usted ha aprendido cmo conectarse a la base de datos en los captulos anteriores. Para este ejemplo, es necesario definir los detalles de conexin y realizar una llamada a la funcin mysql_connect.
<?php $link = mysql_connect(localhost, root, password); mysql_select_db(book_videoplayer, $link); ?>

Cuando se establece la conexin, el siguiente paso es construir la consulta SQL.


<?php $link = mysql_connect(localhost, root, password); mysql_select_db(book_videoplayer, $link);

421

$catID = 1; $query = sprintf(SELECT * FROM categories where id=%d, $catID); ?>

El ltimo paso es devolver algo. Para simplificar, vamos a mostrar uno de los nombres de categora.
<?php $link = mysql_connect(localhost, root, password); mysql_select_db(book_videoplayer, $link); $catID = 1; $query = sprintf(SELECT * FROM categories where id=%d, $catID); $result = mysql_query($query, $link); $row = mysql_fetch_array($result); print Category Name: <strong> . $row[name] . </strong>; ?>

Guardar este archivo como sqltest.php en su casa directorio del servidor Web y acceder a ella mediante el navegador de Internet favorito. Cuando se ejecuta el archivo PHP, usted debera ver una salida similar a la siguiente:
Category Name: Category 1

Si usted ve cualquier otra cosa, asegrese de comprobar los detalles de conexin. Si por alguna razn usted recibe una pgina en blanco, coloque la siguiente lnea en la parte superior de su archivo a la fuerza de PHP para mostrar todos los errores posibles:
error_reporting(E_ALL);

Ahora que usted ha visto una consulta de MySQL, ejecuta utilizando la fecha para esta aplicacin, intente llamar a dos tablas y probar la funcionalidad de la aplicacin final tendr. Las dos nicas lneas de cdigo que necesitan ser modificados son la consulta SQL y la salida.
<?php $link = mysql_connect(localhost, root, password); mysql_select_db(book_videoplayer, $link); $catID = 1; $query = sprintf(SELECT v.name FROM videos v, categories c WHERE v.catId=c.id AND c.id=%d, $catID); $result = mysql_query($query, $link); while($row = mysql_fetch_array($result)) { print Video Name: . <strong> . $row[name] . </strong>; } ?>

422

Al ejecutar este cdigo, debe presentarse una lista de vdeos para esa categora especfica. Este cdigo busca en la categora de vdeo y tablas y devuelve todos los vdeos que los identificadores comparten la misma. Este es el ms bsico de unirse a las tablas de MySQL, pero funciona perfectamente para esta aplicacin.

Integracin remota
El siguiente paso es construir el PHP reales que sern llamados por el uso de Flash Remoting. De hecho, esta seccin es similar en el hecho de que va a utilizar AMFPHP. Pero la parte ms all de este desarrollo real es diferente. CROSS--REF Ms informacin sobre la interaccin remota se puede encontrar en el captulo 8. La ventaja de la construccin de esta aplicacin que utiliza interaccin remota es que te da la posibilidad de probar ms fcilmente. Esto es porque usted puede construir las clases AMFPHP y luego probarlos mediante el cdigo PHP estndar o el visor de navegador incluido que se incluye con AMFPHP. Usted tambin tiene la capacidad de reutilizar estas clases en otros proyectos o con las porciones de cdigo HTML del mismo proyecto. Por ejemplo, suponga que desea crear un panel de usuario que puede mostrar las ltimas pelculas de una categora especfica. Usted puede hacer esto mediante la construccin de una pgina HTML muy bsico y llamar a la clase de interaccin remota para devolver los datos necesarios, al igual que lo hara en Flash. Clase de conector de base de datos Las clases en esta aplicacin dependen de la base de datos. En lugar de definir los detalles de la conexin en todas las clases, es mejor construir una clase de conector de base de datos que es responsable de hacer la conexin inicial y almacenar las credenciales de conexin. La clase de conector tiene cinco variables privadas. Los cuatro primeros definen la informacin de conexin.
<?php class DatabaseConnector { private private private private } ?> $host = $user = $pass = $dbName localhost; root; password; = book_videoplayer;

La quinta variable se utiliza para almacenar el enlace de la base de datos de identificacin de recursos.
private $link = null;

El constructor para esta clase est vaca, porque las variables privadas se definen previamente.
function DatabaseConnector() { }

423

El mtodo de conexin privada slo es llamado cuando una conexin existente no se encuentra. Este mtodo pasa en los detalles de una conexin privada y almacena el identificador de recurso en el $this-> propiedad de enlace, que slo es visible a esta clase.
private function connect() { $this->link = mysql_connect($this->host, $this->user, $this>pass); mysql_select_db($this->dbName, $this->link); }

El segundo mtodo, getConnection, se establece como pblica para otras clases tienen acceso a ella. Sin embargo, los comentarios que lo definen como privado para garantizar las clases remoto no puede acceder a l. Este mtodo comprueba en primer lugar para un recurso de la conexin ya existente, y si uno no se encuentra, se hace una llamada al mtodo connect. El ltimo paso de esta funcin es devolver el recurso de conexin activa, que se utiliza en otras clases.
/** * Get database connection * @access private * @returns database link, to be used in other sql calls */ public function getConnection() { if($this->link == null) { $this->connect(); } return $this->link; }

Como puede ver, esta clase es muy til, ya que se encarga de almacenar la conexin de base de datos. Adems, si uno no se encuentra, se crea una. Esta es la clase completa, que debe ser guardado como DatabaseConnector.php en el directorio del proyecto por lo que se puede acceder por las otras clases.
<?php class DatabaseConnector { private private private private $host = $user = $pass = $dbName localhost; root; password; = book_videoplayer;

private $link = null; function DatabaseConnector() { } private function connect() { $this->link = mysql_connect(

424

$this->host, $this->user, $this->pass ); mysql_select_db($this->dbName, $this->link); } /** * Get database connection * @access private * @returns database link, to be used in other sql calls */ public function getConnection() { if($this->link == null) { $this->connect(); } return $this->link; } } ?>

Clase Video
Ahora que la clase de conector de la base de datos se completa, la prxima clase a desarrollar es la gestin de los videos. Esta clase devuelve la lista de vdeo basado en vdeo o ID de categora. La primera parte de esta clase es para cargar en el archivo de conector de base de datos, que esta clase de vdeos se extender.
<?php require_once DatabaseConnector.php; ?>

Usted puede recordar se extiende desde las clases de ActionScript que han desarrollado en los ejemplos anteriores. La sintaxis de PHP es idntico. Bsicamente, definir la clase y cualquier clase que se extender, de forma similar a la siguiente:
<?php require_once DatabaseConnector.php; class Videos extends DatabaseConnector { } ?>

La clase de vdeo tiene un mtodo, getVideos. Este mtodo acepta un vdeo y un ID de categora por separado como argumentos para determinar qu videos para volver. 425

/** * get videos * @access remote * @returns array of videos */ function getVideos($categoryID=-1, $videoID=-1) { ... }

La primera parte de este mtodo para comprobar las necesidades de identificaciones vlidas para garantizar el SQL no se ver comprometida. Este paso no es obligatorio, pero asegura que su aplicacin sea ms seguro.
if($categoryID == -1 || strlen($categoryID) == 0) { trigger_error(Category ID required to return video list); }

Esta declaracin pide trigger_error si un identificador de categora no vlido o no se pasa in. La razn para usar el trigger_error es porque AMFPHP graciosamente detiene todo el proceso an ms y devuelve el error deseado para la secuencia de comandos de llamada, en este en este caso, que ser de ActionScript. El siguiente paso es asignar las variables de este mtodo y crear una matriz que contendr los datos de vdeo que se pasa de nuevo a ActionScript.
$vidSQL = ; $rows = array();

Una vez que los fundamentos se han definido, el siguiente paso es determinar si la secuencia de comandos debe estar buscando un video nico o una lista de ellos. Esto asigna el SQL correcto si el cdigo slo se debe buscar un vdeo.
// look for specific video? if($videoID != -1 && strlen($videoID) != 0) { $vidSQL = AND v.id= . $videoID; }

El enlace de base de datos puede ser definido simplemente haciendo una llamada al mtodo getConnection de la clase de DatabaseConnector porque la clase de vdeo se est extendiendo. La variable local $link se le asigna la conexin activa que se utiliza en el resto de la interaccin dentro de esta funcin de MySQL.
$link = $this->getConnection();

La consulta de la base de datos es bastante complejo, ya que los controles dos tablas de datos y devuelve una lista de vdeos sobre la base de ese cheque. Esta consulta es similar a la que construy cuando se prueba la base de datos al comienzo de esta seccin. Esta consulta utiliza el $vidSQL, que o bien ser una adicin vlida a la de SQL o una cadena en blanco cuando no buscas un vdeo concreto.
$query = sprintf(SELECT v.name, v.src,

426

v.id as vid, c.name as cat, v.description, v.count FROM categories c, videos v WHERE v.catId=c.id AND v.catId=%d AND v.active=1 . $vidSQL, $categoryID);

La parte especial de esta consulta SQL es la modificacin de los nombres de columna, como la
v.id as vid

Esto se hace porque el conjunto de resultados tiene el nombre de identificacin en las tablas y slo un nombre pueden ser devueltos. Si se mantiene el estndar de nomenclatura slo tendrn acceso a una tabla de informacin de identificacin. Saber que uno ser devuelto es una cuestin de orden que se les llama en. El cambio de nombre slo modifica el conjunto de resultados, por lo que no tiene que preocuparse de los datos originales se vean afectados. El siguiente paso es ejecutar la consulta de MySQL y recuperar los resultados, que luego a travs de bucle y se pasa de la funcin como una matriz multidimensional.
$result = mysql_query($query, $link);

Antes de que se ejecute el bucle, es una buena idea para algunas filas fueron devueltos por la consulta. El incumplimiento de esta comprobacin simple podra resultar en un bucle sin fin. Esto puede daar el servidor Web, ya que muy probablemente no darse cuenta de que est ocurriendo. Esta sencilla comprobacin se hace comprobando el nmero de registros devueltos con la funcin mysql_num_rows. Esta funcin devuelve un valor numrico que representa el nmero de filas devueltas en la consulta.
if(mysql_num_rows($result) == 0) { trigger_error(No videos found); return false; }

Suponiendo que un conjunto de resultados vlidos se encuentra, el siguiente paso es recorrer los resultados y llenar la variable de matriz que se defini anteriormente.
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) { array_push($rows, $row); }

El ltimo paso de esta funcin es devolver la matriz de datos de vdeo. Este mtodo no llegar a este punto, salvo que los datos vlidos de vdeo est listo para ser aprobado de nuevo.
return $rows;

Eso es todo lo que hay en la clase de vdeo. Este archivo debe ser guardado como Videos.php. Esta es la clase completa, que tambin se puede encontrar en el cdigo del libro en el sitio Web. 427

<?php require_once DatabaseConnector.php; class Videos extends DatabaseConnector { /** * get videos * @access remote * @returns array of videos */ function getVideos($categoryID=-1, $videoID=-1) { if($categoryID == -1 || strlen($categoryID) == 0) { trigger_error(Category ID required to return video list); } $vidSQL = ; $rows = array(); // look for specific video? if($videoID != -1 && strlen($videoID) != 0) { $vidSQL = AND v.id= . $videoID; } $link = $this->getConnection(); $query = sprintf(SELECT v.name, v.src, v.id as vid, c.name as cat, v.description, v.count FROM categories c, videos v WHERE v.catId=c.id AND v.catId=%d AND v.active=1 . $vidSQL, $categoryID); $result = mysql_query($query, $link); if(mysql_num_rows($result) == 0) { trigger_error(No videos found); return false; } while($row = mysql_fetch_array($result, MYSQL_ASSOC)) { array_push($rows, $row); } return $rows; }

428

} ?>

La segunda clase de este ejemplo es la clase de categora, que tambin tiene un mtodo. Este mtodo es responsable de devolver todas las categoras activas para el reproductor de vdeo. Antes de que se cree el mtodo, debe cargar en la conexin de bases de datos, exactamente igual que lo hizo en la clase de vdeo.
require_once DatabaseConnector.php;

La primera parte del mtodo getCategories es responsable de la creacin de una nueva variable $rows que llevar a cabo es regresar de la base de datos las categoras. La variable de enlace se llena con una conexin de base de datos activa, que ser utilizado en las llamadas SQL siguiente.
$rows = array(); $link = $this->getConnection();

La consulta SQL bsicamente tira en todas las categoras que estn activas, es decir, la columna activa se establece en un valor de 1. Esta consulta SQL se pasa luego a mysql_query que es responsable de la ejecucin de la llamada realidad de SQL.
$query = SELECT id, name FROM categories WHERE active=1; $result = mysql_query($query, $link);

Si en los controles de la declaracin de al menos una fila vlida antes de continuar y generar un error si no se encuentran filas vlida. Suponiendo se encuentran filas vlidas, un bucle while se utiliza para llenar las filas de la variable $rows y una vez que el bucle se completa la variable $rows se devuelve.
if(mysql_num_rows($result) == 0) { trigger_error(No categories found); return false; } while($row = mysql_fetch_array($result, MYSQL_ASSOC)) { array_push($rows, $row); } return $rows;

Eso es todo lo que hay en la clase de categora y, como se puede ver la estructura de la clase de categora es bastante similar a la clase de vdeo en la seccin anterior. Esta es la clase Categora completado:
<?php require_once DatabaseConnector.php; class Categories extends DatabaseConnector {

429

/** * get categories * @access remote * @returns array of categories */ function getCategories() { $rows = array(); $link = $this->getConnection(); $query = SELECT id, name FROM categories WHERE active=1; $result = mysql_query($query, $link); if(mysql_num_rows($result) == 0) { trigger_error(No categories found); return false; } while($row = mysql_fetch_array($result, MYSQL_ASSOC)) { array_push($rows, $row); } return $rows; } } ?>

Probar las clases En este punto, ambas clases de servicio AMFPHP se han escrito. Usted puede rpidamente probar el uso de ellos o pasar a la parte de ActionScript el desarrollo de esta aplicacin. Prueba de la clase es muy simple: bsicamente crear un archivo PHP, llame el vdeo o el mtodo de la categora, e imprimir el resultado. Por ejemplo, aqu est una prueba simple, tambin conocida como unidad de pruebas:
<?php include amfphp/services/Videos.php; $videos = new Videos(); $list = $videos->getVideos(1); print_r($list); ?>

430

Si ejecuta este ejemplo en su navegador debera ver una salida similar al siguiente ejemplo:
Array ( [0] => Array ( [name] => Sample Video 1:1 [src] => sample.flv [vid] => 1 [cat] => Category A [description] => Really Cool Video Here [count] => 0 ) ... )

Ahora debe tener dos clases completas que se pueden utilizar en el cdigo ActionScript para interactuar con el contenido de la base de datos. El siguiente paso es construir la porcin de ActionScript de la solicitud, que es manejado por las clases externas para la reutilizacin.

Desarrollar un reproductor de video avanzado


En las secciones anteriores de este ejemplo, usted desarroll la base de datos y tablas. Luego construy los servicios de PHP que interactan con las tablas de base de datos. El siguiente paso es desarrollar el ActionScript que se encarga de mostrar y gestionar el reproductor de vdeo. Si nos fijamos en el reproductor de vdeo, como se muestra en la Figura 17.4, en el escenario de Flash te dars cuenta de que hay cuatro partes: el principal componente de reproductor de vdeo, caja de informacin, lista de vdeos, y el men desplegable que almacenar las categoras de vdeo. Si desactiva todo haciendo clic en el escenario o presionando la tecla Esc, una clase de documento con el nombre VideoPlayer aparece. Esta clase es donde la mayora del reproductor de vdeo es dirigido desde, en lugar de tener el cdigo directamente en la lnea de tiempo. Esto tambin le da la opcin de desarrollar en un editor externo, como FDT, o puede utilizar el editor independiente que se incluye con Flash. Crear la clase de documento Comience por crear un nuevo archivo de ActionScript con el editor de ActionScript en Flash y el nombre que VideoPlayer.as. Guardar este archivo en el directorio de su aplicacin en la FLA est situado a asegurar que el archivo se cargar. Tambin puede utilizar el archivo de ActionScript que se proporciona en la fuente del libro en el sitio Web.

431

FIGURA 17.4 Un reproductor de vdeo que ya ha sido diseado para usted

Despus que este archivo de ActionScript se crea y se guarda, es el momento para empezar a desarrollar el ncleo de secuencias de comandos que controla el reproductor de vdeo. Empezar por construir la clase de esquema y ampliar la clase de la clase MovieClip, que se requiere para una clase de documento.
package { import flash.display.MovieClip; public class VideoPlayer extends MovieClip { } }

Ahora que se construye el esquema bsico de clase, puede empezar a construir la funcionalidad actual. Adems de la clase MovieClip, necesita importar dos clases. La clase de evento se utilizarn para todos los de gestin de eventos de base, y el paquete net.* incluir todas las clases necesarias para comunicarse con el servicio remoto.
import flash.events.Event; import flash.net.*;

Esta clase VideoPlayer tendr que tener algunas propiedades definidas, que se almacenan como privado para garantizar que sean protegidos y no pueden ser modificados accidentalmente por clases externas. La segunda 432

propiedad almacenar el NetConnection activa, que se utiliza para interactuar con el servicio remoto. Vas a trabajar con esto en la siguiente seccin de cdigo.
private var gatewayURL:String; private var gateway:NetConnection; private var selectedCatID:Number;

VideoPlayer constructor La funcin de constructor es responsable de la inicializacin de algunas propiedades, que modifica la parte visual de la pantalla del reproductor de vdeo, y llamando al mtodo de la categora.
function VideoPlayer() { gatewayURL = http://localhost/amfphp/gateway.php; getCategories(); videoPlayer.visible = false; videoListCombo.enabled = false; }

Mtodo getCategories El siguiente mtodo en la clase VideoPlayer es getCategories(), que se llama desde el constructor cuando la aplicacin se inicializa. Este mtodo comienza por la creacin de una nueva instancia del Responder, que se encarga de la respuesta del servicio remoto.
public function getCategories():void { var responder:Responder = new Responder( categoryResponseHandler, onFault ); }

Una vez definido el respondedor, el siguiente paso es asignar la puerta de entrada a una nueva instancia de la clase NetConnection. Aqu es donde la llamada real al servicio remoto comienza.
public function getCategories():void { var responder:Responder = new Responder( categoryResponseHandler, onFault ); gateway = new NetConnection(); }

Despus que el gateway ha sido debidamente asignado, el siguiente paso es conectar con el servicio remoto, pasando la ruta de puerta de enlace como el nico argumento.
public function getCategories():void { var responder:Responder = new Responder( categoryResponseHandler, onFault

433

); gateway = new NetConnection(); gateway.connect(gatewayURL); }

El ltimo paso en el mtodo getCategories es hacer la llamada remota. Esto define el servicio que desea conectarse, as como pasa a lo largo de los encuestados que manejan tanto el xito y el fracaso respuestas.
public function getCategories():void { var responder:Responder = new Responder( categoryResponseHandler, onFault ); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(Categories.getCategories, responder); }

Mtodo categoryResponseHandler Ahora que el mtodo getCategories se completa, el siguiente mtodo a desarrollar es el categoryResponseHandler, que se defini en la instancia Responder. Este mtodo se llama cuando un conjunto de registros vlidos se devuelve desde el servicio remoto.
private function categoryResponseHandler(response:Object):void { ... }

El contenido de esta clase de manejar la respuesta de los datos del servicio remoto y rellenar el ComboBox usando estos datos de referencia de vdeo. El primer paso es permitir que el ComboBox, de lo contrario no ser capaz de aadir nuevos contenidos a la misma.
videoListCombo.enabled = true;

Una vez que el ComboBox est habilitada, el siguiente paso es aadir el primer elemento, que informa al usuario seleccionar una opcin. Esta opcin por defecto tendr un valor de -1 para alertar de que no es una identificacin vlida. Usted podra utilizar 0, aparte del hecho de que es una identificacin vlida en la base de datos.
videoListCombo.addItem({label:Choose a Category..., data:-1});

Un bucle for each se construye para manejar todos los elementos de respuesta. Este se encargar de cualquier nmero de elementos de vdeo, que es esencial porque el servicio remoto no devuelve el mismo nmero cada vez, ya que no todas las categoras tiene la misma cantidad de videos.
for each(var item in response) { videoListCombo.addItem({label:item.name, data:item.id}); }

434

Este bucle se toma cada elemento en el objeto de respuesta y le asigna el nombre y la identificacion de los valores ComboBox. Esto llena el ComboBox y permite al usuario seleccionar una categora de vdeo. El ltimo paso del mtodo categoryResponseHandler es asignar el detector de eventos para el ComboBox. Este evento se activa cuando el elemento seleccionado de los cambios del componente ComboBox.
videoListCombo.addEventListener(Event.CHANGE, categoryHandler);

Mtodo categoryHandler El mtodo categoryHandler se llama cuando el usuario selecciona un elemento diferente en la instancia del componente ComboBox.
private function categoryHandler(e:Event):void { ... }

Este mtodo controla el proceso de validacin de la categora seleccionada id. El identificador de categora real se encuentra en la propiedad selectedItem del el evento passed-in.
var id:Number = e.currentTarget.selectedItem.data;

Este ID de la categora es validado mediante una sentencia condicional que los controles bsicos por un valor de -1, que fue asignado al item por defecto.
if(id == -1) return;

Si el valor no se encuentra, entonces sabes el ID es vlido, y el ID de la categora se asigna a la propiedad selectedCatID facilita el acceso a la categora actual ID.
selectedCatID = id;

Por ltimo, una llamada al mtodo getVideos se hace para cargar en la lista de vdeo basado en el ID actual.
getVideos();

Mtodo getVideos El mtodo getVideos se llama cuando se encuentra una categora vlida. Este mtodo se utiliza para hacer la primera llamada al servicio remoto, que se carga la lista correcta de vdeos a partir de la categora almacenados en el mtodo anterior. La nica parte de este mtodo que es diferente del mtodo getCategories son los parmetros pasados a la llamada al mtodo y el xito de la funcin asignada al Responder.
public function getVideos():void { var responder:Responder = new Responder( videosResponseHandler, onFault ); gateway = new NetConnection(); gateway.connect(gatewayURL);

435

gateway.call(Videos.getVideos, responder, selectedCatID, ); }

Usted puede crear un controlador de conexin principal y pasar en estas propiedades diferentes, pero para simplificar, se utilizan varios mtodos.

Mtodo videosResponseHandler Uno de los principales mtodos en esta aplicacin tendra que ser el videosResponseHandler.
private function videosResponseHandler(response:Object):void { ... }

Esto se debe a que el mtodo es el responsable de cargar la lista de vdeos y poblar el componente ScrollPane con la costumbre de los activos de VideoListItem. Estos activos se encuentran en la biblioteca de Flash para este proyecto ya que se han completado para usted. Ms adelante en este proyecto a desarrollar el cdigo ActionScript que se adjunta a los activos. La primera parte de este mtodo es definir la variable nextY que las compensaciones de cada elemento de la lista de vdeo y crea un MovieClip vaco, que se asigna a la propiedad de origen de la instancia de ScrollPane.
var nextY:uint = 5; var listItem:MovieClip = new MovieClip(); videoList.source = listItem;

La mayora de este mtodo se encuentra en el bucle for..each. Este bucle se ejecuta a travs de cada elemento de la lista de respuesta de vdeo.
for each(var item in response) { ... }

Cada paso del bucle se crea una instancia VideoListItem nuevo. Estas instancias de obtener un controlador de eventos que se les asignen y una ubicacin nica en la lista utilizando la variable de nextY previamente definidos.
var videoListItem:MovieClip = new VideoListItem(); videoListItem.y = nextY; videoListItem.x = 2; videoListItem.addEventListener(VideoListItem.ITEM_CLICK, listItemHandler);

La siguiente parte del bucle establece propiedades personalizadas del videoListItem que define el ttulo, la descripcin y vdeo a cargar cuando se hace clic en el artculo.
videoListItem.title = item.name; videoListItem.desc = item.description;

436

videoListItem.videoObj = item; videoListItem.setItem(item.vid, , item.src);

Ahora que la instancia VideoListItem se ha completado, el siguiente paso es aadir a la lista de visualizacin ListItem, que lo hace visible en el ScrollPane.
listItem.addChild(videoListItem);

Cada paso de los incrementos de la variable de bucle nextY para asegurar que cada elemento de vdeo se coloca en una posicin nica. Este valor se determina mediante la adicin de la altura del elemento de vdeo actual ms un relleno ligero a la variable nextY existentes.
nextY += videoListItem.height + 2;

El ltimo paso del mtodo videosResponseHandler es para actualizar el componente ScrollPane llamando al mtodo de actualizacin. Si usted no llama a este mtodo, la barra de desplazamiento en el ScrollPane no reflejara el vdeoelemento aadido.
videoList.update();

Como puede ver, el mtodo de videosResponseHandler es responsable de gran parte de la funcionalidad en la lista de vdeo a pesar de que es slo una parte de la aplicacin en general. Se exiga una gran cantidad de cdigo personalizado para crear correctamente. Mtodo listItemHandler El mtodo listItemHandler se llama cuando uno de los elementos de vdeo hace clic en el ScrollPane.
private function listItemHandler(e:Event):void { ... }

Este mtodo actualiza la informacin de vdeo actual en el videoMetaInfo MovieClip encuentran por debajo del reproductor de vdeo.
videoMetaInfo.titleTxt.text = e.currentTarget.videoObj.name; videoMetaInfo.categoryTxt.text = e.currentTarget.videoObj.cat; videoMetaInfo.viewsTxt.text = e.currentTarget.videoObj.count; videoMetaInfo.descTxt.text = e.currentTarget.videoObj.description;

Tambin es responsable de la sustitucin de la fuente del reproductor de vdeo y la reproduccin del vdeo nuevo.
videoPlayer.visible = true; videoPlayer.source = e.currentTarget.source; videoPlayer.play();

437

Gestin de errores en respuestas de interaccin remota


El ltimo mtodo de la clase VideoPlayer es un controlador de errores en el servicio remoto. Este mtodo no tiene que ser nico a menos que prefiera para manejar cada error de forma diferente. Prefiero mostrar el contenido del error durante el desarrollo porque, como usted recordar, el trigger_error llamadas en el PHP, que devuelve un mensaje de error del usuario.
private function onFault(responds:Object):void { trace(Debug::Error); for(var i in responds) { trace( + responds[i]); } }

Para esta aplicacin, el mensaje de error se traza durante el desarrollo y completamente ignorado cuando se ejecuta el mundo real. Ms adelante en este captulo, se crea un controlador de errores realista que es similar a los encontrados en el vdeo popular de compartir los sitios Web. Ha completado la clase VideoPlayer entero, que es la mayora de las aplicaciones de vdeo, al menos para la parte del proyecto de ActionScript. Esta es la clase VideoPlayer en su totalidad, de esta manera puede mirar por encima de cmo cada uno de los mtodos de interaccin con los dems. Este cdigo fuente tambin est disponible en el sitio Web del libro para que usted pueda cortar y pegar.
package { import flash.display.MovieClip; import flash.events.Event; import flash.net.*; public class VideoPlayer extends MovieClip { private var gatewayURL:String; private var gateway:NetConnection; private var selectedCatID:Number; function VideoPlayer() { gatewayURL = http://localhost/amfphp/gateway.php; getCategories(); videoPlayer.visible = false; videoListCombo.enabled = false; } public function getCategories():void { var responder:Responder = new Responder(categoryRespHandler, onFault); gateway = new NetConnection(); gateway.connect(gatewayURL);

438

gateway.call(Categories.getCategories, responder); } private function categoryRespHandler(response:Object):void { videoListCombo.enabled = true; videoListCombo.addItem( {label:Choose a Category..., data:-1} ); for each(var item in response) { videoListCombo.addItem( {label:item.name, data:item.id} ); } videoListCombo.addEventListener(Event.CHANGE, categoryHandler); } private function categoryHandler(e:Event):void { var id:Number = e.currentTarget.selectedItem.data; if(id == -1) return; selectedCatID = id; trace(Load Category ID: + id); getVideos(); } public function getVideos():void { var responder:Responder = new Responder(videosResHandler, onFault); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(Videos.getVideos, responder, selectedCatID, ); } private function videosRespHandler(response:Object):void { var nextY:uint = 5; var listItem:MovieClip = new MovieClip(); videoList.source = listItem; for each(var item in response) { var videoListItem:MovieClip = new VideoListItem(); videoListItem.addEventListener( VideoListItem.ITEM_CLICK, listItemHandler );

439

videoListItem.y = nextY; videoListItem.x = 2; videoListItem.title = item.name; videoListItem.desc = item.description; videoListItem.videoObj = item; videoListItem.setItem(item.vid,, item.src); listItem.addChild(videoListItem); nextY += videoListItem.height + 2; videoList.update(); } } private function listItemHandler(e:Event):void { var info:Object = e.currentTarget.videoObj; videoMetaInfo.titleTxt.text = info.name; videoMetaInfo.categoryTxt.text = info.cat; videoMetaInfo.viewsTxt.text = info.count; videoMetaInfo.descTxt.text = info.description; videoPlayer.visible = true; videoPlayer.source = e.currentTarget.source; videoPlayer.play(); } // Error Handler private function onFault(responds:Object):void { trace(Debug::Error); for(var i in responds) { trace( + responds[i]); } } } }

Construir la clase VideoListItem


El siguiente paso antes de que pueda probar la aplicacin es la construccin de la clase VideoListItem. Si intenta ejecutar la aplicacin en su forma actual, no slo se obtiene errores, pero tampoco sera capaz de cargar cualquier video porque los artculos no son seleccionables en el momento. El primer paso es crear un archivo de ActionScript en su editor favorito. Guardar este archivo como VideoListItem.as en el mismo directorio donde se ubica la FLA. Despus de que el archivo se crea, usted necesita para construir el esqueleto del archivo de clase, que debe extender la clase MovieClip, ya que se adjunta a una instancia de MovieClip en la biblioteca.
package { import flash.display.MovieClip; public class VideoListItem extends MovieClip

440

{ } }

Adems de la clase MovieClip que se importa, tambin deber importar unas pocas clases de otros con el fin de desarrollar correctamente esta clase. Estas otras clases manejar el texto, eventos, y las partes del ratn sobre instancias del tem de vdeo.
import import import import flash.display.MovieClip; flash.text.TextField; flash.events.Event; flash.events.MouseEvent;

La clase tambin debe tener algunas propiedades por defecto definida, que ser modificado ms tarde en la clase. La mayora de las propiedades son las definiciones de cadena de base. Sin embargo, la ltima propiedad, ITEM_CLICK, es una especial constante pblico que se utiliza en el controlador de eventos. Esto se hace pblico para que la variable puede ser accedida fuera de la clase.
public var videoObj:Object; private private private private private var var var var var _id:uint; _title:String; _desc:String; _thumb:String; _src:String;

public static const ITEM_CLICK:String = onItemClick;

VideoListItem constructor El constructor de esta clase simplemente establece el alfa del tema hasta el 50 por ciento, pero debido a alfa es un valor de 0 a 1, el 50 por ciento es en realidad 0.5.
function VideoListItem() { alpha = 0.5; }

Mtodo setItem El primer mtodo personalizado de esta clase es setItem. Este mtodo se llama en la creacin de una nueva instancia y se establece el id, laminiatura y los parmetros de fuente de vdeo. Para este ejemplo, la opcin del thumb (miniatura) no se utiliza, pero se puede ampliar el ejemplo, porque ya se ha aadido.
function setItem(id:uint, thumb:String, src:String) { _id = id; _thumb = thumb; _src = src; }

La segunda parte del mtodo setItem asigna a los detectores de eventos para el objeto del ratn. Aqu es tambin donde se habilita el icono del puntero del ratn cuando el usuario pasa el ratn sobre el elemento de vdeo. 441

function setItem(id:uint, thumb:String, src:String) { _id = id; _thumb = thumb; _src = src; buttonMode = true; useHandCursor = true; addEventListener(MouseEvent.ROLL_OVER, overHandler); addEventListener(MouseEvent.ROLL_OUT, outHandler); addEventListener(MouseEvent.CLICK, clickHandler); }

Mtodos de controlador de ratn Los mtodos de controlador de ratn se utilizan para modificar el valor alfa del elemento de vdeo. En este ejemplo, que bsicamente establece el alfa plenamente visible o parcialmente visible. Desde aqu se puede aadir una interpolacin a esta propiedad y tienen la propiedad de Alpha sin problemas el cambio.
private function overHandler(e:MouseEvent):void { e.currentTarget.alpha = 1.0; } private function outHandler(e:MouseEvent):void { e.currentTarget.alpha = 0.5; }

El mtodo clickHandler desencadena el evento ITEM_CLICK que alerta a los objetos de escuchar el clic. En este caso, el acto se notificar al VideoPlayer vdeo especfico, y que se cargan.
private function clickHandler(e:MouseEvent):void { dispatchEvent(new Event(ITEM_CLICK)); }

El resto de los mtodos de la clase VideoListItem son para obtener y establecer las propiedades previamente definidos. Por ejemplo, el ttulo puede ser recuperado llamando a obtener el ttulo, como el:
public function get title():String { return _title; }

Tambin puede establecer la propiedad de ttulo llamando ser title y que pasar en el ttulo del vdeo.
public function set title(val:String):void { _title = val; titleTxt.text = val; }

442

Definicin de los mtodos getter y setter


El resto de mtodos getter/setter aparecen en el siguiente cdigo y tambin estn en la clase completa disponible en la fuente de cdigo del libro:
public function get id():uint { return _id; } public function get source():String { return _src; } public function get desc():String { return _desc; } public function set desc(val:String):void { _desc = val; descTxt.text = val; }

Eso es todo lo que hay en la clase VideoListItem. Como puede ver, es en su mayora autnomos, que hace que este pequeo objeto reutilizable en otras aplicaciones. En este ejemplo, usted est construyendo un reproductor de vdeo, pero que podra cambiar fcilmente a un visor de productos, visor de documentos, o cualquier cosa que usted puede pensar. Esta es la clase VideoListItem completa, que se puede estudiar o simplemente copiar y pegar desde el sitio Web del libro.
package { import flash.display.MovieClip; import flash.text.TextField; import flash.events.Event; import flash.events.MouseEvent; public class VideoListItem extends MovieClip { public var videoObj:Object; private private private private private var var var var var _id:uint; _title:String; _desc:String; _thumb:String; _src:String;

public static const ITEM_CLICK:String = onItemClick; function VideoListItem() { alpha = 0.5; }

443

function setItem(id:uint, thumb:String, src:String) { _id = id; _thumb = thumb; _src = src; buttonMode = true; useHandCursor = true; addEventListener(MouseEvent.ROLL_OVER, overHandler); addEventListener(MouseEvent.ROLL_OUT, outHandler); addEventListener(MouseEvent.CLICK, clickHandler); } private function overHandler(e:MouseEvent):void { e.currentTarget.alpha = 1.0; } private function outHandler(e:MouseEvent):void { e.currentTarget.alpha = 0.5; } private function clickHandler(e:MouseEvent):void { dispatchEvent(new Event(ITEM_CLICK)); } public function get id():uint { return _id; } public function get source():String { return _src; } public function get title():String { return _title; } public function set title(val:String):void { _title = val; titleTxt.text = val; } public function get desc():String { return _desc; } public function set desc(val:String):void { _desc = val; descTxt.text = val; } }

444

En este punto usted ha completado el reproductor de vdeo Flash y PHP. Ahora puede probar la aplicacin, y podrs ver la misma interfaz que empezamos. La diferencia es, si selecciona una categora, el ScrollPane se llenar con los videos de esta categora. A continuacin, hacer clic en un elemento de vdeo y el vdeo comenzar a reproducirse. Tal como est, el reproductor de vdeo es una aplicacin bastante robusto que puede ser ampliado. En la seccin siguiente que usted har exactamente eso agregando un poco de seguimiento de base. Luego, en una seccin posterior, se agrega un componente de entrada de los usuarios que los resultados en una aplicacin en el mundo verdaderamente real, manteniendo la funcionalidad original del jugador.

Trabajar con seguimiento de video


En la seccin anterior, se construy un flash completo basado en un reproductor de vdeo de PHP que permite obtener un resultado dinmico. Esta aplicacin permite al propietario proceda a actualizar la base de datos, y la aplicacin Flash refleja estos cambios la prxima vez que se carga. El problema viene cuando el dueo quiere saber qu vdeos son populares. Desea que el proyecto para ayudarle a determinar qu contenido de vdeo es muy popular por lo que puede agregar ms contenido similar. La solucin es desarrollar el seguimiento de vdeo que registra cuntas veces un vdeo ha sido visto. Esto se hace por tener una columna en la base de datos que mantiene la cuenta activa. A continuacin, aadir el apoyo necesario a las clases de PHP y, finalmente, la actualizacin de Flash para mostrar el nmero. La base de datos no necesita ser actualizado, porque la columna de conteo fue agregado en la seccin anterior, aunque no se utiliz. Agregar ms columnas que va a utilizar para empezar es comn para la aplicacin tiene la capacidad de crecer. Columnas extra tambin puede ser el resultado de eliminar temporalmente una caracterstica de una aplicacin despus de que el esquema de base de datos se crea.

Actualizar la clase de video


La clase de servicio de vdeos se cre en la seccin anterior. Todo lo que tienes que hacer ahora es agregar el nuevo mtodo utilizado para modificar el recuento de vdeo:
public function updatePlayCount($vid) { $link = $this->getConnection(); ... }

Este mtodo acepta un parmetro, que es una referencia a la id de vdeo que debe ser actualizada. La primera parte de este mtodo crea un enlace a la base de datos utilizando la clase de base de datos existente, construido en la seccin anterior. Esta variable $link se pasa en todas las acciones futuras de SQL en este mtodo.

445

La segunda parte del mtodo es crear una consulta SQL que agarra el recuento de reproduccin actual del vdeo deseado.
public function updatePlayCount($vid) { $link = $this->getConnection(); $query = sprintf(SELECT count FROM videos WHERE id=%d, $vid); $result = mysql_query($query, $link); }

Comprobacin de registros vlidos Despus de que el valor est cargado, el siguiente paso es comprobar que un registro vlido utilizando la funcin familiar mysql_num_rows.
public function updatePlayCount($vid) { $link = $this->getConnection(); $query = sprintf(SELECT count FROM videos WHERE id=%d, $vid); $result = mysql_query($query, $link); if(mysql_num_rows($result) > 0) { ... } }

El contenido de esa declaracin condicional cuando el valor se actualiza, segn el recuento de determinar en la consulta SQL anterior.
$row = mysql_fetch_row($result); $count = $row[0]; $count++; $queryUpdate = sprintf(UPDATE videos SET count=%d WHERE id=%d, $count, $vid); mysql_query($queryUpdate, $link);

La consulta SQL que actualiza la base de datos se ha construido utilizando sprintf para pasar en limpio la cuenta y de identificacin de vdeo, en lugar de la construccin de una cadena duro de leer, que es ms comn. El uso de sprintf es tanto ms importante cuando vuelva a un proyecto ms tarde. En este punto, usted ha hecho todos los cambios en el archivo Videos.php y puede continuar con las modificaciones necesarias a las clases de ActionScript. Adicin de seguimiento de vdeo a ActionScript La caracterstica de seguimiento de vdeo puede ser aadido en uno de los dos lugares. Usted puede agregar la actualizacin que se ejecuta cuando el vdeo comienza a reproducirse, o bien aadir que lo que el recuento slo se actualiza despus de que el vdeo se ha visto totalmente. Cada opcin tiene sus ventajas. Para este ejemplo, la llamada de seguimiento se hace cuando se solicita un nuevo vdeo, en lugar de esperar a que el vdeo completo. Esta accin es similar a un contador de visitas en un 446

sitio Web, con la excepcin de que no va a ser nico en esta aplicacin. Sin embargo, usted puede agregar el cdigo necesario de los ejemplos anteriores para garantizar la actualizacin es nica

Mtodo updateVideoTracking
Los mtodos de seguimiento se pueden agregar nuevas en cualquier punto de la clase VideoPlayer, sino un lugar lgico es sobre el mtodo de onFault. La primera parte de este nuevo mtodo es crear una nueva instancia de la clase Responder, pasando por el mtodo de control de respuesta como el primer parmetro.
private function updateVideoTracking(vid:uint):void { var responder:Responder = new Responder( updateTrackingHandler, onFault ); ... }

Despus que se crea una nueva instancia Responder, el siguiente paso es crear la conexin de puerta de enlace utilizando una nueva instancia de la clase NetConnection. Este proceso es idntico al de otros remoto llamadas que ha realizado en la seccin anterior.
private function updateVideoTracking(vid:uint):void { var responder:Responder = new Responder( updateTrackingHandler, onFault ); gateway = new NetConnection(); gateway.connect(gatewayURL); }

La actualizacin final para el mtodo updateVideoTracking es donde se realiza la llamada al servicio remoto. La presente convocatoria se pasa a lo largo de la identificacin de vdeos al da y la respuesta debe ser el nuevo contador o un error si algo sale mal.
private function updateVideoTracking(vid:uint):void { var responder:Responder = new Responder( updateTrackingHandler, onFault ); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(Videos.updatePlayCount, responder, vid); }

Una vez que se actualiza el recuento, el recuento de nuevo volvi a Flash. Al igual que las llamadas remoto anteriores, un controlador de respuesta es necesaria para la captura de esta respuesta. En este ejemplo, la cuenta de nuevo se enva a la TextField situado en el MovieClip videoMetaInfo para reflejar la cuenta actual.
private function updateTrackingHandler(response:Object):void { videoMetaInfo.viewsTxt.text = response.count; }

447

El ltimo paso para agregar la funcin de rastreo es la de modificar el mtodo de listItemHandler existentes y aadir en la llamada al mtodo de actualizacin, tales como las siguientes:
private function listItemHandler(e:Event):void { ... updateVideoTracking(e.currentTarget.videoObj.vid); }

En este punto, la adicin de seguimiento es completo. Como puede ver, el proceso de creacin original en la primera seccin permite realmente la capacidad de introducir nuevas funciones con actualizaciones mnimas. Ahora, el reproductor de vdeo puede seguir correctamente los videos y le informar de qu vdeos son ms populares que otros. Desde aqu se puede desarrollar un panel de administracin, donde todos estos datos podra ser visto, o usted puede acceder a su editor de SQL y consultar la tabla de vdeos para la cuenta de activos de cada vdeo.

Construir un componente de Login de usuario en Flash


Ahora que el reproductor de video est bastante llena de caractersticas, es bastante seguro asumir el sitio Web debe exigir el registro para poder utilizar el reproductor. Agregar el registro es una cuestin de crear una forma bsica y la actualizacin de una tabla de base de datos, nada que unas cuantas lneas de cdigo no se puede lograr. La parte ms avanzada de esta funcin es necesario Flash para interactuar con el inicio de sesin de usuario. Para empezar, la aplicacin Flash necesita para mostrar un panel de inicio de sesin cuando se inicie la aplicacin y tambin tiene que desactivar la interfaz hasta que el usuario inicia la sesin correctamente. De acuerdo con la idea de hacer el cdigo reutilizable, vamos a desarrollar el componente de inicio de sesin en un archivo Flash y luego simplemente dejarlo en su lugar cuando se haya completado. Comience por abrir la sesin de archivo de arranque de componentes, que ya tiene el diseo terminado para usted, como se muestra en la Figura 17.5. Todo lo que necesitas para estar preocupados es con el cdigo detrs del componente de inicio de sesin.

448

FIGURA 17.5 El componente de inicio de sesin que ha sido previamente diseado

Cuando el componente est abierto notar el movieclip en la biblioteca es asignado a una clase con un nombre de LoginWindow. No se puede personalizar esa clase por lo que necesita para crear un nuevo archivo ActionScript y gurdelo en la carpeta del proyecto con la FLA.

Construir la clase LoginWindow


Ahora que el archivo se crea puede empezar a construir el cdigo de acceso. El primer paso es construir el esqueleto de la clase y extender el MovieClip, que es el mismo proceso que hemos seguido en los apartados anteriores. Esta clase no slo debe importar la clase MovieClip estndar, pero tambin va a requerir algunos nuevos. Estas nuevas clases se utilizarn para crear las acciones para deshabilitar la interfaz y el manejo de la interaccin con el ratn.
package { import flash.display.MovieClip; import flash.geom.Rectangle; import flash.events.Event; import flash.events.MouseEvent; import flash.net.*; public class LoginWindow extends MovieClip

449

{ function LoginWindow() { ... } } }

Las propiedades de esta clase son los responsables de la gestin de eventos y la creacin de referencias a la MovieClips creados en tiempo de ejecucin.
public var data:Object; private var _visible:Boolean = false; private var container:MovieClip; private var blocker:MovieClip = null; public static var LOGIN_ATTEMPT:String = onLoginAttempt;

LoginWindow constructor El constructor de la clase LoginWindow es donde se establece la propiedad de contenedores. Aqu es tambin donde se encuentran los controladores de eventos para los botones. Esto se hace para asegurar que los botones se les asigna la vez visible para el cdigo es estable.
function LoginWindow() { container = this; loginMC.resetBtn.addEventListener(MouseEvent.CLICK, resetHandler); loginMC.loginBtn.addEventListener(MouseEvent.CLICK, loginHandler); }

Mtodo redraw El mtodo redraw se llama cuando la interfaz cambia. Esto es principalmente una preocupacin cuando el usuario tiene la posibilidad de redimensionar el escenario, aunque la mayora de aplicaciones de sitios Web tienen un tamao fijo. Este mtodo tiene que tener algo de lgica en relacin con el clip de bloqueo para asegurar que no se extrae ms de una vez. El clip de bloqueo es un movieclip que elimina la interaccin de la aplicacin que obliga al usuario a iniciar sesin por "bloqueo" de los clics del ratn.
public function redraw():void { if(blocker == null) { ... } else { ... } ... }

450

El contenido de la condicional para cuando el clip de bloqueo es nulo seala a la MovieClip bloqueo real utilizando el incorporado en la API de dibujo.
blocker = new MovieClip(); blocker.alpha = 0.5; blocker.graphics.beginFill(0x000000); blocker.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);

Una vez que el clip ha sido elaborado, el siguiente paso es asignar los controladores de eventos falsos para el clip de bloqueo. Flash no tiene una interfaz nativa que se puede desactivar, porque el cdigo puede ser personalizado. La forma de evitar esto es crear una pseudo-Disabler. Esto no es ms que un MovieClip colocado en el escenario, que atrapa a todas las interacciones con el ratn y lo cancela. Esto evita que el interfaz subyacente y la aplicacin que se utilice hasta que este clip de bloqueo se retira.
blocker.addEventListener(MouseEvent.ROLL_OVER, dummyHandler); blocker.addEventListener(MouseEvent.ROLL_OUT, dummyHandler); blocker.addEventListener(MouseEvent.CLICK, dummyHandler);

Despus de la primera vez que la pantalla se vuelve a dibujar, el bloqueador que ya se han creado. Una anchura simple y ajuste de altura es la nica actualizacin necesaria. De hecho, si se llama al mtodo estndar de volver a dibujar sin la condicional, cada vez que se vera de otro clip de bloqueo a medida que comienzan a acumularse.
blocker.width = stage.stageWidth; blocker.height = stage.stageHeight;

Independientemente de si este es el primer paso del mtodo de volver a dibujar o no, el clip de bloqueo debe ser reubicado. La ventana de inicio de sesin se coloca un punto muerto, lo que significa que puede calcular el relleno alrededor de ella, multiplica esto para crear un nmero negativo, y coloque el clip de bloqueo utilizando ese clculo.
// reverse the offset to position blocker blocker.y = y * -1; blocker.x = x * -1;

Cuando todos los clculos estn completos, puede aadir el bloqueador de MovieClip a la DisplayList, que le hace visible en la aplicacin.
addChild(blocker);

NOTA Hacer que todos los clculos basados en la posicin antes de que el clip se agrega a la lista de visualizacin minimiza el parpadeo y saltar los objetos en su aplicacin. Colocacin de dos MovieClips ActionScript 3 no tiene ningn tipo de gestin a fondo como lo que se encuentra en ActionScript 2 y sus predecesores. El equivalente est tomando el id de un clip y de intercambio con otro clip. Esta parece ser la gestin de profundidad, excepto por el hecho muy importante que ActionScript se encarga de la reordenacin, cuando se intercambian los nios. 451

En este ejemplo, usted quiere asegurarse de que la casilla de ingreso est por encima del clip de bloqueo, porque si se coloca por debajo de ella, el usuario no es capaz de interactuar o acceder a la aplicacin:
container.swapChildren(loginMC, blocker);

Centrar un MovieClip El ltimo paso del mtodo consiste en volver a dibujar el centro de la casilla de ingreso en el escenario para asegurar que siempre est en el centro. Esta se actualiza constantemente cuando el mtodo redraw (volver a dibujar) se llama, porque cambiar el tamao de la etapa sera la casilla de ingreso sentarse en una posicin no centrado.
loginMC.x = (stage.stageWidth / 2) - (loginMC.width / 2); loginMC.y = (stage.stageHeight / 2) - (loginMC.height / 2);

El clculo utiliza las dimensiones del escenario y las dimensiones de caja de ingreso para determinar el punto medio. Aqu es donde el loginMC MovieClip se coloca cuando se completa el clculo. Mtodo close El mtodo close tiene una tarea: para eliminar la casilla de ingreso actual y permitir la aplicacin para ser utilizado una vez ms. El proceso de eliminacin se consigue mediante la eliminacin del nio contenedor, que contiene el cuadro de acceso y bloqueo de MovieClip.
public function close():void { container.parent.removeChild(container); }

Mtodo resetHandler El mtodo resetHandler se llama cuando se hace clic el botn de reinicio. Este mtodo borra todos los mensajes de estado y se vaca la informacin de acceso y campos de contrasea.
private function resetHandler(e:MouseEvent):void { loginMC.username.text = ; loginMC.password.text = ; loginMC.responseTxt.text = ; }

Mtodo loginHandler El mtodo loginHandler se adjunta al evento Click del loginBtn. Este mtodo se llama cuando el loginBtn se hace clic con el ratn.
private function loginHandler(e:MouseEvent):void { ... }

452

Este mtodo es responsable de comprobar el nombre de usuario y contrasea para campos de datos vlidos. Si uno de estos mbitos est vaca, salir de la funcin y un mensaje de respuesta aparece debajo del campo de la contrasea.
loginMC.responseTxt.text = ; if(loginMC.username.text == || loginMC.password.text == ) { loginMC.responseTxt.text = username & password required; return; }

Si el nombre de usuario y contrasea son campos con los valores aceptables, los valores se almacenan en la propiedad data, que ser ledo por el guin de llamadas en un controlador de eventos personalizados.
data = { username:loginMC.username.text, password:loginMC.password.text };

La ltima parte de este mtodo es disparar un evento personalizado, alertando a la secuencia de comandos de llamada que un nombre de usuario y contrasea han sido capturados y deben ser validados.
dispatchEvent(new Event(LOGIN_ATTEMPT));

Este componente ha sido desarrollado para separar la pantalla y la lgica de la seguridad, lo que significa que el componente puede ser reutilizado, porque nada est codificada en la lgica de inicio de sesin real. El ltimo mtodo real es un setter, que se utiliza para establecer la cadena en el exterior de respuesta. Este ser llamado desde el loginHandler si la validacin falla y no desea mostrar al usuario para que l o ella puede intentar otra contrasea o nombre de usuario.
public function set responseString(s:String):void { loginMC.responseTxt.text = s; }

El mtodo dummyHandler no tiene ninguna funcionalidad. Se utiliza para bloquear los eventos de ratn que se producen en el movieclip de bloqueo. Este mtodo es necesario porque un controlador de eventos necesita una funcin vlida, y si se define un annimo, se crea una prdida de memoria lenta.
private function dummyHandler(e:MouseEvent):void { // no action }

En este punto usted ha completado la clase LoginWindow y puede moverse a la siguiente etapa, que es crear alrededor de ActionScript sencillo para probar el componente. Cuando est debidamente probado se puede crear el servicio de PHP y el componente de inicio de sesin para interactuar con la base de datos que realmente buscan los usuarios reales de intentar iniciar sesin.

453

Esta es la clase LoginWindow completa.


package { import flash.display.MovieClip; import flash.geom.Rectangle; import flash.events.Event; import flash.events.MouseEvent; import flash.net.*; public class LoginWindow extends MovieClip { public var data:Object; private var _visible:Boolean = false; private var container:MovieClip; private var blocker:MovieClip = null; public static var LOGIN_ATTEMPT:String = onLoginAttempt; function LoginWindow() { container = this; loginMC.resetBtn.addEventListener(MouseEvent.CLICK, resetHandler); loginMC.loginBtn.addEventListener(MouseEvent.CLICK, loginHandler); } public function redraw():void { if(blocker == null) { blocker = new MovieClip(); blocker.alpha = 0.5; blocker.graphics.beginFill(0x000000); blocker.graphics.drawRect( 0, 0, stage.stageWidth, stage.stageHeight ); blocker.addEventListener( MouseEvent.ROLL_OVER, dummyHandler ); blocker.addEventListener( MouseEvent.ROLL_OUT, dummyHandler ); blocker.addEventListener( MouseEvent.CLICK, dummyHandler ); }

454

else { blocker.width = stage.stageWidth; blocker.height = stage.stageHeight; } // reverse the offset to position blocker blocker.y = y * -1; blocker.x = x * -1; addChild(blocker); container.swapChildren(loginMC, blocker); loginMC.x = (stage.stageWidth / 2) (loginMC.width / 2); loginMC.y = (stage.stageHeight / 2) (loginMC.height / 2); _visible = true; } public function close():void { container.parent.removeChild(container); } private function resetHandler(e:MouseEvent):void { loginMC.username.text = ; loginMC.password.text = ; loginMC.responseTxt.text = ; } private function loginHandler(e:MouseEvent):void { loginMC.responseTxt.text = ; if( loginMC.username.text == || loginMC.password.text == ) { loginMC.responseTxt.text = username & password required; return; } data = { username:loginMC.username.text, password:loginMC.password.text }; dispatchEvent(new Event(LOGIN_ATTEMPT)); } public function set responseString(s:String):void { loginMC.responseTxt.text = s; }

455

private function dummyHandler(e:MouseEvent):void { // } } }

Probar el componente de login


El siguiente paso es poner a prueba el componente de inicio de sesin para asegurarse de que todo est funcionando correctamente. El primer paso es crear una nueva instancia del componente LoginWindow de forma autnoma FLA, o puede utilizar la muestra que se encuentra el archivo con el cdigo del libro Cdigo.
var login:LoginWindow = new LoginWindow();

Una vez creada la instancia, el siguiente paso es asignar un controlador de eventos para el evento personalizado LOGIN_ATTMEPT que se llama cuando el usuario escribe los datos en tanto el nombre de usuario y los campos de contrasea y luego haga clic en el botn Iniciar sesin.
login.addEventListener(LoginWindow.LOGIN_ATTEMPT, loginHandler);

Despus de cargar el componente de ventana de inicio y el controlador de eventos adecuado es asignado, el siguiente paso es aadir a la lista de visualizacin, que hace visible.
addChild(login);

Asignar un controlador de evento de escena Usted quiere asegurarse de que cualquier modificacin a la etapa vuelve a dibujar el componente de acceso, o los artculos que estn siendo bloqueados accidentalmente pueden situarse ms all del bloqueo de MovieClip.
stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE, stageResizeHandler);

Despus que el evento se asigna al objeto de escena, es necesario crear la funcin que se hace referencia en el detector de eventos. Para esta aplicacin, el controlador simplemente hace una llamada al mtodo de volver a dibujar el componente de acceso. En una aplicacin en el mundo real puede que tenga ms funcionalidad en este evento, pero por ahora esto est muy bien para las pruebas.
function stageResizeHandler(e:Event):void { login.redraw(); }

Manejo el intento (attempt) de acceso La siguiente funcin se usa para manejar los intentos de acceso. Para simplificar, esta funcin tiene un nombre de usuario y contrasea predefinidos, que posteriormente se sustituye con un servicio remoto en la siguiente seccin. Si se llega a un inicio de sesin vlida, se llama el mtodo de cierre de la componente de acceso. Esto elimina el cuadro de inicio de sesin y permite la aplicacin de ese perodo de sesiones. 456

function loginHandler(e:Event):void { if(login.data.username == guest && login.data.password == pass) { login.close(); } }

NOTA Esta aplicacin no almacena los inicios de sesin, lo que significa el inicio de sesin es vlida slo para la sesin activa. Los usuarios tendrn que iniciar sesin cada vez que visitan la aplicacin. La funcin de loginHandler se encarga de los inicios de sesin con xito, pero no notifica al usuario de un intento de acceso incorrecto. Esto se puede solucionar mediante la adicin de una declaracin ms que actualiza el cuadro de respuesta en el cuadro de inicio de sesin.
function loginHandler(e:Event):void { if(login.data.username == guest && login.data.password == pass) { login.close(); } else { login.responseString = username and password incorrect; } }

El ltimo paso es hacer la llamada inicial al evento resize sealar el componente de acceso para la primera vez. Usted tambin puede llamar al mtodo de volver a dibujar directamente, en lugar de pasar por el evento resize.
stage.dispatchEvent(new Event(Event.RESIZE));

Aqu est el cdigo completado para esta prueba. La mayora de los componentes de conexin es manejado internamente pero ofrece facilidad de uso final.
var login:LoginWindow = new LoginWindow(); login.addEventListener(LoginWindow.LOGIN_ATTEMPT, loginHandler); addChild(login); stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE, stageResizeHandler); function stageResizeHandler(e:Event):void { login.redraw(); } function loginHandler(e:Event):void { trace(Do Login); trace(Username: + login.data.username); trace(Password: + login.data.password);

457

if(login.data.username == guest && login.data.password == pass) { trace(user logged in); login.close(); } else { login.responseString = username and password incorrect; } } stage.dispatchEvent(new Event(Event.RESIZE));

Ahora que ha completado el cdigo ActionScript necesario para la muestra, usted puede probar el componente de acceso. Debe aparecer una pantalla de acceso de inmediato y no ser capaz de interactuar con cualquier parte de la pelcula, con exclusin de la pantalla de conexin, como se muestra en la Figura 17.6, hasta que escriba la direccin de acceso. FIGURA 17.6 Ejemplo de aplicacin que muestra el componente de inicio de sesin

458

Construir la clase de administrador de login en PHP


El siguiente paso en la construccin del sistema de acceso para conectarse a la base de datos de los usuarios, ya que un nombre de usuario y la contrasea codificada no es muy prctico y ciertamente no segura. Creacin de tablas MySQL del usuario El primer paso es crear la mesa del usuario en la base de datos existente:
CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `username` varchar(25) default NULL, `password` varchar(40) default NULL, `active` varchar(1) default 1, PRIMARY KEY (`id`) ) ENGINE=MyISAM;

Entonces usted puede rellanar la tabla con algunos de los inicios de sesin de la muestra para realizar pruebas:
INSERT INTO users (username, password) VALUES (guest, MD5(pass)); INSERT INTO users (username, password) VALUES (timmy, MD5(bird));

Una clara diferencia de los inicios de sesin predefinidos en Flash es que estos inicios de sesin tienen contraseas encriptadas como un nivel adicional de seguridad. Antes de que usted puede agregar la lgica de la conexin al servicio, es necesario crear la clase de PHP. Esta clase de verificacin para los usuarios vlidos, y si se encuentra uno, se volver un verdadero, lo que significa que el usuario es vlido y el cuadro de inicio de sesin puede ser removido. Construir la clase de usuario La clase User.php es como las clases de servicios en que se extiende la clase DatabaseConnector para todas las comunicaciones de base de datos. Aqu est el esqueleto de la clase de usuario:
<?php require_once DatabaseConnector.php; class User extends DatabaseConnector { function User() { ... } } ?>

459

Mtodo login El primer mtodo, y slo en esta clase es de acceso. Este mtodo acepta dos argumentos: el nombre de usuario y contrasea para validar. La primera parte de este mtodo es crear una nueva conexin a la base de datos:
/** * Check user auth * @access remote * @returns status of user login attempt */ function login($user, $pass) { $link = $this->getConnection(); }

Cuando se establece la conexin de base de datos, puede marcar el usuario como no conectado. Esto impide cualquier posible intento de hacking que accidentalmente podra hacer un registro de usuario.
$loggedIn = false;

Lo siguiente es la consulta SQL que intenta validar el nombre de usuario y contrasea de combo. La contrasea se pasa a la funcin md5 ya que Flash enva la contrasea en texto claro, pero la base de datos almacena el resultado de md5.
$query = sprintf(SELECT * FROM users WHERE username=%s AND password=MD5(%s), $user, ($pass));

El siguiente paso es hacer la llamada base de datos y almacenar la respuesta en la variable $result, como se muestra en el siguiente cdigo:
$result = mysql_query($query, $link);

Una vez que la respuesta se almacena, una sentencia condicional se usa para determinar si se devuelven filas. Si se devuelve una fila, significa que los datos son vlidos y el usuario se ha autenticado basada en las credenciales que l o ella pasa a lo largo. Cuando una respuesta vlida se encuentra, la variable $loggedIn se establece como verdadera para informar a Flash que el usuario es, en realidad, vlida y ha ingresado exitosamente.
if(mysql_num_rows($result) > 0) { $loggedIn = true; }

El ltimo paso es devolver el resultado de manera que Flash puede actuar en consecuencia.
return array(response => $loggedIn);

Ahora que ha completado la clase de PHP, el siguiente paso es probarlo. Para esta prueba se puede utilizar el navegador de servicio que se incluye con AMFPHP. Usted encontrar que en el navegador una URL similar a la siguiente, dependiendo de donde se instal la fuente de: 460

http://localhost/flashphp/amfphp/browser/ Por ltimo, aqu es la clase de usuario completa, que debe ser guardado como User.php en el directorio de servicios de la instalacin de AMFPHP si no lo han hecho:
<?php require_once DatabaseConnector.php; class User extends DatabaseConnector { /** * Check user auth * @access remote * @returns status of user login attempt */ function login($user, $pass) { $link = $this->getConnection(); $loggedIn = false; $query = sprintf(SELECT * FROM users WHERE username=%s AND password=MD5(%s), $user, ($pass)); $result = mysql_query($query, $link); if(mysql_num_rows($result) > 0) { $loggedIn = true; } return array(response => $loggedIn); } } ?>

Agregar remotamente el componete login


Ahora que ha completado la clase de Usuarios de PHP, el paso siguiente es modificar el componente de acceso existentes para utilizar esta clase de servicios nuevos. El primer paso es agregar la variable de puerta de enlace y la URL de donde el archivo gateway.php se puede encontrar en el servidor de desarrollo.
var gateway:NetConnection; var gatewayURL:String = http://localhost/amfphp/gateway.php;

El ejemplo original fue el de validacin de usuario directamente en el archivo de Flash. Si bien esto era funcional, no era muy prctico porque slo un usuario o la contrasea puede ser utilizado.

461

loginHandler method Este nuevo sistema modifica la funcin loginHandler existentes mediante la adicin de una llamada de servicio remoto, enviando el nombre de usuario y la contrasea que fue capturado por la ventana de conexin de componentes.
function loginHandler(e:Event):void { trace(Do Login); trace(Username: + login.data.username); trace(Password: + login.data.password); var responder:Responder = new Responder(loginRespHandler, onFault); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(User.login, responder, login.data.username, login.data.password ); }

La clase Responder necesita un controlador de respuesta definida, por lo que la siguiente funcin controla esta respuesta de servicio. Para este ejemplo, el servicio o bien devuelve un booleano para saber si el usuario est registrado o no, o un error si algo sale mal.
function loginRespHandler(o:Object):void { ... }

Una declaracin condicional simple se usa para determinar si el usuario se registra en base a la respuesta del servicio remoto. Controlar la respuesta de login Si el usuario est conectado, una llamada al mtodo de cierre del componente de conexin es hecha para ocultar la ventana de acceso y permitir la interfaz de la aplicacin.
function loginRespHandler(o:Object):void { if(o.response == true) { login.close(); } }

Una opcin ms es aadido para manejar los intentos de acceso incorrectos mediante la actualizacin del mensaje de respuesta del componente de inicio de sesin.
function loginRespHandler(o:Object):void { if(o.response == true) { login.close(); }

462

else { login.responseString = username and password incorrect; } }

Manejo de los errores de respuesta La ltima funcin necesaria para el sistema de acceso es la onFault, que controla los errores en las llamadas de servicio. Por ejemplo, si la secuencia de comandos logrado intento de inicio de sesin con un cheque sin nombre de usuario o contrasea, el SQL sera un fracaso. Este error se incrementar en la clase de PHP y enviado de vuelta a Flash, en el supuesto de que est correctamente manejada.
function onFault(responds:Object):void { trace(Debug::Error); for(var i in responds) { trace( + responds[i]); } }

Ahora que el cdigo remoto se ha aadido a la anterior componente de ejemplo de acceso, puede probarlo, y realmente no debera notar ninguna diferencia. El nico cambio sera la posibilidad de usar ms de un usuario, siempre y cuando se encuentra en la tabla de usuarios que ha creado al comienzo de esta seccin. Aqu est el ejemplo de componentes de entrada con el cdigo adecuado remoto incluido:
var gateway:NetConnection; var gatewayURL:String = http://localhost/amfphp/gateway.php; var login:LoginWindow = new LoginWindow(); login.addEventListener(LoginWindow.LOGIN_ATTEMPT, loginHandler); addChild(login); stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE, stageResizeHandler); function stageResizeHandler(e:Event):void { login.redraw(); } function loginHandler(e:Event):void { trace(Do Login); trace(Username: + login.data.username); trace(Password: + login.data.password); var responder:Responder = new Responder(loginRespHandler, onFault); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(User.login, responder, login.data.username,

463

login.data.password ); } function loginRespHandler(o:Object):void { trace(Response: + o.response); if(o.response == true) { trace(user logged in); login.close(); } else { login.responseString = username and password incorrect; } } function onFault(responds:Object):void { trace(Debug::Error); for(var i in responds) { trace( + responds[i]); } } stage.dispatchEvent(new Event(Event.RESIZE));

Finalizar el reproductor de video


La ltima seccin de este captulo est ultimando el reproductor de vdeo. Deber implementar el componente de acceso que construy en la seccin anterior y aprender a utilizar una biblioteca externa.

Uso de un libreria externa


La ventaja de utilizar una biblioteca externa es que slo tiene que actualizar un sitio y todas las instancias de que el uso de la biblioteca tambin se actualizan. Por ejemplo, imagine que tiene un logotipo con un color especfico en l y de repente la empresa decide que quiere cambiar el color del logotipo. En lugar de abrir todos los casos del logotipo y editar, usted puede abrir el maestro de FLA, a editar y, a continuacin, la actualizacin de los casos, que reflejen automticamente los cambios. Usted puede utilizar este concepto para mucho ms que un logotipo simple, porque se le carga el componente de inicio de sesin desde el archivo de ejemplo que construy en la seccin anterior.

Agregar el componente login


Comience por abrir el archivo VideoPlayer.fla si no lo est. A continuacin, seleccione Archivo Importar Abrir biblioteca externa.

464

En este cuadro de dilogo, usted puede navegar hasta el directorio donde el componente de inicio de sesin se almacena y seleccione el archivo. Con el archivo seleccionado, haga clic en Abrir. Arrastre el LoginWindowMC de esta biblioteca en la biblioteca de la FLA VideoPlayer. Ahora debe ver dos MovieClips nuevo en la biblioteca de su archivo de VideoPlayer. Esto es porque el LoginWindowMC tiene un archivo de apoyo que contiene todo el diseo, que se copia automticamente cuando se arrastra el padre. Ahora que se aade el componente de acceso, puede modificar la clase VideoPlayer archivo existente para aadir esta nueva funcionalidad. Para empezar, agregar la creacin de componentes, pero olvdate de la lgica de inicio de sesin. El nuevo cdigo debe ser aadido a la funcin constructora, similar a la siguiente:
function VideoPlayer() { gatewayURL = http://localhost/amfphp/gateway.php; getCategories(); videoPlayer.visible = false; videoListCombo.enabled = false; var login:LoginWindow = new LoginWindow(); login.addEventListener(LoginWindow.LOGIN_ATTEMPT, loginHandler); addChild(login); login.redraw(); }

Antes de probar el cdigo, agregue el mtodo loginHandler para evitar errores de tiempo de ejecucin. Puede agregar este mtodo en cualquier punto en el cdigo. Recomiendo en algn lugar hacia la parte inferior de la clase para mantener el flujo general del archivo.
private function updateTrackingHandler(response:Object):void { ... } private function loginHandler(response:Object):void { ... }

El ltimo paso es importar la clase LoginWindow por lo que la propiedad esttica puede ser cargado por el controlador de eventos.
package { import flash.display.MovieClip; import flash.events.Event; import flash.net.*; import LoginWindow; public class VideoPlayer extends MovieClip {

465

... } }

Al probar la aplicacin que debe consultar inmediatamente a la ventana de inicio de sesin. Porque no agregar ninguna lgica en este momento, no hay manera de cerrar la ventana de acceso, pero se puede ver que est funcionando, lo que puede continuar. La lgica, que es responsable de llamar al servicio remoto, debe ser aadido a la mtodo loginHandler existente.
function loginHandler(e:Event):void { var responder:Responder = new Responder(loginRespHandler, onFault); gateway = new NetConnection(); gateway.connect(gatewayURL); gateway.call(User.login, responder, login.data.username, login.data.password ); }

El siguiente paso es copiar el loginRespHandler y aadir por debajo de loginHandler en la clase VideoPlayer.
function loginRespHandler(o:Object):void { trace(Response: + o.response); if(o.response == true) { trace(user logged in); login.close(); } else { login.responseString = username and password incorrect; } }

El cdigo correcto se ha aadido ahora a la clase VideoPlayer, sin embargo, hay una modificacin final necesaria antes de que el componente de inicio de sesin funcione correctamente. La variable de sesin que se define en el constructor debe ser una propiedad global, porque tal y como est ahora, ningn otro mtodo de esta clase tiene acceso a ella.
package { ... public class VideoPlayer extends MovieClip { ... private var selectedCatID:Number; private var login:LoginWindow;

466

function VideoPlayer() { ... login = new LoginWindow(); } } }

Ahora que la variable de sesin est definido correctamente, puede probar la aplicacin, como se muestra en la Figura 17.7. Usted debe ser capaz de escribir un nombre de usuario y contrasea vlidos, y el componente de inicio de sesin debera desaparecer cuando lo haga. FIGURA 17.7 Reproductor de vdeo con Final caja de ingreso visible

Como se puede ver, el componente de inicio de sesin que se est construyendo de esta manera que realmente hace posible aadir a cualquier proyecto existente. Para ampliar sobre este ejemplo, usted podra agregar un objeto compartido que se preserve la sesin y hacer que lo que el usuario no necesita entrar en cada tiempo. Usted debe ahora tener una gran comprensin de la construccin y de trabajo con tecnologa avanzada, las aplicaciones del mundo real. Estoy seguro de que usted est pensando en muchas aplicaciones diversas para construir despus de ver cmo funcionan en profundidad.

467

El siguiente es un cuadro que delinea los nombres de los archivos y donde deben ser almacenados para esta aplicacin completa. La ruta de acceso se basa en el directorio del proyecto que debe estar en su directorio de Apache para que la aplicacin funcione correctamente.

Ubicaciones de archivos de aplicaciones de cdigo


Nombre de archivo LoginWindow.swf LoginWindow.fla LoginWindow.as VideoListItem.as VideoPlayer.as SkinOverPlayStopSeekMuteVol.swf color.flv Categories.php DatabaseConnector.php Videos.php Tracking.php User.php Save Path / / / / / / /videos /amfphp/services /amfphp/services /amfphp/services /amfphp/services /amfphp/services .

Resumen
En este captulo, se inici la construccin de un reproductor de video muy bsicos y ampli ese concepto para construir un reproductor de vdeo multicategory. Uso de PHP para manejar los datos entre Flash y la base de datos ha presentado la solicitud ms dinmico. Una vez que ha completado el reproductor de vdeo, comenz a expandirse en aadir el seguimiento de vdeo. Usted aprendi lo fcil que era la aplicacin de nuevas caractersticas en el cdigo existente basado en la forma original de la aplicacin del reproductor de vdeo que se desarroll en la seccin anterior. La cuarta parte del captulo presenta el proceso de desarrollo de componentes personalizados que pueden ser reutilizados en sus proyectos de futuro. Para este ejemplo, se desarroll un componente de inicio de sesin que desactive la solicitud hasta que el usuario se conecte. El quinto y ltimo traa todas estas tcnicas en conjunto para desarrollar una aplicacin de reproductor de vdeo final en el mundo real con un mdulo de acceso y seguimiento de vdeo de las secciones anteriores. Todo lo que tienes que hacer es rellenar la base de datos con datos reales y tendr un multicategory totalmente ampliable, de seguimiento, garantizar la aplicacin reproductor de vdeo.

468

Вам также может понравиться