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

Duda PHP POO

Estas en el tema de Duda PHP POO en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buen día a todos estoy tratando de programar un carrito de compras en php y POO a modo de aprendizaje y en el transcurso me ...
  #1 (permalink)  
Antiguo 24/07/2008, 19:45
Avatar de dots3r  
Fecha de Ingreso: julio-2008
Mensajes: 106
Antigüedad: 15 años, 9 meses
Puntos: 5
Duda PHP POO

Buen día a todos estoy tratando de programar un carrito de compras en php y POO a modo de aprendizaje y en el transcurso me surgio la siguinte duda.

Tengo definidas 4 clases:
ClassBaseDatos.php: manejo de base de datos mysql.
ClassProducto.php: Esta clase es simple la utilizo para crear objetos tipo producto.
ClassCarrito.php: Desde esta clase controlo a los objetos tipo producto para agregar, eliminar y editar los productos del carrito.
ClassCatalogo.php: Desde aqui me conecto a la base de datos usando la clase BaseDatos y obtengo los productos.

Ahora bien mi duda es la siguiente, como mencione desde la clase carrito controlo a objetos tipo producto:

ClassProducto.php
Código PHP:
<?php
class Producto {
    private 
$Id;
    private 
$Nombre;
    private 
$Precio;
    
        function 
__construct ($Nombre$Precio) {
            
$this->Id md5($Nombre);
            
$this->Nombre $Nombre;
            
$this->Precio $Precio;
        }
        
        public function 
getId () {
            return 
$this->Id;
        }
        
        public function 
getNombre () {
            return 
$this->Nombre;
        }     
        
        public function 
getPrecio () {
            return 
$this->Precio;
        }
    
}
?>
ClassCarrito.php
Código PHP:
<?php
class Carrito {
    private 
$Productos = array();
    private 
$Total;
    
        function 
__construct () {
            
        }
        
        
// Agrega un Producto
        
public function add (Producto $Producto$Cantidad 1) {
            if(
array_key_exists($Producto->getId(), $this->Productos)) {
                
$this->Productos[$Producto->getId()]['Cantidad'] += $Cantidad;            
            }else{
                
$this->Productos[$Producto->getId()] = array('Producto' => $Producto,
                                                            
'Cantidad' => $Cantidad);
            
            }                            
        }
        
        
// Elimina un Producto
        
public function remove (Producto $Producto) {
            if(
array_key_exists($Producto->getId(), $this->Productos)) {
                unset(
$this->Productos[$Producto->getId()]);
            }
        }
        
        
// Devuelve el numero de Productos
        
public function size () {
            return 
count($this->Productos);
        }
     
        
// Define la Cantidad para un Producto dado
        
public function setCantidad (Producto $Producto$Cantidad) {
            if(
array_key_exists($Producto->getId())) {
                
$this->Productos[$Producto->getId()]['Cantidad'] = $Cantidad;
            } 
        }
     
        
// Define el precio Total
        
private function setTotal (){
            
$Total 0;
            foreach(
$this->Productos as $Producto){
                
$Total += $Producto['Producto']->getPrecio() * $Producto['Cantidad'];
            }
            
$this->Total $Total;
        }
        
        
// Devuelve los Productos
        
public function getProductos () {
            return 
$this->Productos;
        }
        
        
// Devuelve el precio Total
        
public function getTotal () {
            
$this->setTotal();
            return 
$this->Total;
        }
}
?>
Ahora bien, lo que no entiendo esque al momento de obtener los productos desde la base de datos tengo que crear un objeto tipo Producto para cada uno de ellos? O cuando es que tengo que hacer los objetos para pasarlos como parametros en las funciones de la clase carrito, porque tambien se me ocurre obtener los productos desde la base de datos y para agregar uno al carrito hacer lo siguiente:

Código PHP:
<?
$carrito
->add(new($row['nombre'],$row['precio']));
?>
Y bueno, la cosa es que no se que sea lo correcto y es por eso que pido de se ayuda, talves este haciendo las cosas mas complicadas de lo que son al tratar de jugar con objetos directamente en los parametros.

De antemano Gracias y espero su respuesta.
  #2 (permalink)  
Antiguo 24/07/2008, 22:28
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
Respuesta: Duda PHP POO

Lo ideal es que por cada item que obtienes de la base de datos crees un Producto y sea el objeto tipo producto lo que le pases a tu carrito.

Saludos.
  #3 (permalink)  
Antiguo 25/07/2008, 00:27
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda PHP POO

En realidad, a un carrito de la compra es mejor que no le pases directamente el Producto. Normalmente lo que se le suele pasar es una LineaDePedido, que básicamente tiene el id y precio (*) del producto comprado, pero también tiene otra información, como por ejemplo la cantidad de productos que se compran.



(*) Es más suele ser buena idea que este precio se copie en el momento de hacer el pedido. Porque el precio del producto podría cambiar luego, mientras se procesa el pedido y eso. Y no puedes cambiar el precio en el pedido una vez hecho.
  #4 (permalink)  
Antiguo 26/07/2008, 22:44
Avatar de dots3r  
Fecha de Ingreso: julio-2008
Mensajes: 106
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: Duda PHP POO

Bueno pues ahora me encuentro en la siguiete situación, desde la clase catalogo retorno los productos existentes en forma de objetos ( funcion getProductos() ).

Código PHP:
<?
class Catalogo {
    private 
$Productos;
        
        function 
__construct (BaseDatos $conexion) {
            
$sql "SELECT * FROM catalogo";
            
$this->Productos $conexion->getResults($sql,ARRAY_N);
        } 
        
        public function 
totalProductos () {
            return 
count($this->Productos);
        }
        
        public function 
getProductos () {
            
$i 0;
            foreach(
$this->Productos as $Producto) {
                
$this->Productos[$i] = new Producto($Producto['pid'],
                                                    
$Producto['producto'],
                                                    
$Producto['descripcion'],
                                                    
$Producto['precio']);
                
$i ++;
            }    
            return 
$this->Productos;
        }
}
?>
Y los obtengo asi:

Código PHP:
<?
include_once 'models/ClassCatalogo.php';
include_once 
'models/ClassProducto.php';
include_once 
'models/ClassBaseDatos.php';

$conexion = new BaseDatos('localhost','root','pass','carrito');
$Catalogo = new Catalogo($conexion);

echo 
'Cantidad de Productos: '$Catalogo->totalProductos() .'<br><br>';
$Productos $Catalogo->getProductos();

foreach (
$Productos as $Producto) {
    echo 
'ID: '$Producto->getId() .'<br>';
    echo 
'Nombre: '$Producto->getNombre() .'<br>';
    echo 
'Descripcion: '$Producto->getDescripcion() .'<br>';
    echo 
'Precio: '$Producto->getPrecio() .'<br>';
}
?>
Y funciona, pero ahora me surge la siguiente duda, la idea es añadir un link por producto diriguido a otra pagina donde se agregue el producto seleccionado al carrito (instancia) y no tengo clara la manera de persistir (creo que asi se le dice xD) mi objeto tipo producto para pasarlo como parametro a la funcion add() de mi instancia carrito.

Y pues bueno quisiera algunas sugerencias para poder entender un poco mejor como trabajar con POO en PHP.

De antemano Gracias
:D
  #5 (permalink)  
Antiguo 28/07/2008, 00:51
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años
Puntos: 2
Respuesta: Duda PHP POO

Mi estimado Dots3r creo que el compañero Venkman, ya te esta dando la respuesta y creo es la mas acertada.

Cita:
Iniciado por venkman Ver Mensaje
En realidad, a un carrito de la compra es mejor que no le pases directamente el Producto. Normalmente lo que se le suele pasar es una LineaDePedido, que básicamente tiene el id y precio (*) del producto comprado, pero también tiene otra información, como por ejemplo la cantidad de productos que se compran.



(*) Es más suele ser buena idea que este precio se copie en el momento de hacer el pedido. Porque el precio del producto podría cambiar luego, mientras se procesa el pedido y eso. Y no puedes cambiar el precio en el pedido una vez hecho.

Esto quiere decir que a tu carrito de las compras le pasas solo el id de tu producto selecionado. de esa forma en la siguiente pagina puedes recuperar tu producto con algo como
Código PHP:
$producto->getProductById() 
Ya tienes el Id del producto con el metodo te comunicas a tu BD e instancias nuevamente el producto selecionado.
__________________
Saludos!
Mty-NL..
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:32.