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

Ahm*_*med 9 php magento magento-1.7

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

Mage_SalesRule_Model_Rule_Condition_Product_Found扩展的类Mage_SalesRule_Model_Rule_Condition_Product_Combine,但是当从process功能 Mage_SalesRule_Model_Validator称为它调用validate的函数FoundMage_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);
Run Code Online (Sandbox Code Playgroud)

并且其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;
}
Run Code Online (Sandbox Code Playgroud)

和班级的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;
}
Run Code Online (Sandbox Code Playgroud)

现在我不明白的是,如果我写的其他功能Found类让它public function Foo()并尝试从称之为process类的功能Validator类似

    $rule->Foo();
Run Code Online (Sandbox Code Playgroud)

它会抛出异常未定义的函数 我只是想知道为什么我不能在Found类中编写任何函数并调用就像process 谢谢

Ron*_*Ron 2

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

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

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

    if (!$rule->getActions()->validate($item)) {
        continue;
    }
Run Code Online (Sandbox Code Playgroud)

因此,他们在这里使用与产品和产品类型相同的策略。您有一个规则作为通用模型和一堆兄弟类,每个类都拥有独特的逻辑。规则的找到/组合/子选择子类(有助于促进 AND/OR 和具有优先级的组合规则的逻辑)。关键在于: Magento 中的规则被抽象为它自己独特的模块。看一下 Mage_Rule 模块 - 您可能会在其中找到所有缺失的部分。

我希望这个能有一点帮助。