E-commerce con Zend Framework: Clase Colección de Items
Por zsamer en Abril 1, 2009
En el 3er capitulo "Clase Cart" de la serie "E-commerce con Zend Framework" hablamos en detalle sobre las clases que representa el Carro de compras (Shopping Cart). Hablamos de la clase abstracta CartAbstract que determina que comportamiento tiene que implementar las clases que la extiendan y de su clase hija StandardCart (concreta) que implementa el comportamiento y operaciones de un carro de compras.
Ahora es el turno de hablar sobre la clase Collection e Item, la primera representa una colección de Item y la segunda es el Item que representa el producto en el carro de compras. Si aún estas interesado en como implementar un carro de compras en Zend Framework entonces sigue leyendo.
La clase Collection (Core_Store_Cart_Item_Collection ejempleriza un objeto que representa una colección de objetos del tipo Item. El objeto de colección (de items) es un atributo/miembro más de la clase CartAbstract, cumple un rol muy importante ya que es quien nos guardara cada uno de los objetos items de nuestro carro de compras. Implementa las interfaces de SPL de PHP5 ArrayAccess, IteratorAggregate, Countable. En otras palabras es el encargado de guardar cada unos de los productos que vallamos agregando al carro de compras.
A continuación se muestra la clase Core_Store_Cart_Item_Collection.
Ubicación: "library\Core\Store\Cart\Item\Collection.php":
-
<?php
-
Zend_Loader::loadClass('Core_Store_Cart_Item');
-
-
class Core_Store_Cart_Item_Collection implements ArrayAccess, IteratorAggregate, Countable
-
{
-
-
public function detach($offset)
-
{
-
$this->offsetUnset($offset);
-
return $this;
-
}
-
-
public function attach($obj)
-
{
-
{
-
$offset = null;
-
-
{
-
$offset = $obj->getId();
-
}
-
-
$this->offsetSet($offset, $obj);
-
return $this;
-
}
-
throw new Exception('Must be a Object');
-
}
-
-
public function addItem($offset = null, Core_Store_Cart_Item $obj, $validate = true)
-
{
-
if($offset === null)
-
{
-
{
-
$offset = $obj->getId();
-
}
-
}
-
-
$this->offsetSet($offset, $obj, $validate);
-
return $this;
-
}
-
-
public function getItem($offset = null)
-
{
-
if($offset === null){
-
return $this->getIterator();
-
} else {
-
return $this->offsetGet($offset);
-
}
-
}
-
-
public function contains($obj)
-
{
-
return $this->offsetExists($obj);
-
}
-
-
public function getIterator()
-
{
-
return new ArrayIterator($this->_objectArray);
-
}
-
-
{
-
}
-
-
public function offsetExists($offset)
-
{
-
{
-
foreach($this->_objectArray as $object)
-
{
-
if ($object === $offset)
-
{
-
return true;
-
}
-
}
-
return false;
-
}
-
-
}
-
-
public function offsetGet($offset)
-
{
-
if ( true === $this->offsetExists($offset) ){
-
return $this->_objectArray[$offset];
-
} else {
-
return false;
-
}
-
}
-
-
public function offsetSet($offset, $value, $validate = false)
-
{
-
if( true === $validate )
-
{
-
$this->_objectArray[$offset] = $value;
-
} else if( false === $this->offsetExists($value) ) {
-
$this->_objectArray[] = $value;
-
}
-
} else {
-
$this->_objectArray[$offset] = $value;
-
} else {
-
$this->_objectArray[] = $value;
-
}
-
}
-
}
-
-
public function offsetUnset($offset)
-
{
-
{
-
foreach($this->_objectArray as $idx => $object)
-
{
-
if ($object === $offset)
-
{
-
return;
-
}
-
}
-
} else {
-
if ($this->offsetExists($offset)) {
-
}
-
}
-
}
-
}
La clase Item(Core_Store_Cart_Item) representa a cada item que ingresamos al carro de compras, es decir serán las líneas de detalle de nuestro carro de compras (Clase Cart). Nuestro objeto Item va a contener al objeto Product (producto) y cantidad del tipo entero que nos indicará el número de cada producto que tenemos almacenado en el carro y nos calculará el importe (P*Q) de cada uno.
A continuación se muestra la clase Core_Store_Cart_Item.
Ubicación: "library\Core\Store\Cart\Item.php":
-
<?php
-
class Core_Store_Cart_Item
-
{
-
private $_product = null;
-
-
private $_quantity = 0;
-
-
private $_subTotal = null;
-
-
public function __construct(Core_Store_Product $product = null, $qty = null)
-
{
-
$this->_product = $product;
-
$this->_quantity = (int)$qty;
-
$this->_calculateImporte();
-
}
-
-
public function getProduct()
-
{
-
return $this->_product;
-
}
-
-
public function setProduct(Core_Store_Product $product)
-
{
-
$this->_product = $product;
-
$this->_calculateImporte();
-
}
-
-
public function getId()
-
{
-
return $this->_product->getId();
-
}
-
-
public function setId($value)
-
{
-
$this->_product->setId((int)$value);
-
}
-
-
public function getName()
-
{
-
return $this->_product->getName();
-
}
-
-
public function setName($value)
-
{
-
$this->_product->setName($value);
-
}
-
-
public function getPrice()
-
{
-
return $this->_product->getPrice();
-
}
-
-
public function setPrice($value)
-
{
-
$this->_product->setPrice((double)$value);
-
}
-
-
public function getQuantity()
-
{
-
return $this->_quantity;
-
}
-
-
public function setQuantity($value)
-
{
-
$this->_quantity = (int)$value;
-
$this->_calculateImporte();
-
}
-
-
public function getWeight()
-
{
-
return $this->_product->getWeight();
-
}
-
-
public function setWeight($value)
-
{
-
$this->_product->setWeight((double)$value);
-
}
-
-
private function _calculateImporte()
-
{
-
$this->getSubTotal();
-
}
-
-
public function getImporte()
-
{
-
return $this->_subTotal;
-
}
-
-
public function getSubTotal()
-
{
-
if ($this->getPrice() != 0 && null !== $this->getPrice()) {
-
$this->setSubTotal($this->getQuantity() * $this->getPrice());
-
return $this->_subTotal;
-
}
-
return 0;
-
}
-
-
public function setSubTotal($value)
-
{
-
$this->_subTotal = (double)$value;
-
}
-
}
En el próximo y último capitulo veremos cómo aplicar todos los componentes vistos hasta ahora en la arquitectura MVC de Zend Framework, implementaremos una clase controladora CartController que tendrá las distintas acciones correspondiente a un carro de compras: agregar, eliminar y listar el carro y la vista phtml correspondiente al carro de compras.
Hemos terminado por hoy, nos vemos en el último capítulo. ![]()
Comentarios
7 Responses to “E-commerce con Zend Framework: Clase Colección de Items”
Deja tu comentario

Me parece que mas rapido es heredar (extends) de la clase ArrayObject o ArrayIterator , debido a que las implementaciones de los metodos ya estan listas y solo tendríamos que especializarlas, en vez de implementar metodo a metodo usando implements.
Hola Jaime, tienes toda la razón, es otra forma de implementar la colección de objetos. Lo hice de ésta forma para ver bien en detalle cómo funciona una clase de colección internamente.
Saludos!!!
Tengo problemas con serializar los ArrayObjects y ArrayIterator al ponerlos en “SESSION”.
Veo que es un bug que ha sido corregido pero aun no esta en la versión estable. Por ahora tengo mi propio arrayobject contruido para serializarlo
Salu2 desde Perú
Jaime Tan N.
RHCE-MCSA-BCIP
Hola,
me gustaría que publicases el último artículo, para ver el funcionamiento completo del carrito. Gracias.
ya se viene, ya se viene, apenas tenga un tiempo lo publicaré, no más de un par de semana lo tendré.
atentos!!!
hombre… estamos a noviembre… creo que ya han pasado unas cuantas semanas no? XDD
X favor publica ya el siguiente capítulo..! lo necesito d urgencia..!