Mage_SalesRule_Model_Validator类有一个salesrule/rule_collection对象,并且该对象调用了validate类的Mage_SalesRule_Model_Rule_Condition_Product_Found函数,我不了解的是salesrule/rule_collection的对象与Found类之间的关系,如果我们向该类添加任何其他功能并尝试访问它会抛出一个Exception Undefined Function,我只想了解幕后发生的事情
Mage_SalesRule_Model_Rule_Condition_Product_Found扩展了Mage_SalesRule_Model_Rule_Condition_Product_Combine类,但是从process函数
调用它的Mage_SalesRule_Model_Validator会调用validate类的Found函数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);

以及processMage_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类中编写任何函数并像process那样调用的原因
谢谢

最佳答案

Magento的核心开发人员有时喜欢使用其他抽象,这使事情变得更难看。为什么?也许他们打算进一步开发此部分,也许他们认为它使重写更为容易,但有一点是可以肯定的是,他们没有想到与复杂性相关的成本。

整个salesrule模块分割为许多子类,每个子类具有独特的逻辑。核心逻辑实际上位于您正在查看的主文件中: process()方法内的Mage_SalesRule_Model_Validator

您要引用的行在代码中是294,位于适用于特定报价项的所有规则的循环内(报价项本质上是一种产品,已添加到购物车中并转换为容纳其他元数据) 。

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

因此,这里他们使用与产品和产品类型相同的策略。您有一个通用模型规则和一堆同级类,每个同级类都具有独特的逻辑。规则的“发现/合并/子选择”子类(有​​助于简化“与/或”逻辑以及具有优先级的组合规则的逻辑)。这里是启动器:Magento中的规则被抽象为它自己的唯一模块。看一下Mage_Rule模块-可能是找到所有缺少的部分的地方。

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

关于php - 购物车价格规则的类层次结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21397010/

10-12 23:22