jueves, 1 de diciembre de 2016

Javascript Parte XVI

Explicaremos con un ejemplo, una función que tiene datos de entrada.
Ejemplo: Confeccionar una función que reciba dos números y muestre en la página los valores comprendidos entre ellos de uno en uno. Cargar por teclado esos dos valores.
<html>
<head>
</head>
<body>
<script type="text/javascript">

  function mostrarComprendidos(x1,x2)
  {
    var inicio;
    for(inicio=x1;inicio<=x2;inicio++)
    {
      document.write(inicio+' ');
    }
  }

  var valor1,valor2;
  valor1=prompt('Ingrese valor inferior:','');
  valor1=parseInt(valor1);
  valor2=prompt('Ingrese valor superior:','');
  valor2=parseInt(valor2);
  mostrarComprendidos(valor1,valor2);

</script>
</body>
</html>
El programa de JavaScript empieza a ejecutarse donde definimos las variables valor1 y valor2 y no donde se define la función. Luego de cargar los dos valores por teclado se llama a la función mostrarComprendidos y le enviamos las variables valor1 y valor2. Los parámetros x1 y x2 reciben los contenidos de las variables valor1 y valor2.
Es importante notar que a la función la podemos llamar la cantidad de veces que la necesitemos.
Los nombres de los parámetros, en este caso se llaman x1 y x2, no necesariamente se deben llamar igual que las variables que le pasamos cuando la llamamos a la función, en este caso le pasamos los valores valor1 y valor2.

Javascript Parte XV

En programación es muy frecuente que un determinado procedimiento de cálculo definido por un grupo de sentencias tenga que repetirse varias veces, ya sea en un mismo programa o en otros programas, lo cual implica que se tenga que escribir tantos grupos de aquellas sentencias como veces aparezca dicho proceso.
La herramienta más potente con que se cuenta para facilitar, reducir y dividir el trabajo en programación, es escribir aquellos grupos de sentencias una sola y única vez bajo la forma de una FUNCION.
Un programa es una cosa compleja de realizar y por lo tanto es importante que esté bien ESTRUCTURADO y también que sea inteligible para las personas. Si un grupo de sentencias realiza una tarea bien definida, entonces puede estar justificado el aislar estas sentencias formando una función, aunque resulte que sólo se le llame o use una vez.
Hasta ahora hemos visto como resolver un problema planteando un único algoritmo.
Con funciones podemos segmentar un programa en varias partes.
Frente a un problema, planteamos un algoritmo, éste puede constar de pequeños algoritmos.
Una función es un conjunto de instrucciones que resuelven una parte del problema y que puede ser utilizado (llamado) desde diferentes partes de un programa.
Consta de un nombre y parámetros. Con el nombre llamamos a la función, es decir, hacemos referencia a la misma. Los parámetros son valores que se envían y son indispensables para la resolución del mismo. La función realizará alguna operación con los parámetros que le enviamos. Podemos cargar una variable, consultarla, modificarla, imprimirla, etc.

Incluso los programas más sencillos tienen la necesidad de fragmentarse. Las funciones son los únicos tipos de subprogramas que acepta JavaScript. Tienen la siguiente estructura:
function <nombre de función>(argumento1, argumento2, ..., argumento n) 
{ 
  <código de la función> 
} 
Debemos buscar un nombre de función que nos indique cuál es su objetivo (Si la función recibe un string y lo centra, tal vez deberíamos llamarla centrarTitulo). Veremos que una función puede variar bastante en su estructura, puede tener o no parámetros, retornar un valor, etc.

Ejemplo: Mostrar un mensaje que se repita 3 veces en la página con el siguiente texto:
'Cuidado'
'Ingrese su documento correctamente'

'Cuidado'
'Ingrese su documento correctamente'

'Cuidado'
'Ingrese su documento correctamente'
La solución sin emplear funciones es:
<html>
<head>
</head>
<body>

<script type="text/javascript">
  document.write("Cuidado<br>");
  document.write("Ingrese su documento correctamente<br>");
  document.write("Cuidado<br>");
  document.write("Ingrese su documento correctamente<br>");
  document.write("Cuidado<br>");
  document.write("Ingrese su documento correctamente<br>");
</script>

</body>
</html>
Empleando una función:
<html>
<head>
</head>
<body>

<script type="text/javascript">
  function mostrarMensaje()
  {
    document.write("Cuidado<br>");
    document.write("Ingrese su documento correctamente<br>");
  }

  mostrarMensaje();
  mostrarMensaje();
  mostrarMensaje();
</script>

</body>
</html>
Recordemos que JavaScript es sensible a mayúsculas y minúsculas. Si fijamos como nombre a la función mostrarTitulo (es decir la segunda palabra con mayúscula) debemos respetar este nombre cuando la llamemos a dicha función.
Es importante notar que para que una función se ejecute debemos llamarla desde fuera por su nombre (en este ejemplo: mostrarMensaje()).
Cada vez que se llama una función se ejecutan todas las líneas contenidas en la misma.
Si no se llama a la función, las instrucciones de la misma nunca se ejecutarán.
A una función la podemos llamar tantas veces como necesitemos.
Las funciones nos ahorran escribir código que se repite con frecuencia y permite que nuestro programa sea más entendible.

Javascript Parte XIV

Cualquier problema que requiera una estructura repetitiva se puede resolver empleando la estructura while. Pero hay otra estructura repetitiva cuyo planteo es más sencillo en ciertas situaciones.
Esta estructura se emplea en aquellas situaciones en las cuales CONOCEMOS la cantidad de veces que queremos que se ejecute el bloque de instrucciones. Ejemplo: cargar 10 números, ingresar 5 notas de alumnos, etc. Conocemos de antemano la cantidad de veces que queremos que el bloque se repita.


Por último, hay que decir que la ejecución de la sentencia break dentro de cualquier parte del bucle provoca la salida inmediata del mismo.
Sintaxis:
for (<Inicialización> ; <Condición> ; <Incremento o Decremento>)
{
  <Instrucciones>
}
Esta estructura repetitiva tiene tres argumentos: variable de inicialización, condición y variable de incremento o decremento.
Funcionamiento:
 - Primero se ejecuta por única vez el primer argumento .
          Por lo general se inicializa una variable.
 - El segundo paso es evaluar la (Condición), en caso de ser verdadera se ejecuta el bloque,
          en caso contrario continúa el programa.
 - El tercer paso es la ejecución de las instrucciones.
 - El cuarto paso es ejecutar el tercer argumento (Incremento o Decremento).
 - Luego se repiten sucesivamente del Segundo al Cuarto Paso.
Este tipo de estructura repetitiva se utiliza generalmente cuando sabemos la cantidad de veces que deseamos que se repita el bloque.

Ejemplo: Mostrar por pantalla los números del 1 al 10.
<html>
<head>
</head>
<body>

<script type="text/javascript">
  var f;
  for(f=1;f<=10;f++)
  {
    document.write(f+" ");
  }
</script>

</body>
</html>
Inicialmente f se la inicializa con 1. Como la condición se verifica como verdadera se ejecuta el bloque del for (en este caso mostramos el contenido de la variable f y un espacio en blanco). Luego de ejecutar el bloque pasa al tercer argumento del for (en este caso con el operador ++ se incrementa en uno el contenido de la variable f, existe otro operador -- que decrementa en uno una variable), hubiera sido lo mismo poner f=f+1 pero este otro operador matemático nos simplifica las cosas.

Importante: Tener en cuenta que no lleva punto y coma al final de los tres argumentos del for. El disponer un punto y coma provoca un error lógico y no sintáctico, por lo que el navegador no avisará.

Javascript Parte XIII

La sentencia do/while es otra estructura repetitiva, la cual ejecuta al menos una vez su bloque repetitivo, a diferencia del while que puede no ejecutar el bloque.
Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una vez se ejecutará el bloque repetitivo.
La condición de la estructura está abajo del bloque a repetir, a diferencia del while que está en la parte superior.
Finaliza la ejecución del bloque repetitivo cuando la condición retorna falso, es decir igual que el while.

Problema: Escribir un programa que solicite la carga de un número entre 0 y 999, y nos muestre un mensaje de cuántos dígitos tiene el mismo. Finalizar el programa cuando se cargue el valor 0.
<html>
<head>
</head>
<body>
<script  type="text/javascript">
  var valor;
  do {
    valor=prompt('Ingrese un valor entre 0 y 999:','');
    valor=parseInt(valor);
    document.write('El valor '+valor+' tiene ');
    if (valor<10)
    {
      document.write('Tiene 1 digitos');
    }
    else
    {
      if (valor<100)
      {
        document.write('Tiene 2 digitos');
      }
      else
      {
        document.write('Tiene 3 digitos');
      }
    }
   document.write('<br>');
  } while(valor!=0);
</script>
</body>
</html>
En este problema por lo menos se carga un valor. Si se carga un valor menor a 10 se trata de un número de una cifra, si es mayor a 10 pero menor a 100 se trata de un valor de dos dígitos, en caso contrario se trata de un valor de tres dígitos. Este bloque se repite mientras se ingresa en la variable 'valor' un número distinto a 0.

martes, 1 de noviembre de 2016

Javascript Parte XII

Explicaremos el concepto de un acumulador con un ejemplo.
Problema: Desarrollar un programa que permita la carga de 5 valores por teclado y nos muestre posteriormente la suma.
<html>
<head>
</head>
<body>
<script  type="text/javascript">
  var x=1;
  var suma=0;
  var valor;
  while (x<=5)
  {
    valor=prompt('Ingrese valor:','');
    valor=parseInt(valor);
    suma=suma+valor;
    x=x+1;
  }
  document.write("La suma de los valores es "+suma+"<br>");
</script>
</body>
</html>
En este problema, a semejanza de los anteriores, llevamos un CONTADOR llamado x que nos sirve para contar las vueltas que debe repetir el while.
También aparece el concepto de ACUMULADOR (un acumulador es un tipo especial de variable que se incrementa o decrementa con valores variables durante la ejecución del programa).
Hemos dado el nombre de suma a nuestro acumulador. Cada ciclo que se repita la estructura repetitiva, la variable suma se incrementa con el contenido ingresado en la variable valor.

La prueba del diagrama se realiza dándole valores a las variables:
valor  suma  x   
0  0
(Antes de entrar a la estructura repetitiva estos son los valores).
5  5  1
16  21  2
7  28  3
10  38  4
2  40  5
Este es un seguimiento del programa planteado. Los números que toma la variable valor dependerá de qué cifras cargue el operador durante la ejecución del programa.
Hay que tener en cuenta que cuando en la variable valor se carga el primer valor (en este ejemplo es el valor 5), al cargarse el segundo valor (16), el valor anterior 5 se pierde, por ello la necesidad de ir almacenando en la variable suma el valor acumulado de los valores ingresados.

Javascript Parte XI

Hasta ahora hemos empleado estructuras SECUENCIALES y CONDICIONALES. Existe otro tipo de estructuras tan importantes como las anteriores que son las estructuras REPETITIVAS.
Una estructura repetitiva permite ejecutar una instrucción o un conjunto de instrucciones varias veces.

Una ejecución repetitiva de sentencias se caracteriza por:
- La o las sentencias que se repiten.
- El test o prueba de condición antes de cada repetición, que motivará que se repitan o no las sentencias.

Funcionamiento del while: En primer lugar se verifica la condición, si la misma resulta verdadera se ejecutan las operaciones que indicamos entre las llaves que le siguen al while.
En caso que la condición sea Falsa continúa con la instrucción siguiente al bloque de llaves.
El bloque se repite MIENTRAS la condición sea Verdadera.

Importante: Si la condición siempre retorna verdadero estamos en presencia de un ciclo repetitivo infinito. Dicha situación es un error de programación, nunca finalizará el programa.

Ejemplo: Realizar un programa que imprima en pantalla los números del 1 al 100.

Sin conocer las estructuras repetitivas podemos resolver el problema empleando una estructura secuencial. Inicializamos una variable con el valor 1, luego imprimimos la variable, incrementamos nuevamente la variable y así sucesivamente. Pero esta solución es muy larga.
La mejor forma de resolver este problema es emplear una estructura repetitiva:
<html>
<head>
</head>
<body>
<script type="text/javascript">
  var x;
  x=1;
  while (x<=100)
  {
    document.write(x);
    document.write('<br>');
    x=x+1;
  }
</script>
</body>
</html>
Para que se impriman los números, uno en cada línea, agregamos la marca HTML de <br>.
Es muy importante analizar este programa:
La primera operación inicializa la variable x en 1, seguidamente comienza la estructura repetitiva while y disponemos la siguiente condición ( x <= 100), se lee MIENTRAS la variable x sea menor o igual a 100.
Al ejecutarse la condición, retorna VERDADERO, porque el contenido de x (1) es menor o igual a 100.
Al ser la condición verdadera se ejecuta el bloque de instrucciones que contiene la estructura while. El bloque de instrucciones contiene dos salidas al documento y una operación. Se imprime el contenido de x y seguidamente se incrementa la variable x en uno.

La operación x = x + 1 se lee como "en la variable x se guarda el contenido de x más 1". Es decir, si x contiene 1 luego de ejecutarse esta operación se almacenará en x un 2.

Al finalizar el bloque de instrucciones que contiene la estructura repetitiva, se verifica nuevamente la condición de la estructura repetitiva y se repite el proceso explicado anteriormente.
Mientras la condición retorne verdadero, se ejecuta el bloque de instrucciones; al retornar falso la verificación de la condición, se sale de la estructura repetitiva y continúa el algoritmo, en este caso, finaliza el programa.

Lo más difícil es la definición de la condición de la estructura while y qué bloque de instrucciones se va a repetir. Observar que si, por ejemplo, disponemos la condición x >=100 ( si x es mayor o igual a 100) no provoca ningún error sintáctico pero estamos en presencia de un error lógico porque al evaluarse por primera vez la condición retorna falso y no se ejecuta el bloque de instrucciones que queríamos repetir 100 veces.

No existe una RECETA para definir una condición de una estructura repetitiva, sino que se logra con una práctica continua, solucionando problemas.

Una vez planteado el programa debemos verificar si el mismo es una solución válida al problema (en este caso se deben imprimir los números del 1 al 100 en la página), para ello podemos hacer un seguimiento del flujo del diagrama y los valores que toman las variables a lo largo de la ejecución:
 x
 1
 2
 3
 4
 .
 .
 100
        101 Cuando x vale 101 la condición de la estructura 
                repetitiva retorna falso, en este caso finaliza el diagrama.
La variable x recibe el nombre de CONTADOR. Un contador es un tipo especial de variable que se incrementa o decrementa con valores constantes durante la ejecución del programa. El contador x nos indica en cada momento la cantidad de valores impresos en la página.
Importante: Podemos observar que el bloque repetitivo puede no ejecutarse si la condición retorna falso la primera vez.
La variable x debe estar inicializada con algún valor antes que se ejecute la operación x = x + 1.

Javascript Parte X

La instrucción switch es una alternativa para remplazar los if/else if.
De todos modos se puede aplicar en ciertas situaciones donde la condición se verifica si es igual a cierto valor. No podemos preguntar por mayor o menor.
Con un ejemplo sencillo veremos cual es su sintaxis. Confeccionar un programa que solicite que ingrese un valor entre 1 y 5. Luego mostrar en castellano el valor ingresado. Mostrar un mensaje de error en caso de haber ingresado un valor que no se encuentre en dicho rango.
<html>
<head>
</head>
<body>
<script type="text/javascript">
  var valor;
  valor=prompt('Ingrese un valor comprendido entre 1 y 5:','');
  //Convertimos a entero
  valor=parseInt(valor);
  switch (valor) {
    case 1: document.write('uno');
            break;
    case 2: document.write('dos');
            break;
    case 3: document.write('tres');
            break;
    case 4: document.write('cuatro');
            break;
    case 5: document.write('cinco');
            break;
    default:document.write('debe ingresar un valor comprendido entre 1 y 5.');
  }
</script>
</body>
</html>
Debemos tener en cuenta que la variable que analizamos debe ir después de la instrucción switch entre paréntesis. Cada valor que se analiza debe ir luego de la palabra clave 'case' y seguido a los dos puntos, las instrucciones a ejecutar, en caso de verificar dicho valor la variable que analiza el switch.
Es importante disponer la palabra clave 'break' al finalizar cada caso. La instrucciones que hay después de la palabra clave 'default' se ejecutan en caso que la variable no se verifique en algún case. De todos modos el default es opcional en esta instrucción.

Plantearemos un segundo problema para ver que podemos utilizar variables de tipo cadena con la instrucción switch.
Ingresar por teclado el nombre de un color (rojo, verde o azul), luego pintar el fondo de la ventana con dicho color:
<html>
<head>
</head>
<body>
<script type="text/javascript">
  var col;
  col=prompt('Ingrese el color con que se quiere pintar el fondo de la ventana (rojo, verde, azul)' ,'');
  switch (col) {
    case 'rojo': document.bgColor='#ff0000';
                 break;
    case 'verde': document.bgColor='#00ff00';
                 break;
    case 'azul': document.bgColor='#0000ff';
                 break;
  }
</script>
</body>
</html>
Cuando verificamos cadenas debemos encerrarlas entre comillas el valor a analizar:
  case 'rojo': document.bgColor='#ff0000';
               break;
Para cambiar el color de fondo de la ventana debemos asignarle a la propiedad bgColor del objeto document el color a asignar (el color está formado por tres valores hexadecimales que representan la cantidad de rojo, verde y azul), en este caso al valor de rojo le asignamos ff (255 en decimal) es decir el valor máximo posible, luego 00 para verde y azul (podemos utilizar algún software de graficación para que nos genere los tres valores).

Javascript Parte IX

Traducido se lo lee como "O". Si la condición 1 es Verdadera o la condición 2 es Verdadera, luego ejecutar la rama del Verdadero.
Cuando vinculamos dos o más condiciones con el operador "O", con que una de las dos condiciones sea Verdadera alcanza para que el resultado de la condición compuesta sea Verdadero.

Ejemplo: Se carga una fecha (día, mes y año) por teclado. Mostrar un mensaje si corresponde al primer trimestre del año (enero, febrero o marzo).
Cargar por teclado el valor numérico del día, mes y año por separado.
<html>
<head>
</head>
<body>
<script type="text/javascript">
  var dia,mes,año;
  dia=prompt('Ingrese día:','');
  mes=prompt('Ingrese mes:','');
  año=prompt('Ingrese año:','');
  dia=parseInt(dia);
  mes=parseInt(mes);
  año=parseInt(año);
  if (mes==1 || mes==2 || mes==3)
  {
    document.write('corresponde al primer trimestre del año.');
  }
</script>
</body>
</html>
La carga de una fecha se hace por partes, ingresamos las variables dia, mes y año.

lunes, 3 de octubre de 2016

Javascript Parte VIII

El operador &&, traducido se lo lee como "Y". Se emplea cuando en una estructura condicional se disponen dos condiciones.
Cuando vinculamos dos o más condiciones con el operador "&&" las dos condiciones deben ser verdaderas para que el resultado de la condición compuesta de Verdadero y continúe por la rama del verdadero de la estructura condicional.
Recordemos que la condición debe ir entre paréntesis en forma obligatoria.
La utilización de operadores lógicos permiten en muchos casos, plantear algoritmos más cortos y comprensibles.
Veamos un ejemplo: Confeccionar un programa que lea por teclado tres números distintos y nos muestre el mayor de ellos.
<html>
<head>
</head>
<body>
<script type="text/javascript">
  var num1,num2,num3;
  num1=prompt('Ingrese primer número:','');
  num2=prompt('Ingrese segundo número:','');
  num3=prompt('Ingrese tercer número:','');
  num1=parseInt(num1);
  num2=parseInt(num2);
  num3=parseInt(num3);
  if (num1>num2 && num1>num3)
  {
    document.write('el mayor es el '+num1);
  }
  else
  {
    if (num2>num3)
    {
      document.write('el mayor es el '+num2); 
    }
    else
    {
      document.write('el mayor es el '+num3);
    }
  }
</script>
</body>
</html>
Podemos leerla de la siguiente forma:
Si el contenido de la variable num1 es mayor al contenido de la variable num2 Y si el contenido de la variable num1 es mayor al contenido de la variable num3 entonces la CONDICION COMPUESTA resulta Verdadera.
Si una de las condiciones simples da falso, la CONDICION COMPUESTA da Falso y continúa por la rama del falso.
Es decir que se mostrará el contenido de num1 si y sólo si num1>num2 y num1>num3.
En caso de ser Falsa la condición de la rama del falso, analizamos el contenido de num2 y num3 para ver cual tiene un valor mayor.
En esta segunda estructura condicional, al haber una condición simple, no se requieren operadores lógicos.

Javascript Parte VII

Decimos que una estructura condicional es anidada cuando por la rama del verdadero o el falso de una estructura condicional hay otra estructura condicional.
Ejemplo: Confeccionar un programa que pida por teclado tres notas de un alumno, calcule el promedio e imprima alguno de estos mensajes:
Si el promedio es >=7 mostrar "Promocionado".
Si el promedio es >=4 y <7 mostrar "Regular".
Si el promedio es <4 mostrar "Reprobado".
Solución:
<html>
<head>
</head>
<body>
<script type="text/javascript">
  var nota1,nota2,nota3;
  nota1=prompt('Ingrese 1ra. nota:','');
  nota2=prompt('Ingrese 2da. nota:','');
  nota3=prompt('Ingrese 3ra. nota:','');
  //Convertimos los 3 string en enteros
  nota1=parseInt(nota1);
  nota2=parseInt(nota2);
  nota3=parseInt(nota3);
  var pro;
  pro=(nota1+nota2+nota3)/3;
  if (pro>=7)
  {
    document.write('promocionado');
  }
  else
  {
    if (pro>=4)
    {
      document.write('regular');
    }
    else
    {
      document.write('reprobado');
    }
  }
</script>
</body>
</html>
Analicemos el siguiente programa. Se ingresan tres string por teclado que representan las notas de un alumno, se transformas a variables enteras y se obtiene el promedio sumando los tres valores y dividiendo por 3 dicho resultado.
Primeramente preguntamos si el promedio es superior o igual a 7, en caso afirmativo por la rama del verdadero de la estructura condicional mostramos un mensaje que indique 'Promocionado' (con comillas indicamos un texto que debe imprimirse en pantalla).
En caso que la condición nos de falso, por la rama del falso aparece otra estructura condicional, porque todavía debemos averiguar si el promedio del alumno es superior o igual a cuatro o inferior a cuatro.

Los comentarios en JavaScript los hacemos disponiendo dos barras previas al comentario (los comentario en tiempo de ejecución no son tenidos en cuenta y tienen por objetivos de documentar el programa para futuras modificaciones):
//Convertimos los 3 string en enteros
Si queremos disponer varias líneas de comentarios tenemos como alternativa:
/*
linea de comentario 1.
linea de comentario 2.
etc.
*/
Es decir encerramos el bloque con los caracteres /* */

Javascript Parte VI

Cuando se presenta la elección tenemos la opción de realizar una actividad u otra. Es decir tenemos actividades por el verdadero y por el falso de la condición. Lo más importante que hay que tener en cuenta es que se realizan las actividades de la rama del verdadero o las del falso, NUNCA se realizan las actividades de las dos ramas.
En una estructura condicional compuesta tenemos entradas, salidas, operaciones, tanto por la rama del verdadero como por la rama del falso.

Ejemplo: Realizar un programa que lea dos números distintos y muestre el mayor de ellos:
<html>
<head>
</head>
<body>
<script type="text/javascript">
  var num1,num2;
  num1=prompt('Ingrese el primer número:','');
  num2=prompt('Ingrese el segundo número:','');
  num1=parseInt(num1);
  num2=parseInt(num2);
  if (num1>num2)
  {
    document.write('el mayor es '+num1);
  }
  else
  {
    document.write('el mayor es '+num2);
  }
</script>
</body>
</html>
La función prompt retorna un string por lo que debemos convertirlo a entero cuando queremos saber cual de los dos valores es mayor numéricamente. En el lenguaje JavaScript una variable puede ir cambiando el tipo de dato que almacena a lo largo de la ejecución del programa.
Más adelante veremos qué sucede cuando preguntamos cuál de dos string es mayor.
Estamos en presencia de una ESTRUCTURA CONDICIONAL COMPUESTA ya que tenemos actividades por la rama del verdadero y del falso.
La estructura condicional compuesta tiene la siguiente codificación:
if (<condición>) 
{
  <Instruccion(es)>
}
else
{
  <Instruccion(es)>
}
Es igual que la estructura condicional simple salvo que aparece la palabra clave ?else? y posteriormente un bloque { } con una o varias instrucciones.
Si la condición del if es verdadera se ejecuta el bloque que aparece después de la condición, en caso que la condición resulte falsa se ejecuta la instrucción o bloque de instrucciones que indicamos después del else.

Javascript Parte V

No todos los problemas pueden resolverse empleando estructuras secuenciales. Cuando hay que tomar una decisión aparecen las estructuras condicionales.
En nuestra vida diaria se nos presentan situaciones donde debemos decidir.
¿Elijo la carrera A o la carrera B ?
¿Me pongo este pantalón ?
¿Entro al sitio A o al sitio B ?
Para ir al trabajo, ¿elijo el camino A o el camino B ?
Al cursar una carrera, ¿elijo el turno mañana, tarde o noche ?

Por supuesto que en un problema se combinan estructuras secuenciales y condicionales.
Cuando se presenta la elección tenemos la opción de realizar una actividad o no realizarla.
En una estructura CONDICIONAL SIMPLE por el camino del verdadero hay actividades y por el camino del falso no hay actividades. Por el camino del verdadero pueden existir varias operaciones, entradas y salidas, inclusive ya veremos que puede haber otras estructuras condicionales.
Ejemplo: Realizar la carga de una nota de un alumno. Mostrar un mensaje que aprobó si tiene una nota mayor o igual a 4:
<html>
<head>
</head>
<body>
<script type="text/javascript">
  var nombre;
  var nota;
  nombre=prompt('Ingrese nombre:','');
  nota=prompt('Ingrese su nota:','');
  if (nota>=4)
  {
    document.write(nombre+' esta aprobado con un '+nota);
  }
</script>
</body>
</html>
Aparece la instrucción if en el lenguaje JavaScript. La condición debe ir entre paréntesis. Si la condición se verifica verdadera se ejecuta todas las instrucciones que se encuentran encerradas entre las llaves de apertura y cerrado seguidas al if.
Para disponer condiciones en un if podemos utilizar alguno de los siguientes operadores relacionales:
>  mayor
>= mayor o igual
<  menor
<= menor o igual
!= distinto
== igual
Siempre debemos tener en cuenta que en la condición del if deben intervenir una variable un operador relacional y otra variable o valor fijo.
Otra cosa que hemos incorporado es el operador + para cadenas de caracteres:
document.write(nombre+' esta aprobado con un '+nota);
Con esto hacemos más corto la cantidad de líneas de nuestro programa, recordemos que veníamos haciéndolo de la siguiente forma:
document.write(nombre);
document.write(' esta aprobado con un ');
document.write(nota);

jueves, 22 de septiembre de 2016

Javascript Parte IV

Cuando en un problema sólo participan operaciones, entradas y salidas se la denomina estructura secuencial.
El problema anterior, donde se ingresa el nombre de una persona y su edad se trata de una estructura secuencial.
Ejemplo de otro algoritmo con estructura secuencial: Realizar la carga de dos números por teclado e imprimir su suma y su producto:
  <html>
  <head>
  <script type="text/javascript">
    var valor1;
    var valor2;
    valor1=prompt('Ingrese primer número:','');
    valor2=prompt('Ingrese segundo número','');
    var suma=parseInt(valor1)+parseInt(valor2);
    var producto=parseInt(valor1)*parseInt(valor2);
    document.write('La suma es ');
    document.write(suma);
    document.write('<br>');
    document.write('El producto es ');
    document.write(producto);
  </script>
  </head>
  <body>
  </body>
  </html>
Lo primero que debemos tener en cuenta es que si queremos que el operador + sume los contenidos de los valores numéricos ingresados por teclado, debemos llamar a la función parseInt y pasar como parámetro las variables valor1 y valor2 sucesivamente. Con esto logramos que el operador más, sume las variables como enteros y no como cadenas de caracteres. Si por ejemplo sumamos 1 + 1 sin utilizar la función parseInt el resultado será 11 en lugar de 2, ya que el operador + concatena las dos cadenas.
En JavaScript, como no podemos indicarle de qué tipo es la variable, requiere mucho más cuidado cuando operamos con sus contenidos.
Este problema es secuencial ya que ingresamos dos valores por teclado, luego hacemos dos operaciones y por último mostramos los resultados.

Javascript Parte III

Para la entrada de datos por teclado tenemos la función prompt. Cada vez que necesitamos ingresar un dato con esta función, aparece una ventana donde cargamos el valor. Hay otras formas más sofisticadas para la entrada de datos en una página HTML, pero para el aprendizaje de los conceptos básicos de JavaScript nos resultará más práctica esta función.
Para ver su funcionamiento analicemos este ejemplo:
  <html>
  <head>
  </head>
  <body>
  <script type="text/javascript">
    var nombre;
    var edad;
    nombre=prompt('Ingrese su nombre:','');
    edad=prompt('Ingrese su edad:','');
    document.write('Hola ');
    document.write(nombre);
    document.write(' asi que tienes ');
    document.write(edad);
    document.write(' años');
  </script>
  </body>
  </html>
La sintaxis de la función prompt es:
<variable que recibe el dato>=prompt(<mensaje a mostrar en la ventana>,<valor 
  inicial a mostrar en la ventana>);
La función prompt tiene dos parámetros: uno es el mensaje y el otro el valor inicial a mostrar.

Javascript Parte II

Una variable es un depósito donde hay un valor. Consta de un nombre y pertenece a un tipo (númerico, cadena de caracteres, etc.)
Tipos de variable:
Una variable puede almacenar:
Valores Enteros (100, 260, etc.)
Valores Reales (1.24, 2.90, 5.01, etc.)
Cadenas de caracteres ('Juan', 'Compras', 'Listado', etc.)
Valores lógicos (true,false)
Existen otros tipos de variables que veremos más adelante.

Las variables son nombres que ponemos a los lugares donde almacenamos la información. En JavaScript, deben comenzar por una letra o un subrayado (_), pudiendo haber además dígitos entre los demás caracteres. Una variable no puede tener el mismo nombre de una palabra clave del lenguaje.
Una variable se define anteponiéndole la palabra clave var:
var dia;
se pueden declarar varias variables en una misma línea:
var dia, mes, anio;
a una variable se la puede definir e inmediatamente inicializarla con un valor:
var edad=20;
o en su defecto en dos pasos:
var edad;
edad=20;


Elección del nombre de una variable:
Debemos elegir nombres de variables representativos. En el ejemplo anterior los nombres dia, mes, anio son lo suficientemente claros para darnos una idea acabada sobre su contenido, una mala elección de nombres hubiera sido llamarlas a,b y c. Podemos darle otros buenos nombres. Otros no son tan representativos, por ejemplo d, m, a. Posiblemente cuando estemos resolviendo un problema dicho nombre nos recuerde que almacenamos el dia, pero pasado un tiempo lo olvidaríamos.

Impresión de variables en una página HTML.
Para mostrar el contenido de una variable en una página utilizamos el objeto document y llamamos a la función write.
En el siguiente ejemplo definimos una serie de variables y las mostramos en la página:
  <html>
  <head>
  </head>
  <body>
  <script type="text/javascript">
    var nombre='Juan';
    var edad=10;
    var altura=1.92;
    var casado=false;
    document.write(nombre);
    document.write('<br>');
    document.write(edad); 
    document.write('<br>');
    document.write(altura); 
    document.write('<br>');
    document.write(casado); 
  </script>
  </body>
  </html>
Cuando imprimimos una variable, no la debemos disponer entre simples comillas (en caso de hacer esto, aparecerá el nombre de la variable y no su contenido)
Los valores de las variables que almacenan nombres (es decir, son cadenas de caracteres) deben ir encerradas entre comillas simples o dobles. Los valores de las variables enteras (en este ejemplo la variable edad) y reales no deben ir encerradas entre comillas. Cada instrucción finaliza con un punto y coma.
Las variables de tipo boolean pueden almacenar solo dos valores: true o false.
El resultado al visualizar la página debe ser 4 líneas similares a éstas:

Juan
10
1.92
false

Es decir que se muestran los contenidos de las 4 variables. Una variable es de un tipo determinado cuando le asignamos un valor:
  var edad=10;
Es de tipo entera ya que le asignamos un valor entero.
  var nombre='juan';
Es de tipo cadena.
Para mostrar el contenido de una variable en una página debemos utilizar la función 'write' que pertenece al objeto document. Recordemos que el lenguaje JavaScript es sensible a mayúsculas y minúsculas y no será lo mismo si tipeamos:
Document.Write(nombre);
Esto porque no existe el objeto 'Document' sino el objeto 'document' (con d minúscula), lo mismo no existe la función 'Write' sino 'write', este es un error muy común cuando comenzamos a programar en JavaScript

Javascript Parte I

JavaScript, al igual que Flash, Visual Basic Script, es una de las múltiples maneras que han surgido para extender las capacidades del lenguaje HTML (lenguaje para el diseño de páginas de Internet). Al ser la más sencilla, es por el momento la más extendida. JavaScript no es un lenguaje de programación propiamente dicho como C, C++, Delphi, etc. Es un lenguaje script u orientado a documento, como pueden ser los lenguajes de macros que tienen muchos procesadores de texto y planillas de cálculo. No se puede desarrollar un programa con JavaScript que se ejecute fuera de un Navegador, aunque en este momento comienza a expandirse a otras áreas como la programación en el servidor con Node.js
JavaScript es un lenguaje interpretado que se embebe en una página web HTML. Un lenguaje interpretado significa que a las instrucciones las analiza y procesa el navegador en el momento que deben ser ejecutadas.

Nuestro primer programa será el famoso "Hola Mundo", es decir un programa que muestre en el documento HTML el mensaje "Hola Mundo".
<html>
<head>
</head>
<body> 
<script type="text/javascript">
  document.write('Hola Mundo');
</script>
</body>
</html>

El programa en JavaScript debe ir encerrado entre la marca script e inicializada la propiedad type con la cadena text/javascript:
<script type="text/javascript">
</script>
Para imprimir caracteres sobre la página debemos llamar al comando 'write' del objeto document. La información a imprimirse debe ir entre comillas y encerrada entre paréntesis. Todo lo que indicamos entre comillas aparecerá tal cual dentro de la página HTML.
Es decir, si pedimos al navegador que ejecute esta página mostrará el texto 'Hola Mundo'.
Cada vez que escribimos una instrucción finalizamos con el carácter punto y coma.

ES IMPORTANTISIMO TENER EN CUENTA QUE JavaScript es SENSIBLE A MAYUSCULAS Y MINUSCULAS. NO ES LO MISMO ESCRIBIR:
document.write que DOCUMENT.WRITE (la primera forma es la correcta, la segunda forma provoca un error de sintaxis).
Nos acostumbraremos a prestar atención cada vez que escribamos en minúsculas o mayúsculas para no cometer errores sintácticos. Ya veremos que los nombres de funciones llevan letras en mayúsculas.

martes, 2 de agosto de 2016

WEB SERVICES CON PHP - Parte VIII

¿Cómo lo podemos usar?:

Existen muchas formas en que podríamos usar este Web Service, podemos dejar que el visitante seleccione su país y localidad, y que nuestro sitio le retorne cual es el pronostico actual (solo deberíamos incorporar un paso anterior al que se ofrece en el código, el de selección del país).

Otro uso que podemos darle es el de mostrar cual es el clima actual para una localidad determinada (lo mismo que hacen muchos diarios en sus cabeceras). Si decidimos implementar la segunda opción debemos tener especial cuidado en como lo hacemos, ya que si por cada petición que haga el usuario debemos conectarnos con el servidor que ofrece el web service, esto provocaría una gran demora para el usuario, y una sobrecarga innecesaria del servidor. Para solucionar esto podemos guardar en un archivo de texto o en una base de datos, el clima actual, para leerlo desde allí. Este archivo, o base de datos, la actualizaríamos cada un tiempo prudencial (como puede ser una hora o más).

Otros Web Services:

Actualmente existen gran cantidad de Web Services, gratuitos y no. En el sitio de XMethods pueden encontrar gran cantidad de ellos. Sin ir más lejos Google ofrece un web service para realizar búsquedas (solo hay que registrarse en http://www.google.com/apis/) y nos permitirá realizar 1000 consultas por día (creo que puede ser más que interesante para muchos).

Conclusión:

Los Web Services son un tema apasionante, ya que brindan gran funcionalidad y posibilidad de realizar cambios y mejorar nuestras aplicaciones. Un mismo web service puede ser consumido tanto por aplicaciones que se ejecutan en un servidor y entregan código html al cliente, como por aplicaciones que corren directamente en la máquina del cliente. Como vemos las posibilidades son infinitas, es sólo cuestión de comenzar a experimentar.

Apéndice:

Código de seleccionarLocalidad.php

/**
* Codigo para consumir un servicio web (Web Service) por medio de NuSoap.
* La distribucion del codigo es totalmente gratuita y no tiene ningun tipo de restriccion.
* Se agradece que mantengan la fuente del mismo.

*/ $sPais = "argentina"; // Nombre del pais que queremos el listado de localidades

// Inclusion de la libreria nusoap (la que contendra toda la conexión con el servidor // require_once('lib/nusoap.php');

$oSoapClient = new soapclient('http://live.capescience.com/wsdl/GlobalWeather.wsdl', true);

if ($sError = $oSoapClient->getError()) {
echo "No se pudo realizar la operación [" . $sError . "]";
die();
}
$aParametros = array("country" => $sPais);
$respuesta = $oSoapClient->call("searchByCountry", $aParametros);

   // Existe alguna falla en el servicio? if ($oSoapClient->fault) { // Si
echo 'No se pudo completar la operación';
die();
} else { // No
$sError = $oSoapClient->getError();
// Hay algun error ?
if ($sError) { // Si
echo 'Error:' . $sError;
die();
}
}
?>
<html>
   <body>
      <form action="mostrarPronostico.php" method="post" name="frmLocalidades" id="frmLocalidades">
         <table width="400" border="0" cellspacing="0" cellpadding="0">
      <tr>
         <td colspan="2"><div align="center">Seleccione una localidad</div></td>
      </tr>
      <tr>
         <td width="61"> </td>
         <td width="339"> </td>
      </tr>
      <tr>
         <td>Localidad:</td>
         <td><select name="codLocalidad" id="codLocalidad">
$aElemento)
      echo "<option value='".$aElemento["wmo"]."'>".$aElemento["name"]."</option>";
?>
         </select></td>
      </tr>
      <tr>
         <td> </td>
         <td> </td>
      </tr>
      <tr>
            /td>
            td><input type="submit" name="Submit" value="Quiero ver el pronostico"></td>
         /tr>
         /table>
      /form>
   /body>
</html>

WEB SERVICES CON PHP - Parte VII

Comenzamos a programar!

Como mencione anteriormente he dividido la aplicación de prueba del Web Service en dos (2) archivos, uno que mostrara todas las localidades donde existen pronósticos (seleccionarLocalidad.php) y otro que mostrara el pronóstico para la localidad seleccionada (mostrarPronostico.php)

Veamos como consumimos un web service (searchByCountry):

En el código se han eliminado las comprobaciones de errores para poder facilitar la lectura de los pasos. Veamos cuales son los pasos para consumir un servicio web desde PHP:

require_once(“lib/nusoap.php”);

Debemos incluir la librería NuSOAP. En este ejemplo asumimos que el directorio donde se encuentra el archivo nusoap.php esta ubicado en el subdirectorio lib (a partir de donde esta nuestro script).

$oSoapClient = new soapclient('http://live.capescience.com/wsdl/GlobalWeather.wsdl', true);

Debemos instanciar la clase soapclient, ya que en esta ocasión utilizaremos solo el cliente que nos provee NuSOAP. Los parámetros enviados son la ubicación del documento WSDL y true como segundo parametro (este último parámetro indica que el primer documento es un WSDL) .

Definimos un array con el país para el cual se quieren obtener las localidades que tienen pronósticos disponibles. Volviendo al documento WSDL podemos ver que la variable que debemos enviar es “country” y que es del tipo string

$aParametros = array("country" => "argentina");

280. <message name="searchByCountry">

281. <part name="country" type="xsd:string"/>

282. </message>

$aRespuesta = $oSoapClient->call("searchByCountry", $aParametros);


Llamamos al método call del objeto soapclient. Al mismo le pasamos como parámetro el nombre del método que queremos ejecutar en el web service (searchByCountry) y los parámetros ($aParametros). En nuestra variable $aRespuesta tenemos un array con la respuesta del Web Service. Este array tiene el formato descripto en “ArrayOfStation” (el cual fue visto anteriormente). Es decir podemos acceder a las variables descriptas en ArrayOfStation de la siguiente manera: $aRespuesta[“wmo”], $aRespuesta[“elevation”], $aRespuesta[“name”], etc.

Ahora que ya conocemos c&oacte;mo sería el procedimiento para consumir un Web Service, veamos un poco más en profundidad los métodos de soapclient que utilizamos:

Al crear una instancia de soapclient, existen varios parámetros que podemos enviar para su creación:

$oSoapClient = new soapclient(

   <url donde se encuentra el web service o WSDL>,
   [<booleana indicando si el primer parámetro es un WSDL>],
   [<entero con el Portéame>],
   [<cadena proxyHost>],
   [<cadena proxyPort>],
   [<cadena nombre de usuario>],
   [<cadena password>],
   [<entero con el timeout de la conexión>],
   [<entero con el timeout de la respuesta>]);


Solo el primer parámetro es necesario (la ubicación del Web Service o del documento WSDL del Web Service), todos los demás son opcionales.

Al ejecutar el Web Service, existen varios parámetros que podemos enviar al método:

call( <método que queremos ejecutar en el servidor>,

   [<un array asociativo con los parámetros que debemos enviar (si existen)>],
   [<cadena con el espacio de nombres (namespace)>],
   [<cadena con el valor de la acción SOAP>],
   [<booleana indicando si esta presente los valores de SOAPVAL en los headers>],
   [<booleana la cual ya no se utiliza>],
   [<cadena con el style a usar cuando se realiza la serialización de los parametros>],
   [<cadena que puede ser "encoded" o "literal" utilizada para serialización de los parametros>]);


Cómo vemos existen muchos más parametros de los que habiamos utilizado, pero como exigen un conocimiento más profundo sobre los Web Services los cuales escapan a los alcances de este artículo no los trateremos aquí.

WEB SERVICES CON PHP - Parte VI

¿Como lo usamos?

Para responder a esta pregunta no hay nada mejor que un ejemplo de utilización de NuSOAP, el cual nos ayudará también a terminar de ver los conceptos mencionados anteriormente (SOAP, WSDL, etc.).

Decidí ir a la página de XMethods y buscar algún servicio que pueda ser aplicable por personas de todo el mundo, y que no esté limitado a los Estados Unidos. Buscando entre gran cantidad de Web Services de Cotizaciones, o datos específicos de los Estados Unidos, encontré uno que podía ser implementado en cualquier país, y era ni más ni menos que los datos del clima para todo el mundo. Este Web Service tiene 9 métodos que podemos utilizar (todos ellos se encuentran definidos en el archivo WSDL que se encuentra en http://live.capescience.com/wsdl/GlobalWeather.wsdl. Los métodos son: getStation(), isValidCode(), listCountries(), searchByCode(), searchByCountry(), searchByLocation(), searchByName(), searchByRegion(), getWeatherReport().

Para el ejemplo solo utilizare el método searchByCountry() y getWeatherReport().

En el ejemplo existen dos archivos:

seleccionarLocalidad.php: el cual nos permitirá seleccionar una localidad dado un país (el país esta dado por el valor de la variable $sPais). Este archivo PHP utiliza el método del Web Service searchByCountry()

mostrarPronostico.php: el cual mostrara el pronóstico para la localidad seleccionada. Este archivo PHP utiliza el método del Web Service getWeatherReport().

Si queremos ver un listado de los servicios publicados podemos ir a esta página: CapeScience

En esta página nos permiten probar los métodos de los Web Services en línea, sin necesidad de un cliente SOAP, esto nos es de utilidad principalmente para ver como funciona cada uno de los métodos.

Como mencione anteriormente, toda la información del Web Service se encuentra definida dentro del documento WSDL, para este Web service se encuentra definida en CapeScience.

Este documento en particular tiene 425 líneas, por lo que la lectura del mismo es bastante tediosa.

No voy a explicar todo el archivo WSDL, sino que simplemente me detendré en las líneas que son de importancia para nuestra aplicación (las que hacen referencia a los metodos searchByCountry() y getWeatherReport() ). Ahora veamos donde se encuentran las definiciones de los métodos dentro del archivo:

Mensajes de searchByCountry: entre las lineas 277 a 282 podemos apreciar que se encuentra lo siguiente:

277. <message name="searchByCountryResponse">
278. <part name="return" type="xsd1:ArrayOfStation"/>
279. </message>
280. <message name="searchByCountry">
281. <part name="country" type="xsd:string"/>
282. </message>
SearchByCountry: comencemos por la línea 280 y dejaremos para después las líneas 277 a 279.

280. <message name="searchByCountry">
En esta línea se indica que existe un método llamado searchByCountry, que es el método que estábamos buscando.

281. <part name="country" type="xsd:string"/>
Aquí se define que existe un parámetro para dicho método que se llama “country” (país) y es del tipo string.

282. </message>
Fin del método seachByCountry

Ejemplo de un mensaje real con el parámetro country seteado en “argentina”:

<nu:searchByCountry>
   <country xsi:type="xsd:string">argentina</country>
</nu:searchByCountry>


SearchByCountryResponse: Ahora analicemos el método searchByCountryResponse, como su nombre indica, es la respuesta al metodo searchByCountry. Es decir cuando invocamos a searchByCountry, el servidor nos responderá con un mensaje con el formato de searchByCountryResponse. Las respuestas, generalmente, tienen anexado al final Response al nombre del método (esto se epecifica en el portType).

277. <message name="searchByCountryResponse">
Esta línea nos indica que es una respuesta al método searchByCountry.

278. <part name="return" type="xsd1:ArrayOfStation"/>
El método nos devuelve una variable “return” la cual es del tipo ArrayOfSation. Como vimos anteriormente, los documentos WSDL pueden definir sus propios tipos de datos, ArrayOfStation es un tipo de datos definido en este WSDL. Ver más adelante la definición del tipo de datos ArrayOfStation.

279. </message>
Fin del método searchByCountryResponse.

Como vimos anteriormente se hace referencia a un ArrayOfStation, para ver de que se trata esto debemos buscar este tipo de datos dentro del archivo WSDL. En las líneas comprendidas ente 148 y 157, podemos ver que se define este tipo de datos.

148. <xsd:complexType name="ArrayOfStation">
149.   <xsd:complexContent>
150.      <xsd:restriction base="SOAP-ENC:Array">
151.         <xsd:sequence>
152.            <xsd:element maxOccurs="unbounded" minOccurs="0" name="item" type="xsd1:Station"/>
153.         </xsd:sequence>
154.         <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd1:Station[]"/>
155.      </xsd:restriction>
156.   </xsd:complexContent>
157. </xsd:complexType>


148. <xsd:complexType name="ArrayOfStation">
En esta línea podemos ver que se define un tipo de datos complejo (complexType) con el nombre de “ArrayOfStation”, el tipo de datos que buscábamos.

149. <xsd:complexContent>
150. <xsd:restriction base="SOAP-ENC:Array">
151. <xsd:sequence>

Indicamos que es un elemento complejo (array).

152. <xsd:element maxOccurs="unbounded" minOccurs="0" name="item" type="xsd1:Station"/>
Esta línea es la que más nos interesa, ya que se indica precisamente como esta compuesto el array. Nos dice que tiene un mínimo de ocurrencias de 0 (MinOccurs=” 0” ), es decir, que puede no tener elementos. Un máximo de ocurrencias no limitado (maxOccurs=”unbounded”), es decir que podemos tener todos los elementos que queramos. Y al finalizar nos indica el tipo de datos del array, que es “Station”. Por desgracia ahora tenemos que ver que tipo de datos es Station. Como podemos ver un dato se define a partir de otro, hasta llegar a los tipos de datos básicos.

153. </xsd:sequence>
Se cierran los tags anteriormente abiertos.

154. <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd1:Station[]"/>
Terminamos de definir el array.

155. </xsd:restriction> 156. </xsd:complexContent> 157. </xsd:complexType>
Se cierran los demás tags que fueron abiertos.

Nos quedaba pendiente definir el tipo de datos “Station”, nuevamente, al buscar en el código encontramos entre las líneas 134 a 147 la definición de este tipo de datos.

134.   <xsd:complexType name="Station">
135.      <xsd:sequence>
136.         <xsd:element maxOccurs="1" minOccurs="1" name="icao" nillable="true" type="xsd:string"/>
137.      <   xsd:element maxOccurs="1" minOccurs="1" name="wmo" nillable="true" type="xsd:string"/>
138.      <   xsd:element maxOccurs="1" minOccurs="1" name="iata" nillable="true" type="xsd:string"/>
139.      <   xsd:element maxOccurs="1" minOccurs="1" name="elevation" type="xsd:double"/>
140.      <   xsd:element maxOccurs="1" minOccurs="1" name="latitude" type="xsd:double"/>
141.      <   xsd:element maxOccurs="1" minOccurs="1" name="longitude" type="xsd:double"/>
142.      <   xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string"/>
143.      <   xsd:element maxOccurs="1" minOccurs="1" name="region" nillable="true" type="xsd:string"/>
144.      <   xsd:element maxOccurs="1" minOccurs="1" name="country" nillable="true" type="xsd:string"/>
145.         <xsd:element maxOccurs="1" minOccurs="1" name="string" nillable="true" type="xsd:string"/>
146.      </xsd:sequence>
147.   </xsd:complexType>


134. <xsd:complexType name="Station">
Se define que comienza el tipo de datos complejo Station.

135. <xsd:sequence>
Indicamos que comenzamos con la definición del tipo secuencia (es decir que todos los elementos que se definen dentro están incluidos en el tipo de datos Station). Existen otro tipo que no es secuencia (sequence), y se llama choice (elección), en el cual se selecciona entre uno de los elementos dentro definidos (aquellos comprendidos entre <xsd:choice>y </xsd:choice>).

136. <xsd:element maxOccurs="1" minOccurs="1" name="icao" nillable="true" type="xsd:string"/>
137. <xsd:element maxOccurs="1" minOccurs="1" name="wmo" nillable="true" type="xsd:string"/>
138. <xsd:element maxOccurs="1" minOccurs="1" name="iata" nillable="true" type="xsd:string"/>

Se definen 3 elementos los cuales son del tipo string, dichos elementos son: icao, wmo, e iata.

139. <xsd:element maxOccurs="1" minOccurs="1" name="elevation" type="xsd:double"/>
140. <xsd:element maxOccurs="1" minOccurs="1" name="latitude" type="xsd:double"/>
141. <xsd:element maxOccurs="1" minOccurs="1" name="longitude" type="xsd:double"/>

Se definen otros 3 elementos, en este caso son del tipo double. Estos son: elevation, latitude, y longitude.

142. <xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string"/>
143. <xsd:element maxOccurs="1" minOccurs="1" name="region" nillable="true" type="xsd:string"/>
144. <xsd:element maxOccurs="1" minOccurs="1" name="country" nillable="true" type="xsd:string"/>
145. <xsd:element maxOccurs="1" minOccurs="1" name="string" nillable="true" type="xsd:string"/>

Se definen los últimos 4 elementos del tipo string. Los elementos aquí definidos son: name, region, country, y string.

146. </xsd:sequence>
147. </xsd:complexType>

Cierre de los tags abiertos anteriormente.

Veamos un ejemplo de respuesta:

<return xsi:type="cc1:ArrayOfStation" SOAP-ENC:arrayType="cc1:Station[86]">
   <item xsi:type="cc1:Station">
      <icao xsi:type="xsd:string">SARS</icao>
      <wmo xsi:type="xsd:string">87149</wmo>
      <iata xsi:nil="true"/>
      <elevation xsi:type="xsd:double">91.0</elevation>
      <latitude xsi:type="xsd:double">-26.817</latitude>
      <longitude xsi:type="xsd:double">-60.45</longitude>
      <name xsi:type="xsd:string">Presidencia Roque Saenz Pena Aerodrome</name>
      <region xsi:nil="true"/>
      <country xsi:type="xsd:string">
      Argentina </country>
      <string xsi:type="xsd:string">SARS - Presidencia Roque Saenz Pena Aerodrome, Argentina
      @ -26.817'S -60.45'W 91m</string>
      </item>
   <item xsi:type="cc1:Station">
</return>


Para aclarar el tipo de estructura de ArrayOfStation usaremos analogías con otros lenguajes de programación:

// Delphi //

Station = record
icao : String;
wmo : String;
iata : String;
elevation : String;
latitude : String;
longitude : String;
name : String;
region : String;
country : String;
string_ : String;
end;
ArrayOfSation : array of Station;


// C# //

struct Station
{
String icao;
String wmo;
String iata;
String elevation;
String latitude;
String longitude;
String name;
String region;
String country;
String string_;
}
Station[] ArrayOfStation;


Como vemos no es fácil seguir todo lo que esta definido dentro de un documento WSDL, por suerte muchas veces no nos tenemos que preocupar por todo esto ya que los mismos sitios donde se encuentran alojados los Web Services nos proveen de la información necesaria sin necesidad de tener que recurrir a ver los archivos WSDL. También existen aplicaciones como son Altova XMLSPY que nos proveen de la información de manera gráfica

WEB SERVICES CON PHP - Parte V

¿Que es NuSOAP?

NuSOAP es un kit de herramientas (ToolKit) para desarrollar Web Services bajo el lenguaje PHP. Está compuesto por una serie de clases que nos harán mucho más fácil el desarrollo de Web Services. Provee soporte para el desarrollo de clientes (aquellos que consumen los Web Services) y de servidores (aquellos que los proveen). NuSOAP está basado en SOAP 1.1, WSDL 1.1 y HTTP 1.0/1.1

¿NuSOAP es el único soporte para Web Services en PHP?

No, no es el único, existen otros, pero es uno de los que están en una fase de desarrollo mucho más avanzada. Sin ir más lejos, PHP a partir de su versión 5 comienza a dar soporte para SOAP, pero aún está en fase experimental.

¿Por qué NuSOAP y no otro?
  1. Está en una fase madura de desarrollo.
  2. No necesita módulos adicionales.
  3. Es muy fácil su instalación y uso
¿Cómo instalo NuSOAP?

La instalación es bastante sencilla, sólo basta ir a la pagina en sourceforge de NuSOAP http://sourceforge.net/projects/nusoap/ y bajar el archivo comprimido (es un .zip).

Lo descomprimimos en un directorio de nuestro servidor web (como puede ser /lib que es el directorio por default), y listo, ya podemos hacer uso de NuSOAP

jueves, 7 de julio de 2016

WEB SERVICES CON PHP - Parte IV

Los Servicios Web surgieron ante una necesidad de estandarizar la comunicación entre distintas plataformas (PC, Mainframe, Mac, etc.) y lenguajes de programación (PHP, C#, Java, etc.).

Anteriormente se habían realizado intentos de crear estándares pero fracasaron o no tuvieron el suficiente éxito, algunos de ellos son DCOM y CORBA, por ser dependientes de la implementación del vendedor DCOM - Microsoft, y CORBA - ORB (a pesar que CORBA de múltiples vendedores pueden operar entre si, hay ciertas limitaciones para aplicaciones de niveles más altos en los cuales se necesite seguridad o administración de transacciones).

Otro gran problema es que se hacía uso de RPC (Remote Procedure Call) para realizar la comunicación entre diferentes nodos. Esto, además de presentar ciertos problemas de seguridad, tiene la desventaja de que su implementación en un ambiente como es Internet, es casi imposible (muchos firewalls bloquean este tipo de mensajes, lo que hace prácticamente imposible a dos computadoras conectadas por Internet comunicarse).

Los Web Services surgieron para finalmente poder lograr la tan esperada comunicación entre diferentes plataformas. En la actualidad muchos sistemas legacy están pasando a ser web services.

Es por esto que en 1999 se comenzó a plantear un nuevo estándar, el cual terminaría utilizando XML, SOAP, WSDL, y UDDI.

¿Los Web services pueden ser solo utilizados con HTTP?

A pesar de mucho limitar el uso de los Web services al protocolo HTTP, los Web services no fueron pensados para un protocolo en particular, es decir, nada nos impide utilizar SOAP sobre algún otro protocolo de Internet (SMTP, FTP, etc.).

Se utiliza principalmente HTTP por ser un protocolo ampliamente difundido y que se encuentra menos restringido por firewalls (generalmente se bloquean puertos como el FTP, pero el HTTP es muy probable que no este bloqueado).

WEB SERVICES CON PHP - Parte III

WSDL - Web Services Description Language

Es un protocolo basado en XML que describe los accesos al Web Service. Podriamos decir que es el manual de operación del web service, porque nos indica cuales son las interfaces que provee el Servicio web y los tipos de datos necesarios para la utilización del mismo.
Veamos un ejemplo de un documento WSDL:

<?xml version="1.0"> 
<definitions> 
   <types> 
    ...
   </types> 
   <message> 
    ...
   </message> 
   <portType> 
    ...
   </portType> 
   <binding> 
    ...
   </binding> 
</definitions>
Explicación del código anterior:
<?xml version="1.0"> Este es otro documento XML, es por esto que debe comenzar con el tag <?xml .. ?>

<definitions> Comienzo del documento, este tag agrupa a todos los demás.

<types> Se definen los tipos de datos utilizados en el Web Service.

</types> Fin de la definición de tipos.

<message> Se definen los métodos y parámetros para realizar la operación. Cada message puede consistir en una o más partes (parámetros).

</message> Fin de la definición de los parámetros.

<portType> Esta sección es la más importante, ya que se definen las operaciones que pueden ser realizadas, y los mensajes que involucran (por ejemplo el mensaje de petición y el de respuesta).

</portType> Fin de la definición de las operaciones y mensajes.

<binding> Se definen el formato del mensaje y detalles del protocolo para cada portType.

</binding> Fin de la definición del formato del mensaje y detalles del protocolo para cada PortType.

</definitions> Fin del documento WSDL

 UDDI - Universal Discovery Description and Integration
Es un modelo de directorios para Web Services. Es una especificación para mantener directorios estandarizados de información acerca de los Web Services, sus capacidades, ubicación, y requerimientos en un formato reconocido universalmente. UDDI utiliza WSDL para describir las interfaces de los Web Services.
Es un lugar en el cual podemos buscar cuales son los Servicios web disponibles, una especie de directorio en el cual podemos encontrar los Web Services publicados y publicar los Web Services que desarrollemos.

WEB SERVICES CON PHP - Parte II

SOAP

Es un protocolo que permite la comunicación entre aplicaciones a través de mensajes por medio de Internet. Es independiente de la plataforma, y del lenguaje. Esta basado en XML y es la base principal de los Web Services. Los mensajes SOAP son documento XML propiamente dicho, pero esto lo veremos más adelante cuando veamos un ejemplo de un mensaje SOAP.

Veamos como es la estructura básica del protocolo y la correspondiente explicación:
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
   Soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
      <soap:Header>
         ...
      </soap:Header>
      <soap:Body>
         ...
         <soap:Fault>
            ...
         </soap:Fault>
      </soap:Body>
</soap:Envelope>

Explicación del código anterior:
<?xml version="1.0"?>
Como podemos ver en esta linea SOAP es un documento XML, y como tal, debe comenzar con el tag <?xml….?> y la versión correspondiente.

<soap:Envelope
Aquí se indica que comienza el envelope (sobre) del mensaje

xmlns:soap = "http://www.w3.org/2001/12/soap-envelope"
Un mensaje SOAP debe contener siempre un elemento envelope asociado con el namespace (espacio de nombres) http://www.w3.org/2001/12/soap-envelope

Soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
En esta línea lo que se hace es indicar donde se encuentran definidos los tipos de datos utilizados en el documento.

<soap:Header>
Esta línea indica el comienzo del Header (encabezado). En esta sección se incluye información específica del mensaje, como puede ser la autenticación.

</soap:Header>
Como todo documento XML los tags que son abiertos deben ser cerrados, esta línea indica la finalización del Header (encabezado).

<soap:Body>
Aquí comienza el cuerpo del mensaje, en esta sección se incorpora toda la información necesaria para el nodo final. Por ejemplo, los parámetros para la ejecución, o la respuesta a una petición.

<soap:Fault>
Cualquier tipo de fallo que se produzca será notificado en esta sección. La cual esta contenida dentro del cuerpo del mensaje.

</soap:Fault>
Cierre de la sección Fault.

</soap:Body>
Indica el final del cuerpo del mensaje.

</soap:Envelope>
Fin del mensaje SOAP.

WEB SERVICES CON PHP - Parte I

Web Service:

Es un sistema software diseñado para soportar la interoperabilidad máquina - máquina a través de una red. Este tiene una interfaz descripta en un formato que puede ser procesado por una máquina (específicamente WSDL, que veremos más adelante). Otros sistemas interactúan con el Web service utilizando mensajes SOAP los cuales se encuentran establecidos previamente.

Entonces podríamos decir que un Web Service es una comunicación por medio de mensajes SOAP (son mensajes especiales que más adelante veremos detenidamente) entre diferentes equipos a través de una red.

Ahora pasaremos a definir los elementos que componen a los Web Services, para luego ver como ellos estan interrelacionados.

¿Qué es XML, SOAP, WSDL, UDDI?

Para conocer cómo se realiza el intercambio de mensajes en los Web Services debemos primero saber cuales son los elementos fundamentales que lo componen. Estos son el XML, SOAP, WSDL, y UDDI.

XML - eXtensible Markup Language:

Es un subconjunto simplificado del SGML el cual fue diseñado principalmente para documentos Web. Deja a los diseñadores crear sus propias “etiquetas” o "tags" (Ej: <libro>), habilitando la definición, transmisión, validación, y la interpretación de datos entre aplicaciones y entre organizaciones. Un punto que considero que es importante aclarar es que el HTML y el XML tienen funciones diferentes. El HTML tiene por objeto mostrar información, mientras que el XML se ocupa de la información propiamente dicha (el contenido). Este concepto es importante tenerlo en cuenta, ya que muchas personas al escuchar sobre XML piensan que es el sucesor de HTML.

Ejemplo de un documento XML sobre información de autos:

<?xml version="1.0" encoding="UTF-8"?> 
<vehiculos> 
  <coche> 
      <marca>Toyota</marca> 
      <modelo>Corolla</modelo> 
      <fechaCompra>2002</fechaCompra> 
  </coche> 
  <coche> 
      <marca>Honda</marca> 
      <modelo>Civic</modelo> 
      <fechaCompra>2003</fechaCompra> 
  </coche> 
</vehiculos> 
Seguramente este tipo de archivos no sea una novedad para la mayoría de los que lean este artículo, ya que muchos documentos en Internet están en formato XML. Igualmente explicaremos brevemente las secciones del mismo:
<?xml version="1.0" encoding="UTF-8"?>
Todo documento XML debe comenzar indicando que es un documento XML, la versión del mismo y su codificación. Es por eso que se utiliza el tag <?xml .... ?> . Todos los elementos a partir de aquí son definidos por el usuario.

<vehiculos>
Luego se indica un tag raiz (<vehiculos>) el cual contendrá a los demás elementos. Es como en HTML el tag <HTML> .. </HTML>, que dentro de el se encuentran los demás tags. Se lo conoce generalmente como root del documento.

<coche>
Luego definimos un tag <coche> el cual contendrá un coche en particular (en este caso solo incorpore 3 características de un coche: marca, modelo, y fecha de compra).

<marca>Toyota</marca>
<modelo>Corolla</modelo>
<fechaCompra>2002</fechaCompra>
Se definen 3 tags (marca, modelo, y fechaCompra), los cuales contienen los datos para un coche en particular.

<vehiculos>
   <coche>
      <marca>..</marca>
      <modelo>..</modelo>
      <fechaCompra>..</fechaCompra>
   </coche>
</vehiculos>
En el documento podemos apreciar que todos los tags que son abiertos <marca> deben ser cerrados </marca>. Esto es una exigencia del XML.

Se pueden anidar tags <coche><marca></marca>…..</coche>. Marca esta dentro del tag coche. El XML provee muchas otras posibilidades como puede ser que las etiquetas tengan atributos (<coche color="rojo">..</coche>), pero no nos detendremos en ellas ya que la idea es simplemente ofrecer los conceptos básicos para conocer de que se trata el mundo de los Web Services.

jueves, 2 de junio de 2016

Interfaces en PHP

Interfaces
El concepto de interfaz es procedente del mundo Java. Una interfaz es una entidad que encierra funcionalidades que pueden ser implementadas por diversos objetos. Son muy utiles para poder permitir identificar rapidamente las funcionalidades que un sistema software nos proporciona sin necesidad de acceder a ver los métodos de las clases que lo conformen. Esto se lleva a cabo mediante la palabra reservada interface. Veamos un ejemplo de interfaz escrita en PHP:

idataaccess.class.php
1 //-------------------------------------------------------------
2 // Implementación de la interfaz de acceso a base de datos
3 // Autor: Ildefonso Montero Pérez - monteroperez@us.es
4 //-------------------------------------------------------------
5 <?php
6 interface IDataAccess{
7 public function execute($sqlquery);
8 public function debugQuery($sqlquery);
9 }
10 ?>

Como podemos observar la definición es identica. En este caso dado que estamos definiendo un contenedor de funcionalidades, iremos introduciendo funciones dentro de esta definición. No tiene sentido que una interfaz sea definida si no va a existir por lo menos un objeto que sea capaz de implementarla. Esto quiere decir que necesitaremos definir una clase que implemente los metodos contenidos en esta interfaz. Veamoslo para el ejemplo anteriormente citado en el que la interfaz encierra funcionalidades típicas de una fachada de confrontacion de queries a una base de datos.

mysqldataaccess.class.php
1 //-------------------------------------------------------------
2 // Clase que confronta queries contra bbdd de tipo MySQL
3 // Autor: Ildefonso Montero Pérez - monteroperez@us.es
4 //-------------------------------------------------------------
5 <?php
6 class MySQLDataAccess implements IDataAccess{
...
public function execute($sqlquery) { ... }
public function debugQuery($sqlquery) { ... }
...
}
?>

En este ejemplo hemos introducido una clase que lleva a cabo la implementación de las funcionalidades introducidas en la interfaz definida anteriormente. Para ello podemos observar que se añade la palabra reservada implements.

PHP - Carrito de Compras Parte IV - Creación de la Capa de Presentación

1. Entorno

  • NetBeans IDE 6.9.1
  • WampServer 2.1.

2. Introducción

En esta parte mostraremos los formularios con la cual es usuario interactuara con el sistema. Y veremos cómo crear un reporte en Excel con PHP

3. Desarrollo


3.1. Crear Carpeta

Vamos a crear una carpeta que se llamara "Include", en esta carpeta pondremos los archivos que serán comunes para todas las paginas en PHP. Como por ejemplo el menú de opciones del sistema. Y en esa carpeta crearemos un archivo que se llamara "Cabezera.php"




Y el archivo tendrá el siguiente código fuente:


<h1>Programando - Carrito Compras con PHP</h1>
    <div>
        <a href="index.php">Inicio</a> |
        <a href="registrarProducto.php">Registrar Producto</a> |
        <a href="registrarVenta.php">Registrar Venta</a> |
        <a href="verVenta.php">Consultar Ventas</a> |
        <a href="reporteVentas.php">Reporte Producto</a>
    </div>
<br>


3.2. Archivo index.php

En este archivo mostraremos todos los productos que tenemos en el sistema. Y tendrá el siguiente código


<?php
include_once 'CapaDatos/Producto.php';
$pro = new Producto();
$lista = $pro->buscarProductoTodos();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Programando con Café - Carrito de compras con PHP</title>
    </head>
    <body>
        <?php include_once 'Include/Cabezera.php'; ?>
        <div>
        <table border="1">
            <tr style="background-color: chocolate">
                <td colspan="4" >Listado Producto</td>
            </tr>
            <tr style="background-color: chocolate">
                <td>Código</td>
                <td>Nombre</td>
                <td>Precio</td>
                <td>Proceso</td>
            </tr>
        <?php
         if(count($lista)>0){
             for($i=0;$i<(count($lista));$i++) {
                $dirModifica="modificarProducto.php?codigoProducto=".$lista[$i]['codigoProducto'];
                $dirAnadir="anadirCarrito.php?codigoProducto=".$lista[$i]['codigoProducto'];
        ?>
            <tr>
                <td><?php echo ($lista[$i]['codigoProducto']);?></td>
                <td><?php echo ($lista[$i]['nombre']);?></td>
                <td><?php echo ($lista[$i]['precio']);?></td>
                <td><a href="<?php echo $dirModifica;?>">Modificar</a> |
                    <a href="<?php echo $dirAnadir;?>">Añadir</a>
                </td>
            </tr>
        <?php
             }
         }
        ?>
        </table>
        </div>
    </body>
</html>

3.3. Archivo registrarProducto.php

Este archivo PHP es el encargado de mostrar al usuario el formulario para registrar los productos a la base de datos. Su código html es el siguiente


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Programando con Café - Carrito de compras con PHP</title>
    </head>
    <body>
        <?php include_once 'Include/Cabezera.php'; ?>
        <form method="post" action="CapaNegocios/Prod_RegistrarProducto.php">
            <div>
                <table border="1">
                        <tr>
                            <td>Nombre</td>
                            <td><input type="text" name="txtNombre" value="" /></td>
                        </tr>
                        <tr>
                            <td>Precio</td>
                            <td><input type="text" name="txtPrecio" value="0" /></td>
                        </tr>
                        <tr>
                            <td></td>
                            <td><input type="submit" value="Registrar" name="btnRegistrar" /></td>
                        </tr>
                </table>
                </div>
        </form>

    </body>
</html>

3.4. Archivo modificarProducto.php

Este archivo recibe el código del producto por medio del archivo "index.php". Muestra la información del producto que deseamos modificar y nos permite editar su información


<?php
include_once 'CapaDatos/Producto.php';
$pro = new Producto();
$pro->setCodigoProducto($_REQUEST['codigoProducto']);
$lista = $pro->buscarProducto();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Programando con Café - Carrito de compras con PHP</title>
    </head>
    <body>
        <?php include_once 'Include/Cabezera.php'; ?>
        <form method="post" action="CapaNegocios/Prod_ModificarProducto.php">
            <div>
                <table border="1">
                        <tr>
                            <td>Codigo</td>
                            <td><input type="text" name="txtCodigo" value="<?php echo ($lista[0]['codigoProducto']);?>" readonly /></td>
                        </tr>
                        <tr>
                            <td>Nombre</td>
                            <td><input type="text" name="txtNombre" value="<?php echo($lista[0]['nombre']);?>" /></td>
                        </tr>
                        <tr>
                            <td>Precio</td>
                            <td><input type="text" name="txtPrecio" value="<?php echo($lista[0]['precio']);?>" /></td>
                        </tr>
                        <tr>
                            <td></td>
                            <td><input type="submit" value="Actualizar" name="btnActualizar" /></td>
                        </tr>
                </table>
                </div>
        </form>

    </body>
</html>

3.5. Archivo anadirCarrito.php

Este formulario recibe el código del producto que deseamos añadir al carrito de compras desde la pagina "index.php". Muestra toda la información del producto y nos pide la cantidad que deseamos añadir al carrito. Su codigo fuente es el siguiente



<?php
include_once 'CapaDatos/Producto.php';
$pro = new Producto();
$pro->setCodigoProducto($_REQUEST['codigoProducto']);
$lista = $pro->buscarProducto();

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Programando con Café - Carrito de compras con PHP</title>
    </head>
    <body>
        <?php include_once 'Include/Cabezera.php'; ?>
        <form action="registrarVenta.php" method="post">
            <div>
                <table border="1">
                        <tr>
                            <td>Codigo</td>
                            <td><input type="text" name="txtCodigo" value="<?php echo ($lista[0]['codigoProducto']);?>" readonly /></td>
                        </tr>
                        <tr>
                            <td>Nombre</td>
                            <td><input type="text" name="txtNombre" value="<?php echo($lista[0]['nombre']);?>" readonly /></td>
                        </tr>
                        <tr>
                            <td>Precio</td>
                            <td><input type="text" name="txtPrecio" value="<?php echo($lista[0]['precio']);?>" readonly /></td>
                        </tr>
                        <tr>
                            <td>Cantidad Pedir</td>
                            <td><input type="text" name="txtCantidad" value="0" /></td>
                        </tr>
                        <tr>
                            <td></td>
                            <td><input type="submit" value="Añadir" name="btnAnadir" /></td>
                        </tr>
                </table>
                </div>
              
        </form>

    </body>
</html>

3.6. Archivo registrarVenta.php

Este archivo es el encargado de mostrar al usuario el formulario para concluir la venta. Lo que hace es traer todos los productos que están en sesión y mostrarlos en una tabla, para que asi veamos todos los productos que tenemos en el carrito de compras y poder decirle que lo registra a la base de datos


<?php
session_start();
session_register('itemsEnCesta');
//Estableciendo los datos al carrito
$codigo = $_REQUEST['txtCodigo'];
$nombre = $_REQUEST['txtNombre'];
$cantidad = $_REQUEST['txtCantidad'];
$pu = $_REQUEST['txtPrecio'];
$parcial = ($cantidad * $pu);
$descuento = 0;
if ($parcial > 50) {
    $descuento = ($parcial * 0.05);
}
$itemsEnCesta = $_SESSION['itemsEnCesta'];
if ($codigo) {
    if (!isset($itemsEnCesta)) {
        $itemsEnCesta[$codigo] = array("codigo" => $codigo,
            "nombre" => $nombre,
            "cantidad" => $cantidad,
            "pu" => $pu,
            "parcial" => $parcial,
            "descuento" => $descuento,
            "subtotal" => ($parcial - $descuento));
    } else {
        $itemsEnCesta[$codigo] = array("codigo" => $codigo,
            "nombre" => $nombre,
            "cantidad" => $cantidad,
            "pu" => $pu,
            "parcial" => $parcial,
            "descuento" => $descuento,
            "subtotal" => ($parcial - $descuento));
    }
}
$_SESSION['itemsEnCesta'] = $itemsEnCesta;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Programando con Café - Carrito de compras con PHP</title>
    </head>
    <body>
<?php include_once 'Include/Cabezera.php'; ?>
        <div>
            <form action="CapaNegocios/Vent_RegistrarVenta.php" method="post">
                <table border="1">
                    <tr style="background-color: chocolate">
                        <td colspan="6" >Carrito de Compras</td>
                    </tr>
                    <tr style="background-color: chocolate">
                        <td>Cliente</td>
                        <td colspan="5" ><input type="text" name="txtCliente" value="" /></td>
                    </tr>
                    <tr style="background-color: chocolate">
                        <td>Nombre</td>
                        <td>Cantidad</td>
                        <td>Precio</td>
                        <td>Parcial</td>
                        <td>Descuento</td>
                        <td>Sub.Total</td>
                    </tr>
<?php
if (isset($itemsEnCesta)) {
foreach ($itemsEnCesta as $k => $v) {
?>
                    <tr>
                        <td><?php echo ($v['nombre']); ?></td>
                        <td><?php echo number_format(($v['cantidad']), 2); ?></td>
                        <td><?php echo number_format(($v['pu']), 2); ?></td>
                        <td><?php echo number_format(($v['parcial']), 2); ?></td>
                        <td><?php echo number_format(($v['descuento']), 2); ?></td>
                        <td><?php echo number_format(($v['subtotal']), 2); ?></td>
                    </tr>
<?php
                }
}
?>
                    <tr style="background-color: chocolate">
                        <td colspan="6" ><input type="submit" value="Registrar Venta" name="btnRegistrarVenta" /></td>
                    </tr>
                </table>
            </form>
        </div>
    </body>
</html>


3.6. Archivo verVenta.php

Este archivo nos permite ver todas las ventas en formato HTML. Su código seria el siguiente


<?php
include_once 'CapaDatos/Venta.php';
$ven = new Venta();
$lista = $ven->buscarVenta();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Programando con Café - Carrito de compras con PHP</title>
    </head>
    <body>
        <?php include_once 'Include/Cabezera.php'; ?>
        <div>
        <table border="1">
            <tr style="background-color: chocolate">
                <td>Código</td>
                <td>Cliente</td>
                <td>Producto</td>
                <td>Precio</td>
                <td>Cantidad</td>
                <td>Parcial</td>
                <td>Descuento</td>
                <td>Sub. Total</td>
                <td>Total</td>
            </tr>
        <?php
         if(count($lista)>0){
             for($i=0;$i<(count($lista));$i++) {
        ?>
            <tr>
                <td><?php echo ($lista[$i]['CodigoVenta']);?></td>
                <td><?php echo ($lista[$i]['Cliente']);?></td>
                <td><?php echo ($lista[$i]['Nombre']);?></td>
                <td><?php echo number_format(($lista[$i]['Precio']),2);?></td>
                <td><?php echo number_format(($lista[$i]['Cantidad']),2);?></td>
                <td><?php echo number_format(($lista[$i]['Parcial']),2);?></td>
                <td><?php echo number_format(($lista[$i]['Descuento']),2);?></td>
                <td><?php echo number_format(($lista[$i]['SubTotal']),2);?></td>
                <td><?php echo number_format(($lista[$i]['TotalPagar']),2);?></td>
            </tr>
        <?php
             }
         }
        ?>
        </table>
        </div>
    </body>
</html>


3.7. Archivo reporteVentas.php

Este archivo PHP nos permite crear un reporte en Excel. Su código fuente es el siguiente


<?php
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=reporteVentas.xls');
header('Pragma: no-cache');
header('Expires: 0');
include_once 'CapaDatos/Venta.php';
$ven = new Venta();
$lista = $ven->buscarVenta();
?>
<table border="1">
    <tr >
        <td style="background-color: chocolate">Cod</td>
        <td style="background-color: chocolate">Cliente</td>
        <td style="background-color: chocolate">Producto</td>
        <td style="background-color: chocolate">Precio</td>
        <td style="background-color: chocolate">Cantidad</td>
        <td style="background-color: chocolate">Parcial</td>
        <td style="background-color: chocolate">Descuento</td>
        <td style="background-color: chocolate">Sub. Total</td>
        <td style="background-color: chocolate">Total</td>
    </tr>
    <?php
    if (count($lista) > 0) {
        for ($i = 0; $i < (count($lista)); $i++) {
    ?>
            <tr>
                <td><?php echo ($lista[$i]['CodigoVenta']); ?></td>
                <td><?php echo ($lista[$i]['Cliente']); ?></td>
                <td><?php echo ($lista[$i]['Nombre']); ?></td>
                <td><?php echo number_format(($lista[$i]['Precio']), 2); ?></td>
                <td><?php echo number_format(($lista[$i]['Cantidad']), 2); ?></td>
                <td><?php echo number_format(($lista[$i]['Parcial']), 2); ?></td>
                <td><?php echo number_format(($lista[$i]['Descuento']), 2); ?></td>
                <td><?php echo number_format(($lista[$i]['SubTotal']), 2); ?></td>
                <td><?php echo number_format(($lista[$i]['TotalPagar']), 2); ?></td>
            </tr>
    <?php
        }
    }
    ?>
</table>
 
 
Fin del tutorial