UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN CICLO: 01/2015 Nombre de la Practica: Lugar de Ejecución: Tiempo Estimado: MATERIA: DOCENTES: GUIA DE LABORATORIO #4 Funciones en PHP Centro de Cómputo 2 horas con 30 minutos Lenguajes Interpretados en el Servidor Ing. Ricardo Ernesto Elías G. / Ing. Miguel Eduardo García O. I. OBJETIVOS Que el estudiante: Adquirir el dominio de la sintaxis y el uso de funciones con el lenguaje PHP. Lograr la habilidad necesaria para la declaración de funciones con o sin argumentos y con devolución o no de valores. Hacer uso de características avanzadas de las funciones como la lista variable de argumentos, las funciones variables y recursividad. Hacer uso de la modularidad para crear scripts que serán incluidos dentro de un script principal. II. INTRODUCCION TEORICA Funciones Una función es un bloque de código independiente y autónomo que contiene un grupo de instrucciones que se identifican con un nombre. Las funciones pueden invocarse todas las veces que se requiera desde cualquier punto de un script. El código de las funciones puede aparecer dentro del script que se esté realizando o puede ser parte de un script independiente que será llamado como archivo de inclusión (otro script PHP invocado). Generalmente, cuando se realizan scripts con PHP las instrucciones se ejecutan conforme van siendo procesadas por el intérprete del lenguaje. Sin embargo, a la hora de realizar scripts más complejos, hay ocasiones en las que el mismo código ha de ser ejecutado más de una vez. Para estos casos sería útil que el lenguaje de programación permitiera dividir el código en segmentos más pequeños, de forma que cada bloque de código PHP pudiera ser agrupado bajo un identificador para que pudiera ser accedido de forma independiente. PHP permite la creación de funciones que permiten recoger todos los aspectos planteados anteriormente. Una función permite desarrollar una tarea concreta y bien definida. Se encuentra separada del resto de instrucciones del programa y se le asigna un nombre para que posteriormente pueda ser llamada desde otro punto del script, o incluso, desde otro script. Es a través del nombre de la función que se pueden ejecutar las instrucciones contenidas en la función tantas veces como sea necesario. La utilización de funciones permite que un script aparezca escrito como una lista de referencias a las tareas que se deben hacer para crear una página de respuesta. Las funciones también pueden o no, aceptar parámetros o argumentos externos de los que dependa el proceso que deba realizarse para posteriormente devolver un valor. Sintaxis de las funciones en PHP En su forma más compleja una función se declara con la palabra reservada function. A continuación, se debe declarar el nombre de la función y posteriormente, y entre paréntesis, cada uno de los argumentos que 1 / 65 Guía # 4: Funciones en PHP recibirá separados por coma. En el caso más simple, sólo se colocan los paréntesis vacíos inmediatamente después del nombre de la función. Después de cerrar los paréntesis debe abrir llaves y colocar las instrucciones que realizará la función para luego cerrar la llave. La sintaxis se muestra a continuación: function nombre_funcion([$param1, $param2, … , $paramn]){ //bloque de instrucciones PHP } Como se puede ver, son necesarios los siguientes componentes en la declaración de una función: La palabra reservada function que debe utilizarse para indicar al intérprete de PHP que se va a crear una nueva función nombre_funcion indica el nombre con el que se va a identificar la función dentro del script PHP para su posterior llamada. $param1, $param2, ... , $paramn representan los parámetros necesarios para que la función pueda ser ejecutada. Los parámetros han de expresarse siempre entre paréntesis y separados por comas. Incluso si la función no necesitara ningún parámetro, deberán utilizarse los paréntesis. Bloque de instrucciones PHP, representa el conjunto de sentencias o instrucciones que se van a ejecutar cada vez que se haga una llamada a la función. Argumentos o parámetros de la función El diseño de una función puede o debería incluir la aceptación opcional de uno o más argumentos o parámetros que representarán valores que se pasan desde el exterior a la función. Esto permite que la función sea independiente del exterior, haciéndola más portable. Se puede entender un argumento o parámetro como una variable con ámbito local a la función que sirve para almacenar valores que son pasados a la función. Los argumentos o parámetros se especifican colocando nombres de variables entre los paréntesis de la definición de la función: function myfunction($parametro1, $parametro2){ //Código de la función } Devolución de valores Casi siempre será importante que la función creada devuelva un valor antes de finalizar la ejecución. Aunque también existirán casos en los que la función pudiera realizar una tarea sin que devuelva valor alguno. La palabra reservada utilizada para devolver valores en las funciones de PHP es return, igual que en otros lenguajes que usted ya conoce. Veamos los siguientes ejemplos: function square ($num) { return $num * $num; } echo square(4); // obtiene ’16’. ------------------------------------------function residuo($dividendo, $divisor){ $res = $dividendo % $divisor; return $res; } No se puede devolver múltiples valores desde una función, pero un efecto similar se puede conseguir devolviendo una lista. function small_numbers(){ return array(0, 1, 2); } list($zero, $one, $two) = small_numbers(); Lenguajes Interpretados en el Servidor 2 Guía # 4: Funciones en PHP Apunte importante: Recuerde que a los valores que se le aportan a una función desde el exterior se les denomina parámetros o argumentos de la función. Los parámetros actúan como variables dentro de la función. Estas variables no pueden utilizarse fuera de ese ámbito. El valor que devuelva la función debe ser enviado utilizando la palabra reservada return y a continuación el nombre de la variable que contiene el resultado que se desea retornar al punto de llamada. Ventajas del uso de funciones a) Simplificación de código Las funciones hacen que el código de un script sea más fácil de leer, por tanto, lo hacen más entendible y más agradable a la vista del que tenga que leer el código. Esto es, porque evita el tener que repetir varias veces un segmento de código dentro de un mismo script. En lugar de ello se escribe una sola vez y luego dentro del script solamente hacemos la llamada a la función, en lugar de volverlo a escribir. b) Reutilización de código Permite que otros scripts, a parte del script donde se digitó el código de la función, puedan hacer uso de dicha función. Esto evita la carga del programador de tener que escribir la misma funcionalidad en diferentes scripts. c) Modularidad El uso de funciones permite que las modificaciones al código sean menos trabajosas para el programador, porque en lugar de tener que cambiar el mismo código en varios lugares de un script, solamente se modifica el código de la función y los scripts que la llaman no sufren modificación alguna (al menos, en la mayor parte de los casos). Funcionamiento de una función en PHP Aunque el comportamiento puede variar en algunos casos, la mayoría de las funciones siguen un proceso como el siguiente, una vez que son invocadas: 1. Aceptan uno, o más, valores, conocidos como argumentos, desde el script que la llama, 2. Realizan un proceso utilizando dichos valores (argumentos o parámetros), y 3. Devuelven el resultado y el control del programa al script que hizo la llamada. Aspecto de una función en PHP Características de las funciones de PHP (versión 4.2.X en adelante) 1. PHP no hace distinción entre mayúsculas y minúsculas para los nombres de las funciones. Pese a ello se recomienda ser consistente en el código que se escribe de tal forma que si se nombró a una función Cambiar, utilizar en el código siempre Cambiar, y no utilizar indistintamente, cambiar, CAMBIAR, CAMbiar, etc. Lenguajes Interpretados en el Servidor 3 Guía # 4: Funciones en PHP 2. 3. 4. 5. Al igual que con las variables, podemos hacer referencia (una llamada) a una función antes de definirla en el código. Existe una excepción, que se da cuando la función ha sido definida condicionalmente. En ese caso la definición debe preceder a la llamada. No se puede redefinir una función o eliminar su definición. Esto se debe a que PHP no soporta sobrecarga de funciones como otros lenguajes de programación. Por ejemplo C++. Las últimas versiones de PHP, (4 o superior) soportan el uso de lista variable de argumentos en las funciones. Se pueden utilizar parámetros por defecto en las funciones asignándole un valor inicial dentro de la definición de los parámetros de la función. Tipos de funciones. En PHP podemos utilizar las funciones incorporadas del lenguaje (abs(), list(), array(), chr(), intval(), trim(), substr(), printf(), time(), date(), etc.) o pueden realizarse funciones definidas por el usuario. Las funciones incorporadas del lenguaje se comportan de la forma predeterminada para la que fueron creadas. Existen muchas funciones incorporadas o predefinidas en PHP. Algunas ya las hemos utilizado en guías anteriores. Por ejemplo: gettype(), settype(), print(), printf(), substr(), date(), etc. Las funciones definidas por el usuario, o personalizadas, son creadas por el programador y su funcionalidad y utilidad dependen en gran medida de la habilidad del programador. La ventaja de las segundas es que el programador posee un control completo sobre ellas, ya que puede hacer que una función se comporte exactamente del modo que se desea. Parámetros de las funciones La información puede suministrarse a las funciones mediante la lista de parámetros, una lista de variables y/o constantes separadas por comas. PHP soporta pasar parámetros por valor (el comportamiento por defecto), por referencia, y parámetros por defecto. Listas de longitud variable de parámetros sólo están soportadas en PHP4 y posteriores. Un efecto similar puede conseguirse en PHP3 pasando un array de parámetros a la función: function takes_array($input) { echo "$input[0] + $input[1] = ", $input[0]+$input[1]; } Pasar parámetros por referencia Por defecto, los parámetros de una función se pasan por valor (de manera que si se cambia el valor del argumento dentro de la función, el valor pasado fuera de ella no se ve alterado). Si se desea permitir a una función modificar el valor de sus parámetros, deben ser pasados por referencia. Para hacer que una función pase sus parámetros por referencia existen dos métodos: Anteponiendo un símbolo de ampersand (&) al nombre del parámetro o argumento en la definición de la función. Esto hará que siempre que se mande un parámetro a la función en la llamada, este será enviado por referencia. Por ejemplo: function add_some_extra(&$string){ $string .= ' y algo más.'; } $str = ’Esto es una cadena, ’; add_some_extra($str); echo $str; // Saca ’Esto es una cadena, y algo más.’ Anteponer el símbolo de ampersand (&) al nombre del parámetro en la llamada a la función. Este método se debe aplicar si se desea pasar una variable por referencia a una función que no toma el parámetro por referencia por defecto; es decir, si no se especificó en la definición de la función. $num = 10; function called_function($number){ //En la declaración no indica que //el parámetro sea por referencia $number = $number +1; Lenguajes Interpretados en el Servidor 4 Guía # 4: Funciones en PHP echo $number, "\n"; } called_function(&$num); //Se le pasa el parámetro por //referencia a la función echo $num, "\n"; Parámetros por defecto Una función puede definir valores por defecto para los parámetros escalares estilo C++. Esto significa que si al llamar a una función, que requiere parámetros, estos no se especifican, se le asignará a estos un valor por defecto. Veamos el siguiente ejemplo: function makecoffee($type = "cappucino"){ return "Hacer una taza de $type.\n"; } echo makecoffee(); //Se llama a la función sin indicar parámetro echo makecoffee("espresso"); //Se llama a la función usando parámetro La salida del fragmento anterior es: Hacer una taza de cappucino. Hacer una taza de expresso. El valor por defecto tiene que ser una valor literal, y no una variable o miembro de una clase. En PHP 4.0 también es posible especificar unset como parámetro por defecto. Esto significa que el argumento no tomará ningún valor en absoluto si el valor no es suministrado. Destacar que cuando se usan parámetros por defecto, estos tienen que estar a la derecha de cualquier parámetro sin valor por defecto; de otra manera las cosas no funcionarán de la forma esperada. Considera el siguiente fragmento de código: function makeyogurt ($type = "acidophilus", $flavour) { return "Haciendo un bol de $type $flavour.\n"; } echo makeyogurt ("mora"); // No funcionará de la manera esperada La salida del ejemplo anterior es: Warning: Missing argument 2 in call to makeyogurt() in usr/local/etc/httpd/htdocs/php3test/functest.html on line 41 Haciendo un bol de mora. Y ahora, compáralo con: function makeyogurt ($flavour, $type = "acidophilus") { return "Haciendo un bol de $type $flavour.\n"; } echo makeyogurt ("mora"); // funciona como se esperaba La salida de este ejemplo es: Haciendo un bol de acidophilus mora. Funciones variables En la mayoría de casos las llamadas a función se realizan con el identificador de la función de forma directa, sin embargo, en PHP es posible asignar el identificador a una variable de cadena y hacer que en la llamada a función se utilice esta variable en lugar del nombre o identificador de la función. Por ejemplo: $funcion = "potencia"; $valor = 3; echo "$valor elevado al cuadrado es: " . $funcion(3) . "<br />"; Lenguajes Interpretados en el Servidor 5 Guía # 4: Funciones en PHP //Definición de la función sqrt function sqrt($numero){ return $numero * $numero; } Aunque este ejemplo es bastante trivial, el verdadero potencial de las funciones variables se puede experimentar al realizar retrollamadas (callbacks), definiendo una matriz (array) con los nombres de varias funciones haciendo que un ciclo o lazo recorra los nombres de las funciones para que realice cada una el cálculo con uno o varios valores con las distintas funciones definidas. Por ejemplo: $trigFunctions = array("sin", "cos", "tan"); //Funciones predefinidas PHP $degrees = 30; foreach($trigFunctions as $myfunction){ echo "\$myfunction(\$degrees) = " . $myfunction(deg2rad($degrees)) . "<br />"; } Alcance de las variables en PHP. La palabra alcance o ámbito hace referencia a las partes del programa que pueden tener acceso a una variable. La vida de una variable es el tiempo durante el cual existe. En PHP las variables pueden tener tres tipos de alcance: a) Local. Las variables locales son visibles dentro de una función y su vida acaba justo cuando la ejecución de la función termina. Por defecto, todas las variables que se declaran dentro de una función son locales en la función. Esto significa que estas variables no son accesibles desde fuera de la función y mueren cuando la función termina. Ejemplo: <?php //Variable global, visible afuera de las funciones $friend = "Carlos"; function who(){ //Variable local que muere cuando acaba la función $friend = "Juan"; printf("<p>Dentro de la funci&oacute;n tu amigo es: %s.</p>", $friend); } //Llamada a la función who() who(); printf("<p>Fuera de la funci&oacute;n tu amigo es: %s.</p>", $friend); ?> Al ejecutar el script obtenemos lo siguiente: b) Global. Las variables globales son visibles en todo un script, y normalmente no lo son para una función. Dentro de una función no se puede acceder a las variables que se han declarado fuera de ella, a menos que la pasemos por referencia a la función en forma de argumento. Otra forma de hacer que una función acceda a una variable externa a la función es utilizando la palabra reservada global antes del nombre de la variable. Ejemplo: Usando argumento por referencia <!DOCTYPE html> <html lang="es"> <head> <title>Argumento a funci&oacute;n</title> Lenguajes Interpretados en el Servidor 6 Guía # 4: Funciones en PHP </head> <body> <?php //function raise_sal(&$salary){ function raise_sal(&$salary){ //global $salary; $salary *= 1.1; } $salary = 50000; //raise_sal(); raise_sal($salary); ?> &iexcl;Felicidades!, su nuevo salario es: . <?= "$" . $salary ?><br /> </body> </html> Al ejecutar el script obtenemos lo siguiente: Ejemplo <!DOCTYPE html> <html lang="es"> <head> <title>Argumento a funci&oacute;n</title> </head> <body> <?php function raise_sal(){ $GLOBALS['salary'] *= 1.1; } $salary = 50000; raise_sal(); ?> &iexcl;Felicidades!, su nuevo salario es: . <?= "$" . $salary ?><br /> </body> </html> El resultado es: c) Estático. Las variables estáticas son locales en una función, pero retienen su valor entre distintas llamadas a la misma. Una variable estática no es visible fuera de la función, pero no muere cuando la función acaba. Cuando se inicializa una variable estática, esta no pierde su valor entre las distintas llamadas, recuerda el valor que tenía en la llamada anterior. Estas variables mueren hasta que termina el script. Ejemplo: <?php function trackname(){ static $count = 0; $count++; echo "<p>Has ingresado a esta p&aacute;gina $count veces</p>"; } //Invocar varias veces a la función trackname() trackname(); trackname(); trackname(); trackname(); ?> Lenguajes Interpretados en el Servidor 7 Guía # 4: Funciones en PHP El resultado es: Funciones incorporadas de PHP PHP proporciona un gran número de funciones incorporadas, que ya están listas para su utilización inmediata. Lo único que debe hacerse es invocarlas, para lo que necesitará conocer su sintaxis, los argumentos que se requieren para hacer la llamada a la función y el tipo de valor que devuelve para asignarlo a alguna variable u operar con el resultado en el punto de llamada a la función dentro del script principal. Entre los tipos de funciones más utilizados están: Funciones para manejo de caracteres. En PHP existen funciones que permiten trabajar con cadenas de caracteres que podemos dividir en varias subcategorías. Por ejemplo, funciones para limpiar espacios en blanco, como trim(), ltrim(), rtrim() o chop(), funciones para cambiar de mayúsculas a minúsculas y viceversa, como strtolower() y strtoupper(), funciones para obtener partes de una cadena o un indicador de posición de coincidencia de una subcadena dentro de otra cadena; es decir obtener subcadenas de una cadena más larga, como substr(), strpos(), strstr(), explode(), etc. Funciones de búsqueda, reemplazo y comparación en cadenas. Estas funciones permiten realizar búsqueda de una cadena dentro de otra más larga, reemplazar ciertos caracteres de una cadena por otros o comparar una cadena con otra, como htmlentities(), substr_replace(), str_ireplace(), strcmp(), strncmp(), strcasecmp(), etc. Funciones de fecha y hora. Estas funciones permiten trabajar con fechas en PHP, ya sea para obtener algo conocido como la marca de tiempo de la era UNIX o para mostrar datos específicos de una fecha y hora, como el día, el mes, el año, la hora, los minutos y hasta los segundos. Las funciones de fecha de PHP son, entre otras: time(), mktime(), date(), checkdate(), date_default_timezone_get(), date_default_timezone_set(), etc. Funciones para manejo de archivos y directorios. Otro conjunto de funciones útiles, en este caso para el manejo de archivos, son las funciones: fopen(), fread(), fwrite(), feof(), fgetc(), fgets(), fputs(), fseek(), rewind(), ftell(), fclose(), etc. Funciones para manejo de expresiones regulares. También existen algunas funciones de PHP relacionadas con el manejo de expresiones regulares. Entre estas se pueden mencionar: preg_match(), preg_match_all(), preg_replace(), preg_split(), etc. Funciones para trabajo con bases de datos. Las funciones para trabajar con bases de datos en PHP son diversas, dependiendo del tipo de gestor de bases de datos con el que se desea conectar. Es así que PHP proporciona un amplio número de funciones para trabajar con bases de datos MySQL, PostgreSQL, MSSQL e incluso Oracle, entre otras. En el caso de MySQL se puede trabajar usando las extensiones de MySQLi que son las más recomendadas por su rapidez como mysqli_connect(), mysqli_query(), mysqli_fetch_array(), mysqli_fetch_assoc(), mysqli_fetch_object, mysqli_errno(), etc. Lenguajes Interpretados en el Servidor 8 Guía # 4: Funciones en PHP Modularidad En PHP es posible hacer uso de la característica de modularidad utilizando las sentencias include() o require() para implementar la reutilización del código definido en archivos con código PHP. La sintaxis de estas sentencias son las siguientes: include('nombre_de_archivo'); ----------------------------require('nombre_de_archivo'); NOTA: Los paréntesis son opcionales. Si no se incluyen debe dejar espacio entre la palabra reservada include|require y el delimitador de cadena, que puede ser comilla simple o doble. En la sintaxis anterior ‘nombre_de_archivo’ es el nombre del archivo que se desea incluir o evaluar dentro del script que utiliza esta sentencia. Las instrucciones include() y require() son prácticamente idénticas, lo único que las diferencia es la forma en que procesan los errores; es decir, mientras que include() devuelve una advertencia (warning) cuando se produce un fallo por no encontrar el archivo que se pretende incluir, require() devolverá un error fatal al producirse el mismo problema. Existen dos variantes de estas funciones que se denominan include_once() y require_once(), respectivamente. Lo que las diferencia de las anteriores es que evitan un posible conflicto en caso de intentar incluir varias veces el mismo archivo. Un de las aplicaciones más útiles de estas funciones o de sus variantes es proporcionar modularidad en los programas o secuencias de comando PHP. También se pueden utilizar para incluir librerías de funciones o bibliotecas de clase. A manera de ejemplo concreto, puede imaginar una página que se divide en varias secciones lógicas, que luego son invocadas por un script principal que invoca a todas las partes para armar toda la página. Observe la imagen: La modularidad permite que se pueda dividir un script en scripts más pequeños y manejables que permitan realizar modificaciones de forma más rápida y ordenada; es decir, si en algún momento debe hacerse un cambio importante en un sitio creado con PHP, la modularidad permitiría modificar lo menos posible los scripts de la aplicación. Debería ser en la mayoría de los casos un sólo script el que debería de modificarse. Esto es una enorme ventaja para el programador. III. MATERIALES Y EQUIPO Para la realización de la guía de práctica se requerirá lo siguiente: No. Material 1 Guía de práctica #4: Funciones en PHP Lenguajes Interpretados en el Servidor 9 Cantidad 1 Guía # 4: Funciones en PHP 2 3 Computadora con WampServer, Sublime Text y PHP Designer instalados Memoria USB o disco flexible 1 1 IV. PROCEDIMIENTO Indicaciones: Asegúrese de digitar el código de los siguientes ejemplos que se presentan a continuación. Tenga en cuenta que el PHP Designer no es compilador solamente un editor. Por lo tanto, los errores de sintaxis los podrá observar únicamente hasta que se ejecute el script cargando la página en el navegador de su preferencia. Ejercicio #1: El siguiente ejemplo muestra cómo generar una tabla de multiplicar solicitando el número de la tabla al usuario a través de un formulario, luego, haciendo uso de una función se obtiene el valor ingresado y se crea la tabla de multiplicar de ese número. Note que esta función no recibe argumentos ni retorna valor alguno. Se valida el valor numérico que el usuario ingresa haciendo uso de validación en el cliente con JavaScript. Archivo 1: entrada.html <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Introducción de datos</title> <link type="text/css" rel="stylesheet" media="screen" href="css/form.css" /> <link href='http://fonts.googleapis.com/css?family=Days+One' rel='stylesheet' type='text/css'> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> <script type="text/javascript" src="js/validar.js"></script> </head> <body> <header id="D3"> <h1>Ejemplo de uso de Función</h1> </header> <section> <article> <form method="POST" action="tabla.php" name="frmingreso" id="frmingreso" class="elegantaero"> <h1> Cálculo del <span>factorial de un número</span> </h1> <ul> <li class="campo"> <label for="txtnumero">Número: </label> <input type="text" name="txtnumero" id="txtnumero" maxlength="3" placeholder="(Ingrese un número entero)" pattern="[0-9]{1,3}" required="required" /><br /> <span id="numbersOnly">Ingrese números enteros</span> </li> <li class="campo"> <input type="submit" name="enviar" value="Mostrar" class="button" />&nbsp; <input type="reset" name="limpiar" value="Cancelar" class="button" /> </li> </ul> </form> </article> </section> </body> </html> Lenguajes Interpretados en el Servidor 10 Guía # 4: Funciones en PHP Archivo 2: form.css * { margin:0; padding:0; } html, body { height: 100%; } body { /* Old browsers */ background: #f5f6f6; /* FF3.6+ */ background: -moz-linear-gradient(-45deg, #f5f6f6 0%, #dbdce2 21%, #b8bac6 49%, #dddfe3 80%, #f5f6f6 100%); /* Chrome,Safari4+ */ background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#f5f6f6), color-stop(21%,#dbdce2), color-stop(49%,#b8bac6), color-stop(80%,#dddfe3), colorstop(100%,#f5f6f6)); /* Chrome10+,Safari5.1+ */ background: -webkit-linear-gradient(-45deg, #f5f6f6 0%,#dbdce2 21%,#b8bac6 49%,#dddfe3 80%,#f5f6f6 100%); /* Opera 11.10+ */ background: -o-linear-gradient(-45deg, #f5f6f6 0%,#dbdce2 21%,#b8bac6 49%,#dddfe3 80%,#f5f6f6 100%); /* IE10+ */ background: -ms-linear-gradient(-45deg, #f5f6f6 0%,#dbdce2 21%,#b8bac6 49%,#dddfe3 80%,#f5f6f6 100%); /* W3C */ background: linear-gradient(135deg, #f5f6f6 0%,#dbdce2 21%,#b8bac6 49%,#dddfe3 80%,#f5f6f6 100%); /* IE6-9 fallback on horizontal gradient */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f6f6', endColorstr='#f5f6f6',GradientType=1 ); font-size:15px; } #D3 { background:rgba(115,130,10,.75); border-bottom:1px solid rgba(215,68,78,.1); box-shadow: 0px 5px 10px rgba(0,0,0,.4); -webkit-box-shadow: 0px 5px 10px rgba(0,0,0,.4); -moz-box-shadow: 0px 5px 10px rgba(0,0,0,.4); -0-box-shadow: 0px 5px 10px rgba(0,0,0,.4); margin-bottom:16px; margin-top:16px; text-align:center; width:100%; } #D3 h1 { font-family:'Days One',sans-serif; font-size:3.6em; color:#fff; text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), Lenguajes Interpretados en el Servidor 11 Guía # 4: Funciones en PHP 0 0 0 0 3px 5px rgba(0,0,0,.2), 5px 10px rgba(0,0,0,.25), 10px 10px rgba(0,0,0,.2), 20px 20px rgba(0,0,0,.15); } /* Estilo del formulario Elegant Aero */ .elegant-aero { /* Old browsers */ background: #aebcbf; /* FF3.6+ */ background: -moz-linear-gradient(-45deg, #aebcbf 0%, #555a5b 50%, #686870 51%, #6e7774 100%); /* Chrome,Safari4+ */ background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#aebcbf), color-stop(50%,#555a5b), color-stop(51%,#686870), color-stop(100%,#6e7774)); /* Chrome10+,Safari5.1+ */ background: -webkit-linear-gradient(-45deg, #aebcbf 0%,#555a5b 50%,#686870 51%,#6e7774 100%); /* Opera 11.10+ */ background: -o-linear-gradient(-45deg, #aebcbf 0%,#555a5b 50%,#686870 51%,#6e7774 100%); /* IE10+ */ background: -ms-linear-gradient(-45deg, #aebcbf 0%,#555a5b 50%,#686870 51%,#6e7774 100%); /* W3C */ background: linear-gradient(135deg, #aebcbf 0%,#555a5b 50%,#686870 51%,#6e7774 100%); /* IE6-9 fallback on horizontal gradient */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#aebcbf', endColorstr='#6e7774',GradientType=1 ); margin-left:auto; margin-right:auto; max-width: 500px; padding: 20px 20px 20px 20px; font: 12px Arial, Helvetica, sans-serif; color: #fff; } .elegant-aero h1 { font: 2.2em "Trebuchet MS", Arial, Helvetica, sans-serif; padding: 10px 10px 10px 20px; display: block; /* Old browsers */ background: #ffb76b; /* FF3.6+ */ background: -moz-linear-gradient(top, #ffb76b 0%, #ffa73d 50%, #ff7c00 51%, #ff7f04 100%); /* Chrome,Safari4+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffb76b), color-stop(50%,#ffa73d), color-stop(51%,#ff7c00), color-stop(100%,#ff7f04)); /* Chrome10+,Safari5.1+ */ background: -webkit-linear-gradient(top, #ffb76b 0%,#ffa73d 50%,#ff7c00 51%,#ff7f04 100%); /* Opera 11.10+ */ background: -o-linear-gradient(top, #ffb76b 0%,#ffa73d 50%,#ff7c00 51%,#ff7f04 100%); /* IE10+ */ background: -ms-linear-gradient(top, #ffb76b 0%,#ffa73d 50%,#ff7c00 51%,#ff7f04 100%); /* W3C */ background: linear-gradient(to bottom, #ffb76b 0%,#ffa73d 50%,#ff7c00 51%,#ff7f04 100%); /* IE6-9 */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb76b', endColorstr='#ff7f04',GradientType=0 ); Lenguajes Interpretados en el Servidor 12 Guía # 4: Funciones en PHP border-bottom: 1px solid #B8DDFF; margin: -20px -20px 15px; } .elegant-aero h1>span { display: block; font-size: 0.5em; } .elegant-aero label>span { float: left; margin-top: 10px; color: #5E5E5E; } .elegant-aero label { display: block; margin: 0px 0px 5px; } .elegant-aero label>span { float: left; text-align: right; padding-right: 15px; margin-top: 10px; font-weight: bold; width: 20%; } .elegant-aero input[type="text"], .elegant-aero input[type="email"], .elegant-aero textarea, .elegant-aero select { box-shadow: inset 0px 1px 6px #ECF3F5; color: #888; border: 1px solid #C5E2FF; background: #FBFBFB; -webkit-box-shadow:inset 0px 1px 6px #ECF3F5; font: 200 12px/25px Arial, Helvetica, sans-serif; height: 30px; line-height:15px; margin: 2px 6px 16px 0px; outline: 0; padding: 0px 0px 0px 5px; width: 70%; } .elegant-aero textarea{ height:100px; padding: 5px 0px 0px 5px; width: 70%; } .elegant-aero select { background: #fbfbfb url('down-arrow.png') no-repeat right; background: #fbfbfb url('down-arrow.png') no-repeat right; appearance:none; -webkit-appearance:none; -moz-appearance: none; text-indent: 0.01px; text-overflow: ''; width: 70%; } .elegant-aero .button{ Lenguajes Interpretados en el Servidor 13 Guía # 4: Funciones en PHP background: #66C1E4; border: none; color: #FFF; box-shadow: 1px 1px 1px #4C6E91; -webkit-box-shadow: 1px 1px 1px #4C6E91; -moz-box-shadow: 1px 1px 1px #4C6E91; font-weight: Bold; padding: 10px 30px 10px 30px; text-shadow: 1px 1px 1px #5079A3; } .elegant-aero .button:hover{ background: #3EB1DD; } #numbersOnly { background:#ff3019; border:3px groove rgb(50,50,120); -moz-border-radius:15px; -webkit-border-radius:15px; -o-border-radius:15px; -md-border-radius:15px; border-radius:15px; color:White; font:Bold 8pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; padding:6px 8px; visibility:hidden; } ul { list-style-type:none; margin:0; padding:0; } li { display:block; line-height:2.1em; } Archivo 3: tabla.css #tablamulti, #enlace { margin:0 auto; width:18%; } #enlace { font:normal 12pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; text-align:center; } caption { color:rgb(30,30,30); font:bold 11pt "Lucida Sans",Tahoma,Helvetica,sans-serif; padding-bottom:6px; padding-top:6px; text-align:center; } table { border:3px groove rgb(111,3,6); border-collapse:collapse; Lenguajes Interpretados en el Servidor 14 Guía # 4: Funciones en PHP } th { background-color:rgb(233,122,155); border:2px solid rgb(111,5,9); border-collapse:collapse; font:bold 12pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; text-align:center; } td { border-collapse:collapse; border:2px solid rgb(111,5,9); background-color:rgb(225,225,225); text-align:center; font:normal 11pt "Lucida Sans",Tahoma,Helvetica,sans-serif; } Archivo 4: tabla.php <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Tablas de multiplicar</title> <link type="text/css" rel="stylesheet" media="screen" href="css/tabla.css" /> </head> <body> <section> <article> <?php function escribir_tabla(){ $num = (isset($_POST['txtnumero']) && is_int(intval($_POST['txtnumero']))) ? $_POST['txtnumero'] : 0; if($num != 0){ echo "<div id=\"tablamulti\">\n"; echo "<table>\n"; echo "\t<caption>Tabla del $num</caption>\n"; echo "\t<thead>\n\t\t<tr>\n\t\t\t<th colspan=\"3\">\n"; echo "\t\t\t\tTabla del número $num\n"; echo "\t\t\t\n</th>\t\t\n</tr>\t</thead>\n"; echo "\t<tbody>\n"; for($i=1; $i<=20; $i++){ echo "\t\t<tr>\n"; echo "\t\t\t<td>\n\t\t\t\t", $num, "&nbsp;*&nbsp;", $i, "\t\t\t</td>\n"; echo "\t\t\t<td>\n\t\t\t\t = \t\t\t</td>\n"; echo "\t\t\t<td>\n\t\t\t\t", $num*$i, "\t\t\t</td>\n"; echo "\t\t</tr>\n"; } echo "\t</tbody>\n"; echo "</table>\n"; echo "</div>\n"; } else{ die( "<p class=\"error\">El valor ingresado debe ser un número entero mayor que cero.</p>\n <div id=\"enlace\">\t\n<a href=\"entrada.html\">Regresar</a>\n</div>\n" ); } } escribir_tabla(); echo "<div id=\"enlace\">\t\n<a href=\"entrada.html\">Regresar</a>\n</div>\n"; Lenguajes Interpretados en el Servidor 15 Guía # 4: Funciones en PHP ?> </article> </section> </body> </html> Archivo 5: validar.js (function(){ //Agregar al manejador de evento load la función init()) if (window.addEventListener) window.addEventListener("load", init, false); else if (window.attachEvent) window.attachEvent("onload", init); // Buscar en el documento todos los elementos INPUT de tipo texto, ya que // solamente en ellos se va a registrar un controlador de evento. function init(){ var inputtag = document.getElementById("txtnumero"); // Hacer un recorrido por todos los campos del formulario if (inputtag.addEventListener){ inputtag.addEventListener("keypress", filter, false); } else { // No utilizamos attachEvent porque no llama a la función de controlador // con el valor correcto de la palabra clave this. En su lugar se invova // con el manejador de evento onkeypress inputtag.onkeypress = filter; } } // Este es el controlador keypress que filtra la entrada del usuario function filter(event) { // Obtener el objeto event y el código de carácter de la tecla pulsada // de forma compatible con todos los navegadores // Objeto de evento de la tecla var e = event || window.event; // tecla que se ha pulsado var code = e.charCode || e.keyCode; // // if // if // if Si se ha pulsado una tecla de función de cualquier tipo, no filtrarla Tecla de función (solo para Firefox) (e.charCode == 0) return true; Se mantienen presionadas Ctrl o Alt (e.ctrlKey || e.altKey) return true; Carácter de Ctrl en tabla ASCII (code < 32) return true; // Dejar pasar teclas de retroceso (BackSpace), tabulación (Tab), entrada (Enter), // escape (Scape) y espacios en blanco (SpaceBar) if (code==0 || code==8 || code==9 || code==13 || code==27 || code==32) return true; // Buscar la información de los caracteres válidos para este campo de entrada // Caracteres válidos var allowed = "0123456789"; // Mensaja a ocultar/mostrar var messageElement = document.getElementById("numbersOnly"); // Convertir el código de carácter a su carácter correspondiente var c = String.fromCharCode(code); // Comprobar si el carácter está dentro del conjunto de caracteres permitidos if (allowed.indexOf(c) != -1) { // Si c es un carácter legal, ocultar el mensaje, si es que existe. Lenguajes Interpretados en el Servidor 16 Guía # 4: Funciones en PHP if (messageElement) messageElement.style.visibility = "hidden"; return true; // Aceptar el carácter } else { // Si c no está en el conjunto de caracteres permitidos, mostrar el mensaje if (messageElement) messageElement.style.visibility = "visible"; // Y rechazar este evento keypress if (e.preventDefault) e.preventDefault(); if (e.returnValue) e.returnValue = false; return false; } } })(); El resultado visible en su navegador deber lucir así: Lenguajes Interpretados en el Servidor 17 Guía # 4: Funciones en PHP Ejercicio #2: El siguiente ejemplo muestra cómo generar la serie de Fibonacci solicitando al usuario el número de términos de la serie generada. Este dato es validado en el cliente y en el servidor. Archivo 1: fibonacci.php <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Serie de Fibonacci</title> <link rel="stylesheet" href="css/fonts.css" /> <link rel="stylesheet" href="css/form.css" /> <link rel="stylesheet" href="css/niko.css" /> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> <script type="text/javascript" src="js/validar.js"></script> </head> <body> <header id="vintage"> <h1>Serie de Fibonacci con recursividad</h1> </header> <section> <article> <?php //Función de Fibonacci recursiva function fibonacci($n){ if(($n == 0) || ($n == 1)) return $n; return fibonacci($n - 2) + fibonacci($n - 1); } if(isset($_GET['enviar'])): //Verificando el correcto ingreso de los datos $numero1 = isset($_GET['txtnumero']) ? $_GET['txtnumero'] : -1; if($numero1 == -1): $backlink = "\t<p>El valor del campo no es válido</p>\n"; $backlink .= "\t<a class=\"a-btn\" href=\"{$_SERVER['PHP_SELF']}\" title=\"Regresar\">\n"; $backlink .= "\t\t<span class=\"a-btn-symbol\">J</span>\n"; $backlink .= "\t\t<span class=\"a-btn-text\">Ingresar dato</span>\n"; $backlink .= "\t\t<span class=\"a-btn-slide-text\">nuevamente</span>\n"; $backlink .= "\t</a>\n"; echo $backlink; exit(0); endif; $tabla = "<table>\n"; $tabla .= "<caption>Generando serie de Fibonacci</caption>\n"; $tabla .= "<thead>\n\t"; $tabla .= "<tr>\n\t\t<th scope=\"col\">\n\t\t\tSecuencia\n\t\t</th>\n\t\t"; $tabla .= "<th scope=\"col\">\n\t\t\tValor\n\t\t</th>\n"; $tabla .= "<thead>\n"; $tabla .= "<tbody>\n\t"; $i = 0; while($i <= $numero1){ $class = $i%2 == 0 ? "odd" : "even"; $tabla .= "<tr class=\"$class\">\n\t\t<td>\n\t\t\tF<sub>$i</sub>\n\t\t</td>\n"; $tabla .= "\n\t\t<td>\n\t\t\t" . fibonacci($i) . "\n\t\t</td>\n</tr>\n"; $i++; } $tabla .= "<tbody>\n</table>\n"; echo $tabla; echo "<br />\n<a href=\"{$_SERVER['PHP_SELF']}\" title=\"Regresar\" class=\"abtn\">"; echo "\t\t<span class=\"a-btn-symbol\">J</span>\n"; echo "\t\t<span class=\"a-btn-text\">Ingresar</span>\n"; echo "\t\t<span class=\"a-btn-slide-text\">nuevos datos</span></a>"; else: Lenguajes Interpretados en el Servidor 18 Guía # 4: Funciones en PHP ?> <form action="<?= $_SERVER['PHP_SELF'] ?>" method="GET" class="elegant-aero"> <fieldset> <h1> Serie de <span>Fibonacci</span> </h1> <ul> <li class="campo"> <label for="numero1">Valores para serie: </label> <input type="text" name="txtnumero" id="txtnumero" size="4" maxlength="3" pattern="[0-9]{1,3}" required /> <span id="numbersOnly">Ingrese números</span> </li> <li class="campo"> <input type="submit" name="enviar" value="Generar" class="button" />&nbsp; <input type="reset" name="limpiar" value="Cancelar" class="button" /> </li> </ul> </fieldset> </form> <?php endif; ?> </article> </section> </body> </html> Archivo 2: fonts.css @font-face { font-family: 'LeagueGothic'; src: url('../fonts/League_Gothic.eot'); src: url('../fonts/League_Gothic.eot?#iefix') format('embedded-opentype'), url('../fonts/League_Gothic.woff') format('woff'), url('../fonts/League_Gothic.ttf') format('truetype'), url('../fonts/League_Gothic.svg#LeagueGothic') format('svg'); font-weight: normal; font-style: normal; } @font-face{ font-family: 'WebSymbolsRegular'; src: url('../fonts/websymbols-regular-webfont.eot'); src: url('../fonts/websymbols-regular-webfont.eot?#iefix') format('embeddedopentype'), url('../fonts/websymbols-regular-webfont.woff') format('woff'), url('../fonts/websymbols-regular-webfont.ttf') format('truetype'), url('../fonts/websymbols-regular-webfont.svg#WebSymbolsRegular') format('svg'); font-weight: normal; font-style: normal; } Archivo 3: form.css /* Estilo del formulario Elegant Aero */ .elegant-aero { /* Old browsers */ background: #aebcbf; /* FF3.6+ */ background: -moz-linear-gradient(-45deg, #aebcbf 0%, #555a5b 50%, #686870 51%, #6e7774 100%); /* Chrome,Safari4+ */ background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#aebcbf), color-stop(50%,#555a5b), color-stop(51%,#686870), color-stop(100%,#6e7774)); Lenguajes Interpretados en el Servidor 19 Guía # 4: Funciones en PHP /* Chrome10+,Safari5.1+ */ background: -webkit-linear-gradient(-45deg, #aebcbf 0%,#555a5b 50%,#686870 51%,#6e7774 100%); /* Opera 11.10+ */ background: -o-linear-gradient(-45deg, #aebcbf 0%,#555a5b 50%,#686870 51%,#6e7774 100%); /* IE10+ */ background: -ms-linear-gradient(-45deg, #aebcbf 0%,#555a5b 50%,#686870 51%,#6e7774 100%); /* W3C */ background: linear-gradient(135deg, #aebcbf 0%,#555a5b 50%,#686870 51%,#6e7774 100%); /* IE6-9 fallback on horizontal gradient */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#aebcbf', endColorstr='#6e7774',GradientType=1 ); margin-left:auto; margin-right:auto; max-width: 500px; padding: 20px 20px 20px 20px; font: 12px Arial, Helvetica, sans-serif; color: #fff; } .elegant-aero h1 { font: 2.2em "Trebuchet MS", Arial, Helvetica, sans-serif; padding: 10px 10px 10px 20px; display: block; /* Old browsers */ background: #ffb76b; /* FF3.6+ */ background: -moz-linear-gradient(top, #ffb76b 0%, #ffa73d 50%, #ff7c00 51%, #ff7f04 100%); /* Chrome,Safari4+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffb76b), color-stop(50%,#ffa73d), color-stop(51%,#ff7c00), color-stop(100%,#ff7f04)); /* Chrome10+,Safari5.1+ */ background: -webkit-linear-gradient(top, #ffb76b 0%,#ffa73d 50%,#ff7c00 51%,#ff7f04 100%); /* Opera 11.10+ */ background: -o-linear-gradient(top, #ffb76b 0%,#ffa73d 50%,#ff7c00 51%,#ff7f04 100%); /* IE10+ */ background: -ms-linear-gradient(top, #ffb76b 0%,#ffa73d 50%,#ff7c00 51%,#ff7f04 100%); /* W3C */ background: linear-gradient(to bottom, #ffb76b 0%,#ffa73d 50%,#ff7c00 51%,#ff7f04 100%); /* IE6-9 */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb76b', endColorstr='#ff7f04',GradientType=0 ); border-bottom: 1px solid #B8DDFF; margin: -20px -20px 15px; } .elegant-aero h1>span { display: block; font-size: 0.5em; } .elegant-aero label>span { float: left; margin-top: 10px; color: #5E5E5E; } .elegant-aero label { Lenguajes Interpretados en el Servidor 20 Guía # 4: Funciones en PHP display: block; margin: 0px 0px 5px; } .elegant-aero label>span { float: left; text-align: right; padding-right: 15px; margin-top: 10px; font-weight: bold; width: 20%; } .elegant-aero input[type="text"], .elegant-aero input[type="email"], textarea, .elegant-aero select { box-shadow: inset 0px 1px 6px #ECF3F5; color: #888; border: 1px solid #C5E2FF; background: #FBFBFB; -webkit-box-shadow:inset 0px 1px 6px #ECF3F5; font: 200 12px/25px Arial, Helvetica, sans-serif; height: 30px; line-height:15px; margin: 2px 6px 16px 0px; outline: 0; padding: 0px 0px 0px 5px; width: 70%; } .elegant-aero textarea{ height:100px; padding: 5px 0px 0px 5px; width: 70%; } .elegant-aero select { background: #fbfbfb url('down-arrow.png') no-repeat right; background: #fbfbfb url('down-arrow.png') no-repeat right; appearance:none; -webkit-appearance:none; -moz-appearance: none; text-indent: 0.01px; text-overflow: ''; width: 70%; } .elegant-aero .button{ background: #66C1E4; border: none; color: #FFF; box-shadow: 1px 1px 1px #4C6E91; -webkit-box-shadow: 1px 1px 1px #4C6E91; -moz-box-shadow: 1px 1px 1px #4C6E91; font-weight: Bold; padding: 10px 30px 10px 30px; text-shadow: 1px 1px 1px #5079A3; } .elegant-aero .button:hover{ background: #3EB1DD; } #numbersOnly { Lenguajes Interpretados en el Servidor 21 .elegant-aero Guía # 4: Funciones en PHP background:#ff3019; border:3px groove rgb(50,50,120); -moz-border-radius:15px; -webkit-border-radius:15px; -o-border-radius:15px; -md-border-radius:15px; border-radius:15px; color:White; font:Bold 8pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; padding:6px 8px; visibility:hidden; } ul { list-style-type: none; margin: 10px; padding: 0; } li { display: block; line-height: 2em; } Archivo 4: niko.css * { margin: 0; padding: 0; } html, body { height: 100%; } body { font-size: 16px; } #vintage h1 { text-align: center; margin: 15px auto; font-family: "LeagueGothic",sans-serif; font-size: 4em; text-transform: uppercase; color: Olive; text-shadow: 5px 5px 0px #eee, 7px 7px 0px #707070; } table { border-collapse: collapse; font-family: "Tahoma", Verdana, Arial, Helvetica, sans-serif; font-size: 75%; margin: 0 auto; width:24%; } caption { font-size: 400%; text-indent: -10000px; } thead tr { Lenguajes Interpretados en el Servidor 22 Guía # 4: Funciones en PHP /* Old browsers */ background: #9dd53a; /* FF3.6+ */ background: -moz-linear-gradient(45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* Chrome,Safari4+ */ background: -webkit-gradient(linear, left bottom, right top, color-stop(0%,#9dd53a), color-stop(50%,#a1d54f), color-stop(51%,#80c217), color-stop(100%,#7cbc0a)); /* Chrome10+,Safari5.1+ */ background: -webkit-linear-gradient(45deg, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* Opera 11.10+ */ background: -o-linear-gradient(45deg, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* IE10+ */ background: -ms-linear-gradient(45deg, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* W3C */ background: linear-gradient(45deg, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* IE6-9 fallback on horizontal gradient */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9dd53a', endColorstr='#7cbc0a',GradientType=1 ); border-top: 1px solid black; border-bottom: 1px solid black; } tfoot tr { background-color: #FFFFFF; } thead th { padding: 0.5em; white-space: nowrap; } tfoot th { font-size: 110%; text-align: right; padding-right: 0.5em; letter-spacing: 1px; background: } tfoot td { padding-left: 0.5em; color: red; font-size: 110%; font-weight: 600; } tfoot td:hover { background-color: red; color: white; } tr { background-color: #EAFDFF; } tr.odd { background-color: #E4EDC9; } Lenguajes Interpretados en el Servidor 23 Guía # 4: Funciones en PHP tbody tr:hover { background-color: #AAFF99; } td, th { border: 1px dotted #CCCCCC; } tbody td { padding: 0.5em; text-align: center; } td a:link, th a:link { color: black; } td a:visited, th a:visited { color: black; text-decoration: line-through; } td a:hover, th a:hover { color: purple; text-decoration: underline; } td:last-child a:hover { color: red; text-decoration: underline overline; } /* Estilos para los enlaces */ a { text-decoration: none; } .a-btn{ background:#9cedef; background:-webkit-gradient(linear,left top,left bottom,color-stop(#b7f2f4,0),colorstop(#7ce7ea,1)); background:-webkit-linear-gradient(top, #b7f2f4 0%, #7ce7ea 100%); background:-moz-linear-gradient(top, #b7f2f4 0%, #7ce7ea 100%); background:-o-linear-gradient(top, #b7f2f4 0%, #7ce7ea 100%); background:linear-gradient(top, #b7f2f4 0%, #7ce7ea 100%); filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#b7f2f4', endColorstr='#7ce7ea',GradientType=0 ); -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; padding:10px 30px 10px 70px; position:relative; float:left; display:block; left:43%; margin:12px auto; overflow:hidden; border:1px solid #90c6c8; border-color:#90c6c8 #78bdc0 #65b6ba; -webkit-box-shadow:0px -5px 0px 0px #458a8c, 0 1px 1px #d5d5d5, inset 0 1px 0 rgba(255,255,255,0.8); -moz-box-shadow:0px -5px 0px 0px #458a8c, 0 1px 1px #d5d5d5, inset 0 1px 0 rgba(255,255,255,0.8); Lenguajes Interpretados en el Servidor 24 Guía # 4: Funciones en PHP box-shadow:0px -5px 0px 0px #458a8c, rgba(255,255,255,0.8); -webkit-transition:all 0.2s linear; -moz-transition:all 0.2s linear; -o-transition:all 0.2s linear; transition:all 0.2s linear; } 0 1px .a-btn-symbol{ font-family:'WebSymbolsRegular', cursive; color:#437b7d; text-shadow:0 1px 0 #bef3f5; font-size:20px; position:absolute; left:20px; width:20px; text-align:center; line-height:32px; -webkit-transition:all 0.3s ease-in-out; -moz-transition:all 0.3s ease-in-out; -o-transition:all 0.3s ease-in-out; transition:all 0.3s ease-in-out; } .a-btn-text{ font-size:20px; color:#437b7d; text-shadow:0 1px 0 #bef3f5; line-height:16px; font-weight:bold; font-family:"Myriad Pro", "Trebuchet MS", sans-serif; display:block; } .a-btn-slide-text{ font-family:Arial, sans-serif; font-size:10px; letter-spacing:1px; text-transform:uppercase; color:#555; text-shadow:0px 1px 1px rgba(255,255,255,0.9); } .a-btn:hover{ -webkit-transform:scale(1.05); -moz-transform:scale(1.05); -ms-transform:scale(1.05); -o-transform:scale(1.05); transform:scale(1.05); } .a-btn:hover .a-btn-symbol{ opacity:0.5; -webkit-transform:rotate(360deg); -moz-transform:rotate(360deg); -ms-transform:rotate(360deg); -o-transform:rotate(360deg); transform:rotate(360deg); } .a-btn:active{ -webkit-transform:scale(0.95); -moz-transform:scale(0.95); Lenguajes Interpretados en el Servidor 25 1px #d5d5d5, inset 0 1px 0 Guía # 4: Funciones en PHP -ms-transform:scale(0.95); -o-transform:scale(0.95); transform:scale(0.95); -webkit-box-shadow:0px 0px 0px 1px #458a8c, 0 1px 1px #d5d5d5, inset 0 1px rgba(255,255,255,0.8), 0px 1px 1px 2px #fff; -moz-box-shadow:0px 0px 0px 1px #458a8c, 0 1px 1px #d5d5d5, inset 0 1px rgba(255,255,255,0.8), 0px 1px 1px 2px #fff; box-shadow:0px 0px 0px 1px #458a8c, 0 1px 1px #d5d5d5, inset 0 1px rgba(255,255,255,0.8), 0px 1px 1px 2px #fff; } 0 0 0 Archivo 5: validar.js (el mismo script del Ejercicio #6). Resultado de la ejecución en el navegador: Ejercicio #3: En este ejemplo se ilustra cómo utilizar la característica de funciones variables que se pueden emplear en PHP. Se tiene una matriz con distintos valores de monedas que se desean convertir a cinco tipos de monedas diferentes. Lenguajes Interpretados en el Servidor 26 Guía # 4: Funciones en PHP Archivo 1: monedas.php <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Convertir entre monedas</title> <link rel="stylesheet" href="css/fonts.css" /> <link rel="stylesheet" href="css/monedas.css" /> </head> <body> <header id="boardgame"> <h1>Equivalencias entre monedas</h1><hr> </header> <?php $conversion = array("aDolares","aQuetzal","aLempira","aCordova","aColon"); $precios = array(500,750,1000,1500,3000,7500,12000); //Funciones para usar como funciones variables //y hacer la tabla de llamadas que permitirá //invocar a las funciones del array con retrollamadas function aDolares($dato){ return sprintf("%02.2f", $dato*0.11425); } function aQuetzal($dato){ return sprintf("%02.2f", $dato*0.87214); } function aLempira($dato){ return sprintf("%02.2f", $dato*2.14132); } function aCordova($dato){ return sprintf("%02.2f", $dato*2.60470); } function aColon($dato){ return sprintf("%02.2f", $dato*58.1205); } ?> <section> <article> <table class="column-options"> <thead> <tr> <th>Colones (sv)</th> <th>Dólares (sv)</th> <th>Quetzales (gt)</th> <th>Lempiras (ho)</th> <th>Córdovas (ni)</th> <th>Colones (cr)</th> </tr> </thead> <tbody> <?php for($i=0;$i<sizeof($precios);$i++){ if($i%2 == 0){ echo "\t<tr>\n"; } else{ echo "\t<tr class=\"odd\">\n"; } echo "\t\t<td>\t\t&cent; " . $precios[$i] . "\t\t</td>\n\t\t"; for($j=0; $j<sizeof($conversion); $j++): $resultado = $conversion[$j]; switch($resultado): case "aDolares": $signo = "$"; Lenguajes Interpretados en el Servidor 27 Guía # 4: Funciones en PHP break; case "aQuetzal": $signo = "Q"; break; case "aLempira": $signo = "L$"; break; case "aCordova": $signo = "C$"; break; case "aColon": $signo = "&cent;"; break; endswitch; echo "<td>\t\t$signo " . "\t\t</td>\n\t"; endfor; echo "\t</tr>\n"; } ?> </table> </article> </section> </body> </html> number_format($resultado($precios[$i]),3,".",",") Archivo 2: fonts.css @font-face { font-family: 'LeagueGothic'; src: url('../fonts/League_Gothic.eot'); src: url('../fonts/League_Gothic.eot?#iefix') format('embedded-opentype'), url('../fonts/League_Gothic.woff') format('woff'), url('../fonts/League_Gothic.ttf') format('truetype'), url('../fonts/League_Gothic.svg#LeagueGothic') format('svg'); font-weight: normal; font-style: normal; } Archivo 3: monedas.css * { margin: 0; padding: 0; } html, body { height: 100%; } body { font-size: 16px; background-image: url(../img/coins.jpg); background-position: fixed; background-repeat: repeat; } article { left: 50%; margin-left: -31%; position: relative; width: 62%; } Lenguajes Interpretados en el Servidor 28 . Guía # 4: Funciones en PHP #boardgame h1 { color: #fff; font-family: "LeagueGothic",sans-serif; font-size: 4em; margin: 30px auto; text-align: center; text-shadow: 10px 10px 0 #ffd217, 20px 20px 0 #5ac7ff, 30px 30px 0 #ffd217, 40px 40px 0 #5ac7ff; text-transform: uppercase; } /* Estilos para la tabla */ .column-options { border-collapse: collapse; border-bottom: 1px solid #d6d6d6; } .column-options th, .column-options td { font-family: Helvetica, Arial, sans-serif; font-weight: normal; color: #434343; background-color: #f7f7f7; border-left:1px solid #ffffff; border-right:1px solid #dcdcdc; } .column-options th { font-size: 140%; font-weight: normal; letter-spacing: 0.12em; text-shadow: -1px -1px 1px #999; color: #fff; background-color: #0cb08b; padding: 12px 0px 8px 0px; border-bottom: 1px solid #d6d6d6; } .column-options td { text-shadow:1px 1px 0 #fff; padding:12px 14px 12px 14px; text-align:center; } .column-options .odd td { background-color: #ededed; } .column-options th:first-child { border-top-left-radius: 7px; -moz-border-radius-topleft: 7px; } .column-options th:last-child { border-top-right-radius: 7px; -moz-border-radius-topright: 7px; } .column-options th:last-child, .column-options td:last-child { border-right: 0px; } .column-options a.button { font-size: 70%; Lenguajes Interpretados en el Servidor 29 Guía # 4: Funciones en PHP text-shadow: none; text-decoration: none; text-align:center; text-shadow: -1px -1px 1px #72aebd; text-transform:uppercase; letter-spacing: 0.10em; color:#fff; padding: 7px 10px 4px 10px; border-radius: 5px; background-color:#00CC99; border-top: 1px solid #90f2da; border-right:1px solid #00a97f; border-bottom:1px solid #008765; border-left: 1px solid #7dd2bd; box-shadow: 2px 1px 2px #ccc; margin:10px 5px 10px 5px; display:block; } .column-options a.button:hover { position:relative; top:1px; left:1px; background-color:#00CCFF; border-top: 1px solid #9aebff; border-right:1px solid #08acd5; border-bottom:1px solid #07a1c8; border-left: 1px solid #92def1; box-shadow: -1px -1px 2px #ccc; } El resultado visible en el navegador sería: Ejercicio #4: El siguiente ejemplo implementa funciones con lista variable de argumentos para obtener el mayor de una lista de números. Los números son proporcionados directamente en el script PHP. Archivo 1: elmayor.php <!DOCTYPE html> <html lang="es"> Lenguajes Interpretados en el Servidor 30 Guía # 4: Funciones en PHP <head> <meta charset="utf-8" /> <title>Trabajando con funciones de lista variable de argumentos</title> <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Oswald" /> <link rel="stylesheet" href="css/elmayor.css" /> <script src="js/modernizr.custom.lis.js"></script> </head> <body> <header> <h1>Mayor de una lista de números</h1> </header> <section> <article id="leftcol"> <?php function elMayor(){ $num_args = func_num_args(); $args = func_get_args(); //$elmayor = ($dato1 > $dato2) ? $dato1 : $dato2; $elmayor = $args[0]; for($i=1; $i<$num_args; $i++){ $elmayor = ($elmayor > $args[$i]) ? $elmayor : func_get_arg($i); } return $elmayor; } echo "El mayor de 58, 167, 242, 85, 31, 109, -26, 81, 16, 126 es: " . "<h2>" . elMayor(58, 167, 242, 85, 31, 109, -26, 81, 16, 126) . "</h2>"; ?> </article> <article id="rightcol"> <?php echo "El mayor de 61, 37, 75, 184, 42, -303, 43, 56, -121, 226, 172, 78, 6, 86 es: " . "<h2>" . elMayor(61, 37, 75, 184, 42, -303, 43, 56, -121, 226, 172, 78, 6, 86) . "</h2>"; ?> </article> <section> </body> </html> Archivo 2: elmayor.css * { margin: 0; padding: 0; } html, body { height: 100%; font-size: 16px; } body { font-size: 16px; margin: 0 auto; min-width: ; width: 80%; } section { height: auto; margin: 24px auto; min-width: 350px; width: 86%; Lenguajes Interpretados en el Servidor 31 Guía # 4: Funciones en PHP } #leftcol { /* Old browsers */ background: #ff9c3a; /* FF3.6+ */ background: -moz-linear-gradient(-45deg, #ff9c3a 0%, #f29b30 50%, #ff7c00 51%, #ff7f04 100%); /* Chrome,Safari4+ */ background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#ff9c3a), color-stop(50%,#f29b30), color-stop(51%,#ff7c00), color-stop(100%,#ff7f04)); /* Chrome10+,Safari5.1+ */ background: -webkit-linear-gradient(-45deg, #ff9c3a 0%,#f29b30 50%,#ff7c00 51%,#ff7f04 100%); /* Opera 11.10+ */ background: -o-linear-gradient(-45deg, #ff9c3a 0%,#f29b30 50%,#ff7c00 51%,#ff7f04 100%); /* IE10+ */ background: -ms-linear-gradient(-45deg, #ff9c3a 0%,#f29b30 50%,#ff7c00 51%,#ff7f04 100%); /* W3C */ background: linear-gradient(135deg, #ff9c3a 0%,#f29b30 50%,#ff7c00 51%,#ff7f04 100%); /* IE6-9 fallback on horizontal gradient */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9c3a', endColorstr='#ff7f04',GradientType=1 ); border: solid 1px black; -webkit-box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); -moz-box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); -o-box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); -ms-box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); color: #e6e9e9; display:inline-block; margin-left: 16px; margin-right: 16px; padding: 24px 18px; min-width:140px; height: 400px; width: 42%; } #rightcol { /* Old browsers */ background: #bc5ab6; /* FF3.6+ */ background: -moz-linear-gradient(-45deg, #bc5ab6 0%, #963789 50%, #8e008c 51%, #c1309d 100%); /* Chrome,Safari4+ */ background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#bc5ab6), color-stop(50%,#963789), color-stop(51%,#8e008c), color-stop(100%,#c1309d)); /* Chrome10+,Safari5.1+ */ background: -webkit-linear-gradient(-45deg, #bc5ab6 0%,#963789 50%,#8e008c 51%,#c1309d 100%); /* Opera 11.10+ */ background: -o-linear-gradient(-45deg, #bc5ab6 0%,#963789 50%,#8e008c 51%,#c1309d 100%); /* IE10+ */ background: -ms-linear-gradient(-45deg, #bc5ab6 0%,#963789 50%,#8e008c 51%,#c1309d 100%); /* W3C */ background: linear-gradient(135deg, #bc5ab6 0%,#963789 50%,#8e008c 51%,#c1309d 100%); /* IE6-9 fallback on horizontal gradient */ Lenguajes Interpretados en el Servidor 32 Guía # 4: Funciones en PHP filter: progid:DXImageTransform.Microsoft.gradient( endColorstr='#c1309d',GradientType=1 ); border: solid 1px black; -webkit-box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); -moz-box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); -o-box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); -ms-box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); box-shadow: 12px 12px 12px 0px rgba(0,0,0,0.75); color: #f0f0f0; float:left; margin-left: 16px; margin-right: 16px; padding: 24px 18px; min-width:200px; height: 400px; width: 42%; } startColorstr='#bc5ab6', article { border-radius: 15px; -webkit-border-radius: 15px; -moz-border-radius: 15px; -o-border-radius: 15px; font: 1em "Lucida Sans Unicode",Helvetica,sans-serif; height: 10em; min-height: 6em; width: 40%; } body { background-image: background-image: background-image: background-image: 85%); background-image: background-image: linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) 85%); -o-linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) 85%); -moz-linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) 85%); -webkit-linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) -ms-linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) 85%); -webkit-gradient( linear, left bottom, left top, color-stop(0.18, rgb(68,0,243)), color-stop(0.85, rgb(74,50,160)) ); font-size: 15px; height: 100%; width: 100%; } header h1 { color: #dcdfdc; font-family: 'Oswald'; font-size: 3.6em; text-align: center; text-shadow: 0px 1px 0px 0px 2px 0px 0px 3px 0px 0px 4px 0px 0px 5px 0px 0px 6px 0px 0px 7px 0px 0px 8px 7px #999, #888, #777, #666, #555, #444, #333, #001135; Lenguajes Interpretados en el Servidor 33 Guía # 4: Funciones en PHP } El resultado visualizado en un navegador debería ser el siguiente: Ejercicio #5: En este ejemplo se ingresan varias edades con validación en el cliente con JavaScript que permite ingresar solo edades numéricamente correctas. Al enviar los datos ingresados en un cuadro de lista se calcula en el servidor el promedio de las edades ingresadas y cada una de las edades que se ingresaron. Archivo 1: edades.html <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Edades de personas</title> <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Oswald" /> <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Andika" /> <link rel="stylesheet" media="screen" href="css/edades.css" /> <script type="text/javascript" src="js/agregar.js"></script> <script type="text/javascript" src="js/validatefield.js"></script> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> </head> <body> <section> <article> <form name="frmedades" action="promedioedad.php" method="POST"> <fieldset> <legend><span>Edades de personas:</span></legend> <ul> <li> <label for="edad">Ingreso de edades:</label> <div class="campo"> <input type="text" name="edad" id="edad" maxlength="60" /> <input type="reset" name="agregar" id="agregar" value="Agregar" /><br /> <span id="numbersOnly"> El campo sólo acepta números. </span> </div> </li> <li> <label for="ingresados">Edades ingresadas:</label> <div class="campo"> <select name="ingresados[]" id="ingresados" size="6" multiple="multiple"></select> Lenguajes Interpretados en el Servidor 34 Guía # 4: Funciones en PHP </div> </li> <li> <div class="campo"> <input type="submit" name="enviar" id="enviar" value="Enviar" class="boton" /> </div> </li> </ul> </fieldset> </form> </body> </article> </section> </html> Archivo 2: promedioedad.php <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Productos de la tienda</title> <link rel="stylesheet" href="css/fonts.css" /> <link rel="stylesheet" href="css/sticky-table.css" /> <script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery-throttledebounce/1.1/jquery.ba-throttle-debounce.min.js"></script> <script src="js/modernizr.custom.lis.js"></script> <script src="js/jquery.stickyheader.js"></script> </head> <body> <section> <article class="component"> <table> <thead> <th class="head">Edades ingresadas</th> </thead> <tbody> <?php if(isset($_POST['enviar'])){ if(isset($_POST['ingresados'])){ calcularedadprom($_POST['ingresados']); } else{ $msgerr = "No hay edades que procesar."; $edades = array($msgerr); calcularedadprom($edades); } } // Función para calcular el promedio de las edades function calcularedadprom($edades){ $promedades = 0; $contador = 0; $celdas = ""; if(is_array($edades)){ foreach($edades as $edad){ $celdas .= "\n\t<tr>\n\t\t<td class=\"username\">\n\t\t\t$edad\n\t\t</td>\n\t</tr>\n</tbody>\n"; $promedades += $edad; $contador++; } Lenguajes Interpretados en el Servidor 35 Guía # 4: Funciones en PHP $promedades /= $contador; $promedades = number_format($promedades, 2, ".", ","); $celdas .= "<tfoot>\n"; $celdas .= "<tr>\n\t\t<th>\n\t\t\tLa edad promedio es: $promedades\n\t\t</th>\n\t</tr>\n"; $celdas .= "</tfoot>\n"; echo $celdas; } else{ $celdas .= "\n\t<tr>\n\t\t<td class=\"username\">\n\t\t\t$edades\n\t\t</td>\n\t</tr>\n</tbody>\n"; echo $celdas; } } ?> </table> </article> <!-- Librerías de jQuery para hacer el efecto stycky-headers --> <script src="js/jquery.stickyheader.js"></script> </section> </body> </html> Archivo 3: fonts.css @import url(http://fonts.googleapis.com/css?family=Lato:300,400,700); @font-face { font-family: 'codropsicons'; src:url('../fonts/codropsicons.eot'); src:url('../fonts/codropsicons.eot?#iefix') format('embedded-opentype'), url('../fonts/codropsicons.woff') format('woff'), url('../fonts/codropsicons.ttf') format('truetype'), url('../fonts/codropsicons.svg#codropsicons') format('svg'); font-weight: normal; font-style: normal; } Archivo 4: edades.css * { border:0; padding:0; } html, body { height: 100%; } body { font-size: 15px; } #numbersOnly { background-color:Red; border-radius: 8px; -moz-border-radius: 8px; -webkit-border-radius: 8px; -o-border-radius: 8px; -ms-border-radius: 8px; color:Gold; font:Bold 0.9em Arial,Helvetica,sans-serif; display:block; opacity:0.8; padding:4px 5px; Lenguajes Interpretados en el Servidor 36 Guía # 4: Funciones en PHP visibility:hidden; } fieldset { background-color:rgb(190,220,230); border:6px ridge rgb(50,100,150); -moz-border-radius:15px; -webkit-border-radius:15px; -o-border-radius:15px; -ms-border-radius:15px; border-radius:15px; left:-23%; margin-left:50%; padding:16px 18px; position:relative; width:46%; } legend span { display:block; border:3px ridge rgb(50,100,150); background-color:rgb(20,20,100); font:bold 1em "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; color:rgb(225,250,250); padding:2px 5px; } label { font:normal 1em "Arial Rounded MT Bold","Century Gothic",Helvetica,sans-serif; color:rgb(30,60,100); display:block; float:left; width:30%; text-align:right; padding-top:0.6em; padding-bottom:0.6em; } .campo { display:block; float:right; font:Normal 0.9em "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; position:relative; width:68%; } input[type="text"] { color: Navy; font: Normal 1em 'Oswald',Arial,Helvetica,'Liberation Sans'; line-height: 1.4em; height: 1.4em; width: 40%; } select { color: Navy; font: Normal 1em 'Oswald',Arial,Helvetica,'Liberation Sans'; line-height: 1.4em; width:44%; } input#agregar { /* Estilo de borde del botón */ Lenguajes Interpretados en el Servidor 37 Guía # 4: Funciones en PHP border:2px groove #7c93ba; /* Forzar el cambio de tipo de cursor al posicionar el puntero del ratón encima del botón */ cursor:pointer; /* Agregar relleno al contenido del botón */ padding: 5px 25px; /* Dar efecto de gradiente al color de fondo del botón */ /* Para navegadores antiguos que no soporten gradiente colocar un color sólido */ background-color:#6b6dbb; background: -webkit-gradient(linear, left top, left bottom, from(#88add7), to(#6b6dbb)); background: -webkit-linear-gradient(top, #88add7, #6b6dbb); background: -moz-linear-gradient(top, #88add7, #6b6dbb); background: -o-linear-gradient(top, #88add7, #6b6dbb); background: linear-gradient(top, #88add7, #6b6dbb); /* Estilo del texto del botón */ font-family:Oswald, Arial, sans-serif; color:#fff; font-size:1.1em; letter-spacing:.1em; font-variant:small-caps; /* Definir bordes redondeados en las esquinas de la derecha */ -webkit-border-radius: 0 15px 15px 0; -moz-border-radius: 0 15px 15px 0; -o-border-radius: 0 15px 15px 0; -ms-border-radius: 0 15px 15px 0; border-radius: 0 15px 15px 0; /* Añadir un tanto de sombra al botón */ -webkit-box-shadow: rgba(0, 0, 0, .75) 0 2px 6px; -moz-box-shadow: rgba(0, 0, 0, .75) 0 2px 6px; -o-box-shadow: rgba(0, 0, 0, .75) 0 2px 6px; -ms-box-shadow: rgba(0, 0, 0, .75) 0 2px 6px; box-shadow: rgba(0, 0, 0, .75) 0 2px 6px; } input#agregar:hover, input#agregar:focus { color:#edebda; /* Reducir tamaño de la sombra para para producir efecto de botón presionado */ -webkit-box-shadow: rgba(0, 0, 0, .25) 0 1px 0px; -moz-box-shadow: rgba(0, 0, 0, .25) 0 1px 0px; -o-box-shadow: rgba(0, 0, 0, .25) 0 1px 0px; -ms-box-shadow: rgba(0, 0, 0, .25) 0 1px 0px; box-shadow: rgba(0, 0, 0, .25) 0 1px 0px; } .boton { /* Colocar relleno al contenido del botón */ padding: 4px 20px; /* Poner efecto de gradiente para el color de fondo del botón */ /* Para navegadores antiguos que no soportan gradientes colocar un color sólido */ background:#ffae00; background: -webkit-linear-gradient(top, #ffae00, #d67600); background: -moz-linear-gradient(top, #ffae00, #d67600); background: -o-linear-gradient(top, #ffae00, #d67600); background: linear-gradient(top, #ffae00, #d67600); border:2px outset #dad9d8; /* Estilos para el texto */ font-family:Andika, Arial, sans-serif; font-size:1.1em; letter-spacing:0.05em; color:#fff; Lenguajes Interpretados en el Servidor 38 Guía # 4: Funciones en PHP text-shadow: 0px 1px 10px #000; /* Agregar el efecto de esquinas redondeadas para los bordes del botón */ -webkit-border-radius: 15px; -moz-border-radius: 15px; -o-border-radius: 15px; -ms-border-radius: 15px; border-radius: 15px; /* Agregar efecto de sombra al botón */ -webkit-box-shadow: rgba(0, 0, 0, .55) 0 1px 6px; -moz-box-shadow: rgba(0, 0, 0, .55) 0 1px 6px; -o-box-shadow: rgba(0, 0, 0, .55) 0 1px 6px; -ms-box-shadow: rgba(0, 0, 0, .55) 0 1px 6px; box-shadow: rgba(0, 0, 0, .55) 0 1px 6px; } .boton:hover, .boton:focus { border:2px solid #dad9d8; } ul { list-style-type:none; margin:0; padding:0; } li { line-height:2.1em; display:block; } Archivo 5: sticky-table.css .component { line-height: 1.5em; margin: 0 auto; padding: 0.5em 0 0.6em; max-width: 1000px; overflow: hidden; width: 24%; } .component .filler { font-family: 'Lato',Arial,Helvetica,'Liberation Sans'; color: #d3d3d3; } table { background: #fff; border-collapse: collapse; font-family: 'Lato',Arial,Helvetica,'Liberation Sans'; margin: 0 auto; margin-bottom: 3em; width: 80%; } td, th { padding: 0.65em 1em; text-align: center; } td.err { background-color: #e992b9; Lenguajes Interpretados en el Servidor 39 Guía # 4: Funciones en PHP color: #fff; font-size: 0.75em; line-height: 1; text-align: center; } th { background-color: #3c88b6; font-family: 'Lato'; font-weight: bold; color: #fff; white-space: nowrap; } tbody th { background-color: #2ea879; Lato } tbody tr:nth-child(2n-1) { background-color: #d6cdad; transition: all .125s ease-in-out; } tbody tr:hover { background-color: rgba(125,110,90,.3); } /* For appearance */ .sticky-wrap { overflow-x: auto; overflow-y: hidden; position: relative; margin: 1.2em 0; width: 100%; } .sticky-wrap .sticky-thead, .sticky-wrap .sticky-col, .sticky-wrap .sticky-intersect { opacity: 0; position: absolute; top: 0; left: 0; transition: all .125s ease-in-out; z-index: 50; /* Previene que se estire la tabla a tamaño completo */ width: auto; } .sticky-wrap .sticky-thead { box-shadow: 0 0.25em 0.1em -0.1em rgba(0,0,0,.125); width: 100%; /* Force stretch */ z-index: 100; } .sticky-wrap .sticky-intersect { opacity: 1; z-index: 150; } .sticky-wrap .sticky-intersect th { background-color: #666; color: #eee; Lenguajes Interpretados en el Servidor 40 Guía # 4: Funciones en PHP } .sticky-wrap td, .sticky-wrap th { box-sizing: border-box; } Archivo 6: agregar.js function addEvent(obj, evType, fn){ if(obj.addEventListener){ obj.addEventListener(evType, fn, false); return true; } else if (obj.attachEvent){ var r = obj.attachEvent("on"+evType, fn); return r; } else{ return false; } } function initForms(){ document.getElementById("agregar").onclick = function(){ addProducts(document.frmedades.ingresados, document.frmedades.edad.value); } document.getElementById("enviar").onclick = function(){ var contador = 0; for(var i=0; i<document.frmedades.ingresados.options.length; i++){ if(document.frmedades.ingresados.options[i].selected){ contador++; } } if(contador == 0){ alert("No se han seleccionado elementos."); return false; } } } function addProducts(optionMenu, value){ var posicion = optionMenu.length; optionMenu[posicion] = new Option(value, value); } addEvent(window, 'load', initForms); Archivo 7: validatefield.js function init(){ var inputtag = document.getElementById("edad"); (inputtag.addEventListener) ? inputtag.addEventListener("keypress", numbersOnly, false) : inputtag.onkeypress = numbersOnly; } // Este es el controlador keypress que filtra la entrada del usuario function numbersOnly(event) { // Obtener el objeto event y el código de carácter de la tecla pulsada // de forma compatible con todos los navegadores var e = event || window.event; // Objeto de evento de la tecla var code = e.charCode || e.keyCode; // tecla que se ha pulsado // Si se ha pulsado una tecla de función de cualquier tipo, no filtrarla Lenguajes Interpretados en el Servidor 41 Guía # 4: Funciones en PHP if(e.charCode == 0) return true; // Tecla de función (solo para Firefox) if(e.ctrlKey || e.altKey) return true; // Se mantienen presionadas Ctrl o Alt if(code < 32) return true; // Carácter de Ctrl en tabla ASCII // Dejar pasar teclas de retroceso (BackSpace), tabulación (Tab), entrada (Enter), // escape (Scape) y espacios en blanco (SpaceBar) if(code==0 || code==8 || code==9 || code==13 || code==27 || code==32) return true; // Buscar la información de los caracteres válidos para este campo de entrada var allowed = "0123456789"; // Caracteres válidos var messageElement = document.getElementById("numbersOnly"); // Mensaja a ocultar/mostrar // Convertir el código de carácter a su carácter correspondiente var c = String.fromCharCode(code); // Comprobar si el carácter está dentro del conjunto de caracteres permitidos if (allowed.indexOf(c) != -1) { // Si c es un carácter legal, ocultar el mensaje, si es que existe. if(messageElement) messageElement.style.visibility = "hidden"; return true; // Aceptar el carácter } else { // Si c no está en el conjunto de caracteres permitidos, mostrar el mensaje if(messageElement) messageElement.style.visibility = "visible"; // Y rechazar este evento keypress if(e.preventDefault) e.preventDefault(); if(e.returnValue) e.returnValue = false; return false; } } addEvent(window, 'load', init); El resultado que se puede observar al ejecutar el script con cualquier navegador sería el siguiente: Ejercicio #6: El siguiente ejemplo ilustra cómo manejar el envío de campos de formulario de tipo select y checkbox cuando en ambos casos se maneja el nombre del campo como una matriz dentro del script PHP. Se crea una función en script del lado del servidor que procesará los datos seleccionados en ambos tipos de Lenguajes Interpretados en el Servidor 42 Guía # 4: Funciones en PHP campos, teniendo en cuenta que en el caso de los datos seleccionados en el campo de formulario de tipo select se creará una lista desordenada (ol), mientras que en el caso de los checkbox que utilizan el mismo nombre en todos los campos creados con ciudades, se creará una lista ordenada (ul). En la función se utilizan dos argumentos, el primero que debe ser la matriz con los datos de la lista y el segundo que indica el tipo de lista que se quiere crear donde los únicos valores posibles deberían ser: "ul", "ol" . Archivo 1: selectfields.html <!DOCTYPE html> <html lang="es"> <head> <title>Estilo de checkboxes, radios y multi select</title> <meta charset="utf-8" /> <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Bitter" /> <link rel="stylesheet" href="css/fonts.css" /> <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/ui-lightness/jquery-ui.css" /> <link rel="stylesheet" href="css/jquery.multiselect.css" /> <link rel="stylesheet" href="css/fields.css" /> <script type="text/javascript" src="js/checkFields.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script> <script type="text/javascript" src="js/jquery.multiselect.js"></script> <script type="text/javascript"> $(function(){ $("#location").multiselect(); }); </script> </head> <body> <header> <h1 class="inset">Ciudades y destinos de vacación</h1> </header> <section> <article> <div class="form-style"> <form name="frmdestinos" action="destinos.php" method="POST"> <h1> Selección de <span>países y ciudades</span> </h1> <select name="location[]" multiple="multiple" size="5" id="location"> <option value="Guatemala">Guatemala</option> <option value="El Salvador">El Salvador</option> <option value="Costa Rica">Costa Rica</option> <option value="Honduras">Honduras</option> <option value="Panamá">Panamá</option> <option value="Nicaragua">Nicaragua</option> <option value="Belice">Belice</option> </select><br /> <div id="places"> <input type="checkbox" name="place[]" id="place1" value="Ciudad de Guatemala" /> <label for="place1"><span></span>Ciudad de Guatemala</label><br /> <input type="checkbox" name="place[]" id="place2" value="Antigua Guatemala" /> <label for="place2"><span></span>Antigua Guatemala</label><br /> <input type="checkbox" name="place[]" id="place3" value="Panajachel" /> <label for="place3"><span></span>Panajachel</label><br /> <input type="checkbox" name="place[]" id="place4" value="San Salvador" checked="checked" /> <label for="place4"><span></span>San Salvador</label><br /> <input type="checkbox" name="place[]" id="place5" value="Santa Ana" /> Lenguajes Interpretados en el Servidor 43 Guía # 4: Funciones en PHP <label for="place5"><span></span>Santa Ana</label><br /> <input type="checkbox" name="place[]" id="place6" value="Santa Miguel" /> <label for="place6"><span></span>Santa Miguel</label><br /> <input type="checkbox" name="place[]" id="place7" value="San José" /> <label for="place7"><span></span>San José</label><br /> <input type="checkbox" name="place[]" id="place8" value="Puntarenas" /> <label for="place8"><span></span>Puntarenas</label><br /> <input type="checkbox" name="place[]" id="place9" value="San Pedro Sula" /> <label for="place9"><span></span>San Pedro Sula</label><br /> <input type="checkbox" name="place[]" id="place10" value="Tegucigalpa" /> <label for="place10"><span></span>Tegucigalpa</label><br /> <input type="checkbox" name="place[]" id="place11" value="Granada" /> <label for="place11"><span></span>Granada</label><br /> <input type="checkbox" name="place[]" id="place12" value="Ciudad de Panamá" /> <label for="place12"><span></span>Ciudad de Panamá</label><br /> <input type="checkbox" name="place[]" id="place13" value="Colón" /> <label for="place13"><span></span>Colón</label><br /> <input type="checkbox" name="place[]" id="place14" value="Colón" /> <label for="place14"><span></span>Belmopán</label><br /> </div> <input type="submit" name="submit" id="enviar" value="Enviar" class="button" /> <input type="reset" name="cancel" value="Cancelar" class="button" /> </form> </div> </article> </section> </body> </html> Archivo 2: destinos.php <!DOCTYPE html> <html lang="es"> <head> <title>Ciudades de destino</title> <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Bitter" /> <link rel="stylesheet" href="css/fields.css" /> <meta charset="utf-8" /> </head> <body> <header> <h1 class="inset">Ciudades de destino</h1> </header> <section> <div class="form-style"> <?php //La función espera una matriz con una lista ($lista) //ya sea de países o ciudades y un parámetro opcional //con el tipo de lista que tendrá un valor por defecto "ul" function createList($lista, $tipo="ul"){ //Inicializando variables para ambos tipos de listas HTML $ullist = ""; $ollist = ""; switch($tipo): case "ul": $ullist .= "<article id=\"countries\">\n"; $ullist .= "\t<h1>\n"; $ullist .= "\t\tPaíses y ciudades\n"; $ullist .= "\t\t<span>seleccionadas</span>\n"; $ullist .= "\t</h1>\n"; $ullist .= "\t<ul class=\"imglist\">\n"; foreach($lista as $key => $value): $ullist .= "\t\t<li><a href=\"javascript:void(0)\">$key => Lenguajes Interpretados en el Servidor 44 Guía # 4: Funciones en PHP $value</a></li>\n"; endforeach; $ullist .= "\t</ul>\n"; $ullist .= "</article>\n"; print $ullist; break; case "ol": $ollist .= "<article id=\"cities\">\n"; $ollist .= "\t<h1><span>Países</span></h1>\n"; $ollist .= "\t<div class=\"numberlist\">\n"; $ollist .= "\t\t<ol>\n"; foreach($lista as $key => $value): $ollist .= "\t\t\t<li><a href=\"javascript:void(0)\">$key $value</a></li>\n"; endforeach; $ollist .= "\t\t</ol>\n"; $ollist .= "\t</div>\n"; $ollist .= "</article>"; print $ollist; break; default: print "<p>No está definido este tipo de lista</p>"; break; endswitch; } => //Inicia el procesamiento del formulario if(isset($_POST['submit'])): //Análisis de los elementos de campo select if(is_array($_POST['location'])): //Si se tiene una matriz invocar a la función //createList para crear la lista UL createList($_POST['location']); else: echo "Se esperaba una lista, no un valor escalar."; exit(0); endif; //Análisis de los elementos checkbox extract($_POST); if(is_array($place)): createList($place, "ol"); endif; else: print "<p>El procesamiento del formulario requiere que se haya presionado el botón Enviar.</p>"; print "<a href=\"selectfields.html\">Regresar</a>"; exit(0); endif; ?> </div> </section> </body> </html> Archivo 3: fonts.css @font-face { font-family: 'FontAwesome'; src: url('../fonts/fontawesome-webfont.eot'); src: url('../fonts/fontawesome-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff') format('woff'), url('../fonts/fontawesome-webfont.ttf') format('truetype'), Lenguajes Interpretados en el Servidor 45 Guía # 4: Funciones en PHP url('../fonts/fontawesome-webfont.svg#LeagueGothic') format('svg'); font-weight: normal; font-style: normal; } Archivo 4: fields.css /* Encabezados clase inset */ header .inset { color:#238290; font-family:'Bitter'; font-size:4em; font-weight:Bold; text-align:center; text-shadow:-3px -3px 3px #fff, 0 0 1px #888, 3px 3px 3px #000; opacity:0.5; } /* Contenedor del formulario */ .form-style { width:480px; padding:24px; margin:40px auto; background: #FFF; border-radius: 10px; -webkit-border-radius:10px; -moz-border-radius: 10px; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.13); -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.13); -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.13); } .form-style h1 { background: #2A88AD; padding: 20px 30px 15px 30px; margin: -30px -30px 20px -30px; border-radius: 10px 10px 0 0; -webkit-border-radius: 10px 10px 0 0; -moz-border-radius: 10px 10px 0 0; color: #fff; text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.12); font: normal 30px 'Bitter', serif; -moz-box-shadow: inset 0px 2px 2px 0px rgba(255, 255, 255, 0.17); -webkit-box-shadow: inset 0px 2px 2px 0px rgba(255, 255, 255, 0.17); box-shadow: inset 0px 2px 2px 0px rgba(255, 255, 255, 0.17); border: 1px solid #257C9E; } .form-style h1 > span{ display: block; margin-top: 2px; font: 13px Arial, Helvetica, sans-serif; } /* Estilo de los checkboxes */ #places { margin-top: 16px; margin-bottom: 16px; } #places input[type="checkbox"]:not(old), Lenguajes Interpretados en el Servidor 46 Guía # 4: Funciones en PHP #places input[type="radio"]:not(old) { font-size : 1em; margin : 0; opacity : 0; padding : 0; width : 2em; } #places input[type="checkbox"]:not(old) + label, #places input[type="radio"]:not(old) + label{ color : #c77405; display : inline-block; font-family : 'Trebuchet'; font-size : 1.2em; line-height : 1.5em; margin-left : -2em; } #places input[type="checkbox"]:not(old) + label > span, #places input[type="radio"]:not(old) + label > span{ background : #c77405; background-image : -moz-linear-gradient(rgb(240,240,240),rgb(224,224,224)); background-image : -ms-linear-gradient(rgb(240,240,240),rgb(224,224,224)); background-image : -o-linear-gradient(rgb(240,240,240),rgb(224,224,224)); background-image : -webkit-linear-gradient(rgb(240,240,240),rgb(224,224,224)); background-image : linear-gradient(rgb(240,240,240),rgb(224,224,224)); border : 0.0625em solid rgb(192,192,192); border-radius : 0.25em; display : inline-block; height : 0.875em; margin : 0.25em 0.5em 0.25em 0.25em; vertical-align : bottom; width : 0.875em; } #places input[type="checkbox"]:not(old):checked + label > span, #places input[type="radio"]:not(old):checked + label > span{ background-image : -moz-linear-gradient(rgb(224,224,224),rgb(240,240,240)); background-image : -ms-linear-gradient(rgb(224,224,224),rgb(240,240,240)); background-image : -o-linear-gradient(rgb(224,224,224),rgb(240,240,240)); background-image : -webkit-linear-gradient(rgb(224,224,224),rgb(240,240,240)); background-image : linear-gradient(rgb(224,224,224),rgb(240,240,240)); } #places input[type="checkbox"]:not(old):checked + label > span:before{ color : #c77405; content : '\f00c'; display : block; font-family : 'FontAwesome'; font-size : 0.875em; font-weight : bold; line-height : 1em; text-align : center; text-shadow : 0 0 0.0714em rgb(115,153,77); width : 1em; } #places input[type="radio"]:not(old):checked + label > span > span{ background : rgb(153,204,102); background-image : -moz-linear-gradient(rgb(179,217,140),rgb(153,204,102)); background-image : -ms-linear-gradient(rgb(179,217,140),rgb(153,204,102)); background-image : -o-linear-gradient(rgb(179,217,140),rgb(153,204,102)); background-image : -webkit-linear-gradient(rgb(179,217,140),rgb(153,204,102)); Lenguajes Interpretados en el Servidor 47 Guía # 4: Funciones en PHP background-image border border-radius display height margin width : : : : : : : linear-gradient(rgb(179,217,140),rgb(153,204,102)); 0.0625em solid rgb(115,153,77); 0.125em; block; 0.5em; 0.125em; 0.5em; } /* Estilo para los botones de formulario */ .button { border:2px groove #7c93ba; /* Forces the cursor to change to a hand when the button is hovered */ cursor:pointer; padding: 5px 25px; /* Give the background a gradient - see cssdemos.tupence.co.uk/gradients.htm for more info */ /* Required for browsers that don't support gradients */ background-color:#6b6dbb; background: -webkit-gradient(linear, left top, left bottom, from(#88add7), to(#6b6dbb)); background: -webkit-linear-gradient(top, #88add7, #6b6dbb); background: -moz-linear-gradient(top, #88add7, #6b6dbb); background: -o-linear-gradient(top, #88add7, #6b6dbb); background: linear-gradient(top, #88add7, #6b6dbb); /* Style to the text inside the button */ /* Andkia is available at http://www.google.com/webfonts/specimen/Andika */ font-family:Andika, Arial, sans-serif; color:#fff; font-size:1.1em; letter-spacing:.1em; font-variant:small-caps; /* Give the corners a small curve */ -webkit-border-radius: 0 15px 15px 0; -moz-border-radius: 0 15px 15px 0; border-radius: 0 15px 15px 0; /* Add a drop shadow to the button */ -webkit-box-shadow: rgba(0, 0, 0, .75) 0 2px 6px; -moz-box-shadow: rgba(0, 0, 0, .75) 0 2px 6px; box-shadow: rgba(0, 0, 0, .75) 0 2px 6px; } .button:hover, .button:focus { color:#edebda; /* Reduce the spread of the shadow to give a pushed effect */ -webkit-box-shadow: rgba(0, 0, 0, .25) 0 1px 0px; -moz-box-shadow: rgba(0, 0, 0, .25) 0 1px 0px; box-shadow: rgba(0, 0, 0, .25) 0 1px 0px; } /* Estilos de las listas HTML */ .form-style ul { margin-bottom: 42px; } /* Estilos para listas numeradas con círculos */ .numberlist { width:480px; } .numberlist ol{ counter-reset: li; list-style: none; Lenguajes Interpretados en el Servidor 48 Guía # 4: Funciones en PHP *list-style: decimal; font: 15px 'Trebuchet MS','Lucida Sans'; padding: 0; margin-bottom: 4em; } .numberlist ol ol{ margin: 0 0 0 2em; } .numberlist a { position: relative; display: block; padding: .4em .4em .4em 2em; *padding: .4em; margin: .5em 0; background: #87ceeb; color: #fff; text-decoration: none; -moz-border-radius: .3em; -webkit-border-radius: .3em; border-radius: .3em; } .numberlist a:hover{ background: #cbe7f8; color: #333; text-decoration: none; } .numberlist a:before{ content: counter(li); counter-increment: li; position: absolute; left: -1.3em; top: 50%; margin-top: -1.3em; background: #87ceeb; height: 2em; width: 2em; line-height: 2em; border: .3em solid #fff; text-align: center; font-weight: bold; -moz-border-radius: 2em; -webkit-border-radius: 2em; border-radius: 2em; color:#FFF; } ul.imglist { font: 15px "Trebuchet MS","Lucida Sans"; line-height: 24px; /* list-style: outside url("../img/arrow.png") disc; */ list-style: none; margin-bottom: 42px; padding: 0px; } ul.imglist li { background-image: url("../img/arrow.png"); background-position: 0 50%; background-repeat: no-repeat; Lenguajes Interpretados en el Servidor 49 Guía # 4: Funciones en PHP color: #FFF; list-style: none outside none; padding-left: 32px; } ul.imglist li a:hover { background: #ffac39; color: #222; text-decoration: none; } ul.imglist a { position: relative; display: block; padding: .4em .4em .4em 2em; *padding: .4em; margin: .4em 0; background: #fea500; color: #fff; text-decoration: none; -moz-border-radius: .3em; -webkit-border-radius: .3em; border-radius: .3em; } Archivo 5: jquery.multiselect.css .ui-multiselect { padding:2px 0 2px 4px; text-align:left; } .ui-multiselect span.ui-icon { float:right; } .ui-multiselect-single .ui-multiselect-checkboxes input { position:absolute !important; top: auto !important; left:-9999px; } .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important; } .ui-multiselect-header { margin-bottom:3px; padding:3px 0 3px 4px; } .ui-multiselect-header ul { font-size:0.9em; } .ui-multiselect-header ul li { float:left; padding:0 10px 0 0; } .ui-multiselect-header a { text-decoration:none; } Lenguajes Interpretados en el Servidor 50 Guía # 4: Funciones en PHP .ui-multiselect-header a:hover { text-decoration:underline; } .ui-multiselect-header span.ui-icon { float:left; } .ui-multiselect-header li.ui-multiselect-close { float:right; text-align:right; padding-right:0; } .ui-multiselect-menu { display:none; padding:3px; position:absolute; z-index:10000; text-align: left; } .ui-multiselect-checkboxes { position:relative /* fixes bug in IE6/7 */; overflow-y:auto; } .ui-multiselect-checkboxes label { cursor:default; display:block; border:1px solid transparent; padding:3px 1px; } .ui-multiselect-checkboxes label input { position:relative; top:1px; } .ui-multiselect-checkboxes li { clear:both; font-size:0.9em; padding-right:3px; } .ui-multiselect-checkboxes li.ui-multiselect-optgroup-label { text-align:center; font-weight:bold; border-bottom:1px solid; } .ui-multiselect-checkboxes li.ui-multiselect-optgroup-label a { display:block; padding:3px; margin:1px 0; text-decoration:none; } /* Remueve bordes de elementos label en IE6 ocasionado porque IE6 no soporta transparencia */ * html .ui-multiselect-checkboxes label { border:none; } Lenguajes Interpretados en el Servidor 51 Guía # 4: Funciones en PHP Archivo 6: checkFields.js function addEvent(obj, evType, fn){ if(obj.addEventListener){ obj.addEventListener(evType, fn, false); return true; } else if (obj.attachEvent){ var r = obj.attachEvent("on"+evType, fn); return r; } else{ return false; } } function initForms(){ var btnenviar = document.getElementById("enviar"); btnenviar.onclick = function(){ //Verificar si hay un país seleccionado en el campo select var contador = 0; for(var i=0; i<document.frmdestinos.location.options.length; i++){ if(document.frmdestinos.location.options[i].selected){ contador++ } } if(contador == 0){ alert("No ha seleccionado ningún país."); return false; } //Verificar si existe un campo marcado en las casillas //de verificación con las ciudades kontador = 0; for(var j=0; j<document.frmdestinos["place[]"].length; j++){ if(document.frmdestinos["place[]"][j].checked){ kontador++; } } if(kontador == 0){ alert("Debe seleccionar al menos una ciudad."); return false; } } } addEvent(window, 'load', initForms); Archivo 7: jquery.multiselect.js Este archivo se podrá descargar con los recursos de la guía de práctica. El resultado que podrá visualizar si ejecuta el script selectfields.html en el navegador de su preferencia, debería ser el siguiente: Lenguajes Interpretados en el Servidor 52 Guía # 4: Funciones en PHP Lenguajes Interpretados en el Servidor 53 Guía # 4: Funciones en PHP Ejercicio #7: El siguiente ejemplo muestra cómo constuir una aplicación modular creando un sitio web en partes, primero con un archivo denominado header.php, luego el footer.inc.php y el archivo header.inc.php. Ambos archivos son integrados en home.php para armar la página principal de un sitio web. Esta técnica de construcción es llamada modularidad, ya que se utilizan archivos .inc.php Archivo 1: sitio.php <?php require('header.inc.php'); ?> <body> <div id="pagewrap"> <!-- #header y #nav --> <?php require('nav.inc.php'); ?> <!-- /#header y #nav --> <!-- #content --> <?php require('content.php'); ?> <!-- /#content --> <!-- #sidebar --> <?php require('sidebar.php'); ?> <!-- /#sidebar --> <!-- #footer --> <?php require('footer.inc.php'); ?> <!-- /#footer --> </div> <!-- /#pagewrap --> </body> </html> Archivo 2: header.inc.php <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width; initial-scale=1.0"> <title>Web adaptable con Media Queries</title> <!--css --> <link rel="stylesheet" href="css/style.css" /> <!-- <link href="media-queries.css" rel="stylesheet" type="text/css"> --> <!-- html5.js - IE 9 --> <!--[if lt IE 9]> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <!-- css3-mediaqueries.js - IE 9 --> <!--[if lt IE 9]> <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3mediaqueries.js"></script> <![endif]--> </head> Archivo 3: nav.inc.php <header id="header"> <hgroup> <img src="img/logo.png" id="logo" alt="logo" Lenguajes Interpretados en el Servidor 54 > Guía # 4: Funciones en PHP <h1 id="site-description">Responsive Design con CSS3 Media Queries</h1> </hgroup> <nav> <ul id="main-nav" class="clearfix"> <?php $menuoptions = array("Home", "Quiénes somos", "Servicios", "Portafolio", "Blog", "Contacto"); $listitems = ""; foreach($menuoptions as $item): $listitems .= "\t<li>\n\n<a href=\"javascript:void(0);\">$item</a>\n</li>\n"; endforeach; echo $listitems; ?> </ul> </nav> <!-- nav --> <form id="searchform" action="javascript:void(0);"> <input id="s" placeholder="Search" type="search"> </form> </header> Archivo 4: content.php <div id="content"> <article class="post clearfix"> <h2 class="post-title"><a href="#">HTML5</a></h2> <figure class="post-imagen"> <img src="img/html5-imagen.jpg"> </figure> <p> <strong>HTML5</strong> (<em><strong>H</strong>yper<strong>T</strong>ext <strong>M</strong>arkup <strong>L</strong>anguage</em>, versión 5) es la quinta revisión importante del lenguaje básico de la <a href="http://es.wikipedia.org/wiki/World_Wide_Web" title="World Wide Web">World Wide Web</a>, <a href="http://es.wikipedia.org/wiki/HTML" title="HTML">HTML</a>. HTML5 especifica dos variantes de sintaxis para HTML: un «clásico» HTML (text/html), la variante conocida como <em>HTML5</em> y una variante <a href="http://es.wikipedia.org/wiki/XHTML" title="XHTML">XHTML</a> conocida como sintaxis <em>XHTML5</em> que deberá ser servida como XML (XHTML) (application/xhtml+xml). <a href="http://es.wikipedia.org/wiki/HTML5#cite_note-w3cSpec-0">1</a> <a href="http://es.wikipedia.org/wiki/HTML5#cite_note-franganilloHTML5-1">2</a> Esta es la primera vez que HTML y XHTML se han desarrollado en paralelo. </p> <p> Todavía se encuentra en modo experimental, lo cual indica la misma W3C; aunque ya es usado por múltiples desarrolladores web por sus avances, mejoras y ventajas. </p> <p> Al no ser reconocido en viejas versiones de navegadores por sus nuevas etiquetas, se le recomienda al usuario común actualizar a la versión más nueva, para poder disfrutar de todo el potencial que provee HTML5. </p> </article> <article class="post clearfix"> Lenguajes Interpretados en el Servidor 55 Guía # 4: Funciones en PHP <h2 class="post-title"><a href="#">CSS3</a></h2> <figure class="post-imagen"> <img src="img/css3-imagen.jpg"> </figure> <p> El nombre <strong>hojas de estilo en cascada</strong> viene del <a href="http://es.wikipedia.org/wiki/Idioma_ingl%C3%A9s" title="Idioma inglés">inglés</a> <em>Cascading Style Sheets</em>, del que toma sus siglas. CSS es un lenguaje usado para definir la presentación de un documento estructurado escrito en <a href="http://es.wikipedia.org/wiki/HTML" title="HTML">HTML</a> o <a href="http://es.wikipedia.org/wiki/XML" title="XML">XML</a> <a href="http://es.wikipedia.org/wiki/CSS3#cite_note-1">2</a> (y por extensión en <a href="http://es.wikipedia.org/wiki/XHTML" title="XHTML">XHTML</a>). </p> <p> El <a href="http://es.wikipedia.org/wiki/W3C" title="W3C">W3C</a> (World Wide Web Consortium) es el encargado de formular la especificación de las <a href="http://es.wikipedia.org/wiki/Hojas_de_estilo" title="Hojas de estilo">hojas de estilo</a> que servirán de estándar para los <a href="http://es.wikipedia.org/wiki/Agentes_de_usuario" title="Agentes de usuario">agentes de usuario</a> o <a href="http://es.wikipedia.org/wiki/Navegadores" title="Navegadores">navegadores</a>.<br> La idea que se encuentra detrás del desarrollo de CSS es separar la <em>estructura</em> de un documento de su <em>presentación</em>. </p> </article> <!-- /.post --> </div> Archivo 5: sidebar.php <aside id="sidebar"> <section class="widget"> <h4 class="widgettitulo">Noticias</h4> <ul> <?php $submenuoptions = array( "Diseño Web", "Diseño Gráfico", "WordPress", "Joomla", "Drupal", "Redes Sociales", "SEO" ); $listsubmenu = ""; foreach($submenuoptions as $itemsub): $listsubmenu .= href=\"javascript:void(0);\">$itemsub</a>\n</li>\n"; endforeach; echo $listsubmenu; ?> </ul> </section> <section class="widget"> <h4 class="widgettitulo">Sitos Web</h4> <ul> <?php $externallinks = array( Lenguajes Interpretados en el Servidor 56 "\n<li>\n\n<a Guía # 4: Funciones en PHP "http://www.tutosytips.com/" "http://www.wordpress.org.com/" "http://www.Joomla.org/" "http://www.twetter.com/" "http://www.facebook.com/" "http://www.youtube.com/" "javascript:void(0);" => "SEO" => => => => => => "Tutosytips.com", "Wordpress", "Joomla", "Twetter", "Facebook", "YouTube", ); $listext = ""; foreach($externallinks as $extlink => $extitem): $listext .= "\n<li>\n\n<a href=\"$extlink\">$extitem</a>\n</li>\n"; endforeach; echo $listext; ?> </ul> </section> </aside> Archivo 6: footer.inc.php <footer id="footer"> <p>Tutorial por <a href="http://tutosytips.com/">tutosytips</a></p> </footer> <!-- footer --> Archivo 7: style.css /*************************************************************** * Resetear estilos por defecto definidos por los navegadores * ***************************************************************/ html, body, address, blockquote, div, dl, form, h1, h2, h3, h4, h5, h6, ol, p, pre, table, ul, dd, dt, li, tbody, td, tfoot, th, thead, tr, button, del, ins, map, object, a, abbr, acronym, b, bdo, big, br, cite, code, dfn, em, i, img, kbd, q, samp, small, span, strong, sub, sup, tt, var, legend, fieldset { margin: 0; padding: 0; } img, fieldset { border: 0; } img { max-width: 100%; height: auto; width: auto\9; /* ie8 */ } article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; margin: 0; } /*************************************************************** * ESTILOS GENERALES * ***************************************************************/ body { /* background: #0d1424 url(../img/waves_bg.jpg) repeat center top; */ background: #0d1424 url(../img/bg-blue.jpg) repeat center top; font: .81em/150% Arial, Helvetica, sans-serif; color: #666; Lenguajes Interpretados en el Servidor 57 Guía # 4: Funciones en PHP } a { color: #026acb; text-decoration: none; outline: none; } a:hover { text-decoration: underline; } p { margin: 0 0 1.2em; padding: 0; } /* list */ ul, ol { margin: 1em 0 1.4em 24px; padding: 0; line-height: 140%; } li { margin: 0 0 .5em 0; padding: 0; } /* headings */ h1, h2, h3, h4, h5, h6 { line-height: 1.4em; margin: 20px 0 .4em; color: #000; } h1 { font-size: 2em; } h2 { font-size: 1.6em; } input[type=search] { -webkit-appearance: none; outline: none; } #pagewrap { width: 980px; margin: 0 auto; } #header { position: relative; height: 160px; } /* site description */ #site-description { color: #FFFFFF; left: 160px; Lenguajes Interpretados en el Servidor 58 Guía # 4: Funciones en PHP position: absolute; top: 30px; } #searchform { position: absolute; right: 10px; bottom: 6px; z-index: 100; width: 160px; } #searchform #s { width: 140px; float: right; background: #fff; border: none; padding: 6px 10px; /* border radius */ -webkit-border-radius: 5px; -moz-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; border-radius: 5px; behavior: url(htc/border-radius.htc); /* box shadow */ -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.2); -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.2); box-shadow: inset 0 1px 2px rgba(0,0,0,.2); /* transition */ -webkit-transition: width .7s; -moz-transition: width .7s; transition: width .7s; } #main-nav { width: 100%; background: #ccc; margin: 0; padding: 0; position: absolute; left: 0; bottom: 0; z-index: 100; /* gradient */ background: #6a6a6a url(../img/nav-bar-bg.png) repeat-x; background: -webkit-gradient(linear, left top, left bottom, from(#b9b9b9), to(#6a6a6a)); background: -moz-linear-gradient(top, #b9b9b9, #6a6a6a); background: linear-gradient(-90deg, #b9b9b9, #6a6a6a); /* rounded corner */ -webkit-border-radius: 8px; -moz-border-radius: 8px; -o-border-radius: 8px; -ms-border-radius: 8px; border-radius: 8px; behavior: url(htc/border-radius.htc); /* box shadow */ -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 1px 1px rgba(0,0,0,.4); -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 1px 1px rgba(0,0,0,.4); box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 1px 1px rgba(0,0,0,.4); } Lenguajes Interpretados en el Servidor 59 Guía # 4: Funciones en PHP #main-nav li { margin: 0; padding: 0; list-style: none; float: left; position: relative; } #main-nav li:first-child { margin-left: 10px; } #main-nav a { line-height: 100%; font-weight: bold; color: #fff; display: block; padding: 14px 15px; text-decoration: none; text-shadow: 0 -1px 0 rgba(0,0,0,.5); } #main-nav a:hover { color: #fff; background: #474747; /* gradient */ background: -webkit-gradient(linear, left top, left to(#797979)); background: -moz-linear-gradient(top, #cdcdcd, #797979); background: linear-gradient(-90deg, #cdcdcd, #797979); } #content { background: #fff; margin: 30px 0 30px; padding: 20px 35px; width: 600px; float: left; /* rounded corner */ -webkit-border-radius: 8px; -moz-border-radius: 8px; -o-border-radius: 8px; -ms-border-radius: 8px; border-radius: 8px; behavior: url(htc/border-radius.htc); /* box shadow */ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.4); -moz-box-shadow: 0 1px 3px rgba(0,0,0,.4); box-shadow: 0 1px 3px rgba(0,0,0,.4); } h2.post-title { background: #888; -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; border-radius: 5px; behavior: url(htc/border-radius.htc); padding: 0px 5px ; border-top: 1px solid #889; border-bottom: 1px solid #889; Lenguajes Interpretados en el Servidor 60 bottom, from(#cdcdcd), Guía # 4: Funciones en PHP text-align: center; } h2.post-title a { color: #FFFFFF; font-size: 0.9em; text-shadow: 1px 1px 2px #333333; } .post { margin-bottom: 20px; } .post-title { margin: 0 0 5px; padding: 0; font: bold 26px/120% Arial, Helvetica, sans-serif; } .post-title a { text-decoration: none; color: #000; } .post-meta { margin: 0 0 10px; font-size: 90%; } figure.post-imagen img { float: left; margin: 5px; max-width: 260px; } #sidebar { width: 280px; float: right; margin: 30px 0 30px; } .widget { background: #402c80; margin: 0 0 30px; padding: 10px 20px; /* rounded corner */ -webkit-border-radius: 8px; -moz-border-radius: 8px; -o-border-radius: 8px; -ms-border-radius: 8px; border-radius: 8px; behavior: url(htc/border-radius.htc); /* box shadow */ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.4); -moz-box-shadow: 0 1px 3px rgba(0,0,0,.4); box-shadow: 0 1px 3px rgba(0,0,0,.4); } .widgettitulo { background: none repeat scroll 0 0 #9f7ce9; border-radius: 5px 5px 5px 5px; -moz-border-radius: 5px 5px 5px 5px; -webkit-border-radius: 5px 5px 5px 5px; Lenguajes Interpretados en el Servidor 61 Guía # 4: Funciones en PHP -o-border-radius: 5px 5px 5px 5px; -ms-border-radius: 5px 5px 5px 5px; behavior: url(htc/border-radius.htc); color: #FFFFFF; margin: 0 0 5px; padding: 6px 0; text-align: center; } .widget ul { margin: 0; padding: 0; } .widget li { margin: 0; padding: 2px 0; list-style: none; clear: both; border-top: solid 1px #eee; } section.widget ul li a { color: #fff; font-weight: bold; font-style: italic; font-size: 1em; padding: 11px; display: block; -webkit-transition: all 0.4s ease; -moz-transition: all 0.4s ease; transition: all 0.4s ease-out; } section.widget ul li a:hover { background: #fff; color: #6B6B6B !important; text-decoration: none; } /*---FOOTER---*/ #footer { background: linear-gradient(-90deg, #b9b9b9, #6a6a6a) repeat scroll 0 0 rgba(0, 0, 0, 0); -moz-border-radius: 5px 5px 5px 5px; -webkit-border-radius: 5px 5px 5px 5px; -o-border-radius: 5px 5px 5px 5px; -ms-border-radius: 5px 5px 5px 5px; border-radius: 5px 5px 5px 5px; behavior: url(htc/border-radius.htc); clear: both; color: #333333; font-size: 90%; text-align: center; } #footer p { padding: 8px 10px; -webkit-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.75); -moz-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.75); box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.75); } Lenguajes Interpretados en el Servidor 62 Guía # 4: Funciones en PHP #footer a { color: #fff; } .clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } .clearfix { display: inline-block; } .clearfix { display: block; zoom: 1; } /**************************************************** * CONDICIONALES DE MEDIA QUERIES * ****************************************************/ @media screen and (max-width: 980px) { #pagewrap { width: 95%; } #content { width: 60%; padding: 3% 4%; } figure.post-imagen img { float: left; margin: 5px; max-width: 230px; } #sidebar { width: 30%; } #sidebar .widget { padding: 8% 7%; margin-bottom: 10px; } } @media screen and (max-width: 650px) { #header { height: auto; } #searchform { position: absolute; top: 5px; right: 0; z-index: 100; height: 40px; } #searchform #s { width: 70px; } #searchform #s:focus { width: 150px; Lenguajes Interpretados en el Servidor 63 Guía # 4: Funciones en PHP } #main-nav { position: static; } #site-logo { margin: 15px 100px 5px 0; position: static; } /* site description */ #site-description { margin: 0 0 15px; position: static; text-align: center; } #content { width: auto; float: none; margin: 20px 0; } figure.post-imagen img { float: left; margin: 5px; max-width: 180px; } #sidebar { width: 100%; margin: 0; float: none; } #sidebar .widget { padding: 3% 4%; margin: 0 0 10px; } } @media screen and (max-width: 480px) { html { -webkit-text-size-adjust: none; } #main-nav a { font-size: 90%; padding: 10px 8px; } figure.post-imagen img { float: left; margin: 5px; max-width: 130px; } } El resultado: Lenguajes Interpretados en el Servidor 64 Guía # 4: Funciones en PHP V. DISCUSION DE RESULTADOS 1. Realice un script PHP que utilice una función para que dada una lista de números enteros ingresada por el usuario (como mínimo 2 números) permita encontrar el número mayor y menor de dicha lista utilizando dos funciones con lista variable de argumentos, una para encontrar el número mayor y otra para encontrar el número menor. Los números deben ser ingresados mediante un campo input de tipo número (type="number") que mediante un botón agregar se añadirán en un campo select de múltiple selección, del mismo modo que el ejemplo de las edades. Cuando se hayan ingresado varios número, el usuario debe seleccionar todos o una cantidad de valores ingresados que no debe ser menor que dos. Si se intenta enviar uno solo o ninguno de los número debe lanzarse un mensaje de alerta con JavaScript. La solución debe permitir visualizar la lista de números ingresados e indicar cuáles han sido el número mayor y el número menor encontrados por sus funciones. 2. Haciendo uso de la modularidad descrita en el ejemplo 7 del procedimiento, cree una página web que incluya un archivo PHP para la sección head de la página que incluya la Definición de Tipo de Documento, otro para la sección footer, el menú de navegación principal, la sección content y la sección sidebar. Tiene que tomar un diseño distinto del que se mostró en el ejemplo. Puede ser la misma distribución en las mismas posiciones, pero tiene que utilizar una hoja de estilo completamente diferente y con manejo de adaptabilidad para distintos tipos de dispositivo y resoluciones de pantalla. VI. INVESTIGACIÓN COMPLEMENTARIA 1. Investigue la utilización de las funciones include_once() y require_once() e indique la diferencia o diferencias que tienen con respecto a sus homólogas include() y require(). 2. Investigue sobre el uso de funciones anónimas en PHP, indicando los motivos por los cuáles pueden ser utilizadas e implemente un ejemplo simple de cada caso. VII. BIBLIOGRAFIA Cabezas Granado, Luis Miguel. PHP 6 Manual Imprescindible. 1ra. Edición. Editorial Anaya Multimedia. Madrid, España. 2010. Doyle, Matt. Fundamentos de PHP Práctico. Editorial Anaya Multimedia. 1ª. Edición. Madrid, España. 2010. Gutiérrez, Abraham / Bravo, Ginés. PHP 5 a través de ejemplos. Editorial Alfaomega RAMA. 1ra edición. México. Junio 2005. Gil Rubio, Francisco Javier/Villaverde, Santiago Alonso/Tejedor Cerbel, Jorge A. Creación de sitios web con PHP 5. Editorial McGraw-Hill. 1ra edición. Madrid, España, 2006. John Coggeshall. La Biblia de PHP 5. 1ra Edición. Editorial Anaya Multimedia. Madrid España. http://www.php.net/manual/en Lenguajes Interpretados en el Servidor 65