Magento代码/本地案例敏感性

时间:2011-08-05 12:30:27

标签: magento

我发现了一个奇怪的行为,如果有人知道答案,我需要一些帮助。

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&gt;
                <class>Mycompany_Mymodule_Model</class>
                <resourceModel>cybermut_mysql4</resourceModel>
            </**m**ymodule>
</models>

将允许Mage :: getModel('* m * ymodule / Mymodel')

<models>
            <**M**ymodule&gt;
                <class>Mycompany_Mymodule_Model</class>
                <resourceModel>cybermut_mysql4</resourceModel>
            </**M**ymodule>
</models>

将允许Mage :: getModel('* M * ymodule / Mymodel')

为什么本地/法师和本地/所有人之间存在这种不同的行为?

PS:这不是重写它是一个自制模块,我使用的是CE 1.4.2 最诚挚的问候

1 个答案:

答案 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)));
}