题
我根据运输方法开发了Magento中的观察者方法,用于过滤付款方法。这是我的方法:
class Devpassion_Paymentfilter_Model_Observer {
public function paymentMethodIsActive(Varien_Event_Observer $observer) {
$event = $observer->getEvent();
$method = $event->getMethodInstance();
$result = $event->getResult();
$carriers = Mage::getSingleton('shipping/config')->getActiveCarriers();
foreach ($carriers as $carrier) {
// $carrierCode = $carrier->getId();
if ($carrier->getId() == 'flatrate' ){
if($method->getCode() == 'checkmo' OR $method->getCode() == 'paypal_standard'){
$result->isAvailable = true;
}else{
$result->isAvailable = false;
}
}
}
}
}
结果是,对于所有运输方法,此过滤器都是正确的。因此,对于所有运输方法,贝宝和货币支票都显示出来,所有其他都没有。
请给我建议如何设置此条件以过滤仅用于一种特定的运输方法。
解决方案
public function paymentMethodIsActive($observer)
{
/**
* @var $quote Mage_Sales_Model_Quote
*/
$quote = $observer->getEvent()->getQuote();
$method = $observer->getEvent()->getMethodInstance();
$result = $observer->getEvent()->getResult();
$shipping_method = $quote->getShippingAddress()->getShippingMethod(); //selected shipping method
if ($shipping_method == 'flatrate_flatrate' && $method->getCode() == 'checkmo') {
$result->isAvailable = false;
}
}
其他提示
我不是100%的人确定您要完成的工作,但是您不应该根据当前订单来检查运输方法,而不是所有承运人的全局列表。
Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getShippingMethod()
代替
$carriers = Mage::getSingleton('shipping/config')->getActiveCarriers();
谢谢大家。现在,我与所有答案结合使用的方法看起来都像是这样,因此希望对他人有帮助:
class Devpassion_Paymentfilter_Model_Observer {
public function paymentMethodIsActive(Varien_Event_Observer $observer) {
$event = $observer->getEvent();
$method = $event->getMethodInstance();
$result = $event->getResult();
$carriers = Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getShippingMethod();
if ($carriers == 'flatrate_flatrate' ){
if($method->getCode() == 'checkmo' OR $method->getCode() == 'paypal_standard'){
$result->isAvailable = true;
}else{
$result->isAvailable = false;
}
}
}
}