Span Tag Underline Tag La función sendMessageHandler se llama una vez que el mensaje se envió con éxito al servidor. La única parte importante de esta función es la última línea, el que abre el cuadro de mensaje y permite que el usuario escriba un mensaje nuevo. Usted puede borrar el mensaje en la función de envío, pero hacerlo de esta manera se asegura el mensaje permanece intacto hasta que esté seguro de que se ha añadido. 48
El PHP no le avise a un error si el SQL falla, sólo si la página no se carga. Por supuesto que puede añadir más avanzadas de error de manipulación a este ejemplo. Por supuesto que puede añadir más avanzadas de error de manipulación a este ejemplo. 944 4) (4 I>4J> W +++ 40) 2+25#/D X
Ahora que ha completado el código de envío y gestión de las llamadas al servidor, usted puede comenzar la función que gestiona los mensajes y los muestra en TextArea. El loadMessages () es llamado desde dos puntos diferentes. El primer punto es la función init(), que vimos anteriormente, el segundo es el controlador de temporizador. La función de control para ver si otra llamada ya se ha hecho para cargar los mensajes. La adición de esta verificación 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 función 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 después de entrar en una habitación. La mayoría de la funcionalidad de loadMessages es similar al proceso de envío. Es básicamente, definir el archivo PHP correcta para cargar y configurar un controlador de eventos para que el servidor devuelva los datos del mensaje. 944) IJ> W 9I4) J 4D 4) 5 D > 1@ 1!1@ 5401!1@ I !) E IJJD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B ) (4 JD ! +I 1@ JD X
,!)%C La función de respuesta de carga es responsable de trabajar con los datos XML y de pasar los mensajes que se mostrarán. 944) (4 I>4J> W > 1!! 51!! I+ JD > 2')!540')!I +JD 2+ 25#/D
49
9 I> 42++ J W ) I+4B+ JD X 5 IJD 4) 59 D X
* - - À " - - . Después 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 código XML en el Capítulo 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 sería algo como esto: 3 5R6R3 43 *43 3 994 3 3 5R&,R3 43 43 3 ( 4 8 3 3 5R&R3 43 *43 34 47 4 0 3 3 5R&&R3 43 43 3 BV ? 4 3 3 3
El paso final de la función 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 sección. Sin embargo, hay varias maneras de crear una cadena única. La fecha está siempre cambiando y ActionScript tiene un método getTime que devuelve los milisegundos desde 1 de enero de 1970. Este método 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 código ActionScript para su aplicación de chat. Aquí está el código completo de referencia: > - 45# *, 4/D > -4) - 45 E# + /D > !) - 45 E#) + /D > 4) 459 D > 44) 459 D > )
7540
7IJD
50
> D > - 45#;85*/D 9444IJ> W 9 49 540 IG,,,B,JD +>4! 4 I >4+")1B (4 JD + IJD 5 IJD ) IJD9 X 944 4) I) >4J> W 9I 42+255#/J W I# 4 @ /JD
4D X 9I40) 2+2+4 35&J W > > 8 1!C 8 5401!C 8 IJD > 8 + 5 42+2D > 8 + 540) 2+2D > 1@ 1!1@ 5401!1@ I -4) E IJJD 1@ + 51!1@ ) + -D 1@ +5> 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B 4) (4 JD ! +I 1@ JD 9 4 7 ) I 42+2B40) 2+2JD X X 944 4) (4 I>4J> W > 1!! 51!! I+ JD > > 8 1!C 8 5401!C 8 I +JD I#1 4 #E> 8 + JD 82 40) 2+25#/D X 944) IJ> W 9I4) J 4D 4) 5 D
51
> 1@ 1!1@ 5401!1@ I !) E IJJD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B ) (4 JD ! +I 1@ JD X 944) (4 I>4J> W > 1!! 51!! I+ JD > 2')!540')!I +JD 4) 59 D 2+ 25#/D 9 I> 42++ J W ) I+4B+ JD X 5 IJD X 944 IJ- 4 W > 540IJD 5#;85/E+IJD
4 D X 944) I - 4B - 4J> W 2+ 2E5#83/E E#83/E##E E #4/D X 944 (4 I >4J> W I# /JD ) IJD X 4 4+>4! 4 I) >4+ !" OB 4) JD 4IJD
~~ En este punto, usted ha completado la parte de ActionScript de la aplicación de chat. El segundo paso es desarrollar el código PHP, que es llamado desde el código ActionScript. El código PHP está dividido en tres archivos, que se ilustran en la tabla 11.4.
5
TABLA 11.4
! 0 ! 02 2* getMessages.php Coge todos los mensajes en los últimos 15 minutos messages.php Se encarga de la redacción de un nuevo mensaje a la base de datos dbConn.php La conexión de base de datos compartida con los otros archivos El primer archivo trabajar con getMessages.php. La primera parte de la carga de código o incluye el archivo de conexión 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. < @5#-! \1)9 %(13#+ IIJ$I=,\*GJJD < 57 @M@ 7I< @JD
La condición de los últimos 15 minutos se determina por el código 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. También puede escribir esta ecuación matemática básica mediante la eliminación de la etapa de multiplicación. Si lo hace, lo hace más difícil de leer el código, sino que también aumenta la velocidad de la aplicación. IJ$6,,
Esta cadena SQL se pasa a la función 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 duración prevista hasta que una fila válida no se devuelve desde la base de datos. También puede colocar esto en un bucle y el uso mysql_num_rows() para determinar cuántas filas se devuelven.
53
FIGURA 11.3 La consulta SQL devuelto dentro de el MySQL Query Browser
La función 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 capítulo anterior. 0 I< 057 @M9 M
7I< JJ W <2+5# 5R/+< 0ZQR[+#Q34/D <2+5#43/+< 0ZQ 4R[+#434/D <2+5# 3/+< 0ZQ R[+# 34/D <2+5# 34/D X 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. Envío de los datos de vuelta a ActionScript es muy sencilla, solo asignar la variable $xmlData a la declaración de impresión. 4<2D
La declaración de impresión envuelve su archivo messages.php, que se muestra en su totalidad aquí. ;
54
4Q844+ RD < @5#-! \1)9 %(13#+I IJ$I=,\*GJJD < 57 @M@ 7I< @JD <25# 34/D 0 I< 057 @M9 M
7I< JJ W <2+5# 5R/+< 0ZQR[+#Q34/D <2+5#43/+< 0ZQ 4R[+#434/D <2+5# 3/+< 0ZQ R[+# 34/D <2+5# 34/D X <2+5# 3/D 4<2D ;3
El archivo PHP siguiente que debe ser desarrollado es messages.php, que es responsable de la inserción 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 información de acceso y conexión a la base de datos MySQL. 4Q844+ RD
El siguiente paso es comprobar que el mensaje enviado desde ActionScript es de hecho mayor que 0 caracteres cadena vacía. En PHP, strlen() devuelve la longitud de una cadena que se pasa como argumento. 9I 4I
Asumiendo que tiene un mensaje de longitud válido, asigna tres variables: una es el nombre de usuario, el segundo es el mensaje, y la tercera es la fecha en formato timestamp UNIX. < 45
El siguiente paso en el desarrollo de este archivo es tomar realizar la llamada MySQL real, que se realiza utilizando mysql_query(). Esta función tiene la instrucción SQL como argumento y devuelve un identificador de recursos o genera un error. La instrucción 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. En una aplicación más robusta, que se desea añadir 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. 7 @M@ 7I#".-1".9 I 4B BJ
55
C!-I Q#+< 4+#QB Q#+< +#QB Q#+<+#Q J/JD
E El nombre dateAdded fue utilizado porque la fecha es una palabra reservada en MySQL y se producirá un error en la mayoría 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 notificación de Flash que el mensaje se ha añadido otro mensaje y ahora puede ser añadido 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. ; 4Q844+ RD 9I 4I
! )!! 1 El archivo PHP pasado en su versión de Flash aplicación de chat es el archivo de dbconn.php. Este archivo es responsable de conectar a MySQL y proporcionar un vínculo a las tablas contenidas en la base de datos. Sólo puede haber una conexión a una base de datos única a la vez. La mejor práctica es el plan de SQL se conecta a ser más eficientes. Esto le impide tener que ir adelante y atrás. Este archivo es bastante pequeño, pero tiene un requisito muy importante, que es en honor a las medidas de seguridad en la mayor medida. Una buena parte de estos artículos han señalado que la seguridad es importante. Se veía 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 pasarán a lo largo de la conexión. A menudo las aplicaciones más avanzadas tendrán un archivo separado para las variables de 56
configuración. Ese archivo de configuración que se carga sólo cuando la aplicación se inicia y se hace referencia en todo. Sin embargo, debido a esta aplicación es bastante pequeño, sólo se asignan las variables de la base de datos de conexión dentro de la conexión del archivo dbconn.php. < 5#(-M.)/D < 5#-F!M-1.)/D < 5#-F!M --%1/D <8 5#-F!M -M.)/D
La primera variable es a menudo localhost o la dirección IP del servidor donde MySQL se ejecuta si se pasa a estar en ejecución remota del servidor donde está corriendo PHP. No había que esperar para ver una instalación remota de MySQL en sistemas más pequeños, pero es muy común en aplicaciones de mayor tamaño. Las otras tres variables son nombre de usuario, contraseña y el nombre de la base de datos a la que desea conectarse. Esta información de conexión proporcionada por su administrador de sistema o de acogida, si no ya lo saben. MySQL crea una instalación por defecto con el nombre del usuario "root" y sin contraseña, pero es muy inseguro de esta manera y se debe cambiar inmediatamente. Ahora que las variables son definidas correctamente, puede realizar una conexión real a MySQL. Esto se logra por la función mysql_connect() dentro del PHP. Esta función acepta tres argumentos: host, nombre de usuario y una contraseña definida hace un momento. <4?57 @M44I< B< B< JD
La función 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. Selección de la base de datos es simplemente una cuestión 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 conexión. 7 @M M8I<8 B<4?JD
El paso final y más importante es destruir las variables que contienen la información de conexión de MySQL. La destrucción o eliminación de una variable se hace pasando la la variable de referencia a la función unset(), que elimina la existencia de esa variable. 4 I< JD 4 I< JD 4 I< JD 4 I<8 JD 4 I<4?JD
Es importante que este paso para garantizar que los futuros aspectos de una aplicación no puede obtener acceso a estas variables. Esto es especialmente importante cuando la introducción de aplicaciones de terceros en su aplicación personalizada.
57
Una alternativa más segura que el método anterior es envolver todo esto en una clase. Esto es similar a trabajar con un componente cerrado en Flash. El acceso está permitido sólo a lo que usted quiere que otros vean, y el resto está oculto. Aquí hay un ejemplo de una conexión de base de datos con una clase: ; 7 @444 )7 @ 444 W 8<4?D >< 5# /D >< 5#-F!M-1.)/D >< 5#-F!M --%1/D ><8 5#-F!M M.)/D 944)7 @ 444IJWX 894444IJ W < $34?57 @M44I < $3 B < $3 B < $3 JD 7 @M M8I< $38 B< $34?JD X 8944 444 I< 5RRB<5RRB<5RRB <5RRJ W < $3 5< D < $3 5<D < $3 5<D < $38 5<D X 8944!4?IJ W
4< $34?D X X < @540)7 @ 444IJD < @$344IJD ;3
A primera vista no parece muy diferente de la conexión de ejemplo anterior, sin embargo, la sección importante es la definición de las variables. 8<4?D
58
>< 5# /D >< 5#-F!M-1.)/D >< 5#-F!M --%1/D ><8 5#-F!M M.)/D
Como vimos en el capítulo 9, las variables de clase de PHP se puede dar una designación pública y privada. En esta clase de ejemplo, las variables de conexión se definen como privadas, el bloqueo con fuerza dentro de la clase. Esto garantiza esas variables no pueden ser descubiertos por accidente, y también ofrece otro beneficio. Digamos que tienes un nuevo proyecto y desea conectarse a una base de datos; hacerlo sería tan simple como el siguiente bloque de código. ; >' ? ë ' ë 0 #$6#$6# $6# %$ ë 0 <@ 75#-! \1) M8/D < 57 @M@ 76ë 0"r JD ;3
Tenga en cuenta que se utiliza la clase de conexión personalizada, información nueva conexión, y finalmente pasar el enlace de la base de datos en la convocatoria de la consulta. En ningún momento de este código es la información de conexión de acceso o expuestos al público en general. 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 conexión. Aquí está el archivo de conexión original en su totalidad: ; < 5# /D < 5#-F!M-1.)/D < 5#-F!M --%1/D <8 5#-F!M M.)/D <4?57 @M44I< B< B< JD 7 @M M8I<8 B<4?JD 4 I< JD 4 I< JD 4 I< JD 4 I<8 JD 4 I<4?JD ;3
!!% En este punto, todos los ActionScript y PHP es escrito. Sin embargo, si intenta probar la aplicación no se ejecutará porque no se ha definido la tabla de SQL que interactúan con el PHP para enviar y la carga de mensajes.
59
La sintaxis SQL es muy fácil de seguir, pero es importante para construir cuidadosamente. El desempeño de un cuadro de construcción deficiente sufrirá más y más a medida que comienza a crecer. Este SQL crea una tabla de FlashChat, y agrega las filas que se utiliza en el PHP. Notificación de la fila de identificación, que no se utiliza en el código PHP, sino que se utiliza internamente para la indización y la asignación 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 más importante porque se establece como TEXT, lo que da una composición abierta, la capacidad de longitud. Esto significa básicamente un mensaje puede ser de cualquier longitud. Ese registro también podría haber sido asignado un varchar(), que obliguen a la longitud de un límite previamente determinada, como la: > I*G,J..!!9QR
Esta nueva definición de la fila mensaje obligaría a cualquier mensaje de chat más de 150 caracteres que se trunca o terminado. Establecer como texto es más conveniente, pero tiene problemas potenciales de rendimiento como la base de datos y mesa de crecer.
1 !9 I 4I**J44M4 4B 4> I,J..!!9QRB 2..!!B 4I**J..!!9,B 1")1OIJ J.".5)7"-)D
Tomó un montón de código, pero su PHP-impulsado Flash Chat aplicación está completa. Tome el tiempo para revisar el código y extender el ejemplo, para añadir más características. Aquí están algunas ideas para comenzar. Característica de la primera y probablemente más evidente que se podría agregar algo de mayor nivel de seguridad entre PHP y Flash. También puede añadir un panel de moderación o como un bono de un script de moderación de base haya sido proporcionada en el contenido adicional disponible para este libro. En este punto, usted debe tener un buen entendimiento de cómo construir una aplicación completa usando Flash, PHP y MySQL. En la siguiente sección, se utiliza Flash y PHP para construir una galería de fotos completa con las categorías y los controles de navegación.
~~ ¿Qué es mejor que una galería de Flash? ¿Qué tal una galería Flash dinámico en PHP alimenta autoupdating archivos XML? Esta sección es una guía paso a paso sobre cómo desarrollar eso. El desarrollo comenzará con el código ActionScript y luego mudarse a la parte de PHP. El último paso será evaluar la aplicación de acabados y explicar la manera de avanzar. Como aprendimos en el comienzo de este capítulo, cada buena aplicación está diseñada y evaluada antes de que la programación comienza. Tome un momento para mirar a la aplicación de acabado, que está disponible en la fuente de material para este libro. Figura 11.4 se muestra la aplicación completa.
60
FIGURA 11.4 La galería de fotos Flash/PHP completado que muestra contenido cargado
El código ActionScript para la aplicación completa automáticamente para rellenar una lista de categorías. Carga dinámica de las imágenes y permitir una navegación anterior y siguiente a través de cada categoría de las imágenes.
Ñ Ahora que sabes lo que hará la aplicación, puede comenzar a colocar las variables. > - 45# *, 7/D > - 45 E# 7+ /D >
7540
7IJD > ( )> D > 7( )> D
Las dos primeras variables hace referencia al archivo PHP que genera la categoría y los datos de la imagen. La variable de las imágenes se utiliza para almacenar los datos de las imágenes enviadas desde el PHP, que se utiliza para cargar las imágenes. Las dos últimas variables en esta sección son MovieClips titular para la imagen 61
principal y la navegación. Ambas variables se rellenan en tiempo de ejecución una vez que se carga la imagen y los datos de la categoría. El siguiente conjunto de variables que se necesita es específicamente para navegar alrededor de las imágenes y las categorías.
>
4"4D >
4".8 5,D > - 45# /D > - 45#;85*/D
El currentID se usa para recordar que la imagen se está viendo. Esto será utilizado en las funciones de navegación anterior y siguiente. El imageDir es una referencia al directorio de la imagen, que es donde está el directorio de la categoría. La última variable es un destructor de la caché, que como se explicó al comienzo de este capítulo 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 núcleo de la aplicación, que es de las funciones. La función init() es responsable de crear los dos MovieClips holder (titular). El MovieClips se crean dinámicamente, colocado, y adjunta a la lista de visualización. Esto se hace realizando una llamada a addChild y pasando a lo largo de la referencia de MovieClip. La función init también es donde genera el Buster caché. El último paso de la función de inicio es para hacer una llamada a la loadCategories() la función. Es importante que esta función sólo se le llama en el inicio, porque los objetos y las categorías sería indefinido o duplicado. 9444IJ W ( 540)> IJD ( +25*D ( +75H6D I( JD 7( 540)> IJD 7( +25*GD 7( +75G,D I 7( JD 5 IJD IJD X
Una vez que la fase de inicialización de init se ha completado la función loadCategories() es llamado. Esta función se llama al archivo PHP para cargar en la lista de categorías usando URLRequest y pasando a lo largo de una acción personalizada que le dice a la secuencia de comandos que desea que la lista de categorías. Esto es importante porque la gallery.php maneja tanto las categorías y la selección de fotos. En general, la función de loadCategories es bastante similar a otros cargadores utilizados en este libro. 944 IJ> W "# $ > 1@ 1!1@ 5401!1@ I E IJE#N/E4JD > ! 1!! 5401!! IJD
6
! +>4! 4 I>4+ ) !B 0 JD ! +I 1@ JD X
La función de drawCategories se llama una vez la lista de categorías 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 categoría en la galería. 75//45/!4 /7 5/ /3
El texto de la categoría que se muestra en el escenario es un campo de texto dinámico creado en el bucle for..each. También puede adjuntar un clip de película de la biblioteca, pero al hacerlo da lugar a una aplicación más fragmentada y se pierden algunas opciones de formato. 944 0 I>4J> W +++ 9 I> 42++ 7J W +++ X X
Antes de continuar con la aplicación mirada código específico en lo que exactamente se está haciendo para crear el TextField. > 225402IJD 2+ 859 D 2+0 5,,D 2+25#-2/D
La primera línea es la creación de una nueva instancia de TextField y el establecimiento de una referencia a la variable txt. La siguiente línea es asegurarse de que el texto no se puede seleccionar con el ratón. 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 línea de código es responsable de establecer la anchura del TextField a 00 píxeles para acomodar el texto. Luego de la última línea 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 categoría de las imágenes cuando el texto se hace clic.
% # Una función anónima está directamente ligado a la llamada addEventListener. Una función anónima no puede ser llamado por su nombre porque no tiene uno, es usado como una alternativa a una función habitual cuando la tarea es sencilla y no requiere una gran cantidad de código. Siendo realistas funciones anónimas se utilizan para hacer el código más compacto, o si necesita acceder a una variable que está en el ámbito local en el método de llamada. 63
Aquí hay un ejemplo de una función anónima similar a la que se ubica dentro de la función drawCategories. 2 44 +>4! 4 I) >4+ !" OB944I>4J > W I#447 944 B"4R >4+/JD XJD
Usted puede notar una de las razones posibles para evitar las funciones anónimas (aparte de no ser multifuncional) es un código que hace mucho más difícil de leer de un vistazo. Esto se debe principalmente al hecho de la definición de la función está enterrado en el addEventListener. Además, una función anónima no puede ser eliminado, lo que puede causar un potencial de pérdidas de memoria. La última tarea de la función drawCategories es la de conectar el campo de texto a la etapa mediante addChild, como se hace para la categoría. 2 44 + I2JD 7( + I2 44 JD
Aquí está la función drawCategories completo de referencia. 944 0 I>4J> W > 1!! 51!! I+ JD > 2')!540')!I +JD 9 I> 42++ 7J W > 2 44 )> 540)> IJD > 225402IJD 2+ 859 D 2+0 5,,D 2+25+ 8IQ4RJD 2+754I+ 8IQRJEHJ\D 2+45#2M/E+ 8IQRJD 2 44 +>4! 4 I) >4+ !" OB 944I>4J> W " I+ +4+ 8 4IGJJD XJD 2 44 + I2JD 7( + I2 44 JD X X
La siguiente función es centrarse en loadImages. Esta es la función que carga los datos de imagen desde el PHP. El resultado pasa de nuevo es casi idéntica a la encontrada en la función (category) categoría. La variable de medida se establece para las fotos, y también agregar un id de dejar de PHP saber qué fotos para cargar. 944" I4J> W "# < $8 > 1@ 1!1@ 5401!1@ I E IJE#N/E4JD > ! 1!! 5401!! IJD
64
! +>4! 4 I>4+ ) !B !JD ! +I 1@ JD
4"5D X
Una respuesta se envía de nuevo cuando se carga el PHP, y la función 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 añade "empujado" (͞pushed͟) a las imágenes de matriz. 944 !I>4J> W 9 I> 42++ J W + IW4RRB + 8IQ RJXJD X +++ X
He aquí el objeto por sí mismo y un método alternativo y más legible de la creación del objeto. W4RRB + 8IQ RJX
Aquí está el método alternativo para definir el objeto. > 8V8V5408VIJD 8V+45QRD 8V+ 5+ 8IQ RJD
La última tarea de la función de imagesLoaded es establecer la variable de currentImage y hacer una llamada a la función DisplayImage pasando la fuente de imagen. El origen de la imagen se carga desde la matriz de imágenes usando currentImage como el índice de la matriz. 944 !I>4J> W +++
4"5,D 7"I Z
4"[+ JD X
Esta es la función imagesLoaded completa: 944 !I>4J> W > 1!! 51!! I+ JD > 2')!540')!I +JD 540
7IJD 9 I> 42++ J W + IW4RRB + 8IQ RJXJD X
4"5,D 7"I Z
4"[+ JD X
65
Con las categorías y las imágenes cargadas, puede mostrar la imagen. Esto se hace mediante la asignación de un URLRequest construcción del directorio de imagen, id de la categoría actual, y el nombre de la foto. La clase cargador se coloca directamente en una llamada addChild, que maneja la visualización de la imagen una vez que esté completamente cargada. Usted no notará ningún tiempo de carga a nivel local, pero puede ser en línea. Es buena práctica colocar preloaders donde los datos se cargan. Esto informa al usuario de que algo está pasando. 944 7"I - 4J> W > ! 540! IJD +I401!1@ I E
4"E#/E JJD ( + I JD X
½ La parte de navegación de la galería de fotos está construida con dos clips de película 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.
0 2# Usted notará que la función nextImage() tiene algo de lógica condicional. Esta es la comprobación para ver si la variable currentImage es un número mayor que el total de las imágenes, lo que daría lugar a un error de carga. El mismo proceso básico se hace para la función prevImage() con la excepción de que el cheque condicional es garantizar el valor no sea inferior a cero. Las funciones de la imagen anterior y siguiente se bloqueará si una categoría no ha sido elegido. 94442"I) >4J> W
4"EED 9I
4"3 +4 $*J W
4"5,D X 7"I Z
4"[+ JD X 944 >"I) >4J> W
4"$$D 9I
4"5,J W
4"5 +4 $*D X 7"I Z
4"[+ JD X
La última función en el script de galería de fotos se utiliza para generar su buster caché, que se utiliza para asegurar las llamadas al servidor nunca se almacenan en caché. Esta función es idéntica a la utilizada en el Flash aplicación de chat que construyó anteriormente en este capítulo.
66
La última parte de la aplicación es llamar a init() en el inicio de la aplicación y asignar los manejadores de eventos que utiliza los botones de navegación. 944 IJ- 4 W > 540IJD 5#;85/E+IJD
4 D X 4IJD >) +>4! 4 I) >4+ !" OB >"JD 42) +>4! 4 I) >4+ !" OB42"JD
Aquí está el código ActionScript completo para la aplicación galería de fotos: > - 45# T,*, 7/D > - 45 E# 7+ /D >
7540
7IJD > ( )> D > 7( )> D >
4"4D > - 45# /D >
4"45,D > - 45#;85*/D 9444IJ W ( 540)> IJD ( +25*D ( +75H6D I( JD 7( 540)> IJD 7( +25*GD 7( +75G,D I 7( JD 5 IJD IJD X 944 IJ> W > 4- 45#45/D > 1@ 1!1@ 5401!1@ I E IJE#N/E4JD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B 0 JD ! +I 1@ JD
67
X 944 0 I>4J> W > 1!! 51!! I+ JD > 2')!540')!I +JD 9 I> 42++ 7J W > 2 44 )> 540)> IJD > 225402IJD 2+ 859 D 2+0 5,,D 2+25+ 8IQ4RJD 2+754I+ 8IQRJEHJ\D 2+45#2M/E+ 8IQRJD 2 44 +>4! 4 I) >4+ !" OB 944I>4J> W " I+ +4+ 8 4IGJJD XJD 2 44 +84)5 D 2 44 + I2JD 7( + I2 44 JD X X 944" I4J> W I#!" #EJD > 4- 45#45 N5/ED > 1@ 1!1@ 5401!1@ I E IJE#N/E4JD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B !JD ! +I 1@ JD
4"5D X 944 !I>4J> W > 1!! 51!! I+ JD > 2')!540')!I +JD 540
7IJD 9 I> 42++ J W + IW4RRB + 8IQ RJXJD X
4"5,D 7"I Z
4"[+ JD X
68
944 7"I - 4J> W I#!"#E JD > ! 540! IJD +I401!1@ I E
4"E#/E JJD ( + I JD X 94442"I) >4J> W
4"EED 9I
4"3 +4 $*J W
4"5,D X 7"I Z
4"[+ JD X 944 >"I) >4J> W
4"$$D 9I
4"5,J W
4"5 +4 $*D X 7"I Z
4"[+ JD X 944 IJ- 4 W > 540IJD 5#;85/E+IJD
4 D X 4IJD >) +>4! 4 I) >4+ !" OB >"JD 42) +>4! 4 I) >4+ !" OB42"JD
~~ La parte de PHP de esta aplicación galería de fotos está construido de tres archivos. El primer archivo es categories.php, que es una representación estática de las categorías de ser enviado a ActionScript. La primera parte del código es la categoría en un formato de matriz multidimensional. Los elementos de categoría tienen el nombre, id, y la información de derechos de autor para cada categoría. < 5
7I
7I# 4/B*B#)+O9/JB
7I#!4 /BB# /JB
7I#! C /B&B#)+O9/JB
7I#%4 /BHB# /JB JD
69
La primera función 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. 944 IJ W 8< D <25# 34/D 9 I<5,D<4I< JD<EEJ W <2+5# 75//+ < Z<[Z*[+#/45//+ < Z<[Z,[+#/7 5//+ < Z<[Z[+#/34/D X <2+5# 3/D
4<2D X
La longitud del bucle está determinado por cuán grande es el array $categories pasa a ser. 4I< J
El cuerpo del bucle no es más que la construcción de los datos XML, similar a la muestra miró durante la parte de desarrollo de ActionScript. <2+5# 75//+ < Z<[Z*[+#/45//+ < Z<[Z,[+#/7 5//+ < Z<[Z[+#/34/D
El último paso de esta función es la de devolver los datos XML de ActionScript para el proceso.
4<2D
Aquí está el archivo categories.php en su totalidad: ; < 5
7I
7I# 4/B*B#)+O9/JB
7I#!4 /BB# /JB
7I#! C /B&B#)+O9/JB
7I#%4 /BHB# /JB JD 944 IJ W 8< D <25# 34/D 9 I<5,D<4I< JD<EEJ
70
W <2+5# 75//+ < Z<[Z*[+#/45//+ < Z<[Z,[+#/7 5//+ < Z<[Z[+#/34/D X <2+5# 3/D
4<2D X ;3
El archivo siguiente a desarrollar es getPhotos.php, que abre el directorio de foto y devuelve el archivo XML de población con información de origen para cada una de las fotos. La carne de este archivo es la función getPhotosFromID(), que acepta un argumento, un id. Usted quiere asegurarse de que una identificación válida se pasa antes de continuar por lo que una sentencia condicional simple trabajará en este caso. Si un número de identificación válido se ha encontrado, entonces se puede continuar con la apertura de las mismas y el bucle while. ; < M 5# /D 944 "I<54J W 8< M D 9I<554J W 4#". >/D
49 D X <25# 5//+<+#/3/D < 54 I< M +<JD 0 I9 55I<95 I< JJJ W 9I<95#+/NN<95#++/J W <2+5# 45//+#/+#/ 5//+<9+#/ 34/D X X I< JD <2+5# 3/D
4<2D X ;3
71
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 válido. 0 I9 55I<95 I< JJJ W +++ X
Se utiliza un condicional si la declaración 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 aún, el archivo puede error a cabo todos juntos, ya que podría poner el bucle while en un estado recursiva infinita. Después de todas las imágenes 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. I< JD
El último paso en este archivo es devolver el XML para el proceso de flash. Después de haber creado la categoría y los archivos de fotos, puede crear el archivo de gallery.php, que maneja las llamadas de PHP y devuelve el código XML adecuado de acuerdo con lo que se. ; 4Q + RD 4Q + RD IQ 44$722RJD 9I
Este archivo se inicia mediante la inclusión 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 función de cabecera se puede utilizar para casi cualquier tipo de contenido. Es, básicamente, fijarlo, y desde ese punto de la salida sigue a ese formato. Por ejemplo, suponga que desea exportar contenido como PNG. I# 44$74/JD
Asegúrese de utilizar el tipo de contenido correcto en su aplicación. Usando el incorrecto puede provocar errores y, en raras ocasiones una aplicación de accidente. El último bloque de código se utiliza para determinar el contenido que usted está solicitando. Los dos tipos de contenido disponibles en este ejemplo son la categoría y la lista de fotos. La variable $_GET [ 'action'] se pasa de Flash en la dirección URL como una cadena de consulta. http://localhost/photoGallery/gallery.php?cb=11940871683&action=cat 7
En este punto, la galería Flash impulsados por PHP es completa. Se puede extender este ejemplo, para añadir páginas, de las transiciones, o quizás algunos títulos 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.
~~ 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 teléfono 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 límite a la cantidad de alimentos puede suscribirse a. Lo que sigue es un vistazo a la aplicación de RSS que usted desarrollará y cómo va a funcionar, como se muestra en la Figura 11.5.
73
FIGURA 11.5 El lector de RSS con un sistema de distribución de PHP
La aplicación está construido con componentes prediseñados 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 código ActionScript.
î La mayoría 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. 9+>4 +! >4D
Cuando el evento es importado puede asignar las variables de la aplicación de RSS. La única variable global que se necesita para esta aplicación es la referencia de PHP. > - 45# *, 1 /D > - 45 E# + /D
74
~~ La función 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. 944 IJ> W > 1@ 1!1@ 5401!1@ I JD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B9(4 JD ! +I 1@ JD X
La función feedHandler() es responsable de trabajar con la respuesta de la llamada de PHP. En esta aplicación, 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 función addItem(). Esta función feedHandler acepta un objeto como argumento. El objeto necesita al menos una etiqueta de propiedad con el fin de añadir el elemento, pero por lo general, se agrega la propiedad de datos, así. 9449(4 I>4J> W +++ 9 I> 42++4 7J W r )ë % ëë6 ë ! +>4! 4 I! >4+")M !" OB ? 4 JD X X
Los elementos de la lista de carga el cuerpo del texto cuando se hace clic, de modo de crear la función 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. 944 ? 4 I! >4J> W B ë ë X
La última función en la aplicación de RSS es el controlador de botón, que es llamado cada vez que el componente Button se hace clic. Esta función simplemente hace una llamada a la función loadFeeds. 944 8(4 I>4J> W IJD X
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.
75
Aquí está el código de la aplicación de RSS en su totalidad por referencia: 9+>4 +! >4D > - 45# *, 1 /D > - 45 E# + /D 944 IJ> W > 1@ 1!1@ 5401!1@ I JD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B9(4 JD ! +I 1@ JD X 9449(4 I>4J> W > 1!! 51!! I+ JD > 2')!540')!I +JD 9 I> 42++4 7J W ! +"IW8++4B++ XJD ! +>4! 4 I! >4+")M !" OB ? 4 JD X X 944 ? 4 I! >4J> W 9 7+ 25++D X 944 8(4 I>4J> W IJD X 4+>4! 4 I) >4+ !" OB 8(4 JD
Con la porción de ActionScript del lector RSS terminado usted puede centrarse en el código PHP. La conexión 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 información sobre Adobe AIR. ; < 5# 08 + +242 +9;/+ #@ 7587- 7N4 5*N 7"5KN/+ # 7O756,$ =$H $=6H* */D ;3
76
FIGURA 11.6 ¿Cómo 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 posición para el XML generado que se construye una vez que la fuente RSS se carga correctamente. El RSS es leída en el uso de la biblioteca SimpleXML que se entrega con PHP 5. Esta no es la única biblioteca de XML de análisis disponibles para PHP, pero es el más eficiente y más fácil de usar. <95#/D ë ë ë
/
En este punto, usted puede comenzar a construir el bucle foreach, que es responsable de construir el documento XML se reintegrará al ActionScript. <9+5# 34/D 9 I<2$3 <J W < 5<$3 4D < 5 M IQZ+++Z[[RBQRB< JD <9+5#4 734/D <9+5#43/+<$3+#434/D <9+5# 3Z Z#+< +/[[3 34/D
77
<9+5#4 734/D X <9+5# 34/D
El ciclo de tomar cada elemento del XML y los lazos a través de los nodos de elemento. Usted notará que la descripción no está asignado a una variable $desc. La razón de esto es porque la descripción tiene que ser limpiado antes de devolverlo. El proceso de limpieza se realiza mediante preg_replace(), una función de expresión regular que elimina los caracteres sin escapar e impropio. $desc = preg_replace(͚/[...\[\]]/͛, ͚͛, $desc);
Este libro no ofrece un tutorial en profundidad sobre las expresiones regulares (regex), sin embargo, hay una guía muy bueno encontrar en http://php.net/manual/en/reference.pcre.pattern.syntax.php. La última parte del código PHP establece el tipo de cabecera y los resultados del XML en ActionScript. IQ 44$722RJD 4Q;2> 45/*+,/445/$K/;3R+/4/D 4<9D
Usted notará que la requerida de PHP para generar la aplicación de RSS no es en profundidad, mucho de eso se debe a SimpleXML ser tan gran biblioteca. Este ejemplo podría extenderse a tirar más de la información contenida en el feed RSS. Por ejemplo, puede mostrar el título de la entrada, la fecha, e incluso la dirección donde se encuentra la entrada original.
Por último, aquí está la referencia completa para PHP: ; < 5# 08 + +242 +9;/+ #@ 7587- 7N4 5*N 7"5KN/+ # 7O756,$ =$H $=6H* */D <95#/D <25 2MM9I< JD <9+5# 34/D 9 I<2$3 <J W < 5<$3 4D < 5 M IQZ+++Z[[RBQRB< JD <9+5#4 734/D <9+5#43/+<$3+#434/D <9+5# 3Z Z#+< +/[[3 34/D <9+5#4 734/D X <9+5# 34/D IQ 44$722RJD 4Q;2> 45/*+,/445/$K/;3R+/4/D
78
4<9D ;3
~~" ¬ Muchos de los diseñadores utilizan Flash para crear anuncios para ser colocados en línea. Estos van desde los anuncios de mini dentro de una página de anuncios de toda regla que se la página. El formato de anuncio más común es el anuncio de la bandera, que normalmente es 468 × 60, como se muestra en la Figura 11.7, los píxeles de tamaño. Estas banderas son generalmente secuencias de comandos para cargar un sitio web al hacer clic. ¿Qué pasa con el seguimiento de los clics? Aún mejor, ¿por qué no crear un banner dinámico que carga un anuncio al azar y no requiere que el propietario de actualizar algo más que un archivo XML y directorio de la imagen? Esta sección será el proceso de desarrollo de un banner dinámico en Flash. A continuación, añadir el seguimiento a este banner utilizando sólo unas pocas líneas de PHP. Este ejemplo no requiere los archivos de partida, porque cualquier imagen de trabajo para la bandera, y la aplicación va a ser desarrollado 100 por ciento en el código ActionScript. FIGURA 11.7 Ejemplo de la aplicación de anuncios de banner en acción
La primera parte del código es responsable de la inicialización de las variables utilizadas en la aplicación. > - 45# *,844 /D > - 45 E# + /D > ( )> D > - 45#;85*/D > 1!- 4D
Una vez que las variables se definen usted puede construir las funciones. El primero es responsable de la colocación del titular de la imagen, añadiendo el controlador de eventos, y llamando a la función loadImage. ë"7 ' ë"7 ë"7 ë"7 -r '-r)C6 Ñ * r ë"7 %' ë"7 5 IJD "IJD
79
La función loadImage() es responsable de cargar el archivo XML que contiene los datos de anuncios de banner. A continuación, asigne una función de controlador que se llama después de que el XML es completamente cargado. 944"IJ> W > 1@ 1!1@ 5401!1@ I E IJJD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B!JD ! +I 1@ JD X
Después de que el XML es a plena carga, se hace una llamada a imageLoaded. Esta función es responsable de cargar los datos XML, sacando la información 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: 944!I>4J> W > ! 1!! 51!! I+ JD > 2')!540')!I ! +JD +++
La siguiente parte de esta función es ayudar a introducir los datos de imagen y asignarle a las variables locales: > - 452++844 + 8IQ RJD > 4- 452++844 + 8IQ4RJD > - 452++844 + 8IQ RJD > 7- 452++844 + 8IQ RJD 1!5 D
El último paso en esta función es la de cargar la imagen y adjuntarlo a la lista de visualización: > ! 540! IJD * r 8 ë" ( + I JD
Ñ 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 página de anuncios predeterminados. 9441!I) >4J> W 4>1!I401!1@ I1!JJD X
La última tarea del ActionScript es llamar a la función init() y comenzar el proceso. 4IJD
80
Aquí está el código ActionScript para la referencia completa: > - 45# *,844 /D > - 45 E# + /D > ( )> D > - 45#;85*/D > 1!- 4D 9444IJ W ( 540)> IJD ( +25,D ( +75,D ( +>4! 4 I) >4+ !" OB1!JD ( +84)5 D I( JD 5 IJD "IJD X 944"IJ> W > 1@ 1!1@ 5401!1@ I E IJJD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B!JD ! +I 1@ JD X 944!I>4J> W > ! 1!! 51!! I+ JD > 2')!540')!I ! +JD > - 452++844 + 8IQ RJD > 4- 452++844 + 8IQ4RJD > - 452++844 + 8IQ RJD > 7- 452++844 + 8IQ RJD 1!5 D > ! 540! IJD +I401!1@ I 7EJJD ( + I JD X 9441!I) >4J> W 4>1!I401!1@ I1!JJD X 944 IJ- 4 W > 540IJD 5#;85/E+IJD
4 D X
81
4IJD
~~ En este punto, el código ActionScript está completo y usted puede centrarse en el PHP. El archivo ads.php se compone de dos variables globales y una función. La primera variable global es el directorio donde se encuentran las imágenes del anuncio. La segunda variable es la matriz que contiene los datos de los anuncios. <" 5#+" /D <844 5
7I
7IQ 44 .RBQ 4*+VRBQ RJB
7IQ 44 .RBQ 4+VRBQ RJB JD
La función getBannerAd asigna las dos variables como globales para que sean accesibles dentro de esta función.
El banner solo se elige de la matriz mediante el uso de una clave aleatoria. Esta clave aleatoria se genera mediante la función mt_rand() y la longitud de la matriz $bannerAds ($anunciosdebanner). < 45IM 4IJT4I<844 JJD
El archivo XML es construido para dar salida una sola línea de datos de imágenes que ActionScript procesa. 944 44 IJ W +++ <2+5#844 5//+,+ #/ 5//+<" + #/ 5//+<844 Z< 4[Z[+ #/45//+<844 Z< 4[Z,[+ #/ 5//+<844 Z< 4[Z*[+#/34/D <2+5#844 3/D
4<2D X 4 44 IJD
El PHP responsable de cargar el anuncio de la bandera ya está completa. Como puede ver, la cantidad de código necesario para crear esta aplicación es bastante pequeño. Este ejemplo básico se puede ampliar fácilmente para agregar en categorías o imágenes, incluso varios que la transición de la película se sienta en un navegador.
8
Aquí está el código de referencia para completar. ; <" 5#+" /D <844 5
7I
7IQ 44 *RBQ 4*+VRBQ RJB
7IQ 44 RBQ 4+VRBQ RJB
7IQ 44 &RBQ 4&+VRBQ RJB
7IQ 44 HRBQ 4H+VRBQ RJB
7IQ 44 GRBQ 4G+VRBQ RJB
7IQ 44 =RBQ 4=+VRBQ RJB
7IQ 44 PRBQ 4P+VRBQ RJB
7IQ 44 KBQ 4K+VRBQ RJ JD 944 44 IJ W 8<844 B<" D <25#844 34/D < 45IM 4IJT4I<844 JJD <2+5#844 5//+,+ #/ 5//+<" + #/ 5//+<844 Z< 4[Z[+ #/45//+<844 Z< 4[Z,[+ #/ 5//+<844 Z< 4[Z*[+#/34/D <2+5#844 3/D
4<2D X 4 44 IJD ;3
Ahora ha creado con éxito un PHP totalmente funcional y de anuncios de banner Flash espectador. Los conceptos aprendidos en esta sección se pueden adaptar fácilmente a otros proyectos. De hecho, le animamos a ampliar el ejemplo y crear una aplicación más robusta. Esta aplicación también se puede simplificar al cargar un archivo XML estático, sin embargo, esto es más difícil de actualizar y no ofrece el mismo nivel de personalización. La aplicación 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 más probable es que se actualizará de otra fuente.
~~ Un contador de visitas (hit counter) es usada para determinar cuántos visitantes van a un sitio. En general, el contador es visible para los visitantes en forma de texto o un gráfico. Algunos sitios utilizan otras formas de control que no están disponibles al público, para fines de seguimiento de estadísticas. El sorteo de importantes y las características de un golpe contra alguna representación gráfica. 83
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 información mucho más rápido) 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 forzaría el contador de visitas a fallar y no es el resultado ideal que se busca.
La lógica detrás 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. < 45< 0ZQ4R[D <40 45< 4E*D
Cuando tenga el nuevo valor, enviarlo de nuevo en la tabla de SQL. Para ello, la actualización de la fila existente y el establecimiento de la columna de importe que el valor de la variable $newCount. 7 @M@ 7I# 4 -45/+<40 4JD
El último paso en el código PHP es devolver el valor nuevo a Flash para que se muestre.
4# 5/+<40 4D
Eso es todo el PHP las necesidades de la lógica de contador de visitas. El siguiente es el archivo completo. ; 4Q8 44+ RD <@ 75#-! 49 4 /D < 57 @M@ 7I<@ 7JD < 057 @M9 M
7I< JD < 45< 0ZQ4R[D <40 45< 4E*D 7 @M@ 7I# 4 -45/+<40 4JD
4# 5/+<40 4D ;3
" Con el PHP hecho, usted puede moverse sobre el desarrollo de Flash, que consiste en una aplicación de todos los ActionScript. El contador tiene que llamar primero al archivo PHP, que sirve a dos propósitos. 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 dinámico. 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. 84
> - 45# *, 4 /D
La primera función es la de construir loadHitCounter(), que es responsable de llamar al servidor y asignar el manejador de la respuesta. 944( 4 IJ> W > 1@ 1!1@ 5401!1@ I JD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B 4- > 1 JD ! +I 1@ JD X
Después que la respuesta se ha cargado, el handleServerResp() se llama pasa a lo largo de los datos cargados. Esta información es posteriormente enviada a la clase URLVariables para sacar la propiedad resp. Esta propiedad es donde se encuentra la cuenta actual. 944 4- > 1 I>4J> W > 1!! 51!! I+ JD > > 8 1!C 8 5401!C 8 I +JD > 445> 8 + D +++ X
El recuento es finalmente colocado en el campo de texto dinámico, que no tiene el formato de este ejemplo, pero usted puede agregar fácilmente esto por su cuenta. / / % 8# $ X
La última línea absoluta de código en el ActionScript es la llamada a la función loadHitCounter, que comienza todo de encima. ( 4 IJD
En este capítulo usted aprendió los elementos de desarrollo y diseño de una aplicación. Luego, una vez entendido como la aplicación debe ser construido se construyó un cliente de chat usando PHP y Flash. En la siguiente sección usted aprendió a desarrollar una galería de fotos basada en Flash con la categoría dinámica y soporte de imágenes con XML. La última sección 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 cómo construir aplicaciones robustas que se aprovechan de los datos dinámicos para la actualización y funcionalidad.
85
% En este capítulo, aprenderá acerca de cómo desarrollar aplicaciones completas de la tierra para arriba. La atención se centra en la clase basado en los diseños que puede actualizar fácilmente más adelante. El aspecto principal de este capítulo será cómo utilizar Flash y PHP para desarrollar estas aplicaciones. Este capítulo está dividido en cuatro aplicaciones: un carro de PayPal, carrito de la compra personalizado, buscador de Amazon, Flickr y un buscador de galería de fotos. Cada sección se inicia con la solicitud de código PHP y continúa con el ActionScript. Construcción de una aplicación como esta hace que sea más fácil de probar como se construye y reduce la cantidad de tiempo en el proceso de desarrollo. Los ejemplos en este capítulo son construidos con clases personalizadas, que se tratan en el capítulo 9. Si usted no ha leído el capítulo, sin embargo, os recomiendo que lo hagan antes de continuar en este capítulo. Por supuesto, si usted ha utilizado las clases en el pasado, entonces por todos los medios continuar en.
Una aplicación real es uno que ha sido diseñado, probado y desplegado con la intención de que los otros usuarios podrán utilizarlo. Al igual que en una aplicación real que habrá algunos sectores que utilizan una de tercero Application Programming Interface (API) para la carga y búsqueda de datos. Cuando se trabaja con un API es común encontrar una lista de los métodos y las llamadas permitido, como se muestra en la Figura 1.1.
86
FIGURA 1.1 La lista de API de Flickr, que muestra que los métodos y propiedades están públicamente disponibles
Una API abierta no siempre significa que cualquiera puede tener acceso. Por ejemplo, en Flickr que están obligados a pasar a lo largo de una clave que autoriza a una solicitud. Esto no es sólo para bloquear ciertos aspectos de una API, pero también se detiene el correo basura y respuestas automáticas que podría resultar en la API de ser discapacitado.
À . C % ) ) " .
~~ " Trabajar con PayPal en Flash es similar al HTML, porque PayPal ofrece un conjunto común de conexión y capacidad de acceso. Sin embargo, una ventaja para desarrollar la solución en Flash es la capacidad para mejorar la experiencia del usuario, Flash ofrece una comunicación más fluida con otros servicios, ya que no es necesario recargar toda la página o abrir las ventanas adicionales.
87
!! !# ! Antes de comenzar a escribir el código para interactuar con PayPal, crear una cuenta PayPal Premier, que puede utilizar para el seguimiento de sus ventas y autenticar sus peticiones. Sólo toma unos minutos para crear una cuenta, y no cuesta nada. Para configurar una cuenta PayPal Premier, siga estos pasos: 4* En el explorador Web, vaya a www.paypal.com. Seleccione Iniciar - Tipos de cuenta. 6* En la página Tipos de cuenta PayPal, haga clic en Regístrese ahora. Seleccione la cuenta de la página que aparezca Tipo. 5* Bajo Cuenta Premier, haga clic en Iniciar ahora. En Crear un formulario de cuenta PayPal que aparece (ver Figura 1.), escriba la información solicitada. :* Después de enviar su formulario, usted recibió un correo electrónico de confirmación. Usted debe responder al e-mail para activar su cuenta. <* Entra y prueba de su nueva cuenta. Recuerde, usted debe activar la cuenta a través de e-mail antes de que usted puede usar. FIGURA 1. La pantalla de registro de la cuenta de PayPal
88
En este punto, usted debe tener un inicio de sesión 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. El sistema requiere un nombre de usuario y contraseña para generar contenido. Sin embargo, con el fin de presentar una solicitud de datos sólo tiene que proporcionar su dirección de correo electrónico. Esto se utiliza para garantizar la solicitud es correcta. En ningún momento debe colocar la contraseña de PayPal en esta forma. Haga clic en el enlace de vendedor (Merchant) en la parte superior de la página para visitar la página Compre Ahora generador. Las otras opciones en la primera pantalla no son importantes en este punto. Por último, haga clic en Crear botón, que se trasladará a la siguiente página, donde el código HTML es que el botón Comprar ahora. Copia el código HTML que es generado por PayPal para los botones Comprar ahora. Este código se utiliza para construir el ejemplo de Flash. Lo que sigue es el código de ejemplo copia de sistema generador de PayPal comerciante que usted acaba de visitar. 9 45/ 000+7+$8408 / 5/ /3 475/ 4/45//>5/M2?/3 475/ 4/45/8 4 />5/WM X/3 475/ 4/45/M4/>5/WM4X/3 475/ 4/45/M48 />5/WM48 X/3 475/ 4/45/4/>5/WM4X/3 475/ 4/45/
47M/>5/-/3 475/ 4/45/0 />5/*/3 475/ 4/45/0 M4/>5/8 /3 475/ 4/45//>5/-/3 9 3
Asegúrese de que usted no tiene botón de encriptación activada, ello hace que sea imposible coger la información necesaria para construir el botón de Flash. Como puede ver, el código generado por el formulario HTML tiene todas las variables necesarias que se utilizarán para crear un botón de Flash. El siguiente paso es construir el código de Flash que hará que el botón Comprar ahora para la aplicación. Aquí está el código ActionScript necesario para la interfaz con PayPal, como se puede ver el código es muy similar al código HTML existente que ha generado en la página 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. 7> 8 > M- 45#M2?/D > M8 4 - 45# S2+/D > MM4- 45# /D > MM48 - 45#,,,*/D > M4- 45#H+66/D > M
47- 45#-/D > M0 - 45#*/D > M0 M4- 45#8 /D > M4- 45#-/D
89
A pesar de que se puede ver claramente los números en el bloque de variables, todos los parámetros se definen como cadenas para ser compatible con el equivalente de HTML. El siguiente tema es el de establecer la dirección, que se usa para la interfaz con PayPal. Esta es esencialmente la misma variable como la acción, que se encuentra en el código HTML original. > 71!- 45# 000+7+$8408 /D
Cuando se establecen las variables y los datos de PayPal, usted puede crear el código que se llama cuando el se hace clic en el botón Comprar ahora. Esta es la función que se utiliza para llamar a PayPal. Este método no requiere que las variables personalizadas a pasar porque ellos se definen fuera de la función. La definición de una variable fuera de una función es de ámbito de lo que cualquier función tiene acceso a ellos. Si esta variable se define dentro de la función que sólo sería visible a la función en la que se define. La excepción es, por supuesto, si la función es global o de la variable se devuelve desde la función creada. 944 7I) >4J> W > C 8 1!C 8 5401!C 8 IJD C 8 +5MD C 8 +8 4 5M8 4 D C 8 +M45MM4D C 8 +M48 5MM48 D C 8 +45M4D C 8 +
47M5M
47D C 8 +0 5M0 D C 8 +0 M45M0 M4D C 8 +5M4D > 1@ 1!1@ 5401!1@ I71!JD 1@ + 51!1@ ) + -D 1@ +5 C 8 D 41!I 1@ JD X
~ El método de los datos enviados a PayPal está en formato POST. Esto significa que las variables se incluyen en la convocatoria, pero no en la dirección como se ve con GET. Utilizando el formato POST tiene algunas ventajas, la primera es la dirección 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 facturación o tarjeta de crédito, es importante que usted utiliza una llamada de HTTPS. La razón de ello es POST en realidad sólo se convierte en una de Seguridad por oscuridad y no es el resultado más 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. 1@ + 51!1@ ) + -D
90
En los ejemplos anteriores, usted puede haber notado el uso de navigateToURL, que pide una URL y ofrece la capacidad de enviar datos a través de GET de la URL. En este ejemplo se pide que los datos POST, por lo que el uso de sendToURL es una mejor opción. Es importante entender que el método sendToURL envía la solicitud al servidor, pero ignora cualquier respuesta que se devuelve. 41!I 1@ JD
El último paso es asignar a la acción del botón 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 más de un botón, le recomiendo una estructura de clases que transfiere los datos de PayPal, para minimizar la cantidad de código necesario. La función callPaypal se inserta en el botón mediante un detector de eventos. El evento Click es utilizada, que se llama cuando el usuario hace clic en el botón. 87.0 4+84)5 D 87.0 4+ (4 5 D %,B -r '-r)C6
(
El último paso es poner todo el código y probarlo juntos. 7> 8 > M ë - 45#M2?/D > M% - 45# S2+/D > M ëë- 45# /D > M ëë%- 45#,,,*/D > Më- 45#H+66/D > M - 45#-/D > M "- 45#*/D > M " - 45#8 /D > M - 45#-/D > 71!- 45# 000+7+$8408 /D 944 7I) >4J> W > C 8 1!C 8 5401!C 8 IJD C 8 +5MD C 8 +8 4 5M8 4 D C 8 +M45MM4D C 8 +M48 5MM48 D C 8 +45M4D C 8 +
47M5M
47D C 8 +0 5M0 D C 8 +0 M45M0 M4D C 8 +5M4D > 1@ 1!1@ 5401!1@ I71!JD 1@ + 51!1@ ) + -D 1@ +5 C 8 D 41!I 1@ JD
91
X 87.0 4+84)5 D 87.0 4+ (4 5 D 87.0 4+>4! 4 I) >4+ !" OB 7JD
En este punto, usted tiene un ejemplo de trabajo de un botón Comprar ahora de PayPal. Es sólo una cuestión de agregar la información de elementos específicos. También puede crear una clase para que este proceso sea más fácil la creación, como se mencionó anteriormente. PayPal también 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 información se almacena en el mismo formato de los datos básicos de POST, pero mantiene un registro de cada elemento individual. Ya sea que usted utilice la opción de compra o en un elemento de solución Compre Ahora sólo 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 información 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 confirmación de si el pedido pasa a través de. Este servicio está fuera del alcance del libro, pero PayPal proporciona la documentación adecuada para empezar.
" ~~ La sección anterior se centró en la construcción de un botón Comprar ahora en Flash utilizando PayPal como sistema de pago. Ese sistema funciona bastante bien, pero realmente no ofrece al diseñador el control total del carro, el pago, y los componentes de almacenamiento. La mayoría de las veces cuando usted decide construir una solución personalizada que acabará con mejores resultados. Esto no quiere decir que todo el mundo puede desarrollar la interfaz de PayPal siguiente, pero ¿cuánto de ese sitio se utilizan? La construcción de una solución personalizada es donde se llega a centrarse en las características que va a utilizar y excluir los que no se. Esta cesta de la compra se divide en cuatro partes: diseño, MySQL, PHP, y el ActionScript que reúne todo.
' La aplicación de carrito de la compra será construido usando clases para reutilización. Esto también hace que sea más fácil de modificar más adelante. FF Para obtener más información sobre las clases de ActionScript, véase el capítulo 9.
!!!!# La primera porción de código que se centrará en los elementos individuales de productos que se mostrará a la izquierda de la cesta de la compra. Los artículos de la tienda MovieClip será añadido de forma dinámica 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. 9
Al igual que el capítulo 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 código 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. 9 + 7+)> D 9 +2+2D
Hay cinco variables privadas que se utilizan para sostener el elemento de datos específicos. Estos datos son luego compartidos con el carrito de la compra, pero por ahora los datos sólo tiene que ser almacenado. >> 8.- 4D >> 8 - 4D >> 8 8- 4D >> 8 - 4D >> ""4D
El método de StoreItem se deja vacía y en realidad no es necesario porque el compilador de ActionScript lo colocará automáticamente, pero para la integridad es una buena idea tenerlo. 944- "IJWX
El método personalizado primero es responsable de guardar los datos de posición a las variables privadas que se acaba de definir. Los cinco argumentos definidos en esta función se pasan de la persona que llama y se mantendrá los datos de elemento que se utiliza más tarde. 8944 - I 4B 4- 4B - 4B - 4B - 4J> W )ë) %ë,ë %ë %ëë% %ë( +++ X
Los dos cuadros de texto que contienen el nombre y la descripción 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 válidos, pero debido a que se está controlando el PHP que se devuelve puede estar seguro de los datos será válido. 42+258.D 2+258 D
El método final de esta clase se utiliza para enviar los datos a quien llama. La acción de retorno devuelve un objeto personalizado que se llena con los datos del elemento en el método anterior. 8944"IJ8V W
93
4 W B ""B 48.B 8 XD X
El método anterior tiene un tipo especial de retorno definido. El valor devuelto es un objeto en línea que se utiliza para simplificar el código mediante la exclusión 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: > 8V8V5W4>XD
La tabla 1.1 muestra el tipo y el equivalente a la abreviatura de ella. Usando los valores de taquigrafía puede ahorrar tiempo de desarrollo, ya que tiene que escribir menos. . La forma abreviada puede crear problemas, porque se crea un "débil", escribió objeto. Por lo tanto, no pueden beneficiarse de la comprobación de tipos en tiempo de compilación. Usted puede acceder al objeto dinámico mal y no lo sabremos hasta que tiempo de ejecución. Esto significa que usted debe tener cuidado al crear sus propiedades y las variables en taquigrafía. TABLA 1.1 )+% !(? +% 0
Array Object String
new Array() [] new Object() {} new String() ͟͞
Ambos métodos de aplicación que se crearon son públicos porque son llamados desde clases externas. También puede crear una función intermedia que ofrece un mayor nivel de seguridad, que se encarga de llamar a los métodos privados. Con la clase StoreItem construido, puede pasar a la ShoppingCartItem, que se adjunta a la partida cesta de la compra de MovieClip.
!!!)) !# Esta clase es básicamente responsable del mantenimiento de la identificación del tema, que será utilizado en la clase ShoppingCart. Al igual que la clase anterior, éste también tiene que importar la clase MovieClip y TextField para alojar los elementos situados en este MovieClip. ? W ë ' ë / 8 - 4 "24 )> W )ë)
94
944- 4 "IJWX 8944"IJ4 W
4 ""D X 8944 "I4J> W ""5D X X X
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 artículos. 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 métodos que se utilizan en esta aplicación. A menudo construir este primer esqueleto, que puede doblar como un esquema. ? W 8 - 4 24 )> W 944- 4 IJWX 8944 I 8VJ>WX 8944 > I) >4J>WX 8944! IJ>WX 8944IJ>WX 8944 ?IJ>WX 8944 071!I - 4J>WX >944 4I4.8 J.8 WX X X
El lugar más lógico para empezar en esta clase es mediante la asignación de las importaciones de clase que se necesitarán. 9 9 9 9
+ 7+)> D +2+2D +>4 +) >4D +4+\D
Las propiedades de esta clase consistirá en todas las variables privadas para que no se puede acceder por otras clases. >> " 445,D >> 44
7D >> "( 45,D >> 4-445&,D >> 07- 4D
95
El constructor es responsable de la creación en el botón Checkout y la inicialización de la matriz de punto de compra. 944- 4 IJ W 44 540
7IJD 45 44 D ? 4+>4! 4 I) >4+ !" OB944IJ> W > 2- 45#;2> 45R*+,R;34 /D 2E5# 5//E2+2E#/3/D 9 I> 44J W 2E5# 3/D 2E5#@473/E 4Z[+ "+@472+2 E#@473/D 2E5#43/E4Z[+4E#43/D 2E5# 3/E4Z[+ E# 3/D 2E5# 3/D X 2E5# 3/D > > 8 1!C 8 5401!C 8 IJD > 8 +45# ?/D > 8 +252D > 1@ 1!1@ 5401!1@ I07JD 1@ +5> 8 D 1@ + 5#/D 4>1!I 1@ JD XJ X
El contenido del botón Checkout puede parecer abrumador, pero se trata simplemente de construir un documento XML personalizado que se pasarán a la PHP. La variable de XML comienza por asignar el código XML apropiado partida. Sin esta partida, PHP asumiría el expediente está incompleto y no cargar. > 2- 45#6 ë ?? 04 /D
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 sección anterior. Estos elementos tienen la cantidad y la id de elemento, que será colocado en esta costumbre documento XML. 45 44 D 9 I> 44J W +++ 2E5#43/E4Z[+4E#43/D +++ X
96
Una vez que el ciclo for.. se completa el proceso de construcción del XML, el archivo PHP se encuentra en el servidor puede ser llamado. La petición es una base GET, pasando por los datos XML. > > 8 1!C 8 5401!C 8 IJD > 8 +45# ?/D > 8 +252D > 1@ 1!1@ 5401!1@ I07JD 1@ +5> 8 D 1@ + 5#/D 4>1!I 1@ JD
El código PHP espera dos variables a ser transmitido. La acción 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 código. El siguiente paso es la construcción de los métodos. El primer método es responsable de añadir 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 película en la biblioteca. El primer paso es crear una nueva instancia de este clip de película. Después de crear una nueva instancia, un detector de eventos se agrega al botón 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 sección. 8944 I 8VJ> W +++ )ë ")ë ")ë "+ >" 4+>4! 4 I) >4+ !" OB
> JD "+@472+25#*/D "+42+25 +4D +++ X
El siguiente paso es crear una identificación falsa que usted puede utilizar para agregar y eliminar la instancia más tarde. "+ "I " 4JD929 > 7
La colocación de un nuevo carro de ejemplo el tema de la compra está determinado por primera multiplicando el cartItemCount por la altura y luego añadir un espacio. "+75I " 4\ "( JE4-4D
Una vez que se coloca la nueva instancia, es temporalmente añadido al producto objeto de modo que las piezas futuro de código puede acceder a ella sin la caza de ella. Luego se añade a la matriz cartContents. + "5 "D 44 + I JD
La siguiente parte del método de addProduct es responsable de añadir la instancia a la lista de visualización, incrementar la cuenta y, finalmente, hacer una llamada a la actualización de precios. I "JD " 4EED
97
IJD
En este momento, si tuviera que añadir un artículo a la cesta de la compra que permitiría a los duplicados que se añade. Cuando el resultado deseado es incrementar la cantidad al bucle for.. se coloca en el principio del método para cuidar de este. 8944 I 8VJ> W !?9 4 = @ ,ë% = @ )ë
= @ )ë 8 +++ X
El bucle se configura para comprobar el carro de un elemento de identificación válida. Si se encuentra una identificación válida, la cantidad se asigna a la variable q. Este se añade al valor del cuadro de texto la cantidad y una llamada a la actualización de precios se hace para asegurar que siempre es correcto. El retorno se utiliza para detener cualquier ulterior ejecución de código situado dentro de esta función. Este método fue probablemente el más grande, ya que es responsable de gran parte de la funcionalidad de esta aplicación. El código completo se facilite en una presentación final al final de esta sección, y por supuesto, también está disponible en el sitio Web del libro. El siguiente método se utiliza para eliminar un elemento de la cesta de la compra. El método getID que se creó en la clase ShoppingCartItem se utiliza en esta función para recuperar el ID. La referencia de los padres se usa para tomar la meta (botón Delete) e informar el código de lo que el padre o el objeto superior es. Esto proporciona un vínculo sólido a la instancia de clase ShoppingCartItem y en última instancia el método para recuperar el ID. 8944 > I) >4J> W > 45+ + 4+"IJD +++ X
Después del ID, éste puede ser utilizado para eliminar el elemento de la serie de artículos de compra y de la lista de visualización. El método de empalme se utiliza para eliminar el elemento de compra utilizando el ID, que es realmente la posición del elemento puede encontrarse en la matriz. El segundo argumento en el método de empalme es que exista un sólo elemento se elimina. 44 + IB*JD
> I+ + 4JD " 4$$D
98
Si el segundo argumento no se proporciona, el método de empalme se eliminarán todos los elementos de ese punto. El archivo Flash se ha añadido una nota de forma automática que se muestra para informar al usuario de que no hay productos en el carrito. Sin embargo, se elimina esta cuando se añade un elemento. El problema es, si el usuario elimina todos los artículos de la cesta que hay que mostrar una vez más, por lo que una simple declaración de si se añade al final de eliminar el método para controlar este. 9I " 455,J W 4" 2+> 85 D X
Por último, una llamada a los métodos updateTotal y updateList se hace para asegurar que los datos se mantiene constante y el precio se actualiza. ! IJD IJD
Los artículos de compra se añadirán a la matriz que el usuario hace clic en el botón Añadir al carro, sin embargo, puede recordar en la sección 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 añadido o quitado. La solución es presentar una identificación nueva como se elimina un elemento. Esto se logra recorriendo todos los elementos restantes de compra y hacer una llamada para establecer una nueva identificación. 8944! IJ> W 9 I> 45,D " 4DEEJ W
= @ )ë) X X
El otro efecto secundario a la eliminación de un tema libremente es que puede crear un vacío en la lista. Esto no cambia la forma de las funciones de aplicación, pero visualmente no es el más limpio. La forma de evitar este problema es poco para realinear la lista como se quita un elemento. 8944! IJ> W 9 I> 45,D " 4DEEJ W 44 Z[+ "+ "IJD X
= @ )ë F )ë7 "8 " X
En los métodos anteriores no ha habido una llamada a updateTotal. Este método es responsable de mantener el precio total actualizado como elementos añadidos 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 números válidos y un decimal (.) Se proporciona si es necesario. 99
8944IJ> W > .8 5,D 9 I> 45,D " 4DEEJ W E5.8 I 44 Z[+ J\ .8 I 44 Z[+ "+@472+2JD X 2+25#E- 4I 4IJJD ?42 ,94 0,R 9I2+2+429IQ+RJ55$*J W 2+42I#+,,/JD X 9I2+2+429IQ+RJE552+2+4 J W 2+42I#,/JD X X
El método de setGatewayURL establece la propiedad de puerta de enlace que se refiere a la dirección URL que se llama cuando el botón se hace clic en Realizar Pedido. 8944 071!I - 4J> W 075 D X
En este punto la clase ShoppingCart ha sido creado. La última porción de código que se necesita será colocado en la línea de tiempo. Este código será responsable de establecer todo y en última instancia el control de los elementos individuales. La línea de tiempo de ActionScript también podría ser colocado en una clase de documentos, que se explica en el capítulo 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 sección. > - 45# ** 9 + /D
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 código. El siguiente paso es crear un movieclip vacío que tiene la tienda de artículos. > )> 5 4 D + 071!I JD > " )> 540)> IJD " +25GD " +75K,D
La solicitud de que el servidor es más o menos el mismo proceso que se ha utilizado en el pasado. La única porción única es la acción que se adjunta al final de la url. 300
> 1@ 1!1@ 5401!1@ I E#; " /JD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B !JD ! +I 1@ JD
Después de cargar el servidor de datos, se llama la función de respuesta. Esta función se encarga de analizar el XML y agregar el artículo de la tienda al carro de la compra. Aquí tiene un ejemplo del código XML que se devuelve y analiza. 3 5/*/ 45/ ? / 5/4 / 845//3 3
Esta función también es responsable de cargar una nueva instancia del movieclip StoreItem, que contiene la información de cada producto. El botón en este caso también se adjunta a un evento que es responsable de añadir un nuevo elemento a la cesta de la compra. 944 !I>4J> W +++ > 45,D 9 I> 2"42++ J W ë )ë )ë +75KG\D + - I B 2"+ 8IQ4RJB 2"+ 8IQ RJB 2"+ 8IQ 84RJJD 2"+ 8IQ RJJD + 4+>4! 4 I) >4+ !" OB "(4 JD " + IJD EED X I " JD X
La función 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 código que se utilizó en la sección anterior. La declaración trace() es simplemente para probar y nunca se muestran al usuario final de la aplicación. 944"(4 I) >4J> W > 8V5+ + 4+"IJD I#"#E+ + 4JD I#""#E +JD + I JD X
301
Me tomó un tiempo y dio lugar a una gran cantidad de código nuevo, pero todo el código ActionScript necesario para este ejemplo se ha completado. La siguiente parte es para centrarse en el código PHP que es llamado por el botón 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 más fácil de depurar a largo plazo.
1 !9 - M I bb4..!!M". 1).B b4b> IGJB b 7b4I&J..!!!,B b 4b'B b 84b> I,,J..!!!#/B b b> I*,J..!!B b>b4I*J..!!!*B 1")1OIbbJ J
El SQL es responsable de mantener toda la información de cada elemento en la tienda. En una aplicación completa, probablemente sería poblado por un sistema de gestión de contenido. Para este ejemplo, el código de INSERT se proporciona para que usted pueda rápidamente probar el ejemplo. ".-1".9 - M I4B 4B J C!-IQ ) RBQ4 404RJD
~~ Cuando el SQL es configurada el PHP puede ser escrito. El PHP es responsable de la carga de los artículos del almacén 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 conexión debe ser establecida. Esto se logra mediante la carga de un archivo externo que contiene la información de conexión de base de datos. 4Q844+ RD
El contenido de este archivo dbconn.php se ven aquí. ; < 5# /D < 5# 4/D < 5# 0 /D <8 5#8 4/D <4?57 @M44I< B< B< JD 7 @M M8I<8 B<4?JD 4 I< JD 4 I< JD 4 I< JD 4 I<8 JD
30
;3
Ahora usted puede determinar qué acción se está solicitando. Hay dos opciones posibles: getproducts, que devuelve un documento XML de artículos de la tienda, o la caja, que carga el XML de Flash y lo muestra. 9I
La acción getproducts simplemente hace una llamada a otra función que devuelve el código XML generados a partir de las entradas de base de datos. La acción de compra, como se muestra en la figura 1.3, es un poco más 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 artículos de la tienda se recupera.
303
FIGURA 1.3 Aquí está una muestra de la página de caja, cargada de Flash. Esta página es visible cuando se hace clic en el botón Checkout.
Esta función se llama desde la primera acción y es responsable de la construcción de un documento XML de los datos en la base de datos. Los artículos 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. 944 IJ W 8<4?D < 57 @M@ 7I#-! \1)9 - M %(1>5*/B<4?JD <25# 34/D 0 I< 057 @M9 M
7I< JJ W <2+5# 5//+< 0ZQR[+ #/45//+< 0ZQ4R[+
304
#/ 5//+< 0ZQ 4R[+ #/ 845//+< 0ZQ 84R[+#/34/D #/ 5//+< 0ZQ R[+//34/D X <2+5# 3/D
4<2D X
La última función es en realidad una función olvidada de SimpleXML. Esta función tiene dos argumentos, el XML y el nombre del atributo que está buscando. Primero se realiza un bucle a través 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. 944 8I<2B<4J W 9 I<2$3 8 IJ 753<>J W 9I755<4J W
4I 4J<>D X X
49 D X
Ahora que todo el código está completo, aquí están las tres clases y el código de línea de tiempo previsto en un solo lugar para facilitar la visualización y la comparación con el código.
)) ! ? W 9 + 7+)> D 9 +2+2D 9 +>4 +) >4D 9 +4+\D 8 - 4 24 )> W >> " 445,D >> 44
7D >> "( 45,D >> 4-445&,D >> 07- 4D 944- 4 IJ W 44 540
7IJD ? 4+>4! 4 I) >4+ !" OB 944IJ> W > 2- 45#;2> 45R*+,R;34 /D
305
2E5# 5//E2+2E#/3/D 9 I> 4 44 J W 2E5# 3/D 2E5#@473/E 44 Z[+ "+@472+2 E#@473/D 2E5#43/E 44 Z[+4 E#43/D 2E5# 3/E 44 Z[+ E# 3/D 2E5# 3/D X 2E5# 3/D > > 8 1!C 8 5401!C 8 IJD > 8 +45# ?/D > 8 +252D > 1@ 1!1@ 5401!1@ I07JD 1@ +5> 8 D 1@ + 5#/D 4>1!I 1@ JD XJ X 8944 I 8VJ> W !?9 4 9 I> 4 44 J W 9I 44 Z[+55 +J W > @47.8 5 44 Z[+ "+@472+2D 44 Z[+ "+@472+25 @47E*D IJD
4D X X 9I " 455,J W 4" 2+> 859 D X > "- 4 "5 40- 4 "IJD "+ >" 4+>4! 4 I ) >4+ !" OB > JD "+@472+25- 4I*JD "+42+25 +4D "+ "I " 4JD
306
"+75 I " 4\ "( JE4-4D + "5 "D 44 + I JD I "JD " 4EED IJD X 8944 > I) >4J> W > 45+ + 4+"IJD 44 + IB*JD
> I+ + 4JD " 4$$D 9I " 455,J W 4" 2+> 85 D X ! IJD IJD X 8944! IJ> W 9 I> 45,D " 4DEEJ W 44 Z[+ "+ "IJD 44 Z[+ "+75 I\ "( JE4-4D X X 8944IJ> W > .8 5,D 9 I> 45,D " 4DEEJ W E5.8 I 44 Z[+ J\ .8 I 44 Z[+ "+@472+2JD X 2+25#E- 4I 4IJJD ?42 ,94 0,R 9I2+2+429IQ+RJ55$*J W 2+42I#+,,/JD X 9I2+2+429IQ+RJE55 2+2+4 J
307
W 2+42I#,/JD X X 8944 071!I - 4J> W 075 D X >944 4I4.8 J.8 W
4) + 4I4\) +0I*,BJJ) +0I*,BJD X X X
)) !# ? W 9 + 7+)> D 9 +2+2D 8 - 4 "24 )> W >> ""4D 944- 4 "IJWX 8944"IJ4 W
4 ""D X 8944 "I4J> W ""5D X X X
!# ? W 9 + 7+)> D 9 +2+2D 8 - "24 )> W >> 8.- 4D >> 8 - 4D >> 8 8- 4D >> 8 - 4D >> ""4D 944- "IJWX
308
8944 - I 4B4- 4B - 4B- 4B- 4J> W ""5D 8.54D 8 5D 8 85D 8 5D 42+258.D 2+258 D X 8944"IJ8V W
4W B ""B 48.B 8 XD X X X
# > - 45# ** 9 + /D > )> 5 4 D + 071!I JD > " )> 540)> IJD " +25GD " +75K,D > 1@ 1!1@ 5401!1@ I E #;45 /JD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B !JD ! +I 1@ JD 944 !I>4J> W > ! 1!! 51!! I+ JD > 2')!540')!I ! +JD I#')!#E2JD > 45,D 9 I> 2"42++ J W > - "540- "IJD +75KG\D + - IB 2"+ 8IQ4RJB
309
2"+ 8IQ RJB 2"+ 8IQ 84RJJD 2"+ 8IQ RJJD + 4+>4! 4 I ) >4+ !" OB"(4 JD " + IJD EED X I " JD X 944"(4 I) >4J> W > 8V5+ + 4+"IJD I#"#E+ + 4JD I#""#E +JD + I JD X
; < 5# /D < 5# 4/D < 5# 0 /D <8 5#8 4/D <4?57 @M44I< B< B< JD 7 @M M8I<8 B<4?JD 4 I< JD 4 I< JD 4 I< JD 4 I<8 JD ;3 ; 4Q844+ RD 944 IJ W 8<4?D < 57 @M@ 7I#-! \1)9 - M %(1>5*/B<4?JD <25# 34/D 0 I< 057 @M9 M
7I< JJ W <2+5# 5//+< 0ZQR[+ #/45//+< 0ZQ4R[+ #/ 5//+< 0ZQ 4R[+
310
#/ 845//+< 0ZQ 84R[+#/34/D #/ 5//+< 0ZQ R[+//34/D X <2+5# 3/D
4<2D X 9I
4I 4J<>D X X
49 D X ;3
El ejemplo se ha completado, es sólo una cuestión de poner el PHP en un servidor Web activo. Desde este punto se puede extender el ejemplo para tener varias categorías, productos, y las imágenes. 311
Siendo realistas, la construcción de la aplicación en un formato de clase que ofrece una mayor capacidad de expansión, pero no acaba de tomar mi palabra para ella. Experimenta y extender el ejemplo.
~~" % Ñ Amazon ofrece un conjunto muy poderoso de herramientas diseñadas para trabajar con los datos de su sitio. Esta sección abarca la construcción de una aplicación de búsqueda utilizando Amazon.com como la fuente de datos. Este ejemplo utiliza el ECS (Amazon E-Commerce Service), que proporciona acceso directo a Amazon increíble la búsqueda y el sistema de inventario. Con el fin de utilizar la ECS tiene que tener una identificación de acceso válida del Amazon, que se proporciona cuando se crea una cuenta de desarrollador. Este proceso de registro es rápido y gratuito, todo lo que necesita es una dirección válida de correo electrónico y una cuenta activa.
Ñ Para empezar con los desarrolladores la creación de una cuenta, visite el servicio Web de Amazon (AWS) en la página de www.amazon.com/gp/aws/landing.html. Asegúrese de activar la cuenta por correo electrónico 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 básicamente una dirección URL con formato con toda la información necesaria siempre en la Versión GET. Aquí está una muestra de enviar a la Amazonía, como se muestra en la figura 1.4, para devolver información acerca del libro de posibles coincidencias para una palabra clave o serie de palabras clave. +:40 +42;- >5%- - >N%- O7"5W%-M
--MOXN 45"- N- "425 ? N1 4 5)NO70 5W-1 (M1)-X
El AWS_ACCESS_KEY es la identificación de acceso que es proporcionado por Amazon, y la SEARCH_TERMS sería la palabra clave (s) que se transmiten a lo largo de la búsqueda. Como te habrás dado cuenta, la respuesta XML de Amazon es bastante complejo. Sin embargo, para este ejemplo, la atención se centrará en el título 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.
31
FIGURA 1.4 Aquí está la respuesta XML de Amazon, después de una búsqueda de "PHP".
De hecho, la URL enviada a Amazon puede ser modificado para la búsqueda de diferentes elementos o temas todos juntos. AWS está configurado para devolver mensajes de error incluso válido similar a éste si no ofrecen un parámetro de operación. %-+"4> 4 4 4>+ 97 4 4 7+C> 9 4 4!?B! !?B
B- ! 4!?B 44!?B "!?B- 7!?B- !?B"- B C !?B 0 .!?B )97B! - B
+++
El sistema de búsqueda ofrece un montón 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 documentación muy sólido en el centro del desarrollador. Entra en el acceso.
313
¬ Cuando la respuesta XML se ha cargado en la sección anterior, el resultado fue abrumador. Hay muchos nodos XML y datos que simplemente no son aplicables a esta aplicación. Usted podría pasar estos datos en bruto en Flash, pero lo que si usted quiere almacenar los resultados? Usted tiene un montón de información no utilizada obstruyendo su base de datos. La idea es construir una respuesta XML personalizada que contiene únicamente los datos necesarios para esta aplicación. ; < 5#/D #Ñ9 Ñ-
C-:$6#Ñ9 C-:G4- 7- -$
Es importante comprobar las etiquetas válidas antes de una respuesta se envía al Amazonas. Realmente no daña nada, pero se podría considerar una solicitud fraudulenta. 9Ië G-=>ë?@J W +++ X
Suponiendo etiquetas válidas encontrado, construir la petición que se enviará a la AWS. 9I7I
Tiene la palabra la AWS, pasando por los parámetros de búsqueda. < 0'59MM44 I< @ JD
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. <21 4 5 2MM 4I< 0'JD
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 sólo cuatro resultados libro. Incluso si vuelve la Amazonía miles, Flash sólo ve cuatro. <4 45HD
314
<25#;2> 45/*+,/;348? 3/D 9 I<5,D<<4 4D<EEJ W +++ X <2+5#8? 3/D
El contenido del bucle for.. es donde la mayoría del proceso de construcción se produce XML. Por ejemplo, para cargar el título 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é niño debe ser de referencia. Dentro del nodo hijo en vigor, hay otro niño con el nombre ItemAttributes de nodo, que contiene un nodo de título y en última instancia se convierte en el nombre del libro para este niño seleccionado. <21 4 $3" $3"Z<[$3" 8 $3
Como puede ver, Amazon paquetes de este archivo XML completo de la información, que en este caso hace que sea difícil especie de carga de la información deseada. El proceso de carga y datos del autor en miniatura es prácticamente el mismo sólo el acceso de cada niño y referencia el nodo deseado. <2+5#8?3/D <2+5#3Z Z#+ ë 0)ë 0)ë= @0)ëÑ %0 +#[[33/D <2+5# 3Z Z#+<21 4 $3" $3"Z<[$3" 8 $3 +#[[3 3/D <2+5# 3Z Z#+<21 4 $3" $3"Z<[$3" 8 $3! $3 +#[[3 3/D <2+5# 83/+<21 4 $3" $3"Z<[ $3-"$31!+# 83/D <2+5#8?3/D
E Los datos para generar el XML es una línea por la variable $xml; el envoltorio es adaptar esta página y, potencialmente, puede romper el código. 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. I#44$722/JD 4<2D
El Flash (ActionScript) necesarias para la aplicación en todas las clases externas. Esto se hace porque es más fácil de gestionar y mantener para avanzar. FF Si necesita una explicación más a fondo de las clases, os recomiendo que lea el capítulo 9. El archivo Flash (FLA) para esta aplicación consta de un diseño simple con un cuadro de búsqueda y el botón. La clase principal, Booksearch, se asigna como la clase de documento y es responsable de la gestión de la aplicación en general. Aquí está el esqueleto de la clase, que da una idea de qué métodos y propiedades se utilizan para crear esta aplicación.
315
? W 9 + 7+)> D 9 +>4 +\D 9 +4+\D 8 ?- 24 )> W 8> 08- >1!- 4D >> 8?"
7D >> 8?" 44 )> D 8944 ?- IJWX 8944 (4 I) >4J>WX 8944- 1 I - 4J>WX 89441 (4 I>4J>WX >944 >1 IJ>WX X X
El método constructor se utiliza para inicializar la matriz, crear un movieclip contenedor, y agregue el detector de eventos para el botón de búsqueda. 8944 ?- IJ W %)ëÑ %)ë ' 8?" 44 +75*,,D B -r '-r)C6 7 X
El último paso del método constructor es añadir el contenedor nuevo libro a la lista de visualización, que en última instancia, lo hace visible. 8944 ?- IJ W 8?" 540
7IJD 8?" 44 540)> IJD 8?" 44 +75*,,D 4+>4! 4 I) >4+ !" OB (4 JD %)ë X
El siguiente método es centrarse en la searchHandler (). Este método se llama cuando el usuario hace clic en el botón Buscar. Cuando se llama a este método, primero comprueba la longitud de los datos de la caja de búsqueda para asegurar una búsqueda válida va a suceder. Si el valor es de longitud válido, una llamada a eliminar los resultados de búsqueda de edad se hace. 8944 (4 I) >4J> W 9I "0J W ë4
316
- 1 I 2+2JD X X
Una vez que se encuentra un término de búsqueda válido, 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. 8944- 1 I - 4J> W > C 8 1!C 8 5401!C 8 IJD C 8 + 5 D > 1@ 1!1@ 5401!1@ I08- >1!JD 1@ +5 C 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B 1 (4 JD ! +I 1@ JD X
Usted puede haber notado que este método se ha hecho público. Esto se hace lo que otras aplicaciones pueden utilizar la capacidad de buscar, porque eso es lo que la reutilización se trata. Por supuesto, si usted permite que otros para llamar a este método directamente, lo más probable es que quiera colocar otro plazo de verificación para asegurarse de que los datos erróneos no va a ser enviado. Una vez que devuelve el servidor Web de los datos, se envía al método loadedResultsHandler(). La respuesta se envía en formato XML y, utilizando un bucle for..each cada elemento se extrae y se envía a una instancia única de clase BookItem. > 2')!540')!I ! +JD 9 I ë ë %J +++
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. > 8?" ?"5B)ëIJD %)ë2 I ++B ++ B ++ B ++ 8 JD 8?"+75I8?" +4 \I8?"+ E&,JJD 8?" + I8?"JD 8?" 44 + I8?"JD
El controlador de eventos siguiente completado: 89441 (4 I>4J> W > ! 1!! 51!! I+ JD
317
> 2')!540')!I ! +JD 9 I> 42++8?J W > 8?" ?"540 ?"IJD 8?"+ C I ++B ++ B ++ B ++ 8 JD 8?"+75I8?" +4 \I8?"+ E&,JJD 8?" + I8?"JD 8?" 44 + I8?"JDX X
El último método para la clase de documento se utiliza para eliminar los casos elemento existente libro. Este método es llamado cada vez que comienza una nueva búsqueda, para asegurar que los datos no accidentalmente apilar hasta. >944 >1 IJ> W 9I8?" +4 3,J W 8?" 540
7IJD
> I8?" 44 JD 8?" 44 540)> IJD 8?" 44 +75*,,D I8?" 44 JD X X
La primera parte del método de los controles para las entradas válidas porque la primera vez que se ejecuta la aplicación, no habría productos existentes en el escenario. 9I%)ë "0J W +++ X
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. 8?" 540
7IJD
> I8?" 44 JD 8?" 44 540)> IJD
El último paso es añadir el contenedor nuevo libro a la lista de visualización, que se hace llamando addChild() y pasar la nueva instancia del contenedor como un argumento. I8?" 44 JD
Ahora puede seguir adelante y crear la clase BookItem, que se utiliza para cada producto que se añade 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 cómo se pretende trabajar. ? W 9 + 7+)> D 9 +2+2D 9 + 7+! D 9 +4+1!1@ D 8 ?"24 )> W 8944 ?"IJWX 8944 C I- 4B- 4B- 4B - 4J>WX 8944 8IJ>WX 8944C IJ8VWX X X
El primer método en la mayoría de las clases es el constructor, y esto no es una excepción, salvo por el hecho de que este constructor está vacío. El siguiente método es setValues, que se encarga de almacenar los valores pasados. Estos valores serán los datos del libro que es extraído de Amazon. Usted también puede pasar esta información como un objeto, pero para este ejemplo, es más fácil de entender el uso de variables independientes. 8944 C I- 4B- 4B- 4B- 4J> W 5D 5D 5D 85D 2+25D 2+25 D 2+25 D 8IJD X
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 más importante aún, se carga por sí sola, porque la portada del libro no es necesario. También puede crear un gestor visual para informar al usuario de que algo es realmente la carga. El resto del método es sólo una URLRequest estándar, que debe estar familiarizado con los de los ejemplos anteriores. 8944 8IJ> W > 8! ! 540! IJD > 81!- 45 8D > 81!1@ 1!1@ 5401!1@ I 81!JD 8! +I 81!1@ JD 8! +25*,D ë%r
319
X
El último método es para el retorno de los datos BookItem que fue poblada en los métodos anteriores. 8944C IJ8V W
4WB B XD X
En este punto, usted ha completado una aplicación de búsqueda de Amazon con PHP y Flash. También han obtenido una gran cantidad de información sobre el sistema de AWS y debe ser bombeado a construir su propio servicio de Web-habilitado. Algunos proyectos posibles a construir son la aplicación de búsqueda de CD, sistema de concordancia de género, o incluso una galería a la que utiliza la biblioteca de iTunes local o reproductor de música similar a la construcción de una nube visual de música que ha escuchado. Consulte el sitio Web para este libro para ver otros ejemplos de aplicaciones creadas usando el sistema de Amazon AWS.
& La galería de fotos es una aplicación 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 aplicación de entrega de información, como por ejemplo en juegos y sitios de noticias. En esta sección, usted aprenderá a desarrollar una galería de fotos usando el servicio de fotos en Flickr proporcionados por Yahoo. La aplicación Flash se hace una llamada a PHP, que interactúan 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 aplicación, 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 página 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/. Si selecciona la opción no comercial que autoriza su solicitud de forma casi instantánea. En este ejemplo se utiliza una clase de documentos para manejar la mayoría de la carga y visualización 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 cómo la clase trabaja. ? W 9 + 7+)> D 9 +>4 +\D 9 +4+\D 8 724 )> W 8> 08- >1!- 4D
30
>>
7D >> 44 )> D 8944 7IJWX 8944 (4 I) >4J>WX 8944- 1 I - 4J>WX 89441 (4 I>4J>WX >944 > IJ>WX X X
El primer método es realmente el constructor, que en esta aplicación se encarga de la creación de un nuevo contenedor, y también inicializa la matriz de elemento. 8944 7IJ W Ñ ' 44 +75PGD X
Después de que se crea un nuevo movieclip, es necesario que se añada a la lista de visualización, y un controlador de eventos debe ser asignada al botón de búsqueda situado en el escenario. 4+>4! 4 I) >4+ !" OB (4 JD I 44 JD
El siguiente método es centrarse en searchHandler(). Cuando este método se le llama comprueba en primer lugar por un término de búsqueda válido. Si el valor es válido, una llamada a eliminar las imágenes antiguas que se haga. 8944 (4 I) >4J> W 9I "0J W ë4 ( - 1 I 2+2JD X X
El siguiente método es para llamar al PHP, que es responsable de la interfaz con Flickr. La variable de etiquetas se pasa desde el controlador de búsqueda y se envía al PHP a través de una petición GET. 8944- 1 I - 4J> W > C 8 1!C 8 5401!C 8 IJD C 8 + 5 D > 1@ 1!1@ 5401!1@ I08- >1!JD 1@ +5 C 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B 1 (4 JD ! +I 1@ JD X
31
El PHP está configurado para devolver un conjunto de resultados XML, que es una versión 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 información que no es necesario para una aplicación 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 través de un bucle for..each de sacar cada foto nodo de. 89441 (4 I>4J> W > ! 1!! 51!! I+ JD > 2')!540')!I ! +JD ë ë W +++ X X
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 también es donde los datos de imagen se almacena para uso futuro. > " "540 "IJD "+ C I++B++ 8JD
Cuando se crea una nueva instancia de la PhotoItem, debe estar alineado en el contenedor. Esta posición se determina en función 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. "+75I +4 \I "+ EG,JJD
Otra solución más 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 múltiples imágenes a tamaño y ser más dinámico. La última tarea de este método consiste en agregar la nueva instancia en la matriz de fotos y finalmente mostrarlo. + I "JD 44 + I "JD
Cada vez que una nueva búsqueda se lleva a cabo, una llamada al método removeOldPhotos se hace. Este método es responsable de la eliminación de las imágenes existentes y asegurar que los datos no se cruzaron. >944 > IJ> W 9I +4 3,J W 540
7IJD
> I 44 JD 44 540)> IJD 44 +75PGD I 44 JD X X
3
Este método private se establece en el código para que no pueden borrar accidentalmente las imágenes. Si desea permitir la eliminación externa de las imágenes que puede crear un método que los controles que delega cierto nivel de autorización. Si la petición es válida, las imágenes pueden ser removidos. La siguiente clase para crear, ahora que se ha completado la clase de documento, es la PhotoItem. Esta clase contiene la información para cada imagen que se carga desde Flickr. También es responsable de cargar la posición de la miniatura de la instancia en el escenario. ? W 9 + 7+)> D 9 +2+2D 9 + 7+! D 9 +4+1!1@ D 8 "24 )> W >> - 4D >> 8- 4D 8944 ?"IJWX 8944 C I- 4B- 4J>WX 8944 8IJ>WX 8944C IJ8VWX X X
Cuando una nueva instancia de esta clase se crea, una llamada a la setValues se hace para almacenar los datos de la imagen. Este método acepta dos argumentos: título y la ruta en miniatura. Ambas variables se guardan en variables privadas para que accidentalmente no se pueda acceder y modificar. 5D 85D
Una vez que se carguen los datos, el título se añade al componente titleTxt situado en el movieclip. El título también se desplaza a cabo para dar cabida a la imagen en miniatura. 2+25D 2+25*,,D
La pieza final es hacer una llamada al método loadThumb. 8IJD
El método de loadThumb es responsable de cargar la imagen que se encuentra en el documento XML. 8944 8IJ> W > 8! ! 540! IJD > 81!- 45 8D > 81!1@ 1!1@ 5401!1@ I 81!JD 8! +I 81!1@ JD 8! +25*,D I 8! JD X
33
El último método es responsable de pasar de nuevo la información de la imagen. 8944C IJ8V W
4WXD X
Usted puede haber notado el gestor de miniatura es el mismo código que se utilizó en el libro de ejemplo de la búsqueda. También puede haber notado que el código de gestor a través de todo este libro es muy similar. Lo que debería decir es una clase que se han construido para manejar esta tarea, y una importación sencilla sustituiría diez líneas de código que se han duplicado en todas las aplicaciones. Esto no es realmente notable para una pequeña aplicación, pero que sería si estuviera desarrollando un proyecto a gran escala largerscale. Reutilización de la clase se explica en mayor detalle en el capítulo 9. Pero básicamente, lo que viene abajo es cuando eres capaz de hacer algo modular, es probablemente una buena idea para hacerlo.
î El siguiente paso en la galería de fotos es para construir el código PHP que se encargará de la conexión a flickr y analizar la respuesta XML. El primer paso es definir el API clave de Flickr que se proporciona desde Flickr. ; #/r)C Ñ-
C-:$6#/r)C Ñ()C-:$
Flickr tiene una manera única parte de la construcción de las URLs de la imagen. La manera más fácil trabajar con este formato es usando la función sprintf. Esta función acepta una cadena con las variables de marcador de posición que luego se rellenan con las variables reales utilizando valores proporcionados en los otros. <9? 1!5# 9 T + +9? + T T MT M +V/D
Para evitar solicitudes erróneas, una simple declaración if se utiliza para asegurarse de que las etiquetas de variable que viene de Flash, de hecho, tiene un término de búsqueda. Si por alguna razón, la variable está vacía, el script y no más de código se ejecuta desde ese punto. 9I7I
Si se encuentra un valor de etiqueta válido, el siguiente paso es recoger la información de la etiqueta y hacer la llamada a Flickr para iniciar el proceso de búsqueda. <) 5#9? + + /D < @ 5# +9? + > /+ #; 5/+<) + #N 5/+< + #NM?75/+!" O1M
--MO+ #N M5G/D
34
< 0'59MM44 I< @ JD À ! %! ! * ! R'* # ! * 2 + ? ? /0 .
<21 4 5 2MM 4I< 0'JD
Cuántas imágenes para mostrar son determinados por la carga del valor que se encuentra en el documento XML. <4 45 8I<21 4 $3 B# /JD
¬ El proceso de construcción del documento XML personalizado se realiza mediante un bucle que se agarra a cada nodo de fotos y recoge la información requerida. <25#;2> 45/*+,/;34 3/D 9 I<5,D<<4 4D<EEJ W <9 "5 8I<21 4 $3 $3 Z<[B#9 /JD < > "5 8I<21 4 $3 $3 Z<[B # > /JD < "5 8I<21 4 $3 $3 Z<[B#/JD < 5 8I<21 4 $3 $3 Z<[B # /JD <2+5# 3/D <2+5#3Z Z#+ 8I<21 4 $ 3 $3 Z<[B#/J+#[[33/D <2+5# 83/+ 49I<9? 1!B <9 "B < > "B < "B < J+ # 83/D <2+5# 3/D X
La primera parte del circuito es para la construcción de la ruta de la imagen, que se pasa a la función sprintf. Después de que el documento XML en general se crea, el último paso es la salida a la persona que llama, que en este caso sería Flash. I#44$722/JD 4<2D
Ahora que el PHP se ha completado y la aplicación general se ha desarrollado, se puede comprobar, como se muestra en la Figura 1.5.
35
FIGURA 1.5 Aquí está la aplicación final, que muestra las imágenes de una búsqueda usando la etiqueta de color naranja.
En este capítulo usted aprendió cómo 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 continuación, aprendió a desarrollar un sistema de búsqueda que utiliza la API de búsqueda de Amazon.com, y obtuvo una comprensión de cómo los datos en el tercer partido los servicios de regreso. En la última parte del capítulo que desarrolló una aplicación de la imagen usando la API de Flickr. En el proceso, que ha aprendido algunas de las características más 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 galería de fotos con las categorías y la posibilidad de añadir/editar fotografías. Incluso podría incluir esta pequeña porción en una aplicación mayor, mientras que a través de Flickr como la interfaz gráfica o el punto de almacenamiento de fotos. 36
'/*! % Aplicaciones del mundo real están destinados a ser productos completos que han sido probados y están listos para ser desplegados para el público en general a disfrutar de ellos. Este capítulo se centra en la construcción de una serie de aplicaciones que hacen precisamente eso. Los archivos de partida se han previsto para que pueda centrarse en el núcleo de las aplicaciones, lo que sería el proceso de desarrollo. Cada ejemplo se divide en sus clases individuales, archivos, y los paquetes en función de lo que se requiere. Si usted nunca ha trabajado con las clases, te recomiendo que lea el capítulo 10. Esto asegurará los ejemplos y los estilos de codificación son fáciles de seguir.
" Esta aplicación toma el dibujo (véase la figura 13.1) y usa PHP para crear un formato de imagen exportable. La primera parte del código es responsable de la parte de dibujo de la aplicación.
37
FIGURA 13.1 Aquí está la aplicación de dibujo terminado.
Ñ~î " La API de dibujo que se incluye con Flash ofrece una amplia gama de herramientas, como líneas, círculos, cuadrados, y degradados. Este ejemplo se centra en la línea 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 inicialización que se mantenga el color del lápiz y el tamaño por defecto, así como el contenedor de referencia. > 4) )> D > 04 459 D > 4-:45*D > 4 .8 5,2,,,,,,D
La aplicación de dibujo se creó para elaborar la línea cuando el botón se mantiene presionado y se detendrá cuando se suelta el botón del ratón. Durante el tiempo que el botón del ratón se establece un llamado persistente a una función de desplazamiento del ratón se produce al colocar el punto de la pluma en una ubicación diferente. La pluma está programado para trazar la línea donde se encuentra el puntero del ratón. 38
El siguiente paso es la construcción 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 aplicación. Este método startDrawing () sólo es llamado cuando el ratón hace clic. Es importante que una línea nueva se crea en caso de que el color o el tamaño de las variables han cambiado. 944 04I) >4J> W I#- 04/JD 045 D 4) + +4-7I4-:B4 B*+,JD 4) + +>I 'B JD X
Después de la bandera de dibujo se establece que puede comenzar a dibujar el trazo de lápiz reales (s). La posición de la pluma está determinado por la ubicación actual del puntero del ratón. 944 04I) >4J> W 9I 04J W 4) + +4I 'B JD X X
Ahora que la línea está siendo debidamente elaborados, es una buena idea para evitar que una vez que se suelta el botón del ratón. Esto se hace colocando un controlador para el evento de ratón. 944 04I) >4J> W I#- 04/JD 0459 D X
El último método en este ejemplo es bastante complejo. Es responsable de la construcción de la caja de herramientas y de inicializar el evento de controladores de ratón. 9444IJ> W 4) 540)> IJD +>4! 4 I) >4+)-M%.B 04JD +>4! 4 I) >4+)-M B 04JD +>4! 4 I) >4+)-M)CB 04JD I4) JD +++
La caja de herramientas está formado por clips de película que ya están en el escenario y convenientemente identificado dentro de un movieclip contenedor. ) + 0 ) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,26666
D XJD ) + 0 ) +>4! 4 I) >4+ !" OB 944IJ> W
39
4 5,2,,,,D XJD ) + 0 1) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,2,,,,D XJD ) + 0 4) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,2,,,,D XJD ) + 0 4) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,266,,D XJD ) + 0 ?) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,2,,,,,,D XJD ) +8 -:*) +>4! 4 I) >4+ !" OB 944IJ> W 4-:5*D XJD ) +8 -:) +>4! 4 I) >4+ !" OB 944IJ> W 4-:5D XJD ) +8 -:H) +>4! 4 I) >4+ !" OB 944IJ> W 4-:5HD XJD ) +8 -:=) +>4! 4 I) >4+ !" OB 944IJ> W 4-:5=D XJD
Cuando todas las herramientas están 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 código ActionScript para la aplicación de dibujo, aquí está el código completado: > 4) )> D > 04 459 D > 4-:45*D
330
> 4 .8 5,2,,,,,,D 9444IJ> W 4) 540)> IJD +>4! 4 I) >4+)-M%.B 04JD +>4! 4 I) >4+)-M B 04JD +>4! 4 I) >4+)-M)CB 04JD I4) JD ) + 0 ) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,26666
D XJD ) + 0 ) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,2,,,,D XJD ) + 0 1) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,2,,,,D XJD ) + 0 4) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,2,,,,D XJD ) + 0 4) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,266,,D XJD ) + 0 ?) +>4! 4 I) >4+ !" OB 944IJ> W 4 5,2,,,,,,D XJD ) +8 -:*) +>4! 4 I) >4+ !" OB 944IJ> W 4-:5*D XJD ) +8 -:) +>4! 4 I) >4+ !" OB 944IJ> W 4-:5D XJD ) +8 -:H) +>4! 4 I) >4+ !" OB 944IJ> W 4-:5HD XJD ) +8 -:=) +>4! 4 I) >4+ !" OB
331
944IJ> W 4-:5=D XJD 0 4I ) B4) JD X 944 04I) >4J> W I#- 04/JD 045 D 4) + +4-7I4-:B4 B*+,JD 4) + +>I 'B JD X 944 04I) >4J> W 9I 04J W 4) + +4I 'B JD X X 944 04I) >4J> W I#- 04/JD 0459 D X 4IJD
Eso es todo lo que hay es una aplicación de dibujo básico en Flash. Puede ampliar este ejemplo, dando consejos de lápiz diferente o tal vez algunos de diferentes colores para permitir el sombreado de estilos de pintura y otros. La siguiente sección se basa en este ejemplo y usa PHP para hacer y guardar la imagen en el servidor.
o ~~ La librería GD de PHP es una colección de funciones que te dan la habilidad para manipular y crear imágenes. GD también 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 según sea necesario. Uno de los usos más comunes de la biblioteca GD incluye la creación automática de marcas de agua que se aplican a una galería de imágenes. Algunos lo utilizan para crear miniaturas dinámicas, similar a la forma en que su editor de imágenes locales haría. 000+ +444 9++
La biblioteca GD ofrece una lista enorme de funciones, pero algunos de ellos requieren de librerías adicionales. De hecho, es una buena idea ejecutar un código, como el siguiente, para determinar lo que está instalado. ; > MIM49IJJD;3
33
Este código imprime lo que la situación 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.
7I6J W Z#C 4/[53 4IHJ#84I+,8J/ Z# 7- /[538I9 J Z#*!8- /[538I9 J Z#"1- /[538I J Z#"
- /[538I9 J Z#^ - /[538I9 J Z# .- /[538I J Z#% ) - /[538I J Z#' )- /[538I9 J X
El código anterior le permite saber que usted no tiene FreeType (fuente) y JPG (imagen) el apoyo habilitado o instalado. Con esta información, usted puede continuar e instalar las librerías necesarias. Tenga en cuenta que la instalación de aplicaciones en un entorno de línea 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 montón de trabajo para obtener el kit completo de trabajo GD. Si usted es presionado por el tiempo y están trabajando a nivel local se puede echar un vistazo a las opciones de inicio rápido disponible en el capítulo 1, que vienen con una versión 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 instalación. E La biblioteca GD (básicos) no viene con cada versión de PHP. Consulte con su servidor o instalar según 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 aplicación final, es mejor para familiarizarse con la biblioteca GD mirando algunos ejemplos. He aquí un ejemplo GD simple que crea un rectángulo de color rosa y los resultados al explorador como un archivo JPG (véase la figura 13.). <5 IG,BK,JD <8 5 I<BGGB,B*,JD I# 44$7V/JD VI<JD
333
FIGURA 13. Aquí está la imagen que fue generada por la librería GD, utilizando el código simple.
Esta es una continuación del ejemplo anterior, pero esta vez se guarda el archivo JPG al el servidor Web. Al agregar un segundo argumento a la función 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. <5 IG,BK,JD <8 5 I<BGGB,B*,JD I# 44$7V/JD VI<BQ+ +VRJD
Si bien estos ejemplos son bastante simples que deben dar una idea de cómo trabajar con la librería GD. Si usted tiene otras bibliotecas instalado, puede representar el texto en las imágenes, entre otros muchos resultados muy interesantes. La biblioteca GD es una gran característica de PHP y ha llegado realmente útil para muchas tareas, no importa cuán grande. Ahora, vamos a pasar a la aplicación real que se inició en la sección anterior. El ActionScript es permitir a los usuarios dibujar una imagen y cambiar la configuración, y todo funciona a la perfección, 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 creación de un píxel por píxel de la imagen y guardarla en el servidor Web. 334
o o Esta sección se centra en el uso de PHP para hacer que la imagen que se dibuja en la aplicación Flash. Normalmente, se comienza con el código PHP en primer lugar, pero en esta aplicación, el PHP se utiliza solamente como un renderizador de lo que tiene sentido comenzar con la parte de Flash. La mayoría de la aplicación se escribió en la sección anterior, usted simplemente tomar ese código y ampliar para agregar las acciones necesarias. El código 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. <0 5
Cuando los datos se ha cargado correctamente, puede configurar la base de la imagen renderizada. Esto se hace utilizando la función imagecreatetruecolor(), que es parte de la librería GD. <5 I<0 B< JD
La imagen real se genera un bucle a través de todos los datos XML que está sacando los valores de color que fueron capturados en Flash. <54I<4 $34JD 9 I
Los datos de los píxeles se colocan en un patrón de cuadrícula de una línea a la vez, la $x y $y son el punto de cada color se va a colocar. Todos estos datos se pasa a la función 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 guárdelo en el sistema de archivos. IQ 44$74RJD 4I<BQ 4 MR+IJ+Q+4RJD
335
FIGURA 13.3 Una imagen de muestra representa como un PNG
E El proceso de construcción de un píxel de la imagen por píxeles es intensivo del procesador y puede tomar mucho tiempo, dependiendo del tamaño de la imagen. Aquí está el código PHP completado: ; <0 5
336
< 5 2I< JD 2I<B<2B<7B< JD X IQ 44$74RJD 4I<BQ 4 MR+IJ+Q+4RJD ;3
" Hay sólo algunas actualizaciones necesarias para el código de Flash de la sección anterior, pero por ahora se centran en la recopilación de los datos de la imagen utilizando la clase BitmapData. El primer paso en esta función es determinar las dimensiones de la imagen. > 0 454) +0 D > 454) + D
La siguiente variable a definir es la referencia de archivo PHP. > - 45 # * 04"4 + /D
El siguiente paso es construir un nuevo mapa de bits utilizando el método draw() de la clase BitmapData. El método draw realiza un argumento, que es el objetivo. Este método toma el argumento y copia los datos de los píxeles al nuevo mapa de bits. > 8 540 I0 B B B ,2JD 8+ 0I4) JD
Después 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 píxel. > 2- 45#4 3/D 9 I> 45,D0 DEEJ W 9 I> V45,DV DVEEJ W > - 458+ 2IBVJ+- 4I*=JD 9I 55#,/J W 5#/D X 2E5#43/D 2E5#23/EE#23/D 2E5#73/EVE#73/D 2E5#3/E E#3/D 2E5#43/D X X
337
2E5#4 3/D
Los datos de color se almacena un elemento en el documento XML personalizado que se envía 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. > C 8 1!C 8 5401!C 8 IJD C 8 +0 50 D C 8 + 5 D C 8 +452D > 1@ 1!1@ 5401!1@ I JD 1@ + 51!1@ ) + -D 1@ +5 C 8 D 41!I 1@ JD
La respuesta es enviada a PHP usando el método de sendToURL. Este silencio, llama al servidor web y no espera ninguna respuesta. La razón para usar este método es porque la solicitud será bastante grande si la imagen se ha prestado una gran cantidad de datos de píxeles.
" Cuando se posee u opera un sitio web que a veces puede ir fuera de línea, pero probablemente nunca se sabrá si se establecen sólo por un breve momento, a menos que se esté consultando en el sitio. ¿Qué sucede si usted opera muchos sitios Web y están ocupados trabajando mientras que su sitio se cae? Más probable es que su sitio se desconecta y no son conscientes de ello. Esta sección contiene la explicación 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 después de cierto punto (configurable por el operador).
À / 0 :
1 ! )4 I "...!!M". 1).B 4C1 (1I*,,J!#/..!!B '..!!B >C1 (1I*J!*..!!B 1")1OIJ JD
FF Hay muchas maneras que usted puede cargar el esquema de MySQL en su base de datos. Para obtener una explicación, véase el capítulo .
~~ La primera parte de la carga en PHP es la información de conexión para la base de datos. Este se coloca en un archivo externo, por lo que puede ser compartida a través 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 aplicación. 338
Si usted aún no ha creado el dbconn.php, aquí están los contenidos. Se llena la información 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 dueño de su servidor. ; < 5# /D < 5#-1.)/D < 5# --%1/D <8 5# -M.)/D <4?57 @M44I< B< B< JD 7 @M M8I<8 B<4?JD 4 I< JD 4 I< JD 4 I< JD 4 I<8 JD ;3
Después de la conexión de la base de datos se establece puede continuar el desarrollo del archivo monitor.php. La $action se pasa a lo largo de la dirección, pero debe ser válido para que la secuencia de comandos para saber qué estado debe estar en ejecución. <45I I
Suponiendo que la acción es válida y el valor es getsites, que está configurado para devolver una lista de los sitios que están siendo monitoreadas. El proceso de recuperar la lista de sitios se lleva a cabo mediante un bucle que se carga en la información 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. -! \1) )4 %(1>5*
Después que los datos de SQL se recupera, se pasa a un bucle while, que es responsable de la apropiación cada fila y la construcción de una línea de XML que define la información del sitio. < 57 @M@ 7I#-! \1) )4 %(1 >5*/JD <25#;2> 45/*+,/;34/D <2+5# 34/D ë W +++ X <2+5# 3/D
La línea de XML está construido utilizando los datos $row, que se transmite en la función sprint(). El sprintf se utiliza para rellenar automáticamente el código XML necesario atributos utilizando la fila de datos de SQL. <2+5 49I# 45/T / 5/T /34/B
339
< 0ZQ4R[B < 0ZQ R[JD
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 declaración de hecho la salida de impresión a los datos. I# 44$722/JD 4<2D
Aquí está una muestra de la respuesta que se devolvería a Flash: ;2> 45/*+,/;3 3 45/8/ 5/ 000+8+/3 45/"1 7 4/ 5/ 000+ 7 4+/ 3 45/?9-"./ 5/ 000+?9 4+/3 45// 5/ 000++/3 3
~~# Cuando un sitio ha sido inalcanzable para una cierta cantidad de tiempo, es probablemente una buena idea para notificar a alguien. La notificación se envía utilizando el construido en función 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 electrónico se retrasa o no es notado de inmediato. El primer paso es verificar la acción anterior se establece en e-mail al administrador. De lo contrario, este bloque de código completo sería ignorado. 9I<455#4/J W +++ X
Si la acción (action) es válido, el siguiente paso es construir el mensaje de correo electrónico y recuperar los valores pasados de Flash que definir el sitio experimentando el apagón. <9 5# 4 S7 +/D <5#4S7 +/D < 5
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 continuación. <"495#/D <"49+5#\\ 4 4 \\+44/D <"49+5# 4 8449 4/D <"49+5# 904 4 444/D <"49+5#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$4/D <"49+5#-#+< +#Z#+< 1"+#[4/D
340
<"49+5#-4#+<+#44/D <"49+5#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$4/D
El encabezado del correo electrónico debe seguir la especificación que define cómo el e-mail se va a construir y el $from de valor tiene que ser válido, a pesar de que la actual dirección de correo electrónico no es utilizada. ) B4 <( 5# #+<9 +#344/D
Cuando todas las variables y la información de correo electrónico se han creado, el correo electrónico reales pueden ser enviados. Esto se hace realizando una llamada a la función mail(), pasando por la información que fue construido en los pasos anteriores. 9II <B # 4 9 -)4 /B <"49B <( JJ W 4# 5 /D X
La función mail() devuelve un mensaje de éxito si la función es llamada correctamente. La función no sabe el estado del envío efectivo del e-mail. Aquí está el código PHP completado para monitor.php: ;
@ IQ844+ RJD <45I I
7I< JJ W <2+5 49I# 45/T / 5/T /34/B < 0ZQ4R[B < 0ZQ R[JD X <2+5# 3/D I# 44$722/JD 4<2D X 9I<455#4/J W <9 5# 4 S7 +/D <5#4S7 +/D
341
< 5
Ñ En este punto, el código de PHP ha sido completado, y la siguiente sección 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 diseño en el lugar, como se muestra en la figura 13.4, para que pueda centrarse en el desarrollo.
34
FIGURA 13.4 Aquí está la solicitud completa con uno de los lugares con indicación de un fracaso.
Aquí está el esqueleto de clase para la clase de documento. ? W 9 + 7+)> D 9 +4+\D 9 +>4 +\D 8 -)4 24 )> W 8944-)4 IJWX >944- IJ>WX >944-(4 I>4J>WX X X
El constructor de la clase de documento es responsable de asignar el movieclip siteContainer, y agregó que movieclip a la lista de visualización y, finalmente, hacer una llamada al método loadSites(). 44 540)> IJD 44 +75K,D 44 +25,D
343
I 44 JD - IJD
El método 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. > > 8 1!C 8 5401!C 8 IJD > 8 +45# /D > 1@ 1!1@ 5401!1@ I JD 1@ +5> 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B-(4 JD ! +I 1@ JD
El siguiente método se llama cuando los datos del sitio se carga correctamente. Un evento es pasado como un argumento que contiene la respuesta de PHP. >944-(4 I>4J> W +++ X
La respuesta es XML, lo que es necesario crear primero un objeto XML que se utiliza un bucle for..each. > ! 1!! 51!! I+ JD > 2')!540')!I ! +JD > 45,D 9 I> 42++ J W +++ X X
El contenido del bucle for..each crea una nueva instancia de la clase SiteMonitorItem que se adjunta a un clip de película en la línea de tiempo del mismo nombre. > "-)4 "540-)4 "IJD "+ 5 D "+ 1"5++ 8IQ RJD "+ .2+25++ 8IQ4RJD "+ ) +4-IJD "+75I\I "+ E*,JJD 44 + I "JD EED
La variable siteItem tiene la instancia de clase de nueva creación, 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 método attribute(), que tiene un argumento que es el nombre del atributo que está buscando. La colocación del objeto siteItem está determinado por una ecuación simple, utilizando la altura del objeto y el valor de la variable i, luego de tomar esa suma y añadiendo un relleno 10px. 344
En este punto se termina la clase de documento. Aquí está el código completado: ? W 9 + 7+)> D 9 +4+\D 9 +>4 +\D 8 -)4 24 )> W 8> 44 )> D 8> - 45 # -)4 4 + /D 8944-)4 IJ W 44 540)> IJD 44 +75K,D 44 +25,D I 44 JD - IJD X >944- IJ> W > > 8 1!C 8 5401!C 8 IJD > 8 +45# /D > 1@ 1!1@ 5401!1@ I JD 1@ +5> 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B -(4 JD ! +I 1@ JD X >944-(4 I>4J> W > ! 1!! 51!! I+ JD > 2')!540')!I ! +JD > 45,D 9 I> 42++ J W > "-)4 "540 -)4 "IJD "+ 5 D "+ 1"5++ 8IQ RJD "+ .2+25 ++ 8IQ4RJD "+ ) +4-IJD 44 + I "JD "+75I\I "+ E*,JJD "+ ?-IJD
345
EED X X X X
La próxima 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: ? W 8 -)4 "24 )> W 8944-)4 "IJWX 8944 ?-IJ>WX >94441 4 I>4"
>4J>WX >944 1 4 (4 I>4J>WX >944 ?4IJ>WX 8944 IJ4WX 8944 I44J>WX X X
El constructor de esta clase está vacía, por lo que puede dejar fuera y continúe con el método siguiente, que es checkSite(). Este método es llamado por la clase de documento cuando el temporizador expira esperar. El objetivo de este método consiste en comenzar la acción de control del sitio y el controlador correcto en función de la respuesta recibida. 8944 ?-IJ> W > 1@ 1!1@ 5401!1@ I 1"JD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B 1 4 (4 JD ! +>4! 4 I"
>4+"M111B41 4 JD ! +I 1@ JD X
La mayoría de este método es el mismo que los ejemplos anteriores, con la excepción 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 método noResponse() será llamado cuando el sitio no puede ser cargado, como se muestra aquí: ! +>4! 4 I)4--)4- 4 B41 4 JD
El método noResponse() es responsable de incrementar la variable failedAttempts, pero utilizando un método setter en lugar de acceder directamente a la variable. >94441 4 I>4"
>4J> W 5ë 8D X
346
Si se carga el sitio, una llamada a siteResponsedHandler() se hace para borrar los intentos anteriores fracasaron y, básicamente, restablecer la cuenta de errores. >944 1 4 (4 I>4J> W Ñë X
Una llamada a stopChecking() se produce cuando un sitio no responde después de un número determinado de veces, fijada por la constante MAX_ATTEMPTS. >944 ?4IJ> W X
Los dos últimos métodos 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 sólo los incrementos de variable failedAttempts, sino que también determina si todos los controles futuro debe interrumpirse según el recuento actual fracaso. 8944 IJ4 W
49 D X 8944 I44J> W 9I455494J W 9 EED X W 9 54D X Ñë 'ÑÑ-'( W ) +4-I*JD ?4IJD X }
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 círculo rojo. En este punto la clase SiteMonitorItem ya está completo y la película de Flash pueden ser examinados para asegurarse de que funciona correctamente con el código PHP por escrito antes. Lo que sigue es la clase de archivo completado SiteMonitorItem que se adjunta a la movieclip del mismo nombre: ? W
347
9 + 7+)> D 9 +4+\D 9 +>4 +\D 9 +2+2D 8 -)4 "24 )> W 8> - 4D 8> 1"- 4D >> ? 459 D >> 9 45,D >4 )'M) -45&D 8944-)4 "IJWX 8944 ?-IJ> W > 1@ 1!1@ 5401!1@ I 1"JD > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B 1 4 (4 JD ! +>4! 4 I"
>4+"M111B 41 4 JD ! +I 1@ JD X >94441 4 I>4"
>4J> W 5 E*D X >944 1 4 (4 I>4J> W 9 5,D X >944 ?4IJ> W ?5 D X 8944 IJ4 W
49 D X 8944 I44J> W 9I455494J W 9 EED X W 9 54D
348
X 9I9 55)'M) -J W ) +4-I*JD ?4IJD X X X X
" Reproductores de vídeo, como el que se ilustra en la figura 13.5, son cada vez más popular como la Internet sigue para llegar más rápido. La idea detrás de esta sección es desarrollar un reproductor de vídeo que se interconecta con PHP para cargar en la lista de vídeos, así como el seguimiento de la obra cuenta. Flash ya los buques con un muy versátil reproductor de vídeo por componentes, pero aún se puede ampliar, lo que es exactamente lo que esta sección le ayudará a alcanzar. La aplicación 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 rápidamente puede poner a prueba a medida que avanza.
349
FIGURA 13.5 Un reproductor de vídeo con un vídeo cargado y reproduciendo
Usted necesita un archivo de vídeo FLV a fin de probar esta aplicación. 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 aplicación será. En este ejemplo va a utilizar una clase externa para desarrollar el reproductor de vídeo. La primera parte de la aplicación a desarrollar es el código ActionScript, que se divide en clases de una mayor escalabilidad. El ActionScript principal se adjuntará a la aplicación utilizando la clase de document. Para empezar, examine la estructura de clase, que le dará una mejor idea de cómo la aplicación fluye. ? W 8 C 7 24 )> W 8944C 7 IJWX 8944IJ>WX >944!I>4J>WX
350
>9448(4 I>4J>WX X X
El método constructor de la clase de documento es responsable de asignar la instancia VideoPlayer. También es el punto donde se definen los detectores de eventos necesarios. M7 5 ZQ7 R[D ZQ>! 8R[+>4! 4 I>4+ (.B 8(4 JD
La última parte del método constructor es llamar al método LoadData y recoger los datos XML. IJD
El método LoadData() es para cargar los datos de vídeo, que se devuelve en formato XML. 8944IJ> W > C 8 1!C 8 5401!C 8 D 2 % #" $ > 1@ 1!1@ 5401!1@ I JD 1@ +5 C 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B!JD ! +I 1@ JD X
Aquí está una muestra de la respuesta XML, que tiene los atributos de población en lugar de los nodos. > 3 >45/-C*/ 5/ *+9>/7 45/P/3 >45/-C/ 5/ +9>/7 45/&/3 >45/-C&/ 5/ &+9>/7 45/G/3 >45/-CH/ 5/ H+9>/7 45/H/3 >45/-CG/ 5/ G+9>/7 45/*/3 >45/-C=/ 5/ =+9>/7 45//3 > 3
Después 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 vídeo, que se añade al componente ComboBox. ZQ>! 8R[+"IW8R C+++RB$ *XJD 9 I> 42++>J W > 4- 45++ 8IQ4RJD > - 45++ 8IQ RJD ZQ>! 8R[+"IW84B XJD X
351
El último método de la clase de documento es un controlador de eventos para el componente ComboBox. >9448(4 I>4J> W 9I+ + "+55$*J 4D I#!C#E+ + "+JD M7 + 5Q> RE+ + "+D X
Este método controlador de eventos se utiliza para cargar el archivo de vídeo, pero sólo si se encuentra un valor de datos válidos. Una simple declaración de if (si) se utiliza para determinar si se selecciona la etiqueta. 9I+ + "+55$*J 4D
Eso es todo lo que hay a esta clase. Esta es la clase de documento terminado: ? W 9 + 7+)> D 9 +>4 +\D 9 +4+1!C 8 D 9 +4+1!1@ D 9 +4+1!! D 9 ++CD 8 C 7 24 )> W 8> - 45 # *C 7 >)4 + /D >> M7 !C 78?D 8944C 7 IJ W M7 5 ZQ7 R[D ZQ>! 8R[+>4! 4 I >4+ (.B8(4 JD IJD X 8944IJ> W > C 8 1!C 8 5401!C 8 D C 8 +5#> /D > 1@ 1!1@ 5401!1@ I JD 1@ +5 C 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B !JD ! +I 1@ JD X >944!I>4J> W > ! 1!! 51!! I+ JD > 2')!540')!I ! +JD
35
ZQ>! 8R[+"IW 8R C+++RB$*XJD 9 I> 42++>J W > 4- 45++ 8IQ4RJD > - 45++ 8IQ RJD ZQ>! 8R[+"IW 84B XJD X X >9448(4 I>4J> W 9I+ + "+55$*J 4D I#!C#E+ + "+JD M7 + 5Q> RE + + "+D X X X
El siguiente paso es desarrollar el código PHP que se utiliza para devolver un objeto XML. Para este ejemplo, los datos de vídeo es un conjunto estático, pero que puede actualizar fácilmente para utilizar una base de datos MySQL similares a los ejemplos anteriores. <> 5
7I
7I#-C*/B# +9>/B,JB
7I#-C/B# +9>/B,JB
7I#-C&/B# +9>/B,JB
7I#-CH/B# +9>/B,JB
7I#-CG/B# +9>/B,JB
7I#-C=/B# +9>/B,J JD
Este ejemplo sólo tiene una acción, que es recuperar la lista de vídeo y crear un objeto XML que se pasa de nuevo a Flash. 9I<455#> /J W <25#> 3/D 9 I<5,D<4I<> JD<EEJ W <2+5#>/D <2+5#45//+<> Z<[Z,[+#//D <2+5# 5//+<> Z<[Z*[+#//D <2+5#7 45//+<> Z<[Z[+#//D <2+5#34/D X <2+5#> 3/D
Después de que el objeto XML se crea, un tipo de encabezado de XML es emitida, el último paso es la salida el código XML real. I# 44$722/JD 4<2D
353
Eso es todo el código PHP que se necesita para desarrollar este programa de vídeo. Aquí está el PHP completado: ; <45I I
7I
7I#-C*/B# +9>/B,JB
7I#-C/B# +9>/B,JB
7I#-C&/B# +9>/B,JB
7I#-CH/B# +9>/B,JB
7I#-CG/B# +9>/B,JB
7I#-C=/B# +9>/B,J JD 9I<455#> /J W <25#> 3/D 9 I<5,D<4I<> JD<EEJ W <2+5#>/D <2+5#45//+<> Z<[Z,[+#//D <2+5# 5//+<> Z<[Z*[+#//D <2+5#7 45//+<> Z<[Z[+#//D <2+5#34/D X <2+5#> 3/D I# 44$722/JD 4<2D X ;3
Una encuesta es una característica muy común 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 están en algún otro servidor. Un problema menos común es la falta de libertad con el diseño de la aplicación de encuesta.
~~¬ Esta aplicación consiste en el diseño, el desarrollo de PHP y ActionScript para desarrollar una aplicación plena de votación funcionales, como la que se muestra en la Figura 13.6. El foco inicial está en el código SQL que almacena los datos de las encuestas.
354
FIGURA 13.6 Una aplicación de encuesta completa muestra algunos datos del ejemplo
Para ofrecer más de una encuesta, un número de identificación único asignado a cada respuesta que determina que la pregunta que se asocia con.
1 !I "...!!!,B C'..!!B 7C1 (1I,J!#/..!!B C ".I**J..!!B >C1 (1I*J!*..!! JD
Este esquema de la tabla está poniendo las preguntas y respuestas en una tabla de la simplicidad. Sin embargo, en una aplicación más 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 más eficiente. Después de escribir el SQL, puede pasar a desarrollar el código PHP. Esta aplicación tiene dos acciones: la capacidad de obtener datos de las encuestas y votar. En una aplicación más avanzado que lo más probable es que tenga un editor y sistema de eliminación.
355
La acción y la encuesta de identificación son aprobadas por la dirección (URL), así que la primera parte del código es responsable de almacenar la información. <45I I
El siguiente paso es cargar los datos de una encuesta de la base de datos mediante una instrucción SELECT simple. < @5#-! \1)%(15/+<"D <@ 757 @M@ 7I< @JD
Cuando se carga los datos de SQL, se pasa en un bucle while que es responsable de la construcción de los datos XML. Una declaración de if se utiliza para determinar si un voto válido está disponible, si lo es, se añade el atributo XML. <25#5//+<"+#/34/D 0 I< 057 @M9 M
7I<@ 7JJ W <2+5#4/D <2+5#75//+< 0ZQ7R[+#//D <2+5#>5//+< 0ZQCR[+#//D 9I< 0ZQ7R[55#4 0 /J W <2+5#> 5//+< 0ZQC R[+#//D X <2+5#34/D
La segunda acción 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 actualización. 9I<455#>/J W <> 5I I
El último paso del PHP es generar una cabecera XML y el objeto XML creado para el navegador, donde Flash, la cargará. I# 44$722/JD 4<2D
356
Aquí está el archivo PHP concluido que se utilizará en la aplicación de encuesta: ;
@ Q844+ RD <45I I
7I<@ 7JJ W <2+5#4/D <2+5#75//+< 0ZQ7R[+#//D <2+5#>5//+< 0ZQCR[+#//D 9I< 0ZQ7R[55#4 0 /J W <2+5#> 5//+< 0ZQC R[+#//D X <2+5#34/D X <2+5#3/D I# 44$722/JD 4<2D X 9I<455#>/J W <> 5I I
Ñ El código ActionScript para la aplicación de encuesta está dividida en dos partes. La primera pieza es una clase de documentos que controla la mayoría de la solicitud de votación. 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: 3 475/@ 4/>5/% 7 9> ;/ 3 475/4 0 />5/ ?/> 5/,/3 475/4 0 />5/ /> 5/,/3 475/4 0 />5/ 4/> 5/,/3 475/4 0 />5/1/> 5/,/3 3
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 lógico. Aquí está el esqueleto de clase para el PollItem: ? W 8 "24 )> W 8944 "IJWX 8944IJ8VWX 8944 I4B- 4B>4J>WX X X
La primera parte de la clase son las variables, que en esta clase son el id, la respuesta, y el valor de la votación para cada elemento de encuesta ejemplo. >> "4D >> 4 0 - 4D >> > 4D
Esta clase en realidad sólo había dos métodos. El primer método es un captador que devuelve un objeto lleno con el tema de datos. 8944IJ8V W
4W"B4 0 //B> > XD X
El segundo método 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 aplicación. 8944 I4B- 4B>4J> W "5D 4 0 5D > 5>D X
358
Eso es todo lo que hay a la clase PollItem, que se muestra aquí completa: ? W 9 + 7+)> D 9 +2+2D 8 "24 )> W >> "4D >> 4 0 - 4D >> > 4D 8944 "IJWX 8944IJ8V W
4W"B4 0 //B> > XD X 8944 I4B- 4B>4J> W "5D 4 0 5D > 5>D X X X
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: ? W 8 24 )> W 8944 IJWX 8944 IJ>WX 8944!I>4J>WX X X
El primer método se llama desde el constructor y es responsable de cargar los datos de la encuesta en formato XML basado en la encuesta de identificación que se pasa en una petición GET. 8944 IJ> W > C 8 1!C 8 5401!C 8 D 2 % #" $ 2 % (4rr) > 1@ 1!1@ 5401!1@ I JD 1@ +5 C 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B!JD ! +I 1@ JD X
359
Después de cargar los datos, una llamada al método dataLoaded() se hace, que se encarga de mostrar los datos de encuesta con las instancias PollItem. La respuesta del servidor se envía en formato XML, que se analiza y se utiliza para construir la encuesta de gráficos. Cada elemento de los datos de la encuesta se almacena como un atributo en lugar de un nodo en un intento de mantener el código de peso ligero. > 7- 45++ 8IQ7RJD > >- 45++ 8IQ>RJD > 454I2++ 8IQRJJD
La variable de type (tipo) se utiliza para determinar si un elemento es una pregunta o una respuesta. 9I755#@ 4/J W ZQ@ 42R[+25>D 44D X 9I755#4 0 /J W > > 454I++ 8IQ> RJJD X
Las tiendas pollItem variable de la instancia de la clase PollItem, que contiene los gráficos para cada elemento de la encuesta. El porcentaje se determinará con un poco de matemáticas muy básicas, que se divide el recuento de votos por el total y que se multiplica por 100 para generar un porcentaje. > " "540 "IJD "ZQ 42R[+25) + 4I> \*,,JE #T/D "ZQ8 ) R[+0 5I> \*,,J\HD
El último paso en el método es para la alineación de cada pollItem, adjuntando el pollItem a la lista de visualización, y, finalmente, añadiendo a la matriz pollItems. "+75I" +4 \I"+ E,JJD 44 + I"JD " + I"JD
En este punto, la clase de documento está construido, y se muestra en su totalidad aquí: ? W 9 + 7+)> D 9 +>4 +\D 9 +4+1!C 8 D 9 +4+1!1@ D 9 +4+1!! D 9 +2+2D 8 24 )> W 8> !!M"45*D 8> - 45
360
# * + /D 8> 44 )> D 8> "
7D 8944 IJ W " 540
7IJD 44 540)> IJD 44 +25*GD 44 +75*,,D I44 JD IJD X 8944 IJ> W > C 8 1!C 8 5401!C 8 D C 8 +5#/D C 8 +5 !!M"D > 1@ 1!1@ 5401!1@ I JD 1@ +5 C 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B !JD ! +I 1@ JD X 8944!I>4J> W > ! 1!! 51!! I+ JD > 2')!540')!I ! +JD 9 I> 42++4J W > 7- 45++ 8IQ7RJD > >- 45++ 8IQ>RJD > 45 4I2++ 8IQRJJD 9I755#@ 4/J W ZQ@ 42R[+25>D 44D X 9I755#4 0 /J W > > 45 4I++ 8IQ> RJJD X > " "540 "IJD "ZQ 42R[+25 ) + 4I> \*,,JE#T/D
361
"ZQ8 ) R[+0 5 I> \*,,J\HD "+75 I" +4 \ I"+ E,JJD 44 + I"JD " + I"JD X X X X
En este punto usted ha visto una amplia selección de aplicaciones del mundo real, pero todavía hay uno que no se ha hablado. Eso, por supuesto, sería un sistema de gestión de contenidos. Un sistema completo de gestión de contenido sería un proyecto masivo, pero esta sección se centra en un aspecto de la aplicación. El editor de archivo, que se utiliza para añadir y editar los archivos, es una pieza fundamental para cualquier sistema de gestión de contenido. Es probable que en algún momento el administrador va a necesitar actualizaciones realizadas. En lugar de descargar el material de origen, es mucho más eficiente de utilizar un editor de archivos dinámico. La aplicación de esta sección es sólo eso: un editor de archivos dinámico 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 raíz Web. Esta es una buena idea para los archivos de plantilla, porque no tienen que acceder directamente por un huésped. El diseño del editor de archivos es un área de texto básicos, el botón Enviar, TextField y ComboBox. Nada de emocionante para diseñar el editor de archivos, en cambio, la verdadera sustancia de la solicitud se encuentra dentro del código ActionScript y PHP. Comenzando con el código 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 válido, porque si usted va guardar o cargar, se necesita un archivo válido. 9I7I
Después de determinar que es un archivo válido, el siguiente paso es comprobar si la acción está en blanco. Si la acción está en blanco, el código cargará automáticamente la acción, si la acción contiene un valor que se compara mediante una declaración if comunicado interno. 9I
36
+++ X
Este ejemplo sólo permite cargar y guardar los archivos. En una aplicación más robusta que lo más probable es que desee tener una acción de eliminar o moverla. La acción de guardar es responsable de cargar el archivo solicitado, reemplazando el texto actual, y, finalmente, volver a guardar el archivo. Es importante señalar que el ejemplo es con vistas a una pieza fundamental para cualquier aplicación en el mundo real, que es escapar de los datos que se envían desde Flash. Usted también puede agregar una clave de acceso de código de forma arbitraria no puede ejecutarse en el navegador a través de una petición GET. La variable $fileContents recupera desde el principio los datos enviados por Flash. <9 44 5
El archivo se carga mediante la función fopen con acceso de escritura a sobrescribir. Esto significa que el contenido original se elimina y sólo la nueva versión se guarda. < 4594I<9BQ0ERJD
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 acción de guadar es cerrar el archivo de recursos y liberar la memoria. 90 I< 4B<9 44 JD 9 I< 4JD
La carga de un archivo es mucho más fácil. Básicamente, 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. <59MM44 I<9JD 4#9 44 5/+<D
Aquí está el archivo PHP completo, que debe ser guardado con el nombre fileManager.php: ;
M 4I,JD 9I7I
363
4#9 44 5/+<D X X ;3
El siguiente paso es desarrollar el código ActionScript. La parte de diseño ha sido creado previamente para poder mover directo al código. El primer paso es definir las variables utilizadas para este ejemplo. > - 45/ * 9 + /D > 9
75ZQ +2RBQ4 9+2RB Q +2R[D > - 4D
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 función es responsable de llenar la lista de archivos cuadro combinado. 364
944! IJ> W +++ X
El método AddItem del cuadro combinado (comb box) acepta un objeto como argumento, que define los datos de la etiqueta y los datos. Para esta aplicación, el fichero se utiliza tanto para la etiqueta y el valor de los datos. 9 I> 45,D9 +4 DEEJ W r ë% )ë % = @6 X
= @
El método 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. 944I) >4J> W > > 8 1!C 8 5401!C 8 IJD % r ë% )ë > 1@ 1!1@ 5401!1@ I JD 1@ +5> 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B9!JD ! +I 1@ JD X
Después de que el archivo solicitado se carga y se devuelve el contenido de PHP, es enviado en el área de texto bodyTxt y también a la variable storedFileData. Esta variable se utiliza para almacenar en caché los resultados sin modificar. Puede volver a estos resultados más adelante haciendo clic en el botón Restablecer. 9449!I>4J> W > ! 1!! 51!! I+ JD > > 8 1!C 8 5401!C 8 I ! +JD % % / % X
El método de restablecimiento simplemente reemplaza el contenido del cuerpo con los datos modificados que se almacena en el archivo original se carga. 944 (4 I) >4J> W % / X
El último método necesario en esta aplicación 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. 944 >(4 I) >4J> W % "%
365
/ +++ X
%
Las variables pasadas al PHP definir la acción, 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. > > 8 1!C 8 5401!C 8 IJD % r ë% )ë % #$ % %
À
. En una aplicación remota es una buena idea para notificar al usuario del proceso de ahorro, ya que un archivo grande puede tomar tiempo para salvar. > 1@ 1!1@ 5401!1@ I JD 1@ +5> 8 D > ! 1!! 5401!! IJD ! +I 1@ JD
La última tarea del ActionScript es el registro de los eventos de los botones y hacer una llamada a la función populateFileList() para el archivo de perfil ComboBox. 1 >4 4+>4! 4 I) >4+ !" OBJD > 4+>4! 4 I) >4+ !" OB >(4 JD
4+>4! 4 I) >4+ !" OB (4 JD ! IJD
366
FIGURA 13.8 El editor de archivos completada con una muestra de archivo cargado
La aplicación, como se muestra en la figura 13.8, se ha efectuado. El siguiente es el código fuente de ActionScript completo: C - 45/ * 9 + /D > 9
75ZQ +2RBQ4 9+2RB Q +2R[D > - 4D 944! IJ> W 9 I> 45,D9 +4 DEEJ W 9! 8+"IW89 Z[B9 Z[XJD X X 944I) >4J> W > > 8 1!C 8 5401!C 8 IJD
367
> 8 +959! 8+ "+D > 1@ 1!1@ 5401!1@ I JD 1@ +5> 8 D > ! 1!! 5401!! IJD ! +>4! 4 I>4+ ) !B9!JD ! +I 1@ JD X 9449!I>4J> W > ! 1!! 51!! I+ JD > > 8 1!C 8 5401!C 8 I ! +JD 872+254 I> 8 +9 44 JD 5872+2D X 944 (4 I) >4J> W 872+25 D X 944 >(4 I) >4J> W > 87- 45872+2D 587D > > 8 1!C 8 5401!C 8 IJD > 8 +959! 8+ "+D > 8 +45# >/D > 8 +9 44 587D > 1@ 1!1@ 5401!1@ I JD 1@ +5> 8 D > ! 1!! 5401!! IJD ! +I 1@ JD X 1 >4 4+>4! 4 I) >4+ !" OBJD > 4+>4! 4 I) >4+ !" OB >(4 JD
4+>4! 4 I) >4+ !" OB (4 JD ! IJD
368
En este capítulo usted aprendió cómo desarrollar avanzadas aplicaciones del mundo real, tales como la utilización de Flash y PHP para construir un editor de archivos, reproductor de vídeo y monitor de sitio. Si bien el desarrollo del sitio monitor que aprendieron los nuevos eventos que hacen que sea más fácil trabajar con datos incorrectos, así como la vinculación de PHP, MySQL y Flash juntos. La aplicación se ha mejorado mediante la adición de acciones personalizadas, tales como el proceso de e-mail al administrador cuando un sitio no responde. En la aplicación de votación aprendió a desarrollar una aplicación completa usando Flash como medio de visualización. 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 fáciles de actualizar y mantener. De hecho, la mayoría de este capítulo pueden sumarse para crear un sistema de gestión o basadas en otro módulo de aplicaciones.
369
"
%/ Cuando se construye una aplicación, es casi seguro que algún 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 aplicación con la depuración en la mente. La adición de comentarios en realidad puede acelerar la depuración de la línea. Por supuesto, añadiendo a medida que avanza la depuración 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 capítulo se centra en la mejor forma de depurar aplicaciones. Se empieza por las herramientas integradas y luego progresar y algunas aplicaciones externas y prácticas que hacen que sea menos dolorosa.
~~ Empecemos con mirar a la depuración de una aplicación PHP. De forma predeterminada, la depuración 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 instalación por defecto es que los errores se imprimen en la pantalla y cada usuario puede ver. La alternativa y la opción más segura es permitir el registro de errores en un registro de error de archivo similar a cómo 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 sólo accesible por el administrador del servidor. El archivo php.ini se almacena en varios lugares dependiendo de la configuración del servidor. Sin embargo, lo bueno es que PHP puede indicar dónde está almacenado. Basta con crear un nuevo archivo, el nombre de info.php, y agregar el siguiente código: ; 49IJD ;3
Al ejecutar este archivo en un explorador que se presentan con una gran cantidad de información específica de su versión actual de PHP. Uno de los primeros bloques de información es el camino ini, que se ve algo como esto:
49 4I +4J G8 +4
E Modificación incorrecta del archivo php.ini puede resultar en su servidor no funciona. Tenga cuidado al editar este archivo. 370
Después de éxito encontrar el archivo php.ini, y abrirlo en el editor de texto favorito o usar vi si está utilizando la línea de comandos. Usando vi, un comando para abrir un archivo, se ve así: > G8 +4
Con el archivo abierto, desplazarse a través hasta llegar a una sección que se parece a este: D!
99+ D
M594
Las líneas 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 método para activar esta opción es quitar el punto y coma (;) y reemplazar el nombre de archivo con una ruta y el nombre real del archivo, tales como
M5 %"
Después 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 sólo lee el archivo ini(s) en el inicio para maximizar el rendimiento. 62 ! ! ! " " - . Z*K$^$,,P,G**P[ (
9+ 44&, Z,6$$,,P*&&P[ (
9+ 44*& Z,&$.>$,,P&*,*[ (
9+ 44G= +++
Un servidor de producción sólo debería registrar los errores, lo que significa que los errores también 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. 7M
54
¬ 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 depuración, el informe de errores en PHP es muy robusto. Ahí están los errores estándar, tales como errores fatales, los archivos que faltan, advertencias, etc. Aún más 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: M
I# 4444$2 4 /B M-1M%1.".JD
371
)%!!0! El código de depuración no es siempre acerca de los errores de sintaxis, de hecho, la mayoría 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 métodos que se adapten a la depuración. Posiblemente se haya impreso o echo antes, pero créanlo o no las funciones son realmente muy útil para depurar una aplicación. Básicamente, usted puede rastrear las variables y tener una mejor idea de cómo está funcionando un programa.
)%!!!! Trabajar con una matriz es un poco diferente porque una impresión simple mostrará Array. Sin embargo, puede utilizar la función print_r() para ver una matriz. Incluso se mostrará una matriz dentro de una matriz y así sucesivamente, también conocida como una matriz multidimensional. Aquí es el resultado del ejemplo muestra de la llamada print_r:
7 I Z,[53
7 I Z4[53* J Z*[53
7 I Z0[53 J J
Si bien usando trigger_error puede observar que el segundo parámetro 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 código avanza. Aquí es cómo el cambio de manera pragmática el nivel de error, en este caso, haciendo que incluso se informó sobre esto AVISOS:
M 4IM!!JD
Tabla 14.1 muestra los niveles de error y una descripción del nivel de lo que el error se refiere. TABLE 14.1
0!!! ! ) !!!! ) 2* E_ERROR E_WARNING E_PARSE E_NOTICE
Errores fatales en tiempo de ejecución. Estos indican errores que no pueden recuperarse, tales como un problema de asignación de memoria. La ejecución del script se detiene. Advertencias Tiempo de ejecución (errores no fatales). La ejecución del script no se detiene. Errores de compilación analizar el tiempo. Errores de análisis sólo debe ser generada por el analizador. Anuncios de Tiempo de ejecución. Indica que el guión ha topado con algo que podría indicar un
37
error, pero también podría ocurrir en el curso normal de ejecución 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 núcleo 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 núcleo de PHP. E_COMPILE_ERROR Fatal errores de compilación. Esto es como un E_ERROR, excepto que es generado por el Motor de Scripting de Zend. E_COMPILE_WARNING Advertencias en tiempo de compilación 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 código PHP usando la función trigger_error(). E_USER_WARNING Generado por el usuario mensaje de advertencia. Esto es como un E_WARNING, excepto que es generado desde código PHP usando la función trigger_error(). E_USER_NOTICE Generada por el usuario previo aviso. Esto es como un E_NOTICE, excepto que es generado desde código PHP usando la función trigger_error(). E_STRICT Anuncios de Tiempo de ejecución. Habilitar para que PHP sugiera cambios en su código que velarán por la mejor interoperabilidad y por mantener la compatibilidad de su código. 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 montón de opciones de depuración dar salida más allá de la básica y la explotación forestal. De hecho, usted puede personalizar un montón de errores que se encuentran en el archivo php.ini para depurar las aplicaciones más diversas. Si usted desea conseguir un nivel grave de depuración de código y herramientas de observación, entonces puede que desee echar un vistazo a Zend Studio IDE (ver figura 14.1), construido en la cima de la infraestructura Eclipse. Esta aplicación no es gratuito, sin embargo, es el editor de PHP más robusto y un depurador de perfil en el mercado en el momento de escribir este artículo. Una licencia de Zend Studio para rangos de $150 a $300 dependiendo de la versión que usted compra. Zend Studio no es el único editor de PHP, sin embargo tiene el depurador más robusto. Además puede utilizar PHPEclipse que tiene características similares a Zend. Sin embargo, el proceso de instalación es un poco más complicado.
373
FIGURA 14.1 El IDE de Zend Studio con los paneles de depuración visible
374
" Similar a PHP, Flash ofrece una serie de herramientas muy útiles para la depuración. De hecho, el IDE de Flash tiene un sistema de depuración completo construido en el derecho en el que puede inspeccionar su código (véase la figura 14.), se aplican puntos de interrupción, y la actividad en torno a un bloque de código para ver los detalles y encontrar un error.
FIGURA 14. Aquí está el panel que se utiliza para inspeccionar una aplicación.
Flash también tiene un panel de salida (ver figura 14.3) que se utiliza para ver declaraciones trace() los estados llamados desde el código. La sentencia trace es una función básica que acepta una cadena como un argumento. Esto se envía al panel de la producción y ofrece la posibilidad de mostrar los elementos de una aplicación, que se está ejecutando. I#( > 78 8 /JD
Una pregunta común con el uso de las instrucciones de seguimiento es la voluntad que siguen a la producción de una película compilado? Lo harán, pero usted puede seleccionar la opción "Omitir acciones de seguimiento" en el cuadro de diálogo Configuración de publicación para deshabilitarlo.
375
El simple método trace (seguimiento) puede ser útil cuando se depuren los ejemplos de código de base. Sin embargo, para las aplicaciones más completa, lo más probable es que quiera construir su propio gestor de depuración. 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 función de seguimiento que llenarán de que TextArea. Utilizando el método appendText agregará en el texto existente, en lugar de eliminarlo. 944 I8- 4J> W %" %" X
También podría crear una clase personalizada que cualquier porción de su código es capaz de llamar. Sin embargo, encontrará rápidamente que el nivel de seguimiento no es perfecto. Por ejemplo, no de manera pragmática puede borrar la pantalla o de la prioridad lugar en ciertos eventos. De hecho, la depuración en Flash no es tan avanzada como las posibilidades en PHP, pero todavía hace el trabajo. 376
En este punto, usted ha visto cómo Flash se puede utilizar para depurar una aplicación y cómo PHP puede ser usado para la misma tarea. Ahora mira algunas opciones de terceros y las bibliotecas para que este proceso sea aún más fácil. La mayoría de los datos que se pasa de ida y vuelta en Flash es hecho utilizando las llamadas remotas, también conocido como Remoting o Flash Remoting. Este método 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 autónomo y también el modo Flash interactúa con un origen remoto. Utilizando una herramienta de terceros llamado Charles o Charles Web Debugging Proxy, que se puede descargar desde http://xk7.com/charles/, hace que sea muy fácil de ver estos datos a medida que pasa alrededor. Carlos no es freeware, pero ofrece una demostración 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 cómo se ve a Carlos. FIGURA 14.4 Esta es la solicitud que se envía 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 tráfico de red. La desventaja parcial a esta aplicación es que sólo los relojes de tráfico del explorador. Si está probando o la depuración de la aplicación a nivel local no va a ver las llamadas. Más información acerca de LiveHTTPHeaders se puede encontrar en http://livehttpheaders.mozdev.org/.
El último tema en este capítulo será la construcción de una nueva traza que permite a los colores, así como otras características. 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 código de seguimiento de esta alternativa se basa en la clase LocalConnection, que es una clase de pre-compilados que permite a varias películas en las comunicaciones de compartir el tiempo que están en el mismo dominio. La primera parte del código es responsable de construir el objeto de conexión local y el registro de la función de devolución de llamada. > >4! ! 444540! 444IJD
>4! +45 D
378
9448I - 4B>- 4J> W > 8!>- 45 II79I>J55Q494RJ;Q.1)!R>JD > - 454D 0 I8!>J W Q.1)!R 5QA,,,,,,RD 8 ?D Q111R 5QA=,,,,RD 8 ?D Q.R 5QAPP ,RD 8 ?D Q%1.".R 5QA H,,RD 8 ?D Q1- .-R 5QAP ,*RD 8 ?D Q1"-1R 5QA KRD 8 ?D Q !--R 5QAPP6RD 8 ?D Q.".R 5QA==,,RD 8 ?D Q1.R 5QA,,,,RD 8 ?D Q--R 5QA
,,RD 8 ?D X 9I 554J W 5QA,,,,,,RD X 82+ 2E5I#94 5//E E#/3/E E #943/E#4/JD > 4582+> - 4 > 2- 4582+2C - 4D 9I EG32- J W 82+> - 452- D 82+ 52M D X XD
379
Después de la devolución de llamada y el objeto de conexión local están construidas, es el momento para iniciar la conexión. Esto se hace mediante una llamada al método connect() de la instancia local objeto de conexión.
>4! +44I# 8/JD
El resto del código es exclusivamente para la visualización de la ventana de depuración y no es necesario para los propósitos de la funcionalidad. 944 (4 I) >4J> W 82+ 25#/D X 4+>4! 4 I) >4+ !" OB (4 JD 1 : + )5--)+.M- !D +45-4+ M!D +>4! 4 I>4+1-"aB944IJ> W 82+0 5 + % $GD 82+ 5 + ( $PGD 4+25I + % $*J$ 4+0 D 4+75I + ( $*J$ 4+ D XJD
Eso es todo el código necesario para crear una traza alternativa, y usarlo requiere muy poco código. La llamada al seguimiento personalizado parece un poco a esto. El método send() requiere cuatro argumentos, que son los siguientes. El primero es el objeto de conexión local, el segundo es el método al que llamar, la tercera es la cadena de rastrear, y el cuarto es el nivel de error. > 44! ! 444540! 444IJD 44! + 4I# 8/B#8/B#8V.4/B #111/JD
Ahora debe tener un conocimiento bastante sólido de las herramientas y prácticas disponibles para depurar correctamente sus aplicaciones en Flash y PHP. Estas no son las únicas herramientas y prácticas disponibles para depurar una aplicación. Los desarrolladores están subiendo con mejores maneras todo el tiempo, en parte porque es una tarea importante y también porque es el más temido en el ciclo de desarrollo. En este capítulo usted aprendió a crear sus propios errores personalizados y cómo trabajar con los tipos de error estándar que se encuentran en PHP. También ha aprendido a depurar el código dentro de Flash utilizando el panel de salida y las instrucciones de seguimiento. La última sección del capítulo se centró en el desarrollo de un controlador personalizado de depuración en ActionScript, que muestra los mensajes en un código de color scrollbox para identificar mejor sus mensajes de depuración.
380
4 ¬ ,* 5/ 5
381
¬
&
El proceso de mantenimiento de una aplicación se logra simplemente siguiendo algunas reglas. Estas normas se han establecido a través del tiempo como las aplicaciones siguen desarrollándose a diario. Este capítulo se centra en estas reglas individuales. Al final del capítulo, usted comprenderá no sólo la manera de seguir, pero también cómo pueden hacer su trabajo más fácil. La última sección se centra en trabajar en un entorno de equipo, utilizando la nota común que, comentando, y control de versiones desde la perspectiva de un único promotor. Incluso después de que se escribe una aplicación, 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 más fácil 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 planificación en el inicio y los resultados en el tiempo de desarrollo adicional que no siempre pueden explicarse.
Código de comentar que es más importante como un proyecto sigue creciendo, o como los desarrolladores adicionales se introducen en el proyecto. El proceso de comentar el código no es una parte necesaria de una aplicación por escrito, pero es útil cuando se busca en un proyecto que ha estado en desarrollo durante algún tiempo. A menudo el estilo de los comentarios es bien definido en un perfil del proyecto o establecidos por el líder del proyecto. Comentando incluso puede ser beneficioso al escribir el código que usted posee, ya que pueden dejar notas a volver a un pedazo de código en una fecha posterior. Esto es especialmente importante si alguna vez la intención de distribuir el código como un proyecto de código abierto o vender la aplicación. Comentando el código también hace que sea más fácil escribir o generar la documentación con la modificación adicional escaso o nulo que necesita el desarrollador.
Cada lenguaje tiene su propio estilo de comentar código. Por ejemplo, una forma muy común de los comentarios es visto en los documentos HTML, que se parece a este: $$ 4()!4$$3
38
HTML sólo 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 más comunes que se encuentran en Flash, PHP y MySQL.
S+%#! PHP, ActionScript (Flash), y MySQL permite comentarios en bloque. \ \ \ 8? 74B \0 4 >4748 94 + \ \
#! ? 1 MySQL permite comentarios en línea usando un -- al comienzo de una línea. $$ )7-F!4D 8 04 +
#!
También puede usar un comentario en línea para extraer una determinada sección de código. Esto le permite probar rápidamente una sección de código y localizar errores más rápidamente. Aquí hay un comentario en línea que elimina la cláusula de la sección WHERE de una consulta SQL. -! 4B 1) \%(15*,,H. 5R>R\D
Los resultados de un comentario anterior en la consulta se mostrarán todos los usuarios en la base de datos porque la parte condicional se ha comentado. Línea con formato incorrecto y comentarios en línea puede crear en ocasiones difíciles de rastrear los errores a menos que su editor de código se utiliza color resaltado de sintaxis.
#! #) ! Algunos lenguajes de desarrollo y aplicaciones use los comentarios del compilador. Estos comentarios especializados de decirle a un compilador de aplicaciones de cómo manejar ciertos tipos de datos. Estos comentarios no deben ser removidos manualmente a menos que la intención de eliminar esa funcionalidad.
#! C Algunas de las diversas aplicaciones que se han desarrollado en anteriores capítulos de acuerdo con XML. Es importante darse cuenta de que XML puede actuar de una forma desconocida cuando los comentarios son utilizados indebidamente. Esto sólo se convierte en un problema cuando un -- se utiliza dentro de un comentario como el siguiente: $$ 4B44 49$$87 $$3 43
383
43243 3P3 4 3)4 3 43
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á.
#! ) El uso de comentarios en el Apache se limita generalmente a los archivos .htaccess para determinar la configuración del sitio. Es importante tener en cuenta que los comentarios en los archivos de Apache puede causar problemas de renderizado. Si por alguna razón una directiva no está funcionando correctamente, vea los comentarios como el primer culpable de la cuestión. Aquí hay un ejemplo de un comentario en un archivo .htaccess de. A ( 4 + 9 742$ $ + +
8#! Se pueden mezclar varios estilos de comentarios cuando sea necesario. Esto es común a la hora de explicar una sección de código, como una función o definición del método. Como se puede ver, un comentario de bloque se utiliza para describir la función y un comentario de línea explica el código de la función. \ S4*9 48 S4 448 S 4 90 4 S > R 4 S 4 944 048 \ 9447 7I4*.8 B4.8 J.8 W 4 94*N4
4I4*\4JD X
Comentar correctamente el código puede tener ventajas evidentes. Más editores de código populares ofrecen características que se pueden ocultar o colapso comentarios por lo que sólo están 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 información para crear archivos de ayuda en línea llamado sugerencias de código (ver figura 15.1). Estas sugerencias son las cajas en línea de código que aparecen a medida que comienza a escribir. Ellos proporcionan los elementos disponibles posibles basadas en el código introducido hasta el momento. 384
Un editor de ActionScript más avanzado, como FDT por Powerflasher, tiene la capacidad de aprender el código y muestra sus comentarios personalizados en su versión de sugerencias para el código. FIGURA 15.1 Ejemplo de una pista de código muestra en Flash CS3 para las propiedades de MovieClip
Los comentarios se quitan a menudo debido al tamaño del archivo, que puede ser una preocupación válida en un programa de gran tamaño. Sin embargo, la mayoría de las veces, los comentarios se eliminan automáticamente cuando una aplicación se compila o construiye. Dependiendo de la aplicación que utilice, instrucciones de depuración también debe ser eliminado. Por ejemplo, el IDE nativo de Flash que se envía con CS3 tiene una opción de configuración en el cuadro de diálogo Configuración de publicación. Si selecciona Omitir acciones de seguimiento, que se encuentra en la ficha Flash de la Configuración de publicación, seguimiento de las llamadas se quitan de la aplicación. Si las acciones Omitir Trace está habilitado durante la depuración no podrá ver ningún seguimiento de las llamadas que aparece en la ventana de salida. 385
Si decide utilizar una clase personalizada o depuración de un paquete, entonces puede utilizar Find (Buscar) y Replace (reemplazar) para eliminar esas instancias. Sin embargo, tenga cuidado de no borrar accidentalmente la aplicación de código específico. Como puede ver, los comentarios pueden ser beneficiosa desde el punto de vista de la legibilidad del código. También sabemos ahora que comentar correctamente el código tiene ventajas adicionales para utilizar algunos de los editores de código disponibles hoy en día más sólida.
Ñ 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 sección se utiliza para tomar notas sobre las características de una aplicación 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 automáticamente, como se muestra en la Figura 15.. Esto, por supuesto, depende de la aplicación que esté utilizando, pero puede ser muy beneficioso como una aplicación empieza a crecer.
Hay muchos desarrolladores que utilizan este formato para realizar un seguimiento de cambios dinámicos errores. Este es un proceso que muchas aplicaciones comerciales y gratuitos, tales como Jira y Bugzilla, se utiliza para crear una alternativa más gráfica para el texto básico de archivo.
% # !!!+% )K#N El seguimiento de errores es especialmente importante cuando se trata de equipos. Por ejemplo, muchas de las tecnologías de código abierto compuesto por desarrolladores de todo el mundo. Imagínese cómo sería tedioso para rastrear errores en e-mails o llamadas telefónicas a través 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. Aquí hay una página web que muestra un ChangeLog que se generan de forma dinámica.
Un ChangeLog no se limita a unas pocas líneas de texto. Siendo realistas, como se puede ver, puede contener las correcciones de errores, las notas a otros desarrolladores, y la información sobre un elemento específico. Por ejemplo, si usted decide usar un error de seguimiento de la aplicación, es una buena idea incluir el ID del error en la entrada de cambios o dejar que la aplicación para el seguimiento de manejar este. Correctamente la documentación de los identificadores siguientes hace más fácil el seguimiento de un error más tarde, durante el desarrollo de aplicaciones, o si regresa a un proyecto una vez se haya completado.
Aplicaciones de control de versión, que se discuten en la sección siguiente, incluso tienen la capacidad de generar automáticamente una lista de cambios. La ventaja de este enfoque es que el desarrollador no tiene que gastar el tiempo de edición del proyecto o la actualización del registro. Sin embargo, una desventaja de esto es el archivo se vuelve menos personalizado y, a veces hace más difícil de comprender plenamente.
387
Ñ ) El control de versiones es la gestión de múltiples versiones de código o archivos de una aplicación. Estas aplicaciones son utilizados en los equipos de desarrollo, pero puede ser fácilmente utilizado por un único promotor. La ventaja de utilizar el control de versiones es el seguimiento y el código de seguridad que se almacena como a desarrollar o mantener una aplicación. Este nivel adicional de seguridad en un proyecto puede permitir que el desarrollador de experimentar con una idea y todavía tienen la capacidad de volver a una versión estable. También permite a los desarrolladores mantener el código consistente a través de plataformas de desarrollo. Esta característica es un uso muy común para los desarrolladores que viajan solas y el código en un sistema móvil. Simplemente conecte al servidor de desarrollo, descargar la última versión, y están dispuestos a ir. Cuando regresan, una simple actualización que se haga en el mismo servidor y la aplicación está de vuelta en sincronía.
Ñ Existen varias aplicaciones de control de versión disponible para sus entornos de desarrollo de hoy en día. Seleccionar las aplicaciones de control de versiones a utilizar es determinado por mirar a las características y requisitos de su proceso de desarrollo. El más común es la aplicación de control de versiones SVN (Subversion). Otra aplicación muy popular es CVS (Concurrent Versions System). Soporte para el control de versiones es a menudo construidos directamente en un editor de código, como el editor de código abierto Eclipse.
Ñ ( Nuevo para Adobe Flash CS3 es la posibilidad de utilizar Version Cue directamente en Flash. Version Cue (véase la figura 15.3) es el control de Adobe versión de la aplicación que se encuentran dentro de sus otras aplicaciones.
.! %5 Va a encontrar un elemento de menú " Check In..." en el menú Archivo. Este elemento se utiliza para abrir el cuadro de diálogo de gestión de Version Cue y es donde usted puede guardar versiones de su aplicación. 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 aplicación, el código en otro, y la gestión del sitio en un tercero. Usted puede incluso permitir a su equipo para iniciar sesión en el servidor de Version Cue de forma remota y hacer cambios. Esto significa, por ejemplo, el desarrollador puede ser prácticamente 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
El proceso de creación de control de versiones depende del sistema de su entorno de desarrollo de carreras. Una guía de instalación más completo se incluye, con la aplicación que usted decide utilizar. La instalación básica que incluiría descomprimir el contenido de la solicitud de control de versiones, modificando el archivo de configuración de Apache y alerta a la existencia de la aplicación.
!0! ! Normalmente, el proceso de utilización de control de versiones es integrado en su editor de código. 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 o ¬
#! TortoiseSVN http://tortoisesvn.tigris.org/ Windows SCPlugin http://scplugin.tigris.org/ Mac OS X 389
Para una configuración de desarrollo más seguro y final, lo mejor es instalar la aplicación de control de versiones en un equipo diferente.
) %! !0! Los sistemas de control más popular versión de oferta integrada de soluciones de copia de seguridad, pero muchas veces usted encontrará que la copia de seguridad de la aplicación que está escribiendo se incluyen los datos de control de versiones. Normalmente, estos archivos se definen como ocultos y nunca se debería modificar manualmente si por alguna razón no se permite el acceso. E Edición de un control de versión de archivo de forma manual puede resultar en copias de seguridad de corrupción e incluso dañar la integridad del código de su aplicación.
!0! 2 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 compañías 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 código fuente de la aplicación y permite a otros para mantener actualizado el código con sólo conectarlos a su sistema de control de versiones de forma remota.
Colecciones personalizadas pueden hacer que el código de fácil mantenimiento. En antiguas versiones de ActionScript (antes de AS3), los paquetes en realidad no existía, así que era difícil de mantener adecuadamente y compartir la fuente de una aplicación de código. ActionScript 3 introdujo una práctica de codificación más común 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. FF Una mirada más a fondo de bibliotecas personalizadas se pueden encontrar en el capítulo 9.
Si se crea una instalación independiente para su sistema de control de versiones puede usar la misma máquina 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 actualización, así. 390
~ Usted puede crear un SWC en Flash, que le permite distribuir los componentes y las clases de ActionScript. Para publicar un SWC, seleccione la opción de exportación de SWC en el cuadro de diálogo Configuración de publicación. El archivo contiene un clip de SWC compilado y los archivos de clases de ActionScript que lo apoyan. 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 cuánto se ahorra tiempo al no tener que reescribir el código.
En este capítulo usted aprendió a comentar el código y por qué se hace para una mejor aplicación en general. También ha aprendido este aspecto es especialmente importante al desarrollar una aplicación con los demás. Tienes una introducción sobre cómo incorporar un Registro de cambios en su desarrollo y cómo algunas aplicaciones de terceros pueden utilizar esta información para mostrar de seguimiento de fallos más detallado. En la última sección aprendió a utilizar el control de versiones y se introdujeron a Version Cue, que es una nueva adición a Flash CS3.
391
( ¬ * Este capítulo se centra en las mejores prácticas para el mantenimiento de su servidor de tiempo que se introducen técnicas de mejora más avanzados de aplicaciones como el almacenamiento en caché, bases de datos eficiente, copias de seguridad, y código escalable. Después de aprender y aplicar esta información a sus aplicaciones, pronto se dará cuenta de que funcione más eficientemente. Si sigues estos pasos en mente al inicio del proceso de desarrollo de aplicaciones, usted no tendrá que volver a trabajar después de la aplicación.
Uno de los métodos más simples, pero ignorado por el mantenimiento de un servidor más eficaz es mantener las bibliotecas y el servidor central el código 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 más eficientes. Este proceso de actualización no se refiere a su código personal, pero las bibliotecas y los servicios depende de su código. La actualización de su servidor, no sólo ofrece mejoras de rendimiento, pero también puede asegurarse de que su servidor Web es más seguro. PHP, por ejemplo, se actualiza con frecuencia como las mejoras más y se introducen cambios de codificación. Esto es debido a nuevos problemas de seguridad descubiertos, lo que resulta en una mejor aplicación en general. Antes de actualizar su sistema, asegúrese de sus aplicaciones serán 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 versión específica. Un buen ejemplo de esto es que los clientes de correo, como una versión específica de la multitud (una popular aplicación de correo electrónico) requiere PHP 4 y no simplemente en una versión más reciente. Esto no significa que no pueda actualizar, sino todo lo contrario en realidad. Sólo hace falta un pequeño trabajo de investigación y antes de instalar las nuevas versiones.
Como ustedes saben, la instalación de nuevas versiones de las aplicaciones en su servidor no es siempre la mejor opción. Usted necesita ser más consciente de esto con los actualizadores automáticos. Por ejemplo, usted encontrará 39
las actualizaciones automáticas son más propensos a ofrecer marca una nueva funcionalidad, pero al mismo tiempo que también ofrecen el código que no se ha probado tan a fondo. Usted encontrará que no todas las aplicaciones de tu lado del servidor ofrecen actualizaciones automáticas, pero lo mejor es comprobar de antemano y asegurarse de que estas opciones están desactivadas. Algunos proveedores de hosting realizar actualizaciones periódicas de seguridad, a veces sin su permiso, o incluso que le informa de la actualización. 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 versión actualizaciones.
~* La excepción a no instalar las actualizaciones automáticas es cuando se utiliza la plataforma Zend. Este conjunto de herramientas asegura que su sistema esté correctamente al día con todas las últimas mejoras de seguridad, mientras que asegurarse de que su secuencia de comandos existentes seguirán funcionando correctamente. À U " : ! !" .
î Instalación de nuevas aplicaciones o bibliotecas no es una práctica bien cuando se trabaja con un servidor en vivo. Sin embargo, esto no significa que no puede experimentar con el nuevo código de la instalación de un sistema de desarrollo. Usted puede construir o adquirir su alojamiento en un nuevo servidor para obtener una configuración de sistema de desarrollo, pero esto no puede ser la solución más eficaz, especialmente si usted es un hombre de una tienda.
Ñ La alternativa es instalar una versión independiente de Apache en el servidor en vivo. Por defecto, Apache sólo puede tener una versión que se ejecuta porque cada versión que trata de compartir el mismo puerto del servidor. Sin embargo, puede modificar esta configuración modificando el archivo httpd.conf. Usted encontrará este archivo de configuración en el directorio conf/ de su nueva instalación de Apache. Abrir este archivo en su editor de texto favorito o vi, si está ejecutando un servidor remoto, y modificar las siguientes categorías: A 4 ! 44 9" 0480 A >4 9 4484" I,+,+,+,J A A! 4*+&H+G=+PKK,
393
! 4K,
La mayor parte de ese bloque de código es un comentario que explica lo que este parámetro es responsable. Usted puede modificar el puerto en el que su sistema de desarrollo se puede encontrar al cambiar este número a algo similar a lo siguiente: +++ A A! 4*+&H+G=+PKK, r D
Después de guardar y reiniciar Apache, puede acceder a esta nueva instalación, visite http://localhost:9004. Aplicaciones en su equipo utilizan diferentes puertos, así que es mejor para comprobar el puerto antes de elegir uno nuevo.
$ Cuando tenga el nuevo sistema instalado, puede empezar a experimentar con sangrado nueva tecnología de punta sin dañar la configuración de su vida. Sangrado software de borde como se muestra en la figura 16.1 es recién lanzado versiones que no se han probado tanto como versiones estables sería. Esto le permite trabajar con los más avanzados y nuevas características, pero también significa que podrían llegar a los errores y cuestiones de desarrollo utilizando estas versiones. A medida que continúe para probar esta nueva tecnología se puede determinar si se debe utilizar en un entorno viven y se mueven por encima de cuando esté listo.
Muchas bibliotecas y herramientas que utilizará en su servidor Web dependen de otras bibliotecas. Por ejemplo, la librería GD de PHP para la manipulación de imágenes requiere la biblioteca libjpeg con el fin de editar las imágenes correctamente. Al actualizar el servidor, usted necesita estar consciente de estas dependencias, porque la actualización de una parte puede dar lugar en las instalaciones rotas o incompletas. Frecuentemente usted encontrará información sobre el sitio del desarrollador de actualización en materia de información específica o se puede consultar php.net en la sección 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
Ñ Mantener el servidor hasta la fecha es sólo una manera de ejecutar un servidor eficiente. De hecho, las prácticas, hay mucho más importante para seguir en primer lugar. Una de estas prácticas más importante es la optimización de su código de servidor y el sistema que se ejecute. No sólo hay que seguir las mejores prácticas en el desarrollo de sus aplicaciones, también debe mantener su servidor que se optimiza en función de sus necesidades específicas.
~~ Tras los pasos para la optimización de su instalación de PHP que permite llevar a cabo una mejor general del servidor. Estas medidas de optimización es bastante fácil de seguir y fácilmente se puede repetir como usted trabaja en varios servidores.
395
!!0!% A diferencia de la mayoría de aplicaciones que requieren más memoria, PHP se basan más en el procesador en su servidor. Esto significa que un sistema de doble-procesador es más eficiente que un procesador con más memoria. Eso no significa que la memoria no es importante, porque algunas partes de PHP utilizan una cantidad considerable de la memoria. El búfer de salida y la base de datos de plug-ins requieren más memoria que se accede a ellos, ya que tienden a almacenar la mayoría de la información para un acceso más rápido la próxima vez. Esto significa que la primera solicitud es lento, pero las siguientes solicitudes que son más rápidas si tiene suficiente memoria para manejar adecuadamente las solicitudes para ser almacenados. Esto no significa que usted debe salir corriendo y de inmediato adquirir más memoria o más procesadores, porque hay maneras de optimizar su servidor sin gastar dinero en software o hardware adicional.
8,)!) # 8!2 La siguiente es una lista de diez consejos a seguir que producir un mejor rendimiento en su código, así como limitar la tensión en el servidor Web. Que aparecen aquí en orden de menor importancia a la más importante. 4* Limite la cantidad de control de errores de sus aplicaciones de manejar. Menos manipulación de error significa un mejor rendimiento general, a menos que están experimentando ya los cuellos de botella. Entonces, el manejo de errores puede ser importante. 6* Usar la funcion included; no crear uno propio. Siempre que sea posible, trate de usar las funciones previstas en PHP, ya que están precompilados y se han optimizado para funcionar más eficientemente. También han sido probados una y otra vez para asegurarse de que el trabaja. 5* Utilice una selecta declaración en lugar de múltiples if/else. No sólo se utiliza un código más limpio, seleccione producir, sino que también resultará en un mejor rendimiento cuando el PHP se ejecuta la parte de su código. :* Evitar mitos como el eco es más rápido que el de impresión. Como con la mayoría de lenguajes de programación, PHP tiene varios mitos, como todo el código debe estar en una línea. Uno de los mitos más comunes es que el eco es más rápido que el de impresión al enviar el código para el búfer de salida o de la pantalla. Esto simplemente no es cierto. Puede utilizar cualquiera de declaración. Yo personalmente prefiero de impresión, ya que se está imprimiendo a la pantalla o buffer. <* 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 conexión de bases de datos se mantiene activa (a menos que lo cierre) todo el tiempo que su guión está trabajando en el conjunto de resultados. 9* Utilice unset () para eliminar las variables cuando ya no se utiliza. Eliminación 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 estándar siempre que sea posible. Las expresiones regulares, mientras que más robusto, puede consumir una considerable cantidad de memoria. Frecuentemente usted encontrará una función de cadena sencilla (por ejemplo, strstr) produce el mismo resultado y con un aumento de rendimiento significativo en la mayoría de los casos. 396
;* Sea inteligente sobre el uso de la clase. Las tareas simples sufrirán de programación orientada a objetos innecesarios. Va a encontrar más simples tareas consumen más memoria que las prácticas desarrolladas con OOP. Es importante no sólo saber que existen técnicas, sino también cuando se debe utilizar. =*Controla tus aplicaciones para determinar los cuellos de botella. Ralentización en el rendimiento del código se remonta a un lugar específico, conocido como un cuello de botella. Piense en una botella real, donde el cuello se hace más lento el flujo del líquido a medida que los grupos que pasar por la parte superior estrecha de la botella. Lo mismo es cierto para el código como la mayoría de las bibliotecas y los guiones tienen un punto en el que todos deben cumplir. Un cuello de botella en su aplicación pueden existir en el código, pero también podría ser en una llamada de base de datos o un archivo de interacción del sistema. La supervisión de su aplicación se exponen los problemas y le permitirá solucionar el problema de rendimiento. 4>* Caché de su código PHP, siempre que sea posible. Después de optimizar el código, pero todavía necesitamos mejorar más, el caché puede ser una opción. Usted puede desarrollar una solución personalizada o utilizar un sistema existente, tales como memcached, que se examina en la sección siguiente. Usted también puede almacenar en caché el script PHP adquirido precompilar, lo que acelera las solicitudes posteriores. PHP por defecto compila las páginas de sus archivos .php cada vez que se solicitan. El almacenamiento en caché evita este almacenando el código precompilado. Esto es mucho más eficiente y significa un rendimiento más rápido. Dichas recomendaciones no son las únicas maneras de optimizar el código, pero proporcionan una lista de desaceleración comunes y mitos en el desarrollo de sus aplicaciones. Como usted puede ver, con pocas modificaciones en el código y la atención a cómo el servidor Web se ocupa de sus secuencias de comandos, usted puede asegurar un mejor desempeño, manteniendo la funcionalidad final. He visto algunas aplicaciones eliminar funciones cuando el programa comienza a expandirse, y esto es simplemente el enfoque equivocado. Extracción de características de una aplicación lenta es similar a lanzar cantidades salvajes de nuevo hardware para resolver un problema de rendimiento.
) # 8!R El optimizador de Zend es un producto que se utiliza para optimizar y la caché de su código, sino que también proporciona un resultado seguro, ya que el código se compila y cifrado. El cifrado se realiza mediante la ejecución de su código fuente a través de Zend, como se muestra en la Figura 16., que ofusca el código abierto. Esta herramienta no es gratuita, pero a medida que continúe el desarrollo de aplicaciones más robustas, usted aprenderá que el coste se ve compensado por el aumento en el rendimiento a alcanzar.
397
FIGURA 16. Zend Guard con un proyecto activo cargado
R% Un servidor más optimizado se remonta al proceso de desarrollo de aplicaciones. Zend ofrece un estudio de desarrollo que pueden perfilar y depurar el código, lo que le permite localizar los cuellos de botella antes de implementar el código de. El Zend Studio, como se muestra en la Figura 16.3, permite incluso la depuración 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 más información 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 código se encuentra en el Zend Studio IDE
Ñ El proceso de optimización de Apache está dividido en cuatro pedazos. Esto permite al desarrollador a concentrarse en cada paso específico en lugar de obligarlos a modificar todos los aspectos del servidor. En raros casos, sólo verá las actualizaciones de rendimiento mínimo, pero se dará cuenta más que la aplicación y la demanda continuará creciendo.
!&! 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. Más memoria puede ser una ventaja aquí, porque será capaz de mantener adecuadamente la propia.
!0 !
399
Hacer seguro Apache se ejecuta en un servidor dedicado. Esta técnica incluye el desarrollo de instalar que usted aprendió en la sección anterior. Es importante entender el desarrollo de instalar la versión 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 más eficientemente. La empresa (grande) muchas veces las aplicaciones se ejecuta un servidor independiente para gestionar el tráfico web.
! 0( %! 2 Modificación de los archivos de configuración (*.conf) puede producir un aumento de rendimiento si se quita las directivas que no están siendo utilizados. A medida que aprenda el diseño de configuración, puede eliminar los comentarios, que hará más fácil mirar en el largo plazo. Apache ofrece una serie de archivos de configuración de arranque, pero trate de evitar la versión de alto rendimiento ya que en realidad se vuelve menos eficiente en el largo plazo. La razón es porque esta versión excesivamente optimiza Apache, que lo obliga a correr menos eficaz a menos que esté experimentando un tráfico muy alto. ! !!! Siempre que sea posible tratar de limitar la cantidad de uso de registro. Usted puede desactivar el registro completo o limitar la cantidad de información que se escribe en los registros. Los errores son más difíciles de rastrear debido a Apache no informar de estas cuestiones. En la mayoría de los casos, sin embargo, cuando un servidor está funcionando correctamente esto no es un problema. Si decide habilitar el registro, asegúrese de editar los archivos en un equipo diferente, porque el proceso de apertura y análisis de estos archivos a veces muy grandes puede tener un impacto en el rendimiento.
"#!#/ # Puede modificar la directiva MaxClients en el archivo de configuración httpd.conf para aumentar el rendimiento, sino ser conscientes de que cualquier cliente intenta conectarse después de que el límite 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. "9) 9 ?+3 - - > K )4- - > G )2- - > , )2 4 *G, )21@ *,,, "9)3
La directiva MaxClients sólo se aplica cuando el módulo prefork está configurado y habilitado. Hay otras maneras de optimizar Apache, pero corto de agregar hardware adicional y el costo para su organización, esta lista tendrá su servidor en funcionamiento mucho más eficiente.
¬ Ahora que ha optimizado PHP y el servidor Web Apache, el lugar más lógico para optimizar es MySQL. Usted puede optimizar MySQL después de ser instalado, pero hay algunas buenas prácticas a tener en cuenta antes de la instalación, cuando sea posible. 400
,!! # 2 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 sólo los conjuntos de caracteres y las opciones que vayan a utilizar. A menudo, una evaluación rápida de su uso previsto puede resultar en un mejor rendimiento, porque a simple vista se puede determinar qué características que usted usa y no va a usar. La documentación de MySQL tiene varios consejos sobre la mejora del rendimiento, y como seguir aplicando más 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 aplicación de largo camino. Esto significa que usted desea un mejor rendimiento general y no sólo para acciones muy rápido. Por ejemplo, suponga que tiene una tabla con 100.000 líneas, que no es poco común en aplicaciones grandes. Realización de una búsqueda en esta tabla llevará algún tiempo, por lo que MySQL en sintonía con un acceso rápido en la mente realmente será el cuello de botella. Es mejor disponer de MySQL en sintonía con los procesos a largo plazo en mente para trabajar con datos en estos volúmenes.
!% 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. También puede dejar que este registro de relleno y luego pruebe más tarde, dependiendo de qué tan activo es su sistema. $9> 87 @*6$*=K$*$*,P$ 0+
El camino de la lentitud de archivo de registro de consultas será diferente dependiendo de su entorno. Windows no ofrece una "cola" de comandos por defecto, pero puede instalar el servidor de las herramientas disponibles en Microsoft. Es posible que necesite para que "el registro de consultas lentas" en los archivos de configuración de MySQL.
#)! 2 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 símbolo del sistema. Table_name Reemplazar con el nombre real de la tabla que desea consultar.
( O !8M4
Por ejemplo: mysql> check table ); 401
+-------------+---------+---------------+--------------+ | Table | Op | Msg_type | Msg_text | +-------------+---------+---------------+--------------+ | book.poll | check | status | OK | +-------------+---------+---------------+--------------+ 1 row in set (0.00 sec)
# !) 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 configuración de MySQL, usted notará un mejor rendimiento.
!!# El grupo de desarrollo de MySQL proporciona perfiles libre y herramientas de administración. 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 línea de base. Estos interfaz gráfica 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
40
Ñ El tema de la caché es normalmente una vez que miró a experimentar cuellos de botella en una aplicación, pero se puede instalar las soluciones de almacenamiento en caché antes de que surja algún problema.
!,!## Uno de los cuellos de botella en los scripts de servidor es la base de datos. Usted tiene la habilidad de ajustar la configuración, lo que hizo en la sección anterior. A veces, esto sólo puede ir tan lejos como un sistema sigue creciendo. La respuesta a este problema es instalar un software para ayudar a lidiar con la desaceleración 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 intención de acelerar las aplicaciones web dinámicas mediante la eliminación de la carga de base de datos, que se encuentra más a menudo como el sistema sigue creciendo. Puede descargar la última versión de memcached de danga.com en www.danga.com/memcached/.
î La siguiente sección cubre el proceso de instalación de memcached en un servidor Web de Linux. Esta versión requiere de otra biblioteca que se instalen, que también estarán cubiertos. 403
2 0 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 instalación que ha visto en los ejemplos anteriores, cuando la instalación de aplicaciones. < $2>98>4$*+&8+ +:
Cambie el directorio actual a la recién creada libevent para continuar el proceso de instalación. <8>4$*+&8
El último paso para la creación de la dependencia es configurar y construir el necesario instalar los archivos e instalar la biblioteca libevent. <+49 <? <?4
2## Una vez que se instala libevent, puede continuar con la instalación de memcached. <4: $2+2+2+ +:
Empieza por descomprimir el archivo que acaba de descargar. < $2>9 $2+2+2+
A continuación, cambiar el directorio actual para continuar la instalación. < $2+2+2
El último paso del proceso de instalación es la de crear el script de instalación e instalar la aplicación. <+49 <? <?4
Con memcached instalado, ponerlo en marcha y pasar a la extensión de PHP. <+ $$,HK$*P+,+,+*$****
! !/ ##)! En este punto, el siguiente paso es instalar la extensión de PHP que se utiliza para interactuar con memcached. El primer paso es descargar memcached desde el repositorio de paquetes PECL. <0 + +4 $2+2+2+:
404
El número de versión se ha eliminado para asegurarse de que descarga la versión correcta, no por la fuerza una versión en el lector. Lo mejor es leer la documentación antes de descargar una versión de.
2/ 2## Una vez que el archivo se descarga, descomprimir y desempaquetar el archivo de almacenamiento. <:$9 $2+2+2+: < $2>9 $2+2+2+
Cambie al directorio que el archivo ha creado memcached. < $2+2+2
Una llamada a phpize se hace para crear los archivos descomprimidos en una extensión de PHP compatibles. < :
El siguiente paso es configurar la instalación, hacer que los archivos de instalación, y finalmente instalar la aplicación que utiliza los siguientes tres comandos: <+49 <? <?4
Cuando la instalación esté completa, se necesita modificar el archivo php.ini y añadir la nueva extensión. 24 45 +
î El primer paso para la instalación de memcached es descargar la versión binaria directamente de http://jehiah.cz/projects/memcached-win3/ 4* Descomprimir los archivos binarios en el directorio deseado (e.g., c:\memcached). 6* Instalar el servicio: ͚c:\memcached\memcached.exe -d instalar desde el símbolo del sistema. 5* Inicie el servidor de Microsoft Management Console. :* Utilice el servidor, por defecto escuchando en el puerto 1111. 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 extensión memcached (php_memcache.dll). Si usted no ve la extensión 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 añadir la extensión memcached a la lista existente de las extensiones. 24 45 M +
El último paso es reiniciar Apache. 405
El último paso es reiniciar PHP reiniciar Apache y ejecutar la función phpinfo para ver si memcached se ha añadido correctamente.
%!!T El poder de memcached no puede ser explicado en una sección pequeña, pero el siguiente es un buen resumen de cómo cargar y guardar datos en el sistema de almacenamiento en caché. À ! . < 540) D
Después de crear el objeto, crear una nueva conexión. 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 método connect es el número de puerto en el que se está ejecutando memcached. < $344I# /B****JD
Después de realizar la nueva conexión, puede crear algunos datos de la muestra, que probablemente sería un bloque de más avanzada de datos en una aplicación real. < 5
7I# /B# 4 /#844 /B#099 /JD
Después de crear los datos de la muestra, que en este ejemplo es una matriz básica, es necesario enviar los datos al sistema de almacenamiento en caché. Esto se hace realizando una llamada al método 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 información. < $3 I# $B< B9 BK=H,,JD
El segundo argumento es la muestra de datos para almacenar en la memoria caché. < $3 I#4@?7/Bë B9 BK=H,,JD
Memcached tiene la capacidad de almacenar los datos en un formato comprimido, que es fijado por el tercer argumento. Esta opción es una bandera de verdadero o falso. < $3 I#4@?7/B< B BK=H,,JD
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 4 horas. < $3 I#4@?7/B< B9 BHJD
La opción caducará de datos memcached no puede exceder de 59000 (30 días). < $3 I#4@?7/B< B9 BK=H,,JD
406
Como puede ver, el código necesario para guardar los datos en la caché es bastante simple y hace que sea muy fácil de adaptar a las aplicaciones existentes. Aquí está el script de ejemplo completo para guardar los datos en la caché. ; < 540) D < $344I# /B****JD < 5
7I# /B# 4 /#844 /B#099 /JD < $3 I#4@?7/B< B9 BK=H,,JD ;3
! T Una vez que almacenar información en la caché, el proceso para recuperar esa información es una cuestión de llamar a uno de los métodos de la clase Memcache. Este método acepta un argumento, que es la clave que utilizó para guardar los datos en la caché. < 5< $3I#4@?7/JD
Eso es todo lo que hay que cargar la información 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 difícil integrar sin problemas en su código.
Ñ El sistema de almacenamiento en caché memcached se puede instalar en la misma máquina que el servidor Web se ejecuta en. Sin embargo, funciona mejor si se añade a una serie de otras máquinas. Estas máquinas adicionales no tienen que estar en el mismo dominio, ubicación, o incluso ser todo lo que de gran alcance, desde una perspectiva de hardware.
! !%0!0 ! Usted puede utilizar connect() para agregar nuevos servidores, pero hay una función mejor, addServer (), que no utiliza tantos recursos y sólo establece una conexión de red cuando sea necesario. Puedes añadir tantos servidores como desee, pero sólo se utilizará cuando sea requerido por el sistema.
!!!%/ 2 El proceso de cierre de una conexión de servidor caché se realiza mediante una llamada al método close(). Este método no cerrará conexiones persistentes. Estas conexiones se cierran sólo cuando el servidor Web se apaga o se reinicia. < 540) D < $3 IJD
407
# 2%#T Artículos será automáticamente eliminado de la caché cuando su expiración, pero no es raro que a usted lo desea, puede eliminar los datos inmediatamente. El método 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 método para acelerar el proceso de eliminación de ciertos elementos, estableciendo el tiempo de espera de unos minutos u horas, en el futuro.
08## Ahora que tiene una comprensión de cómo instalar, modificar y utilizar memcached debería ver un aumento sustancial del rendimiento. La ventaja de trabajar con memcached se puede añadir más servidores que la carga se vuelve más exigente. Este sigue siendo eliminar el estrés de la base de datos y hace que sus aplicaciones sean más sensibles. La clase Memcached ofrece algunos otros métodos que pueden ser útiles, dependiendo de su uso previsto. También puede utilizar este sistema de almacenamiento en caché memcached con múltiples lenguajes de programación, pero el foco en esta sección ha sido PHP 5.
¬ S& ! Copia de seguridad de sus datos no es sólo una las mejores prácticas para asegurar que sus datos se almacenan de forma segura, copias de seguridad también se puede utilizar para limpiar periódicamente el sistema y limitar los archivos que están disponibles en el sistema. A menudo usted tendrá muchos archivos Oldfilename.php o test.php a través de su servidor como prueba de los conceptos más código. El problema con estos archivos extra se ralentiza el directorio analiza y hace más difícil gestionar los archivos que la material.
Ñ Ejecutar un servidor más eficiente puede incluir la reducción de lo que está instalado en su servidor. En la siguiente sección usted aprenderá cómo excluir archivos no utilizados para limitar la sobrecarga.
# !! 0! Si limita el servidor para que sólo tenga el código de activa y salir de la experimentación de un servidor de desarrollo o de la sección, usted se dará cuenta de un directorio de exploración y la búsqueda 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 práctica 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 ubicación remota.
?# ! 0! 408
Trate de limitar el uso de los archivos más grandes siempre que sea posible. Estos archivos tardan más tiempo para abrir y requieren más memoria cuando se abre. Si no se excluyen, sino que también ralentizar el proceso de copia de seguridad, que obtiene una mirada más a fondo en la siguiente sección. No almacene los datos de backup en la misma unidad, ya que tendrá un problema aún mayor de los recursos.
Ñ 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 básico.
) %! #)! 8 Servidores web UNIX ofrecen un servicio llamado cron, que puede ser configurado para ejecutarse en un momento determinado sobre la base de la información de configuración. Usted puede encontrar más información sobre el servicio cron consultando la página de manual para que. 4 4
Este es el formato de un archivo crontab, donde se repite la última línea para cada nuevo comando. AE$$$$$$$$$$$$$$$$4I,$G6J ALE$$$$$$$$$$$$$ I,$&J ALLE$$$$$$$$$$794 I*$&*J ALLLE$$$$$$$4 I*$*J ALLLLE$$$$790?I,$=JI-475, PJ ALLLLL \\\\\4 4 Todos los trabajos de cron se encuentran en el mismo archivo, que normalmente se cargan al escribir el siguiente comando: 48$
En Windows, puede usar el Programador de tareas, que pueden proporcionar la misma funcionalidad básica.
!! ) %! % Con el sistema de cron, que se puede ejecutar un comando en un momento dado, a su disposición se puede construir un sistema de copia de seguridad automática 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 estrés. 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 más de un directorio a ser respaldada. 409
< 5
7I#> 000> 2+ 79 /JD
El backupDir define en el archivo de almacenamiento se guarda después de su creación. <8? 5#> 000> 2+ 8? /D
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 más de una copia de seguridad por día. <5IQ$$7RJD
El núcleo 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, sólo hay un directorio definido, por lo que este ciclo sólo se ejecutará una vez. 9 I< < J W +++ X
Continuando con la secuencia de comandos, la sección 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 través de otro preg_replace para definir el nombre del archivo. < 5 M IQ<RBQRB< JD < >.5 M IQYI+\J+\;RBQRB< JD
Después de definir el nombre del archivo, el siguiente paso es construir el comando que creará el archivo de almacenamiento. <:.5#W< >.X$W<X+:/D <:5#W<8? XW<:.X/D <8? 5# :9W<:XW< >.X/D
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 sería el mismo que ejecutar el comando en la línea de comandos o terminal. < 5 7 I<8? +#3N*/JD
Para propósitos de depuración 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. 4# 4#+<8? +#8 3/D 4#1 #+< D
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 función 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. ;
410
? < 5
7I#> 000> 2+ 79 /JD <8? 5#> 000> 2+ 8? /D <5IQ$$7RJD 9 I< < J W < 5 M IQ<RBQRB< JD < >.5 M IQYI+\J+\;RBQRB< JD <:.5#W< >.X$W<X+:/D <:5#W<8? XW<:.X/D <8? 5# :9W<:XW< >.X/D < 5 7 I<8? +#3N*/JD 4# 4#+<8? +#8 3/D 4#1 #+< D X ;3
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 periódicamente. Usted nunca quiere borrar accidentalmente información importante por lo que es una buena idea de establecer un sistema de copia de seguridad de este, así. Con la excepción 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 sección. 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 más lento.
~~ Como aprendimos en la sección anterior, se puede asignar scripts de copia de seguridad automática en el fichero crontab. Otro script de copia de seguridad común 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 tamaño del archivo añadido 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 utilizarían exclusivamente para el almacenamiento. Este no es un elemento necesario, pero te da un nivel adicional de protección con sus datos, así como su servidor hace vivir más eficiente. La primera parte de la secuencia de comandos de copia de seguridad de base de datos es definir los detalles de la conexión MySQL. <8( 5# /D <8 45# /D <8 0 5# /D
411
La base de datos para este ejemplo es una aplicación 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. <8.5#8?- /D
! ! - ! ! $ - % .
@ # 49 48 444+ /D
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 más de una base de datos, como la mayoría de los sistemas de hacer. <8? 5Q> 000> 2+ 8 ? RD
Define el directorio de copia de seguridad fuera de la ruta de acceso del público 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 sería único, sino que haría imposible determinar qué archivo ha creado. Una solución mucho más 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 múltiples hasta la fecha se puede utilizar la función getdate(), que devuelve una matriz de información actualizada que se puede hacer referencia a los nombres de las teclas. <75IJD
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 dígitos. Esto no es un requisito de programación, pero más importante, una coherencia que hace que sea más fácil de leer la fecha en el nombre de archivo. <4 5<7Z4[D 9I<4 *,J W <4 5#,/+<4 D X <75<7Z7[D 9I<7*,J W <75#,/+<7D X <7 5<7Z7 [D
La creación 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 aprobación en la información de acceso necesaria. 41
<7 @ 45#7 @$$$ T $T $T T /D
La segunda parte del comando acepta los datos de MySQL y lo empuja a la función gzip, que es donde se crea el archivo real. <: 45/:3T T $T $T $T +:/D
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 función sprintf utiliza marcadores de posición y acepta los argumentos adicionales para cubrir los marcadores de posición. Este es el mismo que crear una cadena en línea, sino que crea una cadena más limpio y más fácil. < 4M45 49I<7 @ 4+#L#+<: 4B < B< B< B<8B <8? B<8B<4 B<7B<7 JD
El tubo | personaje (pipe | character) es un comando especial que indica al sistema para capturar la salida del comando a la izquierda de la tubería e introducir en la función definida en el lado derecho de la tubería. 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 reúne los datos de MySQL y crea el archivo de almacenamiento. 7 I< 4M4JD
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 rápidamente modificar y agregar a su crontab existentes. Usted puede incluso combinar las dos secuencias de comandos de copia de seguridad y agregar más funcionalidad. Los ejemplos anteriores son para empezar. ; A 84 @ Q449+ RD <8( 5# /D <8 45# /D <8 0 5# /D <8.5#8?- /D <8? 5Q> 000> 2+ 8 ? RD <4 5<7Z4[D 9I<4 *,J W <4 5#,/+<4 D X <75<7Z7[D
413
9I<7*,J W <75#,/+<7D X <7 5<7Z7 [D <7 @ 45#7 @$$$ T $T $T T /D <: 45/:3T T $T $T $T +:/D < 4M45 49I<7 @ 4+#L#+<: 4B < B< B< B<8B <8? B<8B<4 B<7B<7 JD 7 I< 4M4JD ;3
En este capítulo, usted aprendió diversas técnicas sobre cómo mantener un servidor Web escalable y más eficiente. El estudio abarcó los temas de la modificación de los archivos de configuración de Apache, lo que limita lo que se carga, y deshabilitar el registro de errores para mejorar el rendimiento global. A continuación, aprendió cómo optimizar MySQL, que puede dar cuenta de la gran mayoría de los cuellos de botella en una aplicación y puede incluso suben a consumir los recursos del servidor Web. En la parte final del capítulo, que se introdujeron para memcached, que fue utilizado para construir un sistema de alto rendimiento que elimina el almacenamiento en caché de la mayoría de los gastos generales de la base de datos. Uso de cada una de estas técnicas en cualquiera de sus proyectos de desarrollo se traducirá en un mejor rendimiento. Nuevo hardware no tiene por qué ser la única solución, si bien optimizar su servidor Web utilizando estas técnicas. También aprendió sobre las nuevas herramientas que pueden ayudarle a optimizar su sistema utilizando un método gráfico en lugar del comando del sistema tradicional.
414
En lugar de tener el final libro con una descripción básica, pensé que desarrollar una aplicación reproductor de vídeo que le permiten comprender el proceso de construcción de una aplicación. En este capítulo se utiliza diversos conceptos y tecnologías aprendidas en los capítulos 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 capítulo está dividido en cinco partes, cada edificio en la sección anterior y que resulta en un reproductor de vídeo completo, PHP conducido. También puede tomar los conceptos y los componentes desarrollados en este capítulo y utilizarlos en sus propios proyectos. Por ejemplo, el componente de acceso será desarrollado como un módulo independiente, que le permite caer en otra aplicación con la modificación de muy poco.
Flash ofrece una gran variedad de funcionalidad. Las posibilidades de lo que se puede desarrollar la utilización de Flash sólo están limitadas por el tiempo y la imaginación. El vídeo 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 vídeo a causa de la amplia disponibilidad de Flash Player para todos los navegadores web más populares. Flash permite a los desarrolladores a construir un reproductor de vídeo y estar seguro de que la mayor audiencia posible será capaz de verla. Además, no hace daño que Adobe ha desarrollado un completo y funcional reproductor de vídeo única que permite a los desarrolladores incorporar fácilmente en un proyecto existente. De hecho, la construcción de un reproductor de vídeo básico en Flash, como se muestra en la Figura 17.1. requiere de muy pocas líneas de código. 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 vídeo que Adobe ofrece para las pruebas: 000+ 2 +9 >0 +9>
415
FIGURA 17.1 Componente de vídeo FLVPlayback aparece en el escenario
El siguiente paso es establecer la propiedad de origen del reproductor de vídeo, señalando la muestra del archivo FLV: 7 7 + 5# 2 +9 >0 +9>/D
Pruebe la película y usted debería ver la carga de vídeo de muestra, a continuación, se inicia automáticamente la reproducción. Felicitaciones, ha desempeñado un FLV en Flash, utilizando el reproductor de componentes vídeo prediseñados. El reproductor de vídeo tiene una colección bastante grande de los métodos y propiedades, pero algunos de los más comunes están relacionados con el control de la reproducción. Por ejemplo, recuerda cómo el video reproduce una vez que se cargó? Esto no puede ser el resultado deseado todo el tiempo, de modo que el reproductor de vídeo te permite modificar este comportamiento, establezca la propiedad autoPlay a false. 7 7 + 5# 2 +9 > 0 +9>/D ë( (
Ahora, cuando se carga el vídeo, espera a una llamada al método de juego antes de que comience la reproducción. Esta funcionalidad es más comúnmente utilizado en sitios de Internet interactivos para garantizar el vídeo o el sonido no conseguir a nadie en problemas mientras se visualiza un sitio. Normalmente, iniciado por el usuario hace clic en un botón o algo similar, vamos a mejorar la funcionalidad y añadir un evento de ratón para iniciar el vídeo. Usted puede empezar por añadir un botón al escenario y le da el nombre de instancia de myPlayBtn. A continuación, modifique el código y añadir la función de controlador de ratón: 7 7 + 5# 2 +9 > 0 +9>/D 7 7 + 759 D ë( B -r '-r)C6
416
%" ( % 7 %" ( % 7 ë(
'-
También quiere que sus usuarios puedan para detener la reproducción de un vídeo. Esto es casi idéntico al proceso de reproducción de un vídeo. Empiece por agregar otro botón para el escenario, con el nombre de instancia myStopBtn. Luego se agrega el nuevo controlador de eventos y asignar al botón Stop, tales como: 7 7 + 5 # 2 +9 >0 +9>/D 7 7 + 759 D 7 7 4+>4! 4 I) >4+ !" OB 84 78?(4 JD 94484 78?(4 I) >4J> W 7 7 +7IJD X ë B -r '-r)C6 ( % 7 ( % 7 '- ë( X
Para simplificar, el componente de un reproductor de vídeo tiene la capacidad de ser de piel, lo que significa que usted no tiene que diseñar una interfaz personalizada. Esto carga la costumbre de la piel en un conjunto predeterminado de los controles de reproducción. 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 más común utilizada. Esta piel es un conjunto completo de controles que se coloca debajo de la componente de reproductor de vídeo. Viendo que esta piel tiene controles de reproducción básica, puede reemplazar el controlador de ratón existentes y utilizar la versión interna: 7 7 + 5# 2 +9 > 0 +9>/D 7 7 + 759 D 7 7 + ?45#-?44 7--?)C+ 09/D
La piel de un reproductor de vídeo debe estar en el mismo directorio que el SWF. También puede establecer la piel utilizando el Inspector de componentes La piel se puede encontrar en el mismo directorio que la película Flash una vez que seleccione al menos una piel de el inspector de propiedades.
417
Como puede ver, la funcionalidad del reproductor de vídeo componente permite crear un jugador de base con bastante rapidez. El problema con este componente se encuentra cuando se desea jugar más de un vídeo o incluso añadir categorías de videos. Afortunadamente, Adobe desarrolló un componente maravilloso e incluso hizo fácil de usar en los proyectos de desarrollo personalizados, que se aprende a hacer más adelante en este capítulo. Va a crear y agregar la funcionalidad adicional que desee.
" ~~ En la sección anterior aprendió a desarrollar un reproductor de vídeo 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 ningún tipo de reutilización, que es crucial cuando se construye una aplicación.
La aplicación de reproductor de vídeo que se desarrollan en esta sección ha sido diseñada, como se muestra en la figura 17., de modo que usted pueda centrarse en la parte de desarrollo. El reproductor de vídeo precompilados está disponible en el sitio Web del libro, donde también se puede encontrar la aplicación completa para tener una idea de lo que será el edificio como un producto acabado. Este reproductor de vídeo está dividido en tres partes. La primera parte es el componente de MySQL, que almacena las referencias de vídeo y las categorías.
418
FIGURA 17. Ejemplo del diseño del reproductor de vídeo que va a trabajar en este capítulo
¬ 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 sólo una sugerencia. Después que la base de datos es creada, puede empezar a añadir la estructura del esquema de la tabla para los videos y las categorías de datos. Para esta aplicación los cuadros ya han sido definidos, pero no dude en buscar los entregó a una mejor comprensión de lo que son responsables. Los cuadros de esta aplicación se dividen para asegurarse de que se optimizan y entender fácilmente que el cuadro es el responsable de cada tarea. Es mejor dividir la funcionalidad en varias tablas, también conocida como la normalización. Así, asegura que su base de datos será la más eficiente y le permite ampliar. La estructura de la tabla en esta aplicación es sencilla. Por ejemplo, el nombre del vídeo, la descripción, y la fuente de referencias se encuentran en la tabla de videos, que se construye similar a la siguiente:
1 !b> bI bb4I**J..!!M4 4B b"b4I**J9.!!B b4b> I,,J9.!!B
419
b b> I,,J9.!!B b 4b2B b4b4I**J9,B b>b> I*J9Q*RB 1")1OIbbJ J.".5)7"-)D
Como puede ver, este cuadro no es nada especial, pero maneja el núcleo de la gestión de aplicaciones. Usted puede agregar más columnas si usted decide que quiere ampliar la aplicación original. Como puede ver, este cuadro no es nada especial, pero maneja el núcleo de la gestión de aplicaciones. Una base de datos no es la única opción de almacenamiento. Usted puede utilizar un archivo XML o incluso codificar los caminos de vídeo en Flash, pero la idea es desarrollar una aplicación ampliable. Esto significa que la base de datos es la opción más lógica para almacenar el vídeo y los datos de categoría. La base de datos también ofrece la capacidad de expandirse y crecer a medida que agrega más características para su aplicación. El segundo cuadro tiene que agregar es la tabla de categorías, que almacena un identificador usado en el código PHP en la siguiente sección y el nombre de la categoría que se muestra en la aplicación Flash.
1 !b bI bb4I**J..!!M4 4B b4b> I*,,J9.!!B b>b> I*J9Q*RB 1")1OIbbJ J.".5)7"-)D
Ñ 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 añadir unas pocas categorías y vídeos: ".-1". I4JC!-IQ 7*RJD ".-1". I4JC!-IQ 7RJD ".-1".> I"B4B B 4J C!-I*BQ-C,*RBQ +9>RBQ C ( RJD ".-1".> I"B4B B 4J C!-IBQ-C,RBQ +9>RBQ C ( RJD
40
FIGURA 17.3 Datos de la tabla de ejemplo se muestra en el MySQL Query Browser
~
Después de cargar los datos en la base de datos que puede probarlo. Esto puede hacerse mediante la creación de un archivo PHP simple que se conecta a la base de datos y ejecuta una consulta muy simple. Usted ha aprendido cómo conectarse a la base de datos en los capítulos anteriores. Para este ejemplo, es necesario definir los detalles de conexión y realizar una llamada a la función mysql_connect. ; <4?57 @M44IQ RBQ RBQ 0 RJD 7 @M M8IQ8?M>7 RB<4?JD ;3
Cuando se establece la conexión, el siguiente paso es construir la consulta SQL. ; <4?57 @M44IQ RBQ RBQ 0 RJD 7 @M M8IQ8?M>7 RB<4?JD
41
) # -r-F/ 4' " ;3
5 $6 )
El último paso es devolver algo. Para simplificar, vamos a mostrar uno de los nombres de categoría. ; <4?57 @M44IQ RBQ RBQ 0 RJD 7 @M M8IQ8?M>7 RB<4?JD <"5*D <@ 75 49I#-! \1) 0 5T/B<"JD ë 6 ë #",ë6"0$=>ë?@#6 "0$ ;3
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 debería ver una salida similar a la siguiente:
7."
Si usted ve cualquier otra cosa, asegúrese de comprobar los detalles de conexión. Si por alguna razón usted recibe una página en blanco, coloque la siguiente línea en la parte superior de su archivo a la fuerza de PHP para mostrar todos los errores posibles:
M 4IM!!JD
Ahora que usted ha visto una consulta de MySQL, ejecuta utilizando la fecha para esta aplicación, intente llamar a dos tablas y probar la funcionalidad de la aplicación final tendrá. Las dos únicas líneas de código que necesitan ser modificados son la consulta SQL y la salida. ; <4?57 @M44IQ RBQ RBQ 0 RJD 7 @M M8IQ8?M>7 RB<4?JD <"5*D # -r-ë/ 4' 6 " 97- - ) Ñ, 5 $6 ) < 57 @M@ 7I<@ 7B<4?JD ë #2 ,ë##6"0$=>ë?@#6 "0$ ;3
4
Al ejecutar este código, debe presentarse una lista de vídeos para esa categoría específica. Este código busca en la categoría de vídeo y tablas y devuelve todos los vídeos que los identificadores comparten la misma. Este es el más básico de unirse a las tablas de MySQL, pero funciona perfectamente para esta aplicación.
î El siguiente paso es construir el PHP reales que serán llamados por el uso de Flash Remoting. De hecho, esta sección es similar en el hecho de que va a utilizar AMFPHP. Pero la parte más allá de este desarrollo real es diferente.
CROSS--REFMás información sobre la interacción remota se puede encontrar en el capítulo 8*
La ventaja de la construcción de esta aplicación que utiliza interacción remota es que te da la posibilidad de probar más fácilmente. Esto es porque usted puede construir las clases AMFPHP y luego probarlos mediante el código PHP estándar o el visor de navegador incluido que se incluye con AMFPHP. Usted también tiene la capacidad de reutilizar estas clases en otros proyectos o con las porciones de código HTML del mismo proyecto. Por ejemplo, suponga que desea crear un panel de usuario que puede mostrar las últimas películas de una categoría específica. Usted puede hacer esto mediante la construcción de una página HTML muy básico y llamar a la clase de interacción remota para devolver los datos necesarios, al igual que lo haría en Flash.
Las clases en esta aplicación dependen de la base de datos. En lugar de definir los detalles de la conexión en todas las clases, es mejor construir una clase de conector de base de datos que es responsable de hacer la conexión inicial y almacenar las credenciales de conexión. La clase de conector tiene cinco variables privadas. Los cuatro primeros definen la información de conexión.
; 8 44 W # $ #$ # $ %,ë#% $ X ;3
La quinta variable se utiliza para almacenar el enlace de la base de datos de identificación de recursos.
><4?54D
El constructor para esta clase está vacía, porque las variables privadas se definen previamente.
9448 44 IJWX
43
El método de conexión privada sólo es llamado cuando una conexión existente no se encuentra. Este método pasa en los detalles de una conexión privada y almacena el identificador de recurso en el $this-> propiedad de enlace, que sólo es visible a esta clase.
>94444IJ W < $34?57 @M44I< $3 B< $3 B< $ 3 JD 7 @M M8I< $38.B< $34?JD X
El segundo método, getConnection, se establece como pública 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 método comprueba en primer lugar para un recurso de la conexión ya existente, y si uno no se encuentra, se hace una llamada al método connect. El último paso de esta función es devolver el recurso de conexión activa, que se utiliza en otras clases. \\ \8 444 \S > \S 4 8 4?B8 4 @ \ 8944 444IJ W 9I< $34?554J W < $344IJD X
4< $34?D X
Como puede ver, esta clase es muy útil, ya que se encarga de almacenar la conexión de base de datos. Además, 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. ; 8 44 W >< 5# /D >< 5# /D >< 5# 0 /D ><8.5#8?M>7 /D ><4?54D 9448 44 IJWX >94444IJ W < $34?57 @M44I
44
< $3 B < $3 B < $3 JD 7 @M M8I< $38.B< $34?JD X \\ \8 444 \S > \S 4 8 4?B8 4 @ \ 8944 444IJ W 9I< $34?554J W < $344IJD X
4< $34?D X X ;3
. Ahora que la clase de conector de la base de datos se completa, la próxima clase a desarrollar es la gestión de los videos. Esta clase devuelve la lista de vídeo basado en vídeo o ID de categoría. La primera parte de esta clase es para cargar en el archivo de conector de base de datos, que esta clase de vídeos se extenderá. ;
@ M4Q8 44 + RD ;3
Usted puede recordar se extiende desde las clases de ActionScript que han desarrollado en los ejemplos anteriores. La sintaxis de PHP es idéntico. Básicamente, definir la clase y cualquier clase que se extenderá, de forma similar a la siguiente: ;
@ M4Q8 44 + RD
2 % ;3
La clase de vídeo tiene un método, getVideos. Este método acepta un vídeo y un ID de categoría por separado como argumentos para determinar qué videos para volver. 45
\\ \> \S \S 4
79> \ 944C I< 7"5$*B<>"5$*J W +++ X
La primera parte de este método para comprobar las necesidades de identificaciones válidas para garantizar el SQL no se verá comprometida. Este paso no es obligatorio, pero asegura que su aplicación sea más seguro. 9I< 7"55$*LL 4I< 7"J55,J W M
I# 7" @ 4> /JD X
Esta declaración pide trigger_error si un identificador de categoría no válido o no se pasa in. La razón para usar el trigger_error es porque AMFPHP graciosamente detiene todo el proceso aún más 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 método y crear una matriz que contendrá los datos de vídeo que se pasa de nuevo a ActionScript. <>-F!5#/D < 0 5
7IJD
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 código sólo se debe buscar un vídeo. ?9 9>; 9I<>"5$*NN 4I<>"J5,J W <>-F!5#.>+5/+<>"D X
El enlace de base de datos puede ser definido simplemente haciendo una llamada al método getConnection de la clase de DatabaseConnector porque la clase de vídeo se está extendiendo. La variable local $link se le asigna la conexión activa que se utiliza en el resto de la interacción dentro de esta función de MySQL. <4?5< $3 444IJD
La consulta de la base de datos es bastante complejo, ya que los controles dos tablas de datos y devuelve una lista de vídeos 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 sección. Esta consulta utiliza el $vidSQL, que o bien será una adición válida a la de SQL o una cadena en blanco cuando no buscas un vídeo concreto. <@ 75 49I#-! >+4B >+ B
46
>+ Q>RB +4 QRB >+ 4B >+4 1) B> > %(1>+"5+ .>+"5T .>+>5*#+<>-F!B< 7"JD
La parte especial de esta consulta SQL es la modificación de los nombres de columna, como la >+ Q>R
Esto se hace porque el conjunto de resultados tiene el nombre de identificación en las tablas y sólo un nombre pueden ser devueltos. Si se mantiene el estándar de nomenclatura sólo tendrán acceso a una tabla de información de identificación. Saber que uno será devuelto es una cuestión de orden que se les llama en. El cambio de nombre sólo 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 través de bucle y se pasa de la función como una matriz multidimensional. < 57 @M@ 7I<@ 7B<4?JD
Antes de que se ejecute el bucle, es una buena idea para algunas filas fueron devueltos por la consulta. El incumplimiento de esta comprobación simple podría resultar en un bucle sin fin. Esto puede dañar el servidor Web, ya que muy probablemente no darse cuenta de que está ocurriendo. Esta sencilla comprobación se hace comprobando el número de registros devueltos con la función mysql_num_rows. Esta función devuelve un valor numérico que representa el número de filas devueltas en la consulta. 9I7 @M4M 0 I< J55,J W M
I#.> 94/JD
49 D X
Suponiendo que un conjunto de resultados válidos se encuentra, el siguiente paso es recorrer los resultados y llenar la variable de matriz que se definió anteriormente. 0 I< 057 @M9 M
7I< B)-F!M-- JJ W
7M I< 0 B< 0JD X
El último paso de esta función es devolver la matriz de datos de vídeo. Este método no llegar a este punto, salvo que los datos válidos de vídeo está listo para ser aprobado de nuevo.
4< 0 D
Eso es todo lo que hay en la clase de vídeo. Este archivo debe ser guardado como Videos.php. Esta es la clase completa, que también se puede encontrar en el código del libro en el sitio Web. 47
;
@ M4Q8 44 + RD C 24 8 44 W \\ \> \S \S 4
79> \ 944C I< 7"5$*B<>"5$*J W 9I< 7"55$*LL 4I< 7"J55,J W M
I# 7" @ 4> /JD X <>-F!5#/D < 0 5
7IJD ?9 9>; 9I<>"5$*NN 4I<>"J5,J W <>-F!5#.>+5/+<>"D X <4?5< $3 444IJD <@ 75 49I#-! >+4B >+ B >+ Q>RB +4 QRB >+ 4B >+4 1) B> > %(1>+"5+ .>+"5T .>+>5*#+<>-F!B< 7"JD < 57 @M@ 7I<@ 7B<4?JD 9I7 @M4M 0 I< J55,J W M
I#.> 94/JD
49 D X 0 I< 057 @M9 M
7I< B)-F!M-- JJ W
7M I< 0 B< 0JD X
4< 0 D X
48
X ;3
La segunda clase de este ejemplo es la clase de categoría, que también tiene un método. Este método es responsable de devolver todas las categorías activas para el reproductor de vídeo. Antes de que se cree el método, debe cargar en la conexión de bases de datos, exactamente igual que lo hizo en la clase de vídeo.
@ M4Q8 44 + RD
La primera parte del método getCategories es responsable de la creación de una nueva variable $rows que llevará a cabo es regresar de la base de datos las categorías. La variable de enlace se llena con una conexión de base de datos activa, que será utilizado en las llamadas SQL siguiente. < 0 5
7IJD <4?5< $3 444IJD
La consulta SQL básicamente tira en todas las categorías que están 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 ejecución de la llamada realidad de SQL. <@ 75#-! B41) %(1>5*/D < 57 @M@ 7I<@ 7B<4?JD
Si en los controles de la declaración de al menos una fila válida antes de continuar y generará un error si no se encuentran filas válida. Suponiendo se encuentran filas válidas, 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. 9I7 @M4M 0 I< J55,J W M
I#. 94/JD
49 D X 0 I< 057 @M9 M
7I< B)-F!M-- JJ W
7M I< 0 B< 0JD X
4< 0 D
Eso es todo lo que hay en la clase de categoría y, como se puede ver la estructura de la clase de categoría es bastante similar a la clase de vídeo en la sección anterior. Esta es la clase Categoría completado: ;
@ M4Q8 44 + RD 24 8 44 W
49
\\ \ \S \S 4
79 \ 944 IJ W < 0 5
7IJD <4?5< $3 444IJD <@ 75#-! B41) %(1>5*/D < 57 @M@ 7I<@ 7B<4?JD 9I7 @M4M 0 I< J55,J W M
I#. 94/JD
49 D X 0 I< 057 @M9 M
7I< B)-F!M-- JJ W
7M I< 0 B< 0JD X
4< 0 D X X ;3
~
En este punto, ambas clases de servicio AMFPHP se han escrito. Usted puede rápidamente probar el uso de ellos o pasar a la parte de ActionScript el desarrollo de esta aplicación. Prueba de la clase es muy simple: básicamente crear un archivo PHP, llame el vídeo o el método de la categoría, e imprimir el resultado. Por ejemplo, aquí está una prueba simple, también conocida como unidad de pruebas: ; 4Q9 > C + RD <> 540C IJD < 5<> $3C I*JD 4M I< JD ;3
430
Si ejecuta este ejemplo en su navegador debería ver una salida similar al siguiente ejemplo:
7 I Z,[53
7 I Z4[53-C** Z [53 +9> Z>[53* Z[53 7 Z 4[5317 C( Z4[53, J +++ J
Ahora debe tener dos clases completas que se pueden utilizar en el código ActionScript para interactuar con el contenido de la base de datos. El siguiente paso es construir la porción de ActionScript de la solicitud, que es manejado por las clases externas para la reutilización.
En las secciones anteriores de este ejemplo, usted desarrolló la base de datos y tablas. Luego construyó los servicios de PHP que interactúan con las tablas de base de datos. El siguiente paso es desarrollar el ActionScript que se encarga de mostrar y gestionar el reproductor de vídeo. Si nos fijamos en el reproductor de vídeo, como se muestra en la Figura 17.4, en el escenario de Flash te darás cuenta de que hay cuatro partes: el principal componente de reproductor de vídeo, caja de información, lista de vídeos, y el menú desplegable que almacenará las categorías de vídeo. 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 mayoría del reproductor de vídeo es dirigido desde, en lugar de tener el código directamente en la línea de tiempo. Esto también le da la opción de desarrollar en un editor externo, como FDT, o puede utilizar el editor independiente que se incluye con Flash. 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 aplicación en la FLA está situado a asegurar que el archivo se cargará. También 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 vídeo que ya ha sido diseñado para usted
Después que este archivo de ActionScript se crea y se guarda, es el momento para empezar a desarrollar el núcleo de secuencias de comandos que controla el reproductor de vídeo. Empezar por construir la clase de esquema y ampliar la clase de la clase MovieClip, que se requiere para una clase de documento. ? W 9 + 7+)> D 8 C 7 24 )> W X X
Ahora que se construye el esquema básico de clase, puede empezar a construir la funcionalidad actual. Además de la clase MovieClip, necesita importar dos clases. La clase de evento se utilizarán para todos los de gestión de eventos de base, y el paquete net.* incluirá todas las clases necesarias para comunicarse con el servicio remoto. 9 +>4 +>4D 9 +4+\D
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 43
propiedad almacenará el NetConnection activa, que se utiliza para interactuar con el servicio remoto. Vas a trabajar con esto en la siguiente sección de código. >> 071!- 4D >> 07. 444D >> ".8 D
+ ~ La función de constructor es responsable de la inicialización de algunas propiedades, que modifica la parte visual de la pantalla del reproductor de vídeo, y llamando al método de la categoría. 944C 7 IJ W 071!5# 9 07+ /D IJD > 7 +> 859 D >! 8+4859 D X
¬ El siguiente método en la clase VideoPlayer es getCategories(), que se llama desde el constructor cuando la aplicación se inicializa. Este método comienza por la creación de una nueva instancia del Responder, que se encarga de la respuesta del servicio remoto. 8944 IJ> W
" 7 6 / X
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. 8944 IJ> W > 4 1 4 5401 4 I 71 4 (4 B 4 JD ", X
Después 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. 8944 IJ> W > 4 1 4 5401 4 I 71 4 (4 B 4
433
JD 07540. 444IJD " "* r X
El último paso en el método 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. 8944 IJ> W > 4 1 4 5401 4 I 71 4 (4 B 4 JD 07540. 444IJD 07+44I071!JD " #" "" $6 X
¬ Ahora que el método getCategories se completa, el siguiente método a desarrollar es el categoryResponseHandler, que se definió en la instancia Responder. Este método se llama cuando un conjunto de registros válidos se devuelve desde el servicio remoto. >944 71 4 (4 I 4 8VJ> W +++ X
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 vídeo. El primer paso es permitir que el ComboBox, de lo contrario no será capaz de añadir nuevos contenidos a la misma. >! 8+485 D
Una vez que el ComboBox está habilitada, el siguiente paso es añadir el primer elemento, que informa al usuario seleccionar una opción. Esta opción por defecto tendrá un valor de -1 para alertar de que no es una identificación válida. Usted podría utilizar 0, aparte del hecho de que es una identificación válida en la base de datos. >! 8+"IW8R 7+++RB$*XJD
Un bucle for each se construye para manejar todos los elementos de respuesta. Este se encargará de cualquier número de elementos de vídeo, que es esencial porque el servicio remoto no devuelve el mismo número cada vez, ya que no todas las categorías tiene la misma cantidad de videos. 9 I> 4 4 J W >! 8+"IW8+4B+XJD X
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 categoría de vídeo. El último paso del método categoryResponseHandler es asignar el detector de eventos para el ComboBox. Este evento se activa cuando el elemento seleccionado de los cambios del componente ComboBox. >! 8+>4! 4 I>4+ (.B 7(4 JD
¬ El método categoryHandler se llama cuando el usuario selecciona un elemento diferente en la instancia del componente ComboBox. >944 7(4 I>4J>W+++X
Este método controla el proceso de validación de la categoría seleccionada id. El identificador de categoría real se encuentra en la propiedad selectedItem del el evento passed-in. > .8 5 " )ë+D
Este ID de la categoría es validado mediante una sentencia condicional que los controles básicos por un valor de -1, que fue asignado al item por defecto. 9I55$*J 4D
Si el valor no se encuentra, entonces sabes el ID es válido, y el ID de la categoría se asigna a la propiedad selectedCatID facilita el acceso a la categoría actual ID. "5D
Por último, una llamada al método getVideos se hace para cargar en la lista de vídeo basado en el ID actual. C IJD
¬ + El método getVideos se llama cuando se encuentra una categoría válida. Este método se utiliza para hacer la primera llamada al servicio remoto, que se carga la lista correcta de vídeos a partir de la categoría almacenados en el método anterior. La única parte de este método que es diferente del método getCategories son los parámetros pasados a la llamada al método y el éxito de la función asignada al Responder. 8944C IJ> W > 4 1 4 5401 4 I 7 6 4 JD 07540. 444IJD 07+44I071!JD
435
" X
#2
"2
$6 6 )6>?
Usted puede crear un controlador de conexión principal y pasar en estas propiedades diferentes, pero para simplificar, se utilizan varios métodos.
¬ Uno de los principales métodos en esta aplicación tendría que ser el videosResponseHandler. >944> 1 4 (4 I 4 8VJ> W +++ X
Esto se debe a que el método es el responsable de cargar la lista de vídeos 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. Más adelante en este proyecto a desarrollar el código ActionScript que se adjunta a los activos. La primera parte de este método es definir la variable nextY que las compensaciones de cada elemento de la lista de vídeo y crea un MovieClip vacío, que se asigna a la propiedad de origen de la instancia de ScrollPane. > 4245GD > ")> 540)> IJD >! + 5 "D
La mayoría de este método se encuentra en el bucle for..each. Este bucle se ejecuta a través de cada elemento de la lista de respuesta de vídeo. 9 I> 4 4 J W +++ X
Cada paso del bucle se crea una instancia VideoListItem nuevo. Estas instancias de obtener un controlador de eventos que se les asignen y una ubicación única en la lista utilizando la variable de nextY previamente definidos. > >! ")> 540C! "IJD >! "+7542D >! "+25D >! "+>4! 4 IC! "+")M !" OB "(4 JD
La siguiente parte del bucle establece propiedades personalizadas del videoListItem que define el título, la descripción y vídeo a cargar cuando se hace clic en el artículo. >! "+5+4D >! "+ 5+ 4D
436
>! "+>8V5D >! "+ "I+>BQRB+ JD
Ahora que la instancia VideoListItem se ha completado, el siguiente paso es añadir a la lista de visualización ListItem, que lo hace visible en el ScrollPane. "+ I>! "JD
Cada paso de los incrementos de la variable de bucle nextY para asegurar que cada elemento de vídeo se coloca en una posición única. Este valor se determina mediante la adición de la altura del elemento de vídeo actual más un relleno ligero a la variable nextY existentes. 42E5>! "+ ED
El último paso del método videosResponseHandler es para actualizar el componente ScrollPane llamando al método de actualización. Si usted no llama a este método, la barra de desplazamiento en el ScrollPane no reflejaría el vídeoelemento añadido. >! +IJD
Como puede ver, el método de videosResponseHandler es responsable de gran parte de la funcionalidad en la lista de vídeo a pesar de que es sólo una parte de la aplicación en general. Se exigía una gran cantidad de código personalizado para crear correctamente. ¬ î El método listItemHandler se llama cuando uno de los elementos de vídeo hace clic en el ScrollPane. >944 "(4 I>4J> W +++ X
Este método actualiza la información de vídeo actual en el videoMetaInfo MovieClip encuentran por debajo del reproductor de vídeo. >)"49+2+25+
4 +>8V+4D >)"49+ 72+25+
4 +>8V+D >)"49+>0 2+25+
4 +>8V+4D >)"49+ 2+25 +
4 +>8V+ 4D
También es responsable de la sustitución de la fuente del reproductor de vídeo y la reproducción del vídeo nuevo. > 7 +> 85 D > 7 + 5+
4 + D > 7 +7IJD
437
2!!!!)% ! 2!# El último método de la clase VideoPlayer es un controlador de errores en el servicio remoto. Este método 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. >9444I 4 8VJ> W I#8
/JD 9 I> 4 4 J W I##E 4 Z[JD X X
Para esta aplicación, el mensaje de error se traza durante el desarrollo y completamente ignorado cuando se ejecuta el mundo real. Más adelante en este capítulo, se crea un controlador de errores realista que es similar a los encontrados en el vídeo popular de compartir los sitios Web. Ha completado la clase VideoPlayer entero, que es la mayoría de las aplicaciones de vídeo, 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 cómo cada uno de los métodos de interacción con los demás. Este código fuente también está disponible en el sitio Web del libro para que usted pueda cortar y pegar. ? W 9 + 7+)> D 9 +>4 +>4D 9 +4+\D 8 C 7 24 )> W >> 071!- 4D >> 07. 444D >> ".8 D 944C 7 IJ W 071!5# 9 07+ /D IJD > 7 +> 859 D >! 8+4859 D X 8944 IJ> W > 4 1 4 5 401 4 I 71 (4 B4JD 07540. 444IJD 07+44I071!JD
438
07+I# + /B 4 JD X >944 71 (4 I 4 8VJ> W >! 8+485 D >! 8+"I W8R 7+++RB$*X JD 9 I> 4 4 J W >! 8+"I W8+4B+X JD X >! 8+>4! 4 I>4+ (.B 7(4 JD X >944 7(4 I>4J> W > .8 5+
4 + "+D 9I55$*J 4D "5D I#! 7"#EJD C IJD X 8944C IJ> W > 4 1 4 5 401 4 I> 1 (4 B4JD 07540. 444IJD 07+44I071!JD 07+I#C +C /B
4 B "B QR JD X >944> 1 (4 I 4 8VJ> W > 4245GD > ")> 540)> IJD >! + 5 "D 9 I> 4 4 J W > >! ")> 5 40C! "IJD >! "+>4! 4 I C! "+")M !" OB "(4 JD
439
>! "+7542D >! "+25D >! "+5+4D >! "+ 5+ 4D >! "+>8V5D >! "+ "I+>BRRB+ JD "+ I>! "JD 42E5>! "+ ED >! +IJD X X >944 "(4 I>4J> W > 498V5+
4 +>8VD >)"49+2+2549+4D >)"49+ 72+2549+D >)"49+>0 2+2549+4D >)"49+ 2+2549+ 4D > 7 +> 85 D > 7 + 5+
4 + D > 7 +7IJD X
(4 >9444I 4 8VJ> W I#8
/JD 9 I> 4 4 J W I##E 4 Z[JD X X X X
+ î El siguiente paso antes de que pueda probar la aplicación es la construcción de la clase VideoListItem. Si intenta ejecutar la aplicación en su forma actual, no sólo se obtiene errores, pero tampoco sería capaz de cargar cualquier video porque los artículos 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. Después 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. ? W 9 + 7+)> D 8 C! "24 )>
440
W X X
Además de la clase MovieClip que se importa, también 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 ratón sobre instancias del ítem de vídeo. 9 + 7+)> D ë / ë - ë '-
La clase también debe tener algunas propiedades por defecto definida, que será modificado más tarde en la clase. La mayoría de las propiedades son las definiciones de cadena de base. Sin embargo, la última propiedad, ITEM_CLICK, es una especial constante público que se utiliza en el controlador de eventos. Esto se hace público para que la variable puede ser accedida fuera de la clase. 8> >8V8VD >> M4D >> M- 4D >> M - 4D >> M 8- 4D >> M - 4D 8 4 ")M !" O- 45#4" ?/D
+ î 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. 944C! "IJ W 5,+GD X
¬ î El primer método personalizado de esta clase es setItem. Este método se llama en la creación de una nueva instancia y se establece el id, laminiatura y los parámetros de fuente de vídeo. Para este ejemplo, la opción del thumb (miniatura) no se utiliza, pero se puede ampliar el ejemplo, porque ya se ha añadido. 944 "I4B 8- 4B - 4J W ë%ë% X
La segunda parte del método setItem asigna a los detectores de eventos para el objeto del ratón. Aquí es también donde se habilita el icono del puntero del ratón cuando el usuario pasa el ratón sobre el elemento de vídeo. 441
944 "I4B 8- 4B - 4J W M5D M 85 8D M 5 D %' 7 -r '- 4rr42- 67 -r '- 4rr4*67 -r '-r)C6 7 X
¬ Los métodos de controlador de ratón se utilizan para modificar el valor alfa del elemento de vídeo. En este ejemplo, que básicamente establece el alfa plenamente visible o parcialmente visible. Desde aquí se puede añadir una interpolación a esta propiedad y tienen la propiedad de Alpha sin problemas el cambio. >944> (4 I) >4J> W +
4 + 5*+,D X >944(4 I) >4J> W +
4 + 5,+GD X
El método clickHandler desencadena el evento ITEM_CLICK que alerta a los objetos de escuchar el clic. En este caso, el acto se notificará al VideoPlayer vídeo específico, y que se cargan. >944?(4 I) >4J> W --)-'r)C X
El resto de los métodos de la clase VideoListItem son para obtener y establecer las propiedades previamente definidos. Por ejemplo, el título puede ser recuperado llamando a obtener el título, como el: 8944IJ- 4 W
4MD X
También puede establecer la propiedad de título llamando ser title y que pasar en el título del vídeo. 8944 I>- 4J> W M5>D 2+25>D X
44
( 2#T ! ! El resto de métodos getter/setter aparecen en el siguiente código y también están en la clase completa disponible en la fuente de código del libro: 8944IJ4 W
4MD X 8944 IJ- 4 W
4M D X 8944 IJ- 4 W
4M D X 8944 I>- 4J> W M 5>D 2+25>D X
Eso es todo lo que hay en la clase VideoListItem. Como puede ver, es en su mayoría autónomos, que hace que este pequeño objeto reutilizable en otras aplicaciones. En este ejemplo, usted está construyendo un reproductor de vídeo, pero que podría cambiar fácilmente 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. ? W 9 + 7+)> D 9 +2+2D 9 +>4 +>4D 9 +>4 +) >4D 8 C! "24 )> W 8> >8V8VD >> M4D >> M- 4D >> M - 4D >> M 8- 4D >> M - 4D 8 4 ")M !" O- 45#4" ?/D 944C! "IJ W 5,+GD X
443
944 "I4B 8- 4B - 4J W M5D M 85 8D M 5 D 84)5 D (4 5 D >4! 4 I) >4+1!!MC1B> (4 JD >4! 4 I) >4+1!!MB(4 JD >4! 4 I) >4+ !" OB?(4 JD X >944> (4 I) >4J> W +
4 + 5*+,D X >944(4 I) >4J> W +
4 + 5,+GD X >944?(4 I) >4J> W >4I40>4I")M !" OJJD X 8944IJ4 W
4MD X 8944 IJ- 4 W
4M D X 8944IJ- 4 W
4MD X 8944 I>- 4J> W M5>D 2+25>D X 8944 IJ- 4 W
4M D X 8944 I>- 4J> W M 5>D 2+25>D X X
444
X
En este punto usted ha completado el reproductor de vídeo Flash y PHP. Ahora puede probar la aplicación, y podrás ver la misma interfaz que empezamos. La diferencia es, si selecciona una categoría, el ScrollPane se llenará con los videos de esta categoría. A continuación, hacer clic en un elemento de vídeo y el vídeo comenzará a reproducirse. Tal como está, el reproductor de vídeo es una aplicación bastante robusto que puede ser ampliado. En la sección siguiente que usted hará exactamente eso agregando un poco de seguimiento de base. Luego, en una sección posterior, se agrega un componente de entrada de los usuarios que los resultados en una aplicación en el mundo verdaderamente real, manteniendo la funcionalidad original del jugador.
En la sección anterior, se construyó un flash completo basado en un reproductor de vídeo de PHP que permite obtener un resultado dinámico. Esta aplicación permite al propietario proceda a actualizar la base de datos, y la aplicación Flash refleja estos cambios la próxima vez que se carga. El problema viene cuando el dueño quiere saber qué vídeos son populares. Desea que el proyecto para ayudarle a determinar qué contenido de vídeo es muy popular por lo que puede agregar más contenido similar. La solución es desarrollar el seguimiento de vídeo que registra cuántas veces un vídeo ha sido visto. Esto se hace por tener una columna en la base de datos que mantiene la cuenta activa. A continuación, añadir el apoyo necesario a las clases de PHP y, finalmente, la actualización de Flash para mostrar el número. La base de datos no necesita ser actualizado, porque la columna de conteo fue agregado en la sección anterior, aunque no se utilizó. Agregar más columnas que va a utilizar para empezar es común para la aplicación tiene la capacidad de crecer. Columnas extra también puede ser el resultado de eliminar temporalmente una característica de una aplicación después de que el esquema de base de datos se crea.
Ñ La clase de servicio de vídeos se creó en la sección anterior. Todo lo que tienes que hacer ahora es agregar el nuevo método utilizado para modificar el recuento de vídeo: 8944 7 4I<>J W 0" +++ X
Este método acepta un parámetro, que es una referencia a la id de vídeo que debe ser actualizada. La primera parte de este método crea un enlace a la base de datos utilizando la clase de base de datos existente, construido en la sección anterior. Esta variable $link se pasa en todas las acciones futuras de SQL en este método.
445
La segunda parte del método es crear una consulta SQL que agarra el recuento de reproducción actual del vídeo deseado. 8944 7 4I<>J W <4?5< $3 444IJD # -r- / 4' 97- - ë 6 X
5 $6
Después de que el valor está cargado, el siguiente paso es comprobar que un registro válido utilizando la función familiar mysql_num_rows. 8944 7 4I<>J W <4?5< $3 444IJD <@ 75 49I#-! 41)> %(15T/B<>JD < 57 @M@ 7I<@ 7B<4?JD ë ë 0 X
El contenido de esa declaración condicional cuando el valor se actualiza, según el recuento de determinar en la consulta SQL anterior. < 057 @M9 M 0I< JD <45< 0Z,[D <4EED <@ 75 49I# > -45T%(15T/B <4B<>JD 7 @M@ 7I<@ 7B<4?JD
La consulta SQL que actualiza la base de datos se ha construido utilizando sprintf para pasar en limpio la cuenta y de identificación de vídeo, en lugar de la construcción de una cadena duro de leer, que es más común. El uso de sprintf es tanto más importante cuando vuelva a un proyecto más 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. Ñ $ Ñ La característica de seguimiento de vídeo puede ser añadido en uno de los dos lugares. Usted puede agregar la actualización que se ejecuta cuando el vídeo comienza a reproducirse, o bien añadir que lo que el recuento sólo se actualiza después de que el vídeo se ha visto totalmente. Cada opción tiene sus ventajas. Para este ejemplo, la llamada de seguimiento se hace cuando se solicita un nuevo vídeo, en lugar de esperar a que el vídeo completo. Esta acción es similar a un contador de visitas en un 446
sitio Web, con la excepción de que no va a ser único en esta aplicación. Sin embargo, usted puede agregar el código necesario de los ejemplos anteriores para garantizar la actualización es única
¬ + & Los métodos de seguimiento se pueden agregar nuevas en cualquier punto de la clase VideoPlayer, sino un lugar lógico es sobre el método de onFault. La primera parte de este nuevo método es crear una nueva instancia de la clase Responder, pasando por el método de control de respuesta como el primer parámetro. >944C ?4I>4J> W "7 6 / X
Después que se crea una nueva instancia Responder, el siguiente paso es crear la conexión de puerta de enlace utilizando una nueva instancia de la clase NetConnection. Este proceso es idéntico al de otros remoto llamadas que ha realizado en la sección anterior. >944C ?4I>4J> W > 4 1 4 5401 4 I ?4(4 B 4 JD ", " "* r X
La actualización final para el método updateVideoTracking es donde se realiza la llamada al servicio remoto. La presente convocatoria se pasa a lo largo de la identificación de vídeos al día y la respuesta debe ser el nuevo contador o un error si algo sale mal. >944C ?4I>4J> W > 4 1 4 5401 4 I ?4(4 B 4 JD 07540. 444IJD 07+44I071!JD " #2 ( $6 6 X
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 envía a la TextField situado en el MovieClip videoMetaInfo para reflejar la cuenta actual. >944 ?4(4 I 4 8VJ> W >)"49+>0 2+25 4 +4D X
447
El último paso para agregar la función de rastreo es la de modificar el método de listItemHandler existentes y añadir en la llamada al método de actualización, tales como las siguientes: >944 "(4 I>4J> W +++ 2 " " 4%1 X
En este punto, la adición de seguimiento es completo. Como puede ver, el proceso de creación original en la primera sección permite realmente la capacidad de introducir nuevas funciones con actualizaciones mínimas. Ahora, el reproductor de vídeo puede seguir correctamente los videos y le informará de qué vídeos son más populares que otros. Desde aquí se puede desarrollar un panel de administración, donde todos estos datos podría ser visto, o usted puede acceder a su editor de SQL y consultar la tabla de vídeos para la cuenta de activos de cada vídeo.
" Ahora que el reproductor de video está bastante llena de características, es bastante seguro asumir el sitio Web debe exigir el registro para poder utilizar el reproductor. Agregar el registro es una cuestión de crear una forma básica y la actualización de una tabla de base de datos, nada que unas cuantas líneas de código no se puede lograr. La parte más avanzada de esta función es necesario Flash para interactuar con el inicio de sesión de usuario. Para empezar, la aplicación Flash necesita para mostrar un panel de inicio de sesión cuando se inicie la aplicación y también tiene que desactivar la interfaz hasta que el usuario inicia la sesión correctamente. De acuerdo con la idea de hacer el código reutilizable, vamos a desarrollar el componente de inicio de sesión en un archivo Flash y luego simplemente dejarlo en su lugar cuando se haya completado. Comience por abrir la sesión de archivo de arranque de componentes, que ya tiene el diseño terminado para usted, como se muestra en la Figura 17.5. Todo lo que necesitas para estar preocupados es con el código detrás del componente de inicio de sesión.
448
FIGURA 17.5 El componente de inicio de sesión que ha sido previamente diseñado
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 guárdelo en la carpeta del proyecto con la FLA.
Ahora que el archivo se crea puede empezar a construir el código 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 sólo debe importar la clase MovieClip estándar, pero también va a requerir algunos nuevos. Estas nuevas clases se utilizarán para crear las acciones para deshabilitar la interfaz y el manejo de la interacción con el ratón. ? W 9 + 7+)> D ë "ë " ë - ë '- ë F 8 !4%4024 )>
449
W 944!4%40IJ W +++ X X X
Las propiedades de esta clase son los responsables de la gestión de eventos y la creación de referencias a la MovieClips creados en tiempo de ejecución. 8> 8VD >> M> 8 459 D >> 44 )> D >> 8? )> 54D 8 > !".M) - 45#4!4/D
El constructor de la clase LoginWindow es donde se establece la propiedad de contenedores. Aquí es también 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 código es estable. 944!4%40IJ W 44 5 D 4) + 4+>4! 4 I) >4+ !" OB
(4 JD 4) +4 4+>4! 4 I) >4+ !" OB 4(4 JD X
¬ El método redraw se llama cuando la interfaz cambia. Esto es principalmente una preocupación cuando el usuario tiene la posibilidad de redimensionar el escenario, aunque la mayoría de aplicaciones de sitios Web tienen un tamaño fijo. Este método tiene que tener algo de lógica en relación con el clip de bloqueo para asegurar que no se extrae más de una vez. El clip de bloqueo es un movieclip que elimina la interacción de la aplicación que obliga al usuario a iniciar sesión por "bloqueo" de los clics del ratón. 8944 0IJ> W 9I8? 554J W +++ X W +++ X +++ X
450
El contenido de la condicional para cuando el clip de bloqueo es nulo señala a la MovieClip bloqueo real utilizando el incorporado en la API de dibujo. 8? 540)> IJD 8? + 5,+GD 8? + +84I,2,,,,,,JD 8? + + 01I,B,B + % B + ( JD
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 código puede ser personalizado. La forma de evitar esto es crear una pseudo-Disabler. Esto no es más que un MovieClip colocado en el escenario, que atrapa a todas las interacciones con el ratón y lo cancela. Esto evita que el interfaz subyacente y la aplicación que se utilice hasta que este clip de bloqueo se retira. 8? +>4! 4 I) >4+1!!MC1B7(4 JD 8? +>4! 4 I) >4+1!!MB7(4 JD 8? +>4! 4 I) >4+ !" OB7(4 JD
Después 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 actualización necesaria. De hecho, si se llama al método estándar de volver a dibujar sin la condicional, cada vez que se vería de otro clip de bloqueo a medida que comienzan a acumularse. 8? +0 5 + % D 8? + 5 + ( D
Independientemente de si este es el primer paso del método de volver a dibujar o no, el clip de bloqueo debe ser reubicado. La ventana de inicio de sesión se coloca un punto muerto, lo que significa que puede calcular el relleno alrededor de ella, multiplica esto para crear un número negativo, y coloque el clip de bloqueo utilizando ese cálculo. > 99 48? 8? +757\$*D 8? +252\$*D
Cuando todos los cálculos están completos, puede añadir el bloqueador de MovieClip a la DisplayList, que le hace visible en la aplicación. I8? JD
Hacer que todos los cálculos basados en la posición antes de que el clip se agrega a la lista de visualización minimiza el parpadeo y saltar los objetos en su aplicación ¬
ActionScript 3 no tiene ningún tipo de gestión a fondo como lo que se encuentra en ActionScript y sus predecesores. El equivalente está tomando el id de un clip y de intercambio con otro clip. Esta parece ser la gestión de profundidad, excepto por el hecho muy importante que ActionScript se encarga de la reordenación, cuando se intercambian los niños. 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 aplicación: 44 + 0 4I4) B8? JD
¬ El último paso del método 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 método redraw (volver a dibujar) se llama, porque cambiar el tamaño de la etapa sería la casilla de ingreso sentarse en una posición no centrado. 4) +25I + % J$I4) +0 JD 4) +75I + ( J$I4) + JD
El cálculo 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 cálculo. ¬ El método close tiene una tarea: para eliminar la casilla de ingreso actual y permitir la aplicación para ser utilizado una vez más. El proceso de eliminación se consigue mediante la eliminación del niño contenedor, que contiene el cuadro de acceso y bloqueo de MovieClip. 8944 IJ> W 44 + 4+ > I44 JD X
¬ El método resetHandler se llama cuando se hace clic el botón de reinicio. Este método borra todos los mensajes de estado y se vacía la información de acceso y campos de contraseña. >944 (4 I) >4J> W 4) + 4+25#/D 4) + 0 +25#/D 4) + 4 2+25#/D X
¬ El método loginHandler se adjunta al evento Click del loginBtn. Este método se llama cuando el loginBtn se hace clic con el ratón. >9444(4 I) >4J> W +++ X
45
Este método es responsable de comprobar el nombre de usuario y contraseña para campos de datos válidos. Si uno de estos ámbitos está vacía, salir de la función y un mensaje de respuesta aparece debajo del campo de la contraseña. 4) + 4 2+25#/D 9I4) + 4+255#/LL4) + 0 +255#/J W 4) + 4 2+25# 4N 0 @ /D
4D X
Si el nombre de usuario y contraseña son campos con los valores aceptables, los valores se almacenan en la propiedad data, que será leído por el guión de llamadas en un controlador de eventos personalizados. 5W 44) + 4+2B 0 4) + 0 +2 XD
La última parte de este método es disparar un evento personalizado, alertando a la secuencia de comandos de llamada que un nombre de usuario y contraseña han sido capturados y deben ser validados. >4I40>4I!".M) JJD
Este componente ha sido desarrollado para separar la pantalla y la lógica de la seguridad, lo que significa que el componente puede ser reutilizado, porque nada está codificada en la lógica de inicio de sesión real. El último método real es un setter, que se utiliza para establecer la cadena en el exterior de respuesta. Este será llamado desde el loginHandler si la validación falla y no desea mostrar al usuario para que él o ella puede intentar otra contraseña o nombre de usuario. 8944 4 - 4I - 4J> W 4) + 4 2+25 D X
El método dummyHandler no tiene ninguna funcionalidad. Se utiliza para bloquear los eventos de ratón que se producen en el movieclip de bloqueo. Este método es necesario porque un controlador de eventos necesita una función válida, y si se define un anónimo, se crea una pérdida de memoria lenta. >9447(4 I) >4J> W 44 X
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 sesión para interactuar con la base de datos que realmente buscan los usuarios reales de intentar iniciar sesión.
453
Esta es la clase LoginWindow completa. ? W 9 + 7+)> D 9 ++14D 9 +>4 +>4D 9 +>4 +) >4D 9 +4+\D 8 !4%4024 )> W 8> 8VD >> M> 8 459 D >> 44 )> D >> 8? )> 54D 8 > !".M) - 45#4!4/D 944!4%40IJ W 44 5 D 4) + 4+>4! 4 I) >4+ !" OB
(4 JD 4) +4 4+>4! 4 I) >4+ !" OB 4(4 JD X 8944 0IJ> W 9I8? 554J W 8? 540)> IJD 8? + 5,+GD 8? + +84I,2,,,,,,JD 8? + + 01I ,B ,B + % B + ( JD 8? +>4! 4 I ) >4+1!!MC1B 7(4 JD 8? +>4! 4 I ) >4+1!!MB 7(4 JD 8? +>4! 4 I ) >4+ !" OB 7(4 JD X
454
W 8? +0 5 + % D 8? + 5 + ( D X > 99 48? 8? +757\$*D 8? +252\$*D I8? JD 44 + 0 4I4) B8? JD 4) +25I + % J$ I4) +0 JD 4) +75I + ( J$ I4) + JD M> 85 D X 8944 IJ> W 44 + 4+ > I44 JD X >944 (4 I) >4J> W 4) + 4+25#/D 4) + 0 +25#/D 4) + 4 2+25#/D X >9444(4 I) >4J> W 4) + 4 2+25#/D 9I 4) + 4+255#/LL 4) + 0 +255#/J W 4) + 4 2+25 # 4N 0 @ /D
4D X 5W 44) + 4+2B 0 4) + 0 +2 XD >4I40>4I!".M) JJD X 8944 4 - 4I - 4J> W 4) + 4 2+25 D X
455
>9447(4 I) >4J> W X X X
~ El siguiente paso es poner a prueba el componente de inicio de sesión para asegurarse de que todo está funcionando correctamente. El primer paso es crear una nueva instancia del componente LoginWindow de forma autónoma FLA, o puede utilizar la muestra que se encuentra el archivo con el código del libro Código. > 4!4%40540!4%40IJD
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 contraseña y luego haga clic en el botón Iniciar sesión. 4+>4! 4 I!4%40+!".M) B4(4 JD
Después de cargar el componente de ventana de inicio y el controlador de eventos adecuado es asignado, el siguiente paso es añadir a la lista de visualización, que hace visible. I4JD
Ñ Usted quiere asegurarse de que cualquier modificación a la etapa vuelve a dibujar el componente de acceso, o los artículos que están siendo bloqueados accidentalmente pueden situarse más allá del bloqueo de MovieClip. +45-4+ M!D + )5--)+.M- !D +>4! 4 I>4+1-"aB 1 :(4 JD
Después que el evento se asigna al objeto de escena, es necesario crear la función que se hace referencia en el detector de eventos. Para esta aplicación, el controlador simplemente hace una llamada al método de volver a dibujar el componente de acceso. En una aplicación en el mundo real puede que tenga más funcionalidad en este evento, pero por ahora esto está muy bien para las pruebas. 944 1 :(4 I>4J> W 4+ 0IJD X
¬ ! La siguiente función se usa para manejar los intentos de acceso. Para simplificar, esta función tiene un nombre de usuario y contraseña predefinidos, que posteriormente se sustituye con un servicio remoto en la siguiente sección. Si se llega a un inicio de sesión válida, se llama el método de cierre de la componente de acceso. Esto elimina el cuadro de inicio de sesión y permite la aplicación de ese período de sesiones. 456
9444(4 I>4J> W 9I4++ 455# /NN4++ 0 55 # /J W " X X
Esta aplicación no almacena los inicios de sesión, lo que significa el inicio de sesión es válida sólo para la sesión activa. Los usuarios tendrán que iniciar sesión cada vez que visitan la aplicación* La función de loginHandler se encarga de los inicios de sesión con éxito, pero no notifica al usuario de un intento de acceso incorrecto. Esto se puede solucionar mediante la adición de una declaración más que actualiza el cuadro de respuesta en el cuadro de inicio de sesión. 9444(4 I>4J> W 9I4++ 455# /NN4++ 0 55 # /J W 4+ IJD X " "#ë $ X
El último paso es hacer la llamada inicial al evento resize señalar el componente de acceso para la primera vez. Usted también puede llamar al método de volver a dibujar directamente, en lugar de pasar por el evento resize. + >4I40>4I>4+1-"aJJD
Aquí está el código completado para esta prueba. La mayoría de los componentes de conexión es manejado internamente pero ofrece facilidad de uso final. > 4!4%40540!4%40IJD 4+>4! 4 I!4%40+!".M) B4(4 JD I4JD +45-4+ M!D + )5--)+.M- !D +>4! 4 I>4+1-"aB 1 :(4 JD 944 1 :(4 I>4J> W 4+ 0IJD X 9444(4 I>4J> W I#!4/JD I# 4#E4++ 4JD I# 0 #E4++ 0 JD
457
9I4++ 455# /NN4++ 0 55 # /J W I# 4/JD 4+ IJD X W 4+ 4 - 45# 44 0 4
/D X X + >4I40>4I>4+1-"aJJD
Ahora que ha completado el código 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 película, con exclusión de la pantalla de conexión, como se muestra en la Figura 17.6, hasta que escriba la dirección de acceso. FIGURA 17.6 Ejemplo de aplicación que muestra el componente de inicio de sesión
458
~~ El siguiente paso en la construcción del sistema de acceso para conectarse a la base de datos de los usuarios, ya que un nombre de usuario y la contraseña codificada no es muy práctico y ciertamente no segura. ¬ El primer paso es crear la mesa del usuario en la base de datos existente:
1 !b bI bb4I**J..!!M4 4B b 4b> IGJ9.!!B b 0 b> IH,J9.!!B b>b> I*J9Q*RB 1")1OIbbJ J.".5)7"-)D
Entonces usted puede rellanar la tabla con algunos de los inicios de sesión de la muestra para realizar pruebas: ".-1". I 4B 0 JC!-IQ RB )GIQ RJJD ".-1". I 4B 0 JC!-IQ7RB )GIQ8 RJJD
Una clara diferencia de los inicios de sesión predefinidos en Flash es que estos inicios de sesión tienen contraseñas encriptadas como un nivel adicional de seguridad. Antes de que usted puede agregar la lógica de la conexión al servicio, es necesario crear la clase de PHP. Esta clase de verificación para los usuarios válidos, y si se encuentra uno, se volverá un verdadero, lo que significa que el usuario es válido y el cuadro de inicio de sesión puede ser removido. 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: ;
@ M4Q8 44 + RD 24 8 44 W 944 IJ W +++ X X ;3
459
¬ El primer método, y sólo en esta clase es de acceso. Este método acepta dos argumentos: el nombre de usuario y contraseña para validar. La primera parte de este método es crear una nueva conexión a la base de datos: \\ \ ? \S \S 4 9 4 \ 9444I< B< J W <4?5< $3 444IJD X
Cuando se establece la conexión de base de datos, puede marcar el usuario como no conectado. Esto impide cualquier posible intento de hacking que accidentalmente podría hacer un registro de usuario. <"459 D
Lo siguiente es la consulta SQL que intenta validar el nombre de usuario y contraseña de combo. La contraseña se pasa a la función md5 ya que Flash envía la contraseña en texto claro, pero la base de datos almacena el resultado de md5. <@ 75 49I#-! \1) %(1 45RT R. 0 5)GIQT RJ/B< BI< JJD
El siguiente paso es hacer la llamada base de datos y almacenar la respuesta en la variable $result, como se muestra en el siguiente código: < 57 @M@ 7I<@ 7B<4?JD
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 válidos y el usuario se ha autenticado basada en las credenciales que él o ella pasa a lo largo. Cuando una respuesta válida se encuentra, la variable $loggedIn se establece como verdadera para informar a Flash que el usuario es, en realidad, válida y ha ingresado exitosamente. 9I7 @M4M 0 I< J3,J W <"45 D X
El último paso es devolver el resultado de manera que Flash puede actuar en consecuencia.
4
7IQ 4 R53<"4JD
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 instalación de AMFPHP si no lo han hecho: ;
@ M4Q8 44 + RD 24 8 44 W \\ \ ? \S \S 4 9 4 \ 9444I< B< J W <4?5< $3 444IJD <"459 D <@ 75 49I#-! \1) %(1 45RT R. 0 5)GIQT RJ/B< BI< JJD < 57 @M@ 7I<@ 7B<4?JD 9I7 @M4M 0 I< J3,J W <"45 D X
4
7IQ 4 R53<"4JD X X ;3
Ñ 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. > 07. 444D > 071!- 45# 9 07+ /D
El ejemplo original fue el de validación de usuario directamente en el archivo de Flash. Si bien esto era funcional, no era muy práctico porque sólo un usuario o la contraseña puede ser utilizado.
461
Este nuevo sistema modifica la función loginHandler existentes mediante la adición de una llamada de servicio remoto, enviando el nombre de usuario y la contraseña que fue capturado por la ventana de conexión de componentes. 9444(4 I>4J> W I#!4/JD I# 4#E4++ 4JD I# 0 #E4++ 0 JD " 7 / ", " "* r " #* " $6 6 " ë6 " X
6
La clase Responder necesita un controlador de respuesta definida, por lo que la siguiente función 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. 94441 (4 I8VJ> W +++ X
Una declaración condicional simple se usa para determinar si el usuario se registra en base a la respuesta del servicio remoto. Si el usuario está conectado, una llamada al método de cierre del componente de conexión es hecha para ocultar la ventana de acceso y permitir la interfaz de la aplicación. 94441 (4 I8VJ> W " X
Una opción más es añadido para manejar los intentos de acceso incorrectos mediante la actualización del mensaje de respuesta del componente de inicio de sesión. 94441 (4 I8VJ> W 9I+ 4 55 J W 4+ IJD X
46
" "#ë $ X
¬ La última función 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 sesión con un cheque sin nombre de usuario o contraseña, el SQL sería 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. 9444I 4 8VJ> W I#8
/JD 9 I> 4 4 J W I##E 4 Z[JD X X
Ahora que el código remoto se ha añadido a la anterior componente de ejemplo de acceso, puede probarlo, y realmente no debería notar ninguna diferencia. El único cambio sería la posibilidad de usar más de un usuario, siempre y cuando se encuentra en la tabla de usuarios que ha creado al comienzo de esta sección. Aquí está el ejemplo de componentes de entrada con el código adecuado remoto incluido: > 07. 444D > 071!- 45# 9 07+ /D > 4!4%40540!4%40IJD 4+>4! 4 I!4%40+!".M) B4(4 JD I4JD +45-4+ M!D + )5--)+.M- !D +>4! 4 I>4+1-"aB 1 :(4 JD 944 1 :(4 I>4J> W 4+ 0IJD X 9444(4 I>4J> W I#!4/JD I# 4#E4++ 4JD I# 0 #E4++ 0 JD > 4 1 4 5401 4 I41 (4 B4JD 07540. 444IJD 07+44I071!JD 07+I# +4/B 4 B 4++ 4B
463
4++ 0 JD X 94441 (4 I8VJ> W I#1 4 #E+ 4 JD 9I+ 4 55 J W I# 4/JD 4+ IJD X W 4+ 4 - 45# 44 0 4
/D X X 9444I 4 8VJ> W I#8
/JD 9 I> 4 4 J W I##E 4 Z[JD X X + >4I40>4I>4+1-"aJJD
" La última sección de este capítulo está ultimando el reproductor de vídeo. Deberá implementar el componente de acceso que construyó en la sección anterior y aprender a utilizar una biblioteca externa.
La ventaja de utilizar una biblioteca externa es que sólo tiene que actualizar un sitio y todas las instancias de que el uso de la biblioteca también se actualizan. Por ejemplo, imagine que tiene un logotipo con un color específico 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 continuación, la actualización de los casos, que reflejen automáticamente los cambios. Usted puede utilizar este concepto para mucho más que un logotipo simple, porque se le carga el componente de inicio de sesión desde el archivo de ejemplo que construyó en la sección anterior.
Ñ Comience por abrir el archivo VideoPlayer.fla si no lo está. A continuación, seleccione Archivo O Importar O Abrir biblioteca externa.
464
En este cuadro de diálogo, usted puede navegar hasta el directorio donde el componente de inicio de sesión 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 diseño, que se copia automáticamente cuando se arrastra el padre. Ahora que se añade el componente de acceso, puede modificar la clase VideoPlayer archivo existente para añadir esta nueva funcionalidad. Para empezar, agregar la creación de componentes, pero olvídate de la lógica de inicio de sesión. El nuevo código debe ser añadido a la función constructora, similar a la siguiente: 944C 7 IJ W 071!5# 9 07+ /D IJD > 7 +> 859 D >! 8+4859 D " r" 9 r" 9 " -r r" 9 r4G),Ñ-'(6 " 7 " " X
Antes de probar el código, agregue el método loginHandler para evitar errores de tiempo de ejecución. Puede agregar este método en cualquier punto en el código. Recomiendo en algún lugar hacia la parte inferior de la clase para mantener el flujo general del archivo. >944 ?4(4 I 4 8VJ> W +++ X " 7 4%1 X
El último paso es importar la clase LoginWindow por lo que la propiedad estática puede ser cargado por el controlador de eventos. ? W 9 + 7+)> D 9 +>4 +>4D 9 +4+\D ë r" 9 8 C 7 24 )> W
465
+++ X X
Al probar la aplicación que debe consultar inmediatamente a la ventana de inicio de sesión. Porque no agregar ninguna lógica en este momento, no hay manera de cerrar la ventana de acceso, pero se puede ver que está funcionando, lo que puede continuar. La lógica, que es responsable de llamar al servicio remoto, debe ser añadido a la método loginHandler existente. 9444(4 I>4J> W " 7 / ", " "* r " #* " $6 6 " ë6 " X
6
El siguiente paso es copiar el loginRespHandler y añadir por debajo de loginHandler en la clase VideoPlayer. 94441 (4 I8VJ> W I#1 4 #E+ 4 JD 9I+ 4 55 J W I# 4/JD 4+ IJD X W 4+ 4 - 45# 44 0 4
/D X X
El código correcto se ha añadido ahora a la clase VideoPlayer, sin embargo, hay una modificación final necesaria antes de que el componente de inicio de sesión funcione correctamente. La variable de sesión que se define en el constructor debe ser una propiedad global, porque tal y como está ahora, ningún otro método de esta clase tiene acceso a ella. ? W +++ 8 C 7 24 )> W +++ >> ".8 D >> 4!4%40D
466
944C 7 IJ W +++ 4540!4%40IJD X X X
Ahora que la variable de sesión está definido correctamente, puede probar la aplicación, como se muestra en la Figura 17.7. Usted debe ser capaz de escribir un nombre de usuario y contraseña válidos, y el componente de inicio de sesión debería desaparecer cuando lo haga. FIGURA 17.7 Reproductor de vídeo con Final caja de ingreso visible
Como se puede ver, el componente de inicio de sesión que se está construyendo de esta manera que realmente hace posible añadir a cualquier proyecto existente. Para ampliar sobre este ejemplo, usted podría agregar un objeto compartido que se preserve la sesión y hacer que lo que el usuario no necesita entrar en cada tiempo. Usted debe ahora tener una gran comprensión de la construcción y de trabajo con tecnología avanzada, las aplicaciones del mundo real. Estoy seguro de que usted está pensando en muchas aplicaciones diversas para construir después de ver cómo funcionan en profundidad.
467
El siguiente es un cuadro que delinea los nombres de los archivos y donde deben ser almacenados para esta aplicación completa. La ruta de acceso se basa en el directorio del proyecto que debe estar en su directorio de Apache para que la aplicación funcione correctamente.
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
.
En este capítulo, se inició la construcción de un reproductor de video muy básicos y amplió ese concepto para construir un reproductor de vídeo multicategory. Uso de PHP para manejar los datos entre Flash y la base de datos ha presentado la solicitud más dinámico. Una vez que ha completado el reproductor de vídeo, comenzó a expandirse en añadir el seguimiento de vídeo. Usted aprendió lo fácil que era la aplicación de nuevas características en el código existente basado en la forma original de la aplicación del reproductor de vídeo que se desarrolló en la sección anterior. La cuarta parte del capítulo 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 sesión que desactive la solicitud hasta que el usuario se conecte. El quinto y último traía todas estas técnicas en conjunto para desarrollar una aplicación de reproductor de vídeo final en el mundo real con un módulo de acceso y seguimiento de vídeo 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 aplicación reproductor de vídeo.
468