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

Ejemplo como para el FAQ

Estas en el tema de Ejemplo como para el FAQ en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Saludos desde Colombia. Al programar estructurado con AJAX, me dio por querer aprender a programar a Objetos con PHP, lenguaje al que le estoy muy ...
  #1 (permalink)  
Antiguo 08/03/2007, 11:11
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Antigüedad: 19 años, 1 mes
Puntos: 0
Ejemplo como para el FAQ

Saludos desde Colombia.

Al programar estructurado con AJAX, me dio por querer aprender a programar a Objetos con PHP, lenguaje al que le estoy muy agradecido por q me ha sacado de muchos problemas.

Ya he leido sobre lo primero que hay que leer, OOP lo basico. Pero como soy terco y me gusta el codigo, me e puesto en la tarea de hacer un ejemplo tipico de un formulario con informacion de un usuario, que al hacer ingresar vaya a la bd se conecte y todo eso. Yo se que es jarto que uno venga pidiendo codigo, pero es que asi es que arrancamos muchos, con ejemplos muy practicos de lo que antes haciamos estructurado para poderlo hacer en Objetos.

Estoy tratando de utilizar propiedades, atributos privados y todo eso, para de una vez, aprender estos conceptos.

De antemano mis agradecimientos y si tienen tiempo de hacer esto se los agradeceria, estoy seguro que un ejemplo de estos despejaria muchas dudas y seria el punto de arranque de muchas personas que al igual como yo, quieren programar "serio".

Gracias
  #2 (permalink)  
Antiguo 08/03/2007, 11:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Ejemplo como para el FAQ

Haber si entiendo tu pregunta, quieres que alguien haga un ejemplo asi de insertar datos via formulario en PHP pero OOP?
  #3 (permalink)  
Antiguo 08/03/2007, 13:33
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Ejemplo como para el FAQ

Cita:
Iniciado por GatorV Ver Mensaje
Haber si entiendo tu pregunta, quieres que alguien haga un ejemplo asi de insertar datos via formulario en PHP pero OOP?
Si, exacto...aca mismo en el FAQ existen ejemplos de clases para conectarse a la base de datos, ahora seria bueno que el ejemplo mostrara la interaccion de todos estos conceptos con un ejemplo sencillo, asi sea de 2 capas, o si tienen tiempo pues seria bueno ir mejorando ese ejemplo hasta hacerlo de 3 capas.

Gracias.
  #4 (permalink)  
Antiguo 08/03/2007, 17:37
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: Ejemplo como para el FAQ

Si tenes claros los conceptos de poo, me parece que lo mejor es que intentes escribir el codigo tu mismo y luego plantear dudas que aparecerán... que serán mas concretas ;)

Saludos.
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #5 (permalink)  
Antiguo 09/03/2007, 08:28
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Ejemplo como para el FAQ

Bueno, Buscando en Internet con paciencia encontre este articulo, me parecio bueno para los que tienen la cabeza enredada con tanto concepto.

http://www.ribosomatic.com/articulos...clases-en-php/
  #6 (permalink)  
Antiguo 09/03/2007, 09:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Ejemplo como para el FAQ

Si vas a tomar ese articulo como una fuente de enseñanza, yo que tu buscaria otra fuente, si realmente quieres aprender Programacion Orientada a Objetos, no significa nadamas tener una clase por aqui y por alla, va muchisimo mas alla, y ese articulo es programacion procedural pero intentando ser orientada a objetos.

La razon por la que nadie postea un codigo es porque no es tan sencillo, hacer algo bien hecho implementando, que aproveche todos los beneficios que tiene PHP en su forma de Orientado a Objetos.

Saludos
  #7 (permalink)  
Antiguo 12/03/2007, 08:35
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Ejemplo como para el FAQ

Ese es el problema que creo tenemos muchos, depronto creemos que algo esta bien hecho y puede ser mejor.

Por ejemplo encontre e implemente un ejemplo, claro que me toco hacerle unas cosas para que funcionara, me imagino que no seran recomendables.
por favor hagan sus comentarios, en que se puede mejorar, que no es una buena practica, etc...

Gracias por su paciencia.

Código PHP:
<? //session_start();?>
<? 
class Usuario{
private  
$nombre;
private  
$apellido;
private  
$telefono;
private  
$email;

public function 
getNombre() {
      return 
$this->nombre;
    }

public function 
setNombre($nombre) {
      
$this->nombre $nombre;
    }
   
public function 
getApellido(){
       return 
$this->apellido;
    }

  public function 
setApellido($apellido) {
      
$this->apellido $apellido;
    }

    public function 
getTelefono(){
      return 
$this->telefono;
    }
    public function 
setTelefono($telefono){
      
$this->telefono $telefono;
    }

   public function 
getEmail(){
      return 
$this->email;
    }
   public function 
setEmail($email){
      
$this->email $email;
    }
        
//constructor??
    /*function Usuario($nombre,$apellido,$telefono,$email){
        $this->nombre=$nombre;
        $this->apellido=$apellido;
        $this->telefono=$telefono;
        $this->email=$email;*/

}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php 
function print_form() {?>
<form name="form1" method="post" action="default_Usuario.php">
<table width="200" border="1" align="center">
  <tr>
    <td align="center">NOMBRE</td>
    <td>
      <input type="text" name="nombre" id="nombre">
   </td>
  </tr>
  <tr>
    <td align="center">APELLIDO</td>
    <td><input type="text" name="apellido" id="apellido"></td>
  </tr>
  <tr>
    <td align="center">TELEFONO</td>
    <td><input name="telefono" type="text" id="telefono"></td>
  </tr>
  <tr>
    <td align="center">EMAIL</td>
    <td><input name="email" type="text" id="email"></td>
  </tr>
  <tr>
    <td colspan="2" align="center">
      <input type="submit" name="submit" value="Guardar">    </td>
  </tr>
</table>
</form>
<? ?>

<?php
function set_properties($nombre,$apellido,$telefono,$email){
global 
$objUsuario;
//INSTANCIA
$objUsuario = new Usuario();/*
$_SESSION['Usuario'] = $objUsuario;  */
foreach($_POST as $nombre_campo => $valor){ 
  
$valor str_replace("'""_"$valor);
   
$asignacion "\$" $nombre_campo "='" $valor "';"
   eval(
$asignacion); 
   }
$objUsuario->setNombre($nombre);
$objUsuario->setApellido($apellido);
$objUsuario->setTelefono($telefono);
$objUsuario->setEmail($email);
?> 
<?php 
function mostrar_Usuario($objUsuario){ 
//$objUsuario = $_SESSION['Usuario'];
?>

<h3>Aca estan los datos recuperados:
 <ul>
 <li>Nombre: <? echo $objUsuario->getNombre(); ?>
 <li>Apellido: <? echo $objUsuario->getApellido(); ?>
 <li>Telefono: <? echo $objUsuario->getTelefono(); ?>
 <li>Email: <? echo $objUsuario->getEmail(); ?>
 </ul>
     <? }
if(isset(
$_POST['submit']) && $_POST['submit']=='Guardar') {
set_properties($nombre,$apellido,$telefono,$email);
mostrar_Usuario($objUsuario);
 } else {
 
print_form();
 }
?>
</body>

</html>
  #8 (permalink)  
Antiguo 12/03/2007, 16:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Ejemplo como para el FAQ

El ejemplo que publicaste es la forma mala de hacer las cosas, trata de pensar en todo como un objeto, te dejo aqui un ejemplito, nada loco, pero basico de altas de personas.

Persona.php:
Código PHP:
<?php
class Persona {
    private 
$nombre;
    private 
$apellido;
    
    public function 
__construct$nombre ''$apellido '' ) {
        
$this->nombre $nombre;
        
$this->apellido $apellido;
    }
    
    public function 
setNombre($nombre) {
        
$this->nombre $nombre;
    }
    
    public function 
getNombre() {
        return 
$this->nombre;
    }
    
    public function 
setApellido($apellido) {
        
$this->apellido $apellido;
    }
    
    public function 
getApellido() {
        return 
$this->apellido;
    }
    
    public function 
escribeNombre() {
        echo 
$this->nombre " " $this->apellido;
    }
}
?>
AlmacenPersonas.php:
Código PHP:
<?php
class AlmacenPersonas {
    private 
$storage = array();
    private static 
$_instance null;
    
    public static function 
getInstance() {
        if( 
self::$_instance == null ) {
            
self::$_instance = new self();
        }
        
        return 
self::$_instance;
    }
    
    private function 
__construct() {
        @
session_start();
        
        if( isset( 
$_SESSION['personasStorage'] ) ) {
            
$this->storage unserialize$_SESSION['personasStorage'] );
        }
    }
    
    public function 
__destruct() {
        
$_SESSION['personasStorage'] = serialize$this->storage );
    }
    
    public function 
addPersona $persona ) {
        
$this->storage[] = $persona;
    }
    
    public function 
getPersona$offset ) {
        if( isset( 
$this->storage[$offset] ) ) {
            return 
$this->storage[$offset];
        }
        
        throw new 
Exception("Esta persona no existe");
    }
    
    public function 
getAll() {
        return 
$this->storage;
    }
}
?>
ControladorPersonas.php:
Código PHP:
<?php
class ControladorPersonas() {
    private 
$almacen;
    
    public function 
__construct() {
        
$this->almacen AlmacenPersonas::getInstance();
    }
    
    public function 
AltaPersona$nombre$apellido ) {
        
$persona = new Persona$nombre$apellido );
        
        
$this->almacen->add$persona );
    }
    
    public function 
regresaPersonas() {
        return 
$this->almacen->getAll();
    }
}
?>
Ahora sus implementaciones:
alta_personas.php
Código PHP:
<?php
require( 'Persona.php' );
require( 
'AlmacenPersonas.php' );
require( 
'ControladorPersonas.php' );

if( 
strtoupper$_SERVER['HTTP_REQUEST_METHOD'] ) == 'POST' ) {
    
$nombre $_POST['nombre'];
    
$apellido $_POST['apellido'];
    
    
$controlador = new ControladorPersonas();
    
$controlador->AltaPersona$nombre$apellido );
    
$respuesta "Gracias!";
}
?>
<html>
<head>
<title>Alta de Persona</title>
</head>
<body>
<h1>Registrar una Persona</h1>
<h2><?php echo $respuesta?></h2>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Nombre: <input type="text" name="nombre" value="" />
Apellido: <input type="text" name="apellido" value="" />
<input type="submit" name="submit" value="Registrar" />
</form>
</body>
</html>
ver_personas.php
Código PHP:
<?php
require( 'Persona.php' );
require( 
'AlmacenPersonas.php' );
require( 
'ControladorPersonas.php' );

$controlador = new ControladorPersonas();
$personas $controlador->regresaPersonas();
?>
<html>
<head>
<title>Ver Personas</title>
</head>
<body>
<h1>Personas Registradas:</h1>
<?php foreach( $personas as $numero => $persona ) { ?>
<?php 
echo sprintf"%s - %s %s"$numero$persona->getNombre(), $persona->getApellido() ); ?>
<?php 
?>
</body>
</html>
Si te puedes dar cuenta todo esta completamente separado, la clase Persona, no sabe si las variables llegan via POST, o via XML, o desde la linea de comando, solo se encarga de guardarlas, asi como el Almacen y el Controlador, asi debes de pensar.
En Abstraccion.
  #9 (permalink)  
Antiguo 13/03/2007, 07:03
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Ejemplo como para el FAQ

GatorV, muy buen diseño de la clase Persona, me surgió una duda de cual metodo sería más correcto implementar:

Supongamos que el usuario necesita ser guardado en una tabla en la bd (dar de alta) y ademas necesita logearse para utilizar aplicaciones del sistema.

Ambos metodos insertarUsuario, logearUsuario, incluso actualizarUsuario, en ¿qué clase es correcto que se implementaran éstas funcionalidades? En la clase de Persona o habría que crear una clase adicional para estas tareas de forma de desacoplar la clase Persona.

gracias y saludos.
  #10 (permalink)  
Antiguo 13/03/2007, 09:02
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Ejemplo como para el FAQ

Implemente el codigo que muy amablemente te tomaste a la tarea de pensar, veo que maneja el patron Singleton, lo corri y no me generaba el resultado esperado, tuve que cambiar la linea
Código PHP:
if( strtoupper$_SERVER['HTTP_REQUEST_METHOD'] ) == 'POST' ) { 
por
Código PHP:
if(isset($_POST['submit']) && $_POST['submit']=='Registrar') { 
. Al hacer eso si entro en esa validacion, el problema es que no se como mostrar lo que almacene, ya que esta en otro script y no sabria donde seria adecuado ponerlo....!!
Gracias por tus comentarios.
  #11 (permalink)  
Antiguo 13/03/2007, 09:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Ejemplo como para el FAQ

Lo ideal es abstraer a la entidad de su almacen, es decir la clase persona, tiene sus propiedades, pero no esta mal hacer lo que dices, la misma persona debe de ser capaz de saber como guardarse en la base de datos. Ahora el de loggearse en el sistema y validarlo esto no es de la persona, es una clase aparte que se encarga de ver que credenciales tiene la Persona y ver si es valido o no para entrar a determinado modulo.
  #12 (permalink)  
Antiguo 13/03/2007, 09:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Ejemplo como para el FAQ

Para mostrar lo que almacenaste corre el script de ver_personas.php
  #13 (permalink)  
Antiguo 13/03/2007, 10:04
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Ejemplo como para el FAQ

No se si hay algun problema con las variables de sesion o que pero no muestra nada, si yo quiero que inmediatamente despues de registrar el nombre y el apellido, muestre esos datos como seria correcto hacerlo?
  #14 (permalink)  
Antiguo 13/03/2007, 10:56
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: Ejemplo como para el FAQ

Gracias por el codigo GatorV
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #15 (permalink)  
Antiguo 13/03/2007, 11:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Ejemplo como para el FAQ

De nada Fridureiks

Para mostrarlos inmediatamente despues de AltaPersona podrias poner un header e ir a mostrar personas.

Código PHP:
header("Location: ver_personas.php"); 
  #16 (permalink)  
Antiguo 13/03/2007, 13:45
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Ejemplo como para el FAQ

En el codigo que pusiste veo que tienes una variable de sesion asi:

Almacen_Personas.php:
Código PHP:
private function __construct() { 
        @
session_start();          
        if( isset( 
$_SESSION['personasStorage'] ) ) { 
            
$this->storage unserialize$_SESSION['personasStorage'] ); 
        } 
veo que tienes un @ antes de session_star(), si se lo quitamos, nos da el siguiente error:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\Archivos de programa\xampp\htdocs\alta_personas\Persona.php:31 ) in C:\Archivos de programa\xampp\htdocs\alta_personas\AlmacenPersona s.php on line 12
  #17 (permalink)  
Antiguo 13/03/2007, 15:52
 
Fecha de Ingreso: marzo-2005
Mensajes: 43
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Ejemplo como para el FAQ

Cita:
Iniciado por ktulu_red Ver Mensaje
En el codigo que pusiste veo que tienes una variable de sesion asi:

Almacen_Personas.php:
Código PHP:
private function __construct() { 
        @
session_start();          
        if( isset( 
$_SESSION['personasStorage'] ) ) { 
            
$this->storage unserialize$_SESSION['personasStorage'] ); 
        } 
veo que tienes un @ antes de session_star(), si se lo quitamos, nos da el siguiente error:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\Archivos de programa\xampp\htdocs\alta_personas\Persona.php:31 ) in C:\Archivos de programa\xampp\htdocs\alta_personas\AlmacenPersona s.php on line 12
Lo arregle colocando session_start() al principio del script y listo, gracias a todos por su valiosa colaboracion.
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 14:49.