类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
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
之类的原因
感谢
答案 0 :(得分:2)
Magento的核心开发人员有时喜欢使用额外的抽象,这使得事情变得更加困难。为什么?也许他们打算进一步发展这一部分,也许他们认为它更容易覆盖,有一件事是他们没有想到与复杂性相关的成本。
整个salesrule模块分解为许多子类,每个子类都拥有一个独特的逻辑。核心逻辑实际上位于您正在查看的主文件中:{strong>进程()方法内的Mage_SalesRule_Model_Validator
。
您所指的行是代码中的294,它位于应用于特定报价项的所有规则的循环内(报价项基本上是添加到购物车并转换为保留附加项的产品元数据)。
if (!$rule->getActions()->validate($item)) {
continue;
}
因此,他们在产品和产品类型中使用相同的策略。你有一个规则作为一般模型和一堆兄弟类,每个类都拥有独特的逻辑。规则的Found / Combine / Subselect子类(有助于促进AND / OR和组合规则与优先级的逻辑)。以下是踢球者:Magento中的规则被抽象为自己独特的模块。看看Mage_Rule模块 - 这可能就是你会发现所有缺失的部分。
我希望这有点帮助。