2011-08-05 5 views
2

J'ai trouvé un comportement étrange, et j'ai besoin d'aide si quelqu'un connaît les réponses.Code Magento/sensibilité à la casse locale

comportement semble différent

Si j'ai un monModule de module dans app/code/local/Mage entre app/code/local/Mage et app/code/(ou autre) local/MyCompany avec un modèle MyModel (app/code/local/Mage/monModule/Modèle/MyModel) Je peux le charger avec:

Mage :: getModel ('* m * ymodule/MyModel') ou Mage :: getModel ('* m * ymodule/Mymodel ') fonctionnent tous les deux ...

Mais si le module est dans app/code/local/Mycompany le nom est sensible à la casse et un seul fonctionnera, selon config.xml

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

Mage :: volonté permet getModel ('* m * ymodule/MyModel')

et

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

permettra Mage :: getModel ('* M * ymodule/Mymodel')

Pourquoi y at-il cette différence t comportement entre local/Mage et local/Alltheothers ???

PS: Il est pas une réécriture, c'est un module fait maison et je suis en utilisant CE 1.4.2 Cordialement

Répondre

2

La différence est que lorsque le module est sous Mage/monModule avec un shortname de mymodule et vous appelez Mage :: getModel ('Mymodule/mymodel') vous finissez par atteindre le comportement de repli.

Si le résolveur ne trouve pas d'entrée pour le shortname monModule (sensible à la casse), puis il est par défaut à un nom de classe de mage_mymodule_model_mymodel et depuis votre module est sous l'espace de noms de Mage qui fonctionne. En déplaçant votre module dans un espace de noms spécifique à la société, vous vous retrouvez avec un nom de classe qui ne fonctionne pas s'il a atteint le fallback. Vous avez besoin de mycompany_mymodule_model_mymodel et au lieu de finir avec mage_mymodule_model_mymodel.

Le code correspondant est en 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 appelle uc_words sur classname $.

function uc_words($str, $destSep='_', $srcSep='_') 
{ 
    return str_replace(' ', $destSep, ucwords(str_replace($srcSep, ' ', $str))); 
}