Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Analisis de Clase y Herencia

Estas en el tema de Analisis de Clase y Herencia en el foro de Frameworks y PHP orientado a objetos en Foros del Web. He creado una clase para conectarme mediante mysqli y a su vez otra que hereda de la primera, les presento el código para oir sugerencias. ...
  #1 (permalink)  
Antiguo 07/04/2008, 07:18
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Analisis de Clase y Herencia

He creado una clase para conectarme mediante mysqli y a su vez otra que hereda de la primera, les presento el código para oir sugerencias.

Agradezco de antemano su ayuda.

Código PHP:
<?php
  
class BD{

    protected 
$link;
    private   
$server$user$password$db$result;

    public function 
__construct($server$user$password$db){
      
$this->link mysqli_connect($server$user$password$db);
      
mysqli_select_db($this->link$db);
    }

    public function 
query($sql){
      
$this->result mysqli_query($this->link$sql);
    }

    public function 
recordset(){
      
$this->record mysqli_fetch_object($this->result);
      return 
$this->record;
    }

    public function 
numrows(){
      
$this->numrows mysqli_num_rows($this->result);
      return 
$this->numrows;
    }

    public function 
__destruct(){
      return 
mysqli_close($this->link);
    }
  }

  class 
UsuariosEnLinea extends BD{

    public function 
mostrar_usuarios_conectados(){

      
$ip               ip2long($_SERVER["REMOTE_ADDR"]);
      
$tiempo_limite    300;
      
$tiempo_actual    time();
      
$tiempo_conectado $tiempo_actual $tiempo_limite;

      
parent::query("DELETE FROM onlineusers WHERE tiempo < $tiempo_conectado");

      if(
parent::query("SELECT ip FROM onlineusers WHERE ip = $ip") != 0){
         
parent::query("UPDATE onlineusers SET tiempo = $tiempo_actual WHERE ip = $ip");
      }
      else{
         
parent::query("INSERT INTO onlineusers (ip, tiempo) VALUE ('$ip','$tiempo_actual')");
      }

      
$usuarios parent::query("SELECT ip FROM onlineusers");

      
$usuarios_conectados parent::numrows($usuarios);

      return 
$usuarios_conectados;
    }
  }

  
$ul = new UsuariosEnLinea("localhost","usuario","clave","bd");

  echo 
"Usuarios en Línea ".$ul->mostrar_usuarios_conectados();

  unset(
$bd$ul);
?>
  #2 (permalink)  
Antiguo 07/04/2008, 22:01
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 18 años, 8 meses
Puntos: 55
Re: Analisis de Clase y Herencia

muy bueno alaintm felicitaciones
si bien es una version muy basica por algo hay q empezar :)
__________________
Degiovanni Emilio
developtus.com
  #3 (permalink)  
Antiguo 08/04/2008, 07:55
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Agradezco tu comentario, es que he comenzado a emplear a PHP orientado a objetos, y mi idea es emplearlo en el sitio de la Intranet donde trabajo y en el proyecto de la Maestría que curso actualmente, por eso necesito de sus comentarios sobre todo que más puedo implementar en la clase principal.

Y una duda no tengo que liberar la memoria de los resultados si empleo unset()?
  #4 (permalink)  
Antiguo 08/04/2008, 08:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Analisis de Clase y Herencia

Hola alaintm,

Tienes muchos errores conceptuales en tu clase, el primero es que aunque tu clase UsuariosEnLinea extiende a la clase DB, todos los métodos los ocupa vía parent::, lo cual es igual que si la clase no la extendiera y solo ocupara un objeto. Que en este caso es lo mejor, ya que si haces un diagrama de entidad / relación te darás cuenta que la clase UsuariosEnLinea no debe de extender a DB, si no mas bien ocupar datos de DB.

Otro error es que en tu clase DB, ocupas sintaxis de esta forma:
Código PHP:
public function numrows(){
      
$this->numrows mysqli_num_rows($this->result);
      return 
$this->numrows;

No es necesario usar $this->numrows, todo el tiempo, solo cuando quieras guardar el valor en una propiedad de la clase, si solo vas a regresar el valor usa algo así:
Código PHP:
public function numrows(){
      return 
mysqli_num_rows($this->result);

Otro error es que tu las variables que asignes dinamicamente (usando $this->variable) pasan a ser propiedades publicas de la clase, y por diseño conceptual deberías de hacer que todas, o la mayoría de las propiedades de una clase sean privadas o protegidas.

Saludos.
  #5 (permalink)  
Antiguo 08/04/2008, 08:57
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Antes de todo muchas gracias por tus observaciones. Con respecto a la función que devuelve el número de filas corregí el detalle que me recomendastes, pero me queda una duda esta mal la implementación de la clase de Usuarios en Línea o sin querer esa es la forma en que debe trabajar esa clase y por último o entendí el detalle del empleo de
Código PHP:
$this-variable 
y el modelo de entidad relación si tienes algún enlace que me aclare las dudas de este último.
  #6 (permalink)  
Antiguo 08/04/2008, 09:06
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Estuve revisando y tenia una variable record que no estaba declarada como privada y la declaraba dinámicamente en la función recorset, es ese el detalle que me señalabas al emplear $this->variable
  #7 (permalink)  
Antiguo 08/04/2008, 09:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Analisis de Clase y Herencia

Tu clase usuarios en linea, debe de ser un objeto independiente que usa una fuente de datos para checar cuantos usuarios en linea hay.

En un ambiente ideal, UsuariosEnLinea implementaría un Data Source, que le indique cuantos usuarios en linea hay, y este Data Source seria una interface extendible, para poder ver por ejemplo usuarios en linea de diferentes fuentes, como un archivo de texto, una base de datos, un archivo xml, etc.

El empleo de $this->variable se usa para accesar a las propiedades de un objeto, pero si tu no le defines una visibilidad por defecto PHP las asume como "publicas" y una de las principales cosas que debes de evitar en PHP es usar propiedades publicas, todas deben de ser leídas vía get y escritas mediante set:
Código PHP:
class DBResult {
       private 
$rows;
       public function 
getRows() {
              return 
$this->rows;
       }
       public function 
setRows$rows ) {
              
$this->rows $rows;
       }

Los diagramas de entidad relación es la base de la POO, puedes buscar un buen libro de POO, casi siempre dedican un capitulo completo a esto.

Para que te quites un poco de dudas sobre cuando heredar y cuando no, te recomiendo leas el principio de Liskov.

Saludos.
  #8 (permalink)  
Antiguo 08/04/2008, 09:39
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Con respecto al uso de $this->variable y tengo las dudas aclaradas.
Con respecto a la Clase de Usuarios en Linea, lo que he entendido y ante todo me disculpas es que soy nuevo es que debe ser independiente y no heredar de otra, en realidad es el proyecto es integrado con MySQL y además me sirve para estudiar, pero mi duda es que de la forma en que implemente la clase empleando parent esta bien o mal o como pudiese ser en caso de llamar las funciones de la clase padre las herdara porque la verdad no me salio.
  #9 (permalink)  
Antiguo 08/04/2008, 11:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Analisis de Clase y Herencia

Para usar métodos heredados solo es cuestión de llamarlos con $this:
Código PHP:
class Padre {
      public function 
algo() {
               echo 
"Desde padre!";
      }
}

class 
Hija extends Padre {
      public function 
otracosa() {
             
$this->algo();
      }
}

$obj = new Hija();
$obj->otracosa(); // imprime "Desde padre!" 
parent se usa cuando quieres llamar al método que sobrescribiste desde el hijo:
Código PHP:
class Padre {
      public function 
algo() {
               echo 
"Desde padre!";
      }
}

class 
Hija extends Padre {
      public function 
algo() {
             echo 
"desde hija";
             
parent::algo();
      }
}

$obj = new Hija();
$obj->algo(); // imprime "desde hija", luego "desde padre!" 
Entiendo que tu proyecto sea atado a MySQL, pero en si debes de pensar cuando programas en POO, en lo que es el polimorfismo y la abstracción de tu aplicación. Si no te estas limitando a solo programar "estilo orientado a objetos" y entre eso y usar programación orientada a funciones no hay mucha "evolución".

Saludos.
  #10 (permalink)  
Antiguo 09/04/2008, 07:31
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Te agradezco la ayuda. Muchas Gracias
  #11 (permalink)  
Antiguo 09/04/2008, 07:39
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

He revisado la clase de Usuarios en Línea y corregí los parent:: por $this->, así es como me quedo el código, si tienes más sugerencias te las agradecería.

Código PHP:
class UsuariosEnLinea extends BD{
    private 
$ip$tiempo_limite$tiempo_actual$tiempo_conectado;
    public function 
mostrar_usuarios_conectados(){
      

      
$this->ip               ip2long($_SERVER["REMOTE_ADDR"]);
      
$this->tiempo_limite    300;
      
$this->tiempo_actual    time();
      
$this->tiempo_conectado $tiempo_actual $tiempo_limite;

      
$this->query("DELETE FROM usuariosenlinea WHERE tiempo < $tiempo_conectado");

      if(
$this->query("SELECT ip FROM usuariosenlinea WHERE ip = $ip") != 0){
         
$this->query("UPDATE usuariosenlinea SET tiempo = $tiempo_actual WHERE ip = $ip");
      }
      else{
         
$this->query("INSERT INTO usuariosenlinea (ip, tiempo) VALUE ('$ip','$tiempo_actual')");
      }

      
$usuarios $this->query("SELECT ip FROM usuariosenlinea");

      
$usuarios_conectados $this->numrows($usuarios);

      return 
$usuarios_conectados;
    }
  } 

Última edición por alaintm; 09/04/2008 a las 07:48 Razón: Corrección de error en la declaración de private
  #12 (permalink)  
Antiguo 09/04/2008, 07:54
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Tengo una duda es necesario siempre que declare una variable en private al asignar un valor a ella usar $this->variable = valor o puedo asignar el valor de esta forma $variable = valor

Agradezco de antemano su ayuda
  #13 (permalink)  
Antiguo 09/04/2008, 08:14
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Analisis de Clase y Herencia

Hola alaintm,

Sigues con muchos errores conceptuales, como te digo, no es necesario usar $this-> en todas tus variables, de hecho no es necesario que todas sean miembros de una clase, mira ve este ejemplo:
Código PHP:
class Prueba {
        protected 
$protegida// esta variable si la heredas la puedes ver y cambiar desde una clase hija
        
private $privada// esta variable solo la puedes cambiar desde esta clase
        
public $publica// no es recomendable usar variables publicas

        
public function Funcion() {
                 
$variable "hola"// variable simple que solo se ve durante Funcion()
                 
$otravar $this->privada// aqui leemos desde una propiedad de la clase
                 
$this->publica "hola de nuevo"// aqui asignamos algo a $publica (propiedad de la clase)
        
}

        public function 
leePrivada() {
                return 
$this->privada// esto lo hacemos para poder leer una propiedad desde fuera
        
}

Como puedes ver, hay varias formas de asignar variables en una clase, no es necesario que todas las variables sean propiedades de la clase, puedes usar fácilmente todas las variables de forma local, como veo tu clase, la única que seria bueno que guardaras como propiedad seria $usuarios_conectados para que luego la puedas leer sin tener que volver a hacer el query a la base de datos.

Por ejemplo:
Código PHP:
$enlinea = new UsuariosEnLinea(); // en el constructor hacemos el "calculo";
echo $enlinea->getConectados();
// imprimimos mucho codigo html
// mas abajo
echo $enlinea->getConectados(); 
Si te fijas en ese código, si uso el tuyo tendría que hacer 2 veces el calculo en la base de datos lo que me daría números incorrectos (para esa pagina), si lo haces como te indico te mostrara el mismo numero ya que asi solo hara el calculo cada que se cree el objeto (o sea cada que entran a la pagina).

Saludos.
  #14 (permalink)  
Antiguo 09/04/2008, 09:07
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

No sabes como agradezco tu paciencia y ayuda. Gracias por aclararme las dudas.
Salu2
  #15 (permalink)  
Antiguo 09/04/2008, 09:25
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Se que presento problemas de conceptos pero es que soy nuevo en POO, estuve mucho tiempo trabajando estructurado, ahora lo que entendí, si declaro a $usuarios_conectados como propiedad la puedo leer sin tener que volver a hacer el query a la base de datos cada vez que la llame

Código PHP:
$ul->mostrar_usuarios_conectados(). 
Hice los ajustes en el código y me quedo de esta forma:

Código PHP:
class UsuariosEnLinea extends BD{
    private 
$usuarios_conectados;
    
    public function 
mostrar_usuarios_conectados(){
      
$ip               ip2long($_SERVER["REMOTE_ADDR"]);
      
$tiempo_limite    300;
      
$tiempo_actual    time();
      
$tiempo_conectado $tiempo_actual $tiempo_limite;

      
$this->query("DELETE FROM usuariosenlinea WHERE tiempo < $tiempo_conectado");

      if(
$this->query("SELECT ip FROM usuariosenlinea WHERE ip = $ip") != 0){
         
$this->query("UPDATE usuariosenlinea SET tiempo = $tiempo_actual WHERE ip = $ip");
      }
      else{
         
$this->query("INSERT INTO usuariosenlinea (ip, tiempo) VALUE ('$ip','$tiempo_actual')");
      }

      
$usuarios $this->query("SELECT ip FROM usuariosenlinea");

      
$usuarios_conectados $this->numrows($usuarios);

      return 
$usuarios_conectados;
    }
  } 
  #16 (permalink)  
Antiguo 09/04/2008, 09:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Analisis de Clase y Herencia

De la forma que lo pones jamas podras leer la variable $usuarios_conectados, ya que no la estas guardando como propiedad.

También recuerda que si usas variables privadas debes de crear sus setters/getters, revisa el ejemplo que te deje mas arriba.

Saludos.
  #17 (permalink)  
Antiguo 09/04/2008, 10:10
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Estuve revisando algo de documentación y lo que me haz indicado.

1. Cuando te refieres a propiedad lo que entiendo des pues de revisar la documentación es cuando declaro:
Código PHP:
public $variable
mientras que método es:
Código PHP:
public function nombre(){} 
2. Me recomiendas que no declare variable publicas ahí es donde me pierdo o es que no se debe abusar de ellas y si no es así como es que lo manejaría las propiedades, porque de esta forma lo veo y te pongo el ejemplo que estuve revisando:

We have added two things in the example below. First of all, we have added a new property by adding the line: "public $name". This gives our class a new public property called $name. The second thing we've done is change the drive() method, as it now prints the value of the $name property. As you can see we use $this->name to refer to the $name property.

The $this variable refers to the current instance, and must be used when you want to access a property or method from within the class.

The example below demonstrates the use of the $name property and the $this variable:
Código PHP:
<?php

Class MyCar {
        public 
$name;

        function 
drive() {
                echo 
'Vrooooom... ' $this->name;
        }
}

// Instance 1
$porsche = new MyCar();
$porsche->name 'Porsche';
$porsche->drive();
3. No entiendo lo de setters/getters.
  #18 (permalink)  
Antiguo 09/04/2008, 10:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Analisis de Clase y Herencia

1.- Es correcto, las propiedades de la clase son las variables que tu declaras con cierta visibilidad dentro de la clase.

2.- Es un tema un poco amplio, pero en corto, si tu usas variables publicas, corres el riesgo de que puedan ser modificadas desde cualquier lado, y eso podría influir al hacer algún calculo, o al hacer algo en tu programación ya que la pueden cambiar. Es por eso que se recomienda usar variables privadas, ya que así tu tienes el control si quieres permitir el cambio. Es algo que se da mucho cuando usas clases entre varios programadores.

3.- Los setters/getters sirven precisamente para eso, para poder leer una variable privada o establecer el valor:
Código PHP:
class test {
        private 
$auto;
        public function 
setAuto$auto ) {
               
$this->auto $auto;
        }
        public function 
getAuto$auto ) {
               return 
$this->auto;
        }

Saludos.
  #19 (permalink)  
Antiguo 09/04/2008, 11:13
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Gracias por la aclaración, pero sucede algo si creo en la clase un método __construct como inicio la conexión si la clase hereda de la clase BD que la misma posee un método __construct que establece la conexión, entonces como manejo esta situación.
  #20 (permalink)  
Antiguo 09/04/2008, 11:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Analisis de Clase y Herencia

Llama a parent::__construct() en tu constructor.

Saludos.
  #21 (permalink)  
Antiguo 09/04/2008, 11:32
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

El código quedo así pero me da error o es que tengo pasar loas valores al __contruct() porque me esta dando error:

Código PHP:
class UsuariosEnLinea extends BD{
    private 
$usuarios_conectados;
    
    public function 
__construct(){
      
$ip               ip2long($_SERVER["REMOTE_ADDR"]);
      
$tiempo_limite    300;
      
$tiempo_actual    time();
      
$tiempo_conectado $tiempo_actual $tiempo_limite;

      
parent::__construct();
      
      
$this->query("DELETE FROM usuariosenlinea WHERE tiempo < $tiempo_conectado");

      if(
$this->query("SELECT ip FROM usuariosenlinea WHERE ip = $ip") != 0){
         
$this->query("UPDATE usuariosenlinea SET tiempo = $tiempo_actual WHERE ip = $ip");
      }
      else{
         
$this->query("INSERT INTO usuariosenlinea (ip, tiempo) VALUE ('$ip','$tiempo_actual')");
      }

      
$usuarios $this->query("SELECT ip FROM usuariosenlinea");

      
$this->usuarios_conectados $this->numrows($usuarios);
    }

    public function 
mostrar_usuarios_conectados(){
      return 
$this->usuarios_conectados;
    }
  } 
  #22 (permalink)  
Antiguo 09/04/2008, 11:36
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Analisis de Clase y Herencia

Si tu estas definiendo que el constructor de DB necesita parámetros, entonces debes de enviárselos al usar parent::__construct( $param1, $param2, $paramN ).

Saludos.
  #23 (permalink)  
Antiguo 09/04/2008, 12:31
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

No se si esta bien ahora pero de esta forma si trabaja. Dime si tiene más errores porque la verdad deseo aprender y hoy creeme que he aprendido.

Código PHP:
class UsuariosEnLinea extends BD{
    private 
$usuarios_conectados;
    
    public function 
__construct($server$user$password$db){
      
$ip               ip2long($_SERVER["REMOTE_ADDR"]);
      
$tiempo_limite    300;
      
$tiempo_actual    time();
      
$tiempo_conectado $tiempo_actual $tiempo_limite;

      
parent::__construct($server$user$password$db);
      
      
$this->query("DELETE FROM usuariosenlinea WHERE tiempo < $tiempo_conectado");

      if(
$this->query("SELECT ip FROM usuariosenlinea WHERE ip = $ip") != 0){
         
$this->query("UPDATE usuariosenlinea SET tiempo = $tiempo_actual WHERE ip = $ip");
      }
      else{
         
$this->query("INSERT INTO usuariosenlinea (ip, tiempo) VALUE ('$ip','$tiempo_actual')");
      }

      
$usuarios $this->query("SELECT ip FROM usuariosenlinea");

      
$this->usuarios_conectados $this->numrows($usuarios);
    }

    public function 
mostrar_usuarios_conectados(){
      return 
$this->usuarios_conectados;
    }
  }

...

$ul = new UsuariosEnLinea("localhost","usuario","clave","bd");

  echo 
"Usuarios en Línea ".$ul->mostrar_usuarios_conectados(); 
  #24 (permalink)  
Antiguo 09/04/2008, 12:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Analisis de Clase y Herencia

Como tu dices "trabaja", aunque deberías de buscar siempre un nivel mayor de abstracción, usar clases registro o de configuración para cargar los datos de la bd, y abstraer la fuente de datos de tu clase usuariosenlinea.

Saludos.
  #25 (permalink)  
Antiguo 09/04/2008, 13:34
Avatar de alaintm  
Fecha de Ingreso: marzo-2007
Mensajes: 149
Antigüedad: 17 años, 1 mes
Puntos: 1
Re: Analisis de Clase y Herencia

Gracias, en cuanto tenga variaciones te las muestro. Gracias nuevamente
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:58.