2012-03-15 13 views

Respuesta

39

La manera de hacerlo es añadir un observador que se ve para este evento 'sales_quote_add_item':

<events> 
    <sales_quote_add_item> 
     <observers> 
      <priceupdate_observer> 
       <type>singleton</type> 
       <class>mymodule/observer</class> 
       <method>updatePrice</method> 
      </priceupdate_observer> 
     </observers> 
    </sales_quote_add_item> 
</events> 

El observador debe tener un método que hace algo como esto:

public function updatePrice($observer) { 
    $event = $observer->getEvent(); 
    $quote_item = $event->getQuoteItem(); 
    $new_price = <insert logic> 
    $quote_item->setOriginalCustomPrice($new_price); 
    $quote_item->save(); 
} 
+1

gracias por compartir información! Entonces, el XML entraría en un módulo local que necesitamos crear, ¿sí? (Encontré esto buscando: http://goo.gl/UBFgS) ¿Y luego se puede declarar la función pública en el phtml que está ejecutando el código del carro que estoy considerando? –

+1

Aquí debería dar una visión general sobre cómo crear un observador: http://alturl.com/tja43 –

+4

¡Respondió a mi problema! ¡Gracias por compartir esto! – haifacarina

4

puede utilizar una clase de observador para escuchar checkout_cart_product_add_after, y el uso de “super Mode” de un producto para fijar los precios personalizados aga inst el elemento de cita.

En su /app/code/local/{namespace}/{yourmodule}/etc/config.xml:

<config> 
    ... 
    <frontend> 
     ... 
     <events> 
      <checkout_cart_product_add_after> 
       <observers> 
        <unique_event_name> 
         <class>{{modulename}}/observer</class> 
         <method>modifyPrice</method> 
        </unique_event_name> 
       </observers> 
      </checkout_cart_product_add_after> 
     </events> 
     ... 
    </frontend> 
    ... 
</config> 

Y a continuación, crear una clase de observador en/app/código/local/{namespace }/{} yourmodule /Model/Observer.php

<?php 
     class <namespace>_<modulename>_Model_Observer 
     { 
      public function modifyPrice(Varien_Event_Observer $obs) 
      { 
       $customPrice = Mage::getSingleton(’core/session’)->getCustomPriceCalcuation(); // Provide you price i have set with session 
       $p = $obs->getQuoteItem(); 
       $p->setCustomPrice($customPrice)->setOriginalCustomPrice($customPrice); 
      } 

     } 
2

Como diestro respondida por Gershon Herczeg, Jürgen Thelen y Xman clásica. Deberá escribir un observador del evento sales_quote_add_item. Cuando se agrega un producto al carrito, su observador se activará. Si el producto es Configurable, este evento se disparará dos veces. Tendrá que hacer algo así para obtener solo productos simples.

$item = $observer->getEvent()->getQuoteItem(); 
    $quote = $item->getQuote(); 
    $product = $item->getProduct(); 
    if ($product->getTypeId() != "configurable") { 
     //Do your thing here 
    } 
2

Se solucionó el problema con el producto configurable. Simplemente elimine el

$ quote_item-> save();

y luego el producto no se agregará al carrito dos veces. Pero otro tema muy serio es permanecer en esta función. Es decir, con esta función podemos actualizar el precio del artículo en el carrito, pero luego de agregarlo al carrito, el precio del producto no cambia según la moneda diferente. Por lo tanto, esta función no se puede usar para una tienda que tenga varias monedas.

Si alguien encontró ninguna solución sobre ese tema, por favor, comparta con nosotros ...

3

sopa de frutos secos.

del archivo: /app/etc/modules/config.xml

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <modules> 
    <Ajax_ProductAdjust> 
     <codePool>local</codePool> 
     <active>true</active> 
    </Ajax_ProductAdjust> 
    </modules> 
</config> 

del archivo: /app/code/local/Ajax/ProductAdjust/etc/config.xml

<?xml version="1.0"?> 
     <config> 
     <modules> 
     <Ajax_ProductAdjust> 
      <version>1.0.1</version> 
     </Ajax_ProductAdjust> 
     </modules> 
     <global> 
      <models> 
      <Ajax_ProductAdjust> 
       <class>Ajax_ProductAdjust_Model</class> 
      </Ajax_ProductAdjust> 
      </models> 
      <events> 
       <sales_quote_add_item> 
        <observers> 
        <ajax_productadjust_model_observer> 
         <type>singleton</type> 
         <class>Ajax_ProductAdjust_Model_Observer</class> 
         <method>updatePrice</method> 
        </ajax_productadjust_model_observer> 
       </observers> 
       </sales_quote_add_item> 
      </events> 
     </global> 
    </config> 

del archivo: /app/code/local/Ajax/ProductAdjust/Model/Observer.php

<?php 
//Notes 
class Ajax_ProductAdjust_Model_Observer 
{ 

    public function _construct() 
     { 
     } 

    public function getNewPrice() 
     { 
     //Your new functionality here 
     // 
     $newprice = ""; 

     return $newprice; 
     } 

    public function updatePrice(Varien_Event_Observer $observer) 
    { 
     $event = $observer->getEvent(); 
     $quote_item = $event->getQuoteItem(); 
     $new_price = $this->getNewPrice(); 
     $quote_item->setOriginalCustomPrice($new_price); 
     $quote_item->save(); 
     } 
} 

Cheers,

+1

¿Cómo puedo obtener los detalles del producto en este observador? – Naveenbos

+0

Intenté usar este método y seguí recibiendo errores: '1452 No se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa – NotJay

1

La pregunta no indica si esto debe hacerse agregando algo de lógica al código o no. Entonces, como tiene respuestas para el desarrollador, también hay algo que se llama reglas de precios del carrito (en el panel de administración vaya a Promociones> Reglas de precios del carrito de compras) donde puede crear diferentes reglas para realizar ventas y descuentos (con o sin cupones).

0
To change product price while adding product to cart, use an observer event. 
    Follow the steps given below 
    1. Add an observer in your module config.xml file. 
    2. Create an observer file in your model 
    3. add checkout_cart_product_add_after event 

archivo: app/código/local/Espacio de nombres/módulo/etc/config.xml

por ejemplo: app/código/local/MGS/Rileytheme/etc/config.xml

 <frontend> 
      <routers> 
       <routeurfrontend> 
        <use>standard</use> 
        <args> 
        <module>MGS_Rileytheme</module> 
        <frontName>rileytheme</frontName> 
        </args> 
       </routeurfrontend> 
      </routers> 
      <layout> 
      <updates> 
      <rileytheme> 
       <file>rileytheme.xml</file> 
      </rileytheme> 
      </updates> 
      </layout> 
      <events> 
       <checkout_cart_product_add_after> 
       <observers> 
        <rileytheme> 
        <class>rileytheme/observer</class> 
        <method>modifyPrice</method> 
        </rileytheme> 
       </observers> 
       </checkout_cart_product_add_after> 
      </events></b> 
    <frontend> 

archivo: app/código/local/MGS/Rileytheme/modelo/Observer.php

class MGS_Rileytheme_Model_Observer { 
    public function modifyPrice(Varien_Event_Observer $observer) { 
     //$order = Mage::registry('current_order'); For getting current order 
     //$orderid = $order->getRealOrderId(); For getting orderid 
      $quote_item = $observer->getQuoteItem(); 
      $payment = 30; //add your custom product price here and do your logic here 
      $quote_item->setOriginalCustomPrice($payment); 
      $quote_item->save(); 
      return $this; 
    } 
} 
Cuestiones relacionadas