Код Magento / местная чувствительность к регистру - PullRequest
2 голосов
/ 05 августа 2011

Я обнаружил странное поведение, и мне нужна помощь, если кто-то знает ответы.

Поведение выглядит по-разному между приложением / кодом / локальным / Магом и приложением / кодом / локальным / MyCompany (или любым другим)

Если у меня есть модуль Mymodule в приложении / code / local / Mage с моделью 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 Ответ

2 голосов
/ 08 августа 2011

Разница в том, что когда ваш модуль находится под Mage / Mymodule с коротким именем mymodule и вы вызываете Mage :: getModel (' Mymodule / mymodel') вы в конечном итоге попали в режим отступления.

Если распознаватель не находит запись для короткого имени Mymodule (чувствительно к регистру), то по умолчанию используется имя класса mage_mymodule_model_mymodel и поскольку ваш модуль находится подпространство имен Мага, которое работает.

Перемещая ваш модуль в специальное пространство имен компании, вы получаете имя класса, которое не работает, если оно попадает в резерв.Вам нужно 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 вызывает uc_words для $ classname.
function uc_words($str, $destSep='_', $srcSep='_')
{
    return str_replace(' ', $destSep, ucwords(str_replace($srcSep, ' ', $str)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...