购物车价格规则的类层次结构

时间:2014-01-28 04:45:19

标签: php magento magento-1.7

Mage_SalesRule_Model_Validator的对象为salesrule/rule_collection,该对象调用类validate的函数Mage_SalesRule_Model_Rule_Condition_Product_Found,我不明白的是{的对象是什么{1}}与Found类相关,如果我们向该类添加任何其他函数并尝试访问它将抛出异常未定义函数,我只想了解幕后发生的事情

salesrule/rule_collection扩展了类Mage_SalesRule_Model_Rule_Condition_Product_Found,但是来自Mage_SalesRule_Model_Rule_Condition_Product_Combine的函数 process调用它调用Mage_SalesRule_Model_Validator validateFound对象调用的Mage_SalesRule_Model_Validator函数

process

调用try { $validator = Mage::getModel('module/validator') ->init($customer->getWebsiteId(), $customerGroupId); } catch (Exception $e) { Mage::log('Exception: ' . $e . ' in ' . __CLASS__ . ' on ' . __LINE__); } $v = $validator->process($quote); 类的process函数的Mage_SalesRule_Model_Validator validate函数

Found

public function process($_quote) { $quote = $_quote; $customerSession = Mage::getSingleton('customer/session'); foreach ($this->_rules as $rule) { if ($rule->getIsValid() === false) { continue; } if ($rule->getIsValid() !== true) { $rule->afterLoad(); if (!$rule->validate($quote)) { // quote does not meet rule's conditions , //Call Found.php $rule->setIsValid(false); continue; } $rule->setIsValid(true); // passed all validations, remember to be valid } } return $this; }

validate函数
Found

现在我不明白的是,如果我在 public function validate(Varien_Object $object) { //Called form Validator.php $all = $this->getAggregator() === 'all'; $true = (bool)$this->getValue(); $found = false; $Count = count($object->getAllItems()); $i = 0; foreach ($object->getAllItems() as $item) { $found = $all ? true : false; foreach ($this->getConditions() as $cond) { $validated = $cond->validate($item); // Call to Product.php's function 'validate' if($validated) { $this->_ProductId[] = $item->getProductId(); } if($i == $Count) { if ($all && !$validated) { $found = false; break; } elseif (!$all && $validated) { $found = true; break 2; } } } if($i == $Count) { if ($found && $true) { break; } } $i = $i + 1; } return false; } 类中编写任何其他函数,请将其设为Found并尝试从public function Foo()process函数调用它喜欢

Validator

它将抛出异常未定义函数 我只是想知道为什么我不能在 $rule->Foo(); 类中编写任何函数并调用Found之类的原因 感谢

1 个答案:

答案 0 :(得分:2)

Magento的核心开发人员有时喜欢使用额外的抽象,这使得事情变得更加困难。为什么?也许他们打算进一步发展这一部分,也许他们认为它更容易覆盖,有一件事是他们没有想到与复杂性相关的成本。

整个salesrule模块分解为许多子类,每个子类都拥有一个独特的逻辑。核心逻辑实际上位于您正在查看的主文件中:{strong>进程()方法内的Mage_SalesRule_Model_Validator

您所指的行是代码中的294,它位于应用于特定报价项的所有规则的循环内(报价项基本上是添加到购物车并转换为保留附加项的产品元数据)。

    if (!$rule->getActions()->validate($item)) {
        continue;
    }

因此,他们在产品和产品类型中使用相同的策略。你有一个规则作为一般模型和一堆兄弟类,每个类都拥有独特的逻辑。规则的Found / Combine / Subselect子类(有助于促进AND / OR和组合规则与优先级的逻辑)。以下是踢球者:Magento中的规则被抽象为自己独特的模块。看看Mage_Rule模块 - 这可能就是你会发现所有缺失的部分。

我希望这有点帮助。