我发现了一个奇怪的行为,如果有人知道答案,我需要一些帮助。
app / code / local / Mage和app / code / local / MyCompany(或其他)之间的行为似乎不同
如果我在app / code / local / Mage中有模块Mymodule模型Mymodel(app / code / local / Mage / Mymodule / Model / Mymodel),我可以加载它:
Mage :: getModel('* M * ymodule / Mymodel')或Mage :: getModel('* m * ymodule / Mymodel')都正常工作。 ..
但是如果模块在app / code / local / Mycompany中,则名称区分大小写,只有一个可以使用,具体取决于config.xml
<model>
<**m**ymodule>
<class>Mycompany_Mymodule_Model</class>
<resourceModel>cybermut_mysql4</resourceModel>
</**m**ymodule>
</models>
将允许Mage :: getModel('* m * ymodule / Mymodel')
和
<models>
<**M**ymodule>
<class>Mycompany_Mymodule_Model</class>
<resourceModel>cybermut_mysql4</resourceModel>
</**M**ymodule>
</models>
将允许Mage :: getModel('* M * ymodule / Mymodel')
为什么本地/法师和本地/所有人之间存在这种不同的行为?
PS:这不是重写它是一个自制模块,我使用的是CE 1.4.2 最诚挚的问候答案 0 :(得分:2)
不同之处在于,当您的模块位于Mage / Mymodule 下且短名称为 mymodule 时,您调用Mage :: getModel(' Mymodule / mymodel')你最终会遇到后退行为。
如果解析器没有找到短名称 Mymodule (区分大小写)的条目,则默认为 mage_mymodule_model_mymodel 的类名,因为您的模块位于有效的Mage命名空间。
通过将您的模块移动到公司特定的命名空间,您最终会得到一个类名,如果它遇到了回落,它就不起作用。您需要 mycompany_mymodule_model_mymodel ,最后选择 mage_mymodule_model_mymodel 。
相关代码位于Mage_Core_Model_Config :: getGroupedClassName()
public function getGroupedClassName($groupType, $classId, $groupRootNode=null)
{
if (empty($groupRootNode)) {
$groupRootNode = 'global/'.$groupType.'s';
}
$classArr = explode('/', trim($classId));
$group = $classArr[0];
$class = !empty($classArr[1]) ? $classArr[1] : null;
if (isset($this->_classNameCache[$groupRootNode][$group][$class])) {
return $this->_classNameCache[$groupRootNode][$group][$class];
}
//$config = $this->getNode($groupRootNode.'/'.$group);
$config = $this->_xml->global->{$groupType.'s'}->{$group};
if (isset($config->rewrite->$class)) {
$className = (string)$config->rewrite->$class;
} else {
if (!empty($config)) {
$className = $config->getClassName();
}
if (empty($className)) {
$className = 'mage_'.$group.'_'.$groupType;
}
if (!empty($class)) {
$className .= '_'.$class;
}
$className = uc_words($className);
}
$this->_classNameCache[$groupRootNode][$group][$class] = $className;
return $className;
}
NB :Magento在$ classname上调用uc_words。
function uc_words($str, $destSep='_', $srcSep='_')
{
return str_replace(' ', $destSep, ucwords(str_replace($srcSep, ' ', $str)));
}