我正在学习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中使用新的折扣价。感谢
答案 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)
为什么不使用产品的“目录价格规则”或“特价”功能?这些是内置的功能来做这种事情。
要添加购物车价格更改,您需要观察其他活动。速成课程:
您必须构建一个捕获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
还原为它的原始版本。更改核心文件不是一个好主意。