使用观察员Magento更改所有页面上的产品价格

时间:2014-05-19 05:18:00

标签: magento events observers

我正在学习Magento,我开始学习事件和观察者。通过在管理产品区域中设置,将一定百分比的金额添加到产品中。 它工作正常,但折扣价仅显示在产品页面上。任何人都可以建议我如何通过Magento改变价格。我的意思是改变价格应该去购物车,订购等。

以下是 observer

的代码
<?php
class Xyz_Catalog_Model_Price_Observer
{
    public function __construct()
    {
    }
    /**
     * Applies the special price percentage discount
     * @param   Varien_Event_Observer $observer
     * @return  Xyz_Catalog_Model_Price_Observer
     */
    public function apply_discount_percent($observer)
    {
      $event = $observer->getEvent();
      $product = $event->getProduct();   
      // process percentage discounts only for simple products     
      if ($product->getSuperProduct() && $product->getSuperProduct()->isConfigurable()) {
      } else {
        $percentDiscount = $product->getPercentDiscount();

        if (is_numeric($percentDiscount)) {
          $today = floor(time()/86400)*86400;
          $from = floor(strtotime($product->getSpecialFromDate())/86400)*86400;
          $to = floor(strtotime($product->getSpecialToDate())/86400)*86400;

          if ($product->getSpecialFromDate() && $today < $from) {
          } elseif ($product->getSpecialToDate() && $today > $to) {
          } else {
            $price = $product->getPrice();
            $finalPriceNow = $product->getData('final_price');

            $specialPrice = $price - $price * $percentDiscount / 100;

            // if special price is negative - negate the discount - this may be a mistake in data
            if ($specialPrice < 0)
              $specialPrice = $finalPriceNow;

            if ($specialPrice < $finalPriceNow)
              $product->setFinalPrice($specialPrice); // set the product final price
          }
        }   
      }         
      return $this;
    }
}

config.xml

<?xml version="1.0"?>
<config>
  <global>
    <models>
        <xyzcatalog>
             <class>Xyz_Catalog_Model</class>
        </xyzcatalog>
    </models>
    <events>
      <catalog_product_get_final_price>
        <observers>
          <xyz_catalog_price_observer>
            <type>singleton</type>
            <class>Xyz_Catalog_Model_Price_Observer</class>
            <method>apply_discount_percent</method>
          </xyz_catalog_price_observer>
        </observers>
      </catalog_product_get_final_price>     
    </events>
  </global>
</config>

请告知我如何在整个Magento中使用新的折扣价。感谢

3 个答案:

答案 0 :(得分:7)

这是解决方案

<强> config.xml中

<?xml version="1.0"?>
<config>
    <modules>
        <Seta_DiscountPrice>
            <version>0.1.0</version>    <!-- Version number of your module -->
        </Seta_DiscountPrice>
    </modules>
    <global>
        <models>
            <setadiscountprice>
                <class>Seta_DiscountPrice_Model</class>
            </setadiscountprice>
        </models>
        <events>
        <catalog_product_get_final_price>
            <observers>
                <seta_discountprice_price_observer>
                    <type>singleton</type>
                    <class>Seta_DiscountPrice_Model_Price_Observer</class>
                    <method>apply_10</method>
                </seta_discountprice_price_observer>
            </observers>
        </catalog_product_get_final_price>
            <catalog_product_collection_load_after>
                <observers>
                    <seta_discountprice_price_observer>
                        <type>singleton</type>
                        <class>Seta_DiscountPrice_Model_Price_Observer</class>
                        <method>apply_view</method>
                    </seta_discountprice_price_observer>
                </observers>
            </catalog_product_collection_load_after>
        </events>
    </global>
</config>

<强> Observer.php

<?php

class Seta_DiscountPrice_Model_Price_Observer
{
    public function __construct()
    {
    }
    /**
     * Applies the special price percentage discount
     * @param   Varien_Event_Observer $observer
     * @return  Seta_DiscountPrice_Model_Price_Observer
     */
public function apply_10($observer)
{
    $event = $observer->getEvent();
    $product = $event->getProduct();
    // process percentage discounts only for simple products
    if ($product->getSuperProduct() && $product->getSuperProduct()->isConfigurable()) {
    } else {

        $product->setFinalPrice(10);
    }
    return $this;
}
    public function apply_view($observer)
    {
        $event = $observer->getEvent();
        $myCustomPrice = 10;
        $products = $observer->getCollection();

        foreach( $products as $product )
        {
            $product->setPrice( $myCustomPrice );
            $product->setFinalPrice( $myCustomPrice );
        }
        return $this;
    }
}

答案 1 :(得分:3)

  1. 为什么不使用产品的“目录价格规则”或“特价”功能?这些是内置的功能来做这种事情。

  2. 要添加购物车价格更改,您需要观察其他活动。速成课程:

  3. 您必须构建一个捕获add-to-cart事件sales_quote_add_item的观察者,然后您可以像在产品页面上那样在观察者中执行php-stuff来更改添加的产品的价格卡片:

    $observer->getEvent()->getQuoteItem()->setOriginalCustomPrice([your price])
    

答案 2 :(得分:-1)

正是为了完成这项任务,最好使用Catalog Price Rules菜单中的Promotions

但据我所知,你正在学习这个目的。因此,当您不确定某个事件时,您只需记录已分派的事件即可。在app/Mage.php中,您有一个名为dispatchEvent的方法。然后你可以记录每个调度的事件:

public static function dispatchEvent($name, array $data = array())
{
    if(strpos($name, 'product') || strpos($name, 'price')) { // optional
        Mage::log($name, null, 'events.log', true);
    }
    Varien_Profiler::start('DISPATCH EVENT:'.$name);
    $result = self::app()->dispatchEvent($name, $data);
    Varien_Profiler::stop('DISPATCH EVENT:'.$name);
    return $result;
}

您的日志文件将在var/log文件夹中创建。当然,当你完成时,不要忘记将Mage.php还原为它的原始版本。更改核心文件不是一个好主意。