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);
以及
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
类中编写任何函数并像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/