Development

Documentation/es_ES/cookbook/1.0/shopping_cart (diff)

You must first sign up to be able to contribute.

Changes between Version 1 and Version 2 of Documentation/es_ES/cookbook/1.0/shopping_cart

Show
Ignore:
Author:
Javier.Eguiluz (IP: 217.127.103.246)
Timestamp:
02/14/08 08:42:25 (10 years ago)
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/es_ES/cookbook/1.0/shopping_cart

    v1 v2  
    1919(próximamente el resto de la traducción...) 
    2020 
     21== Constructor == 
     22 
     23La clase `SfShoppingCart` está dirigida a la gestión de carritos de la compra. Puede contener cualquier tipo de objeto. El constructor permite declarar el valor de algún tipo impositivo a aplicar a la cesta, como tasas o impuestos según las leyes comerciales del país: 
     24 
     25    [php] 
     26    $my_shopping_cart = new sfShoppingCart(APP_CART_TAX); 
     27 
     28En este ejemplo, la tasa de impuestos que se va aplicar en el carrito de la compra, se va a definir en el archivo de configuración `app.yml` de la aplicación, para facilitar el cambio: 
     29 
     30    all: 
     31      cart: 
     32        tax:  19.6 
     33 
     34== Crear un usuario para el carrito de la compra == 
     35 
     36Usted puede crear fácilmente un nuevo objeto `sfShoppingCart` (es decir, un nuevo carrito de la compra) en una acción con el nuevo constructor. Sin embargo, no será de ninguna utilidad si la acción no está vinculada a una sesión de usuario. La forma más fácil de mantener los artículos seleccionados por un usuario en su carrito de la compra es creando un objeto `sfShoppingCart` en la clase `sfUser`. Para ello, hay que añadir un método personalizado a la clase `myUser` en `myproject/apps/myapp/lib/myUser.php`: 
     37 
     38    [php] 
     39    class myUser extends sfUser 
     40    { 
     41      public function getShoppingCart() 
     42      { 
     43        if (!$this->hasAttribute('shopping_cart')) 
     44          $this->setAttribute('shopping_cart', new sfShoppingCart(APP_CART_TAX)); 
     45     
     46        return $this->getAttribute('shopping_cart'); 
     47      } 
     48     
     49      ... 
     50    } 
     51 
     52El método `$user->getShoppingCart()` creará una nueva cesta de la compra si el usuario no tuviera ya una. 
     53 
     54>**Nota**: Si desea más información sobre la forma de saltarse la clase `sfUser` por defecto, para utilizar una clase `myUser` personalizada, debe leer la sección acerca de las factorías en el [http://www.librosweb.es/symfony/capitulo17.html Capítulo 17 de la Guía definitva]. 
     55 
     56== Añadir, modificar y eliminar elementos == 
     57 
     58La cesta de la compra puede contener cualquier cantidad de objetos de diferentes clases. Cada uno de los items almacenados en el carrito de la compra es una instancia de la clase `sfShoppingCartItem`. 
     59La clase `sfShoppingCart` cuenta con los métodos `addItem()` y `deleteItem()`. 
     60 
     61Como se puede añadir o eliminar cualquier tipo de objeto, el primer argumento de estas llamadas a los métodos es el nombre de la clase del objeto. Para modificar la cantidad de un artículo, en primer lugar se tiene que obtener el objeto `sfShoppingCartItem` a través del método `getItems()` del objeto `sfShoppingCart`, y después llamar a su método `setQuantity()`. 
     62 
     63### El módulo shoppingcart 
     64 
     65A continuación npresentamos un posible módulo de la aplicación de gestión de la cesta de la compra donde los objetos de la clase ‘Product’ (que representa a los productos), se pueden añadir, modificar o eliminar con las acciones ‘add ','update' y 'delete ': 
     66 
     67    [php] 
     68    class shoppingcartActions extends sfActions 
     69    { 
     70      ... 
     71       
     72      public function executeIndex() 
     73      { 
     74        $this->shopping_cart = $shopping_cart; 
     75        $this->items = $shopping_cart->getItems(); 
     76        ... 
     77      } 
     78          
     79      public function executeAdd() 
     80      { 
     81        ... 
     82        if ($this->hasRequestParameter('id')) 
     83        { 
     84          $product = ProductPeer::retrieveByPk($this->getRequestParameter('id')); 
     85          $item = new sfShoppingCartItem('Product', $this->getRequestParameter('id')); 
     86          $item->setQuantity(1); 
     87          $item->setPrice($product->getPrice()); 
     88          $shopping_cart = $this->getUser()->getShoppingCart(); 
     89          $shopping_cart->addItem($item); 
     90        } 
     91   
     92        ... 
     93      } 
     94   
     95      public function executeUpdate() 
     96      { 
     97        $shopping_cart = $this->getUser()->getShoppingCart(); 
     98        foreach ($shopping_cart->getItems() as $item) 
     99        { 
     100          if ($this->hasRequestParameter('quantity_'.$item->getId())) 
     101          { 
     102            $item->setQuantity($this->getRequestParameter('quantity_'.$item->getId())); 
     103          } 
     104        } 
     105     
     106        ... 
     107      }  
     108        
     109      public function executeDelete() 
     110      { 
     111        if ($this->hasRequestParameter('id')) 
     112        { 
     113          $shopping_cart = $this->getUser()->getShoppingCart(); 
     114          $shopping_cart->deleteItem('Product', $this->getRequestParameter('id')); 
     115        } 
     116     
     117        ... 
     118      } 
     119 
     120      ... 
     121    } 
     122 
     123### Añadir un item 
     124 
     125Echemos un vistazo más de cerca a este código. 
     126 
     127Para agregar un elemento a la cesta de la compra, usted llame al método `addItem()`, pasándole el objeto `sfShoppingCartItem`. Este objeto contiene la clase del objeto y el ID exclusivo del item que se agregó, la cantidad que debe incrementarse y el precio del artículo. Esto permite que la cesta pueda contener objetos de cualquier clase. Por ejemplo, usted podría tener un carrito de la compra con libros y CDs al mismo tiempo. 
     128 
     129El precio se almacena en el mismo momento para evitar desajustes entre el número de artículos y el precio total de la compra, en caso de que un producto sea modificado en el precio en un "back-office" (o para que el carro puede mantenerse entre los períodos de sesiones). Esto también permite aplicar precios de descuento según la cantidad ordenada por el cliente: 
     130 
     131    [php] 
     132    if ($quantity > 10) 
     133    { 
     134      $item->setPrice($product->getPrice() * 0.8); 
     135    } 
     136    else 
     137    { 
     138      $item->setPrice($product->getPrice()); 
     139    } 
     140 
     141El problema es que usted pierde el precio original si aplica el descuento de esta manera. Esa es la razón por la que el objeto `sfShoppingCartItem` tiene un método `setDiscount()` que espera un porcentaje de descuento: 
     142 
     143    [php] 
     144    if ($quantity > 10) 
     145    { 
     146      $item->setPrice($product->getPrice()); 
     147      $item->setDiscount(20); 
     148    } 
     149    else 
     150    { 
     151      $item->setPrice($product->getPrice()); 
     152    } 
     153 
     154### Actualizar un item 
     155 
     156Para cambiar la cantidad de un artículo en el carrito, se utiliza el método `setQuantity()` del objeto `sfShoppingCartItem`. Para eliminar un artículo, puede llamar al método `deleteItem()` o cambiar la cantidad a 0 llamando `setQuantity(0)`. 
     157 
     158Si un usuario añade el mismo item (la misma clase y el mismo id) varias veces, la cesta incrementará la cantidad de este item, y no añadirá un item nuevo: 
     159 
     160    [php] 
     161    $item = new sfShoppingCartItem('Product', $this->getRequestParameter('id')); 
     162    $item->setQuantity(1); 
     163    $item->setPrice($product->getPrice()); 
     164    $shopping_cart = $this->getUser()->getShoppingCart(); 
     165    $shopping_cart->addItem($item); 
     166    $shopping_cart->addItem($item); 
     167     
     168    // same as 
     169     
     170    $item = new sfShoppingCartItem('Product', $this->getRequestParameter('id')); 
     171    $item->setQuantity(2); 
     172    $item->setPrice($product->getPrice()); 
     173    $shopping_cart = $this->getUser()->getShoppingCart(); 
     174    $shopping_cart->addItem($item); 
     175     
     176Eventualmente, es posible que se pregunte por qué la acción update utiliza argumentos como `'quantity_2313 = 4'` en lugar de `'id=2313&cantidad=4'`. Como cuestión de hecho, la forma en que esta acción se lleva a cabo permite la actualización de cantidades de múltiples artículos a la vez. 
     177 
     178### Eliminar toda una cesta de la compra 
     179 
     180Para poner a cero la cesta de la compra, simplemente llame al método `clear()` de la instancia sfShoppingCart. 
     181 
     182    [php] 
     183    $this->getUser()->getShoppingCart()->clear(); 
     184 
     185== Mostrar la cesta de la compra en una plantilla == 
     186 
     187La acción `shoppingcart/index` debería mostrar el contenido del carrito de la compra. Vamos a examinar una posible aplicación: 
     188 
     189### Obtener el contenido del carrito de la compra 
     190 
     191El objeto `sfShoppingCart` posee tres métodos que le ayudarán a procesar el contenido de un carrito de la compra: 
     192 
     193* `->getItems()`: conjunto de todos los objetos sfShoppingCartItem en el carrito de la compra. 
     194* `->getItem($class_name, $object_id)`: un objeto específico `sfShoppingCartItem` 
     195* `->getTotal()`: Precio total de la cesta de la compra (suma de la cantidad * precio de cada item) 
     196 
     197Los ítems del carrito de la compra también tienen un contenedor de parámetros (parameter holder). Esto significa que usted puede agregar información personalizada a cualquier item. 
     198 
     199Por ejemplo, en un sitio web que vende partes de autos, los objetos `sfShoppingCartItem` necesitan almacenar los objetos añadidos, pero también el vehículo para el que la pieza fue comprada. Esto puede hacerse simplemente añadiendo: 
     200 
     201    [php] 
     202    $item->setParameter('vehicle', $vehicle_id); 
     203 
     204>**Nota**: Puede que necesite un método `getObjects()` en lugar de `getItems()`. Este método existe, pero depende de la capa de acceso a datos Propel. Como el uso de Propel es opcional, es posible que no pueda utilizarlo. Más información sobre la capa de acceso a datos en el [http://www.librosweb.es/symfony/capitulo8.html Capítulo 8 de la Guía definitiva]. 
     205 
     206### Paso de los valores a la plantilla 
     207 
     208Con el fin de mostrar el contenido del carrito, la acción del index tiene que definir algunas variables de acceso a la plantilla: 
     209 
     210    [php] 
     211    ... 
     212    $this->shopping_cart = $shopping_cart; 
     213    $this->items = $shopping_cart->getItems(); 
     214 
     215El siguiente ejemplo muestra una simple plantilla `indexSuccess.php` sobre la base de una iteración sobre todos los items del carrito para mostrar información acerca de cada uno de ellos: 
     216 
     217    [php] 
     218    <?php if ($shopping_cart->isEmpty()): ?> 
     219     
     220      Your shopping cart is empty. 
     221     
     222    <?php else: ?> 
     223     
     224      <?php foreach ($items as $item): ?> 
     225        <?php $object = call_user_func(array($item->getClass().'Peer', 'retrieveByPK'), $item->getId()) ?>  
     226        <?php echo $object->getLabel() ?><br /> 
     227        <?php echo $item->getQuantity() ?><br /> 
     228        <?php echo currency_format($item->getPrice(), 'EUR' ) ?>  
     229        <?php if ($item->getDiscount()): > 
     230           (- <?php echo $item->getDiscount() ?> %) 
     231        <?php endif ?><br /> 
     232      <?php endforeach ?> 
     233       
     234      Total : <?php echo currency_format($shopping_cart->getTotal(), 'EUR' ) ?><br /> 
     235     
     236    <?php endif ?> 
     237 
     238Tenga en cuenta que este ejemplo se utiliza la capa de acceso a datos Propel. Si su proyecto usa otra capa de acceso a datos, este ejemplo puede necesitar adaptaciones. 
     239 
     240== Con o sin impuestos == 
     241 
     242Por defecto, todas las operaciones -incluido `$shopping_cart->addItem()`, el acceso con `$item->getPrice()` y `$shopping_cart->getTotal()`- utilizan los precios **sin impuestos**. 
     243 
     244Para obtener la cantidad total de impuestos, usted tiene que proceder así: 
     245 
     246    [php] 
     247    $total_with_taxes = $shopping_cart->getTotalWithTaxes() 
     248 
     249Si lo necesita, el objeto `sfShoppingCart` puede ser inicializado de manera que procese al valor de una tasa o impuesto en sus métodos, para incluirlo en el precio de los artículos: 
     250 
     251    [php] 
     252    class myUser extends sfUser 
     253    { 
     254      public function getShoppingCart() 
     255      { 
     256        if (!$this->hasAttribute('shopping_cart')) 
     257        { 
     258          $this->setAttribute('shopping_cart', new sfShoppingCart(APP_CART_TAX)); 
     259        } 
     260        $this->getAttribute('shopping_cart')->setUnitPriceWithTaxes(APP_CART_WITHTAXES); 
     261        return $this->getAttribute('shopping_cart'); 
     262      } 
     263     
     264      ... 
     265    } 
     266 
     267Si `APP_CART_WITHTAXES` es `true`, los métodos `$shopping_cart->addItem()` y `$item->getPrice()` aplicarán el impuesto a los precios. Los métodos `getTotal()` y `getTotalWithTaxes()` darán resultados correctos. 
     268 
     269Una vez más, es un buen hábito para definir el impuesto en un fichero de configuración: es la razón por la que el ejemplo anterior utiliza la constante `APP_CART_WITHTAXES` en lugar de un simple `true`. El archivo `myproject/apps/myapp/config/app.yml` debe contener: 
     270 
     271    all: 
     272      cart: 
     273        tax:       19.6 
     274        withtaxes: true 
     275 
     276Si no está seguro de cómo aplicar los impuestos o tasas al carrito, haga la siguiente petición al carrito: 
     277 
     278    [php] 
     279    $uses_tax = $shopping_cart->getUnitPriceWithTaxes();