E-commerce con Zend Framework: Clase Cart
Por zsamer en Febrero 23, 2009
En el capitulo anterior "E-commerce con Zend Framework: Factoría" hablamos sobre el componente/clase Factoría que nos resolvía el problema de obtener el objeto persistente Cart (carro de compras) desde una sesión, implementado con Zend_Sesion, y todo este proceso implementando el conocido patrón de diseño Factory.
Hoy vamos a mostrar las clases Core_Store_Cart_Abstract y Core_Store_Cart_Abstract_StandardCart.
CartAbstract es una clase abstracta que determina que comportamiento tiene que implementar las clases que las extiendan, nos dice el "que hacen nuestras sub-clases" no el como lo hacen ya que esto dependerá de cada una, además nos entrega una estructura, molde o esqueleto a seguir, es un tipo. También es correcto haber hecho esto usando una interfaz, pero en nuestro ejemplo tenemos implementado un método en común save(), por lo que lo haremos con una clase abstracta.
CartAbstract nos presenta una colección de método, que debemos implementar estos métodos serán el comportamiento de la clase Concreta Cart, son las acciones que debe de realizar en determinados momentos.
Clase Core_Store_Cart_Abstract
-
<?php
-
Zend_Loader::loadClass('Core_Store_Cart_Item_Collection');
-
-
abstract class Core_Store_Cart_Abstract
-
{
-
protected $_contents = null;
-
-
protected $_total = 0;
-
-
protected $_weight = 0;
-
-
protected $_totalTax = 0;
-
-
protected $_taxValue = 19;
-
-
protected function __construct()
-
{
-
$this->reset();
-
}
-
-
-
abstract public function addCart(Core_Store_Cart_Item $item);
-
-
abstract public function updateQuantity($products_id, $quantity);
-
-
abstract public function cleanup();
-
-
abstract public function countContents();
-
-
abstract public function getQuantity($products_id);
-
-
abstract public function inCart($products_id);
-
-
abstract public function remove($products_id);
-
-
abstract public function removeAll();
-
-
abstract public function getProducts();
-
-
abstract public function getContents();
-
-
abstract public function getTotal();
-
-
abstract public function getWeight();
-
-
public function save()
-
{
-
try {
-
$sessionData = Zend_Registry::get('coreSession');
-
-
}
-
-
$sessionData->cart = $this;
-
-
} catch (Exception $e) {
-
}
-
}
-
}
Clase Core_Store_Cart_Abstract_StandardCart
-
<?php
-
Zend_Loader::loadClass('Core_Store_Cart_Abstract');
-
-
class Core_Store_Cart_Abstract_StandardFinal extends Core_Store_Cart_Abstract
-
{
-
-
protected function __construct()
-
{
-
parent::__construct();
-
}
-
-
{
-
if (!self::$_instance instanceof self) {
-
self::$_instance = new self();
-
}
-
-
return self::$_instance;
-
}
-
-
{
-
$this->_contents = new Core_Store_Cart_Item_Collection();
-
$this->_total = 0;
-
$this->_weight = 0;
-
-
$sessionData = Zend_Registry::getInstance()->get('coreSession');
-
-
}
-
}
-
-
public function addCart(Core_Store_Cart_Item $item)
-
{
-
if ($this->inCart($item->getId())) {
-
$this->updateQuantity($item->getId(), $item->getQuantity());
-
} else {
-
$this->_contents->addItem($item->getId(), $item);
-
$this->cleanup();
-
}
-
}
-
-
public function updateQuantity($productId, $quantity, $qtyFromPost = false)
-
{
-
$item = $this->findProducto($productId);
-
-
if ($item !== null) {
-
$quantity = ($qtyFromPost === true)? $quantity: $item->getQuantity() + $quantity;
-
$item->setQuantity($quantity);
-
-
$this->cleanup();
-
}
-
}
-
-
public function cleanup()
-
{
-
foreach( $this->_contents->getIterator() as $key => $value ) {
-
if ( $this->getQuantity($key) <1 ) {
-
$this->_contents->detach($key);
-
}
-
}
-
}
-
-
public function countContents()
-
{
-
return (int)$this->_contents->count();
-
}
-
-
public function getQuantity($productId)
-
{
-
if ( $this->inCart($productId) ) {
-
if(($item = $this->_contents->getItem($productId)) && ($item->getQuantity()> 0) ){
-
return $item->getQuantity();
-
}
-
return 0;
-
} else {
-
return 0;
-
}
-
}
-
-
public function inCart($productId)
-
{
-
return $this->_contents->offsetExists($productId);
-
}
-
-
public function has($productId)
-
{
-
return $this->inCart($productId);
-
}
-
-
private function findProducto($productoId) {
-
if($this->inCart($productoId)){
-
return $this->_contents->getItem($productoId);
-
}
-
return null;
-
}
-
-
public function remove($productId)
-
{
-
$product = $this->findProducto($productId);
-
if ($product !== null) {
-
$this->_contents->detach($product);
-
}
-
}
-
-
public function removeProductos(ArrayAccess $productIds) {
-
if ($productIds !== null) {
-
-
for($iterator = $productIds->getIterator();
-
$iterator->valid();
-
$iterator->next()) {
-
$this->remove((String)$iterator->current());
-
}
-
}
-
}
-
-
public function removeAll()
-
{
-
$this->reset();
-
}
-
-
public function getProducts()
-
{
-
$this->calculateTotals();
-
return $this->_contents;
-
}
-
-
public function calculateTotals()
-
{
-
$this->_total = 0;
-
$this->_weight = 0;
-
-
foreach ($this->_contents->getIterator() as $productsId => $item)
-
{
-
-
$this->_weight += ($item->getQuantity() * $item->getWeight());
-
$this->_total += $item->getImporte();
-
}
-
}
-
-
public function getContents()
-
{
-
return $this->_contents;
-
}
-
-
public function getTotal()
-
{
-
return (double)$this->_total;
-
}
-
-
public function getWeight()
-
{
-
return (double)$this->_weight;
-
}
-
}
Nos damos cuenta que la clase concreta Core_Store_Cart_Abstract_StandardCart que extiende Core_Store_Cart_Abstract implementa cada uno de los métodos abstractos de la super-clase abstracta.
Sin entrar en detalle de la clase concreta del ejemplo observamos que obtenemos su instancia mediante el método estático getInstance(), esto es una implementación del patrón de diseño singleton, única instancia del objeto.
También observamos que el constructor de la super clase abstracta inicializa el proceso llamando el método reset(), que setea los atributo de la clase para comenzar con el sistema, crea una instancia del objeto de colección de items Core_Store_Cart_Item_Collection y setea atributos como total igual a "0" (cero).
Ahora vamos a explicar brevemente algunos de los principales métodos:
- addCart(item): Agrega items a nuestro carro de compras, lo agrega al objeto de colección, primero valida si el item/producto ya existe. Si existe actualiza su cantidad, de lo contrario lo agrega como nuevo item.
- cleanup(): Revisa que no hayan items con cantidad menos a 1 (o cero) si es así elimina el objeto item.
- updateQuantity(productId): Busca el objeto ítem en la colección mediante su id y cuando lo encuentra actualiza su cantidad.
- remove(productId): Busca el objeto ítem en la colección mediante su id y cuando lo encuentra lo elimina.
- getQuantity(productId): Obtenemos la cantidad de un ítem en particular dentro de la colección.
- calculateTotals(): Recorre la colección y suma el total (importe p*q), peso y impuesto y los guarda como atributo del objeto Cart.
- inCart(productId): Verifica si el objeto ítem ya existe en la colección.
- findProducto(productId): Busca a un ítem/producto en la colección por su id.
- countContents(): Obtiene el numero de items guardados en la colección.
- getProducts(): Obtenemos la colección de items/productos.
- El resto de los métodos es Coser y Cantar.
Bueno por hoy terminamos, la próxima sesión veremos el objeto de colección de items Core_Store_Cart_Item_Collection y la clase Core_Store_Cart_Item. Por ahora vayan analizando y observando los componentes que hemos expuesto en estos tres episodios.
![]()
Comentarios
One Response to “E-commerce con Zend Framework: Clase Cart”
Deja tu comentario

[...] el 3er capitulo “Clase Cart” de la serie “E-commerce con Zend Framework” hablamos en detalle sobre las clases que representa el [...]