Comment puis-je obtenir une liste de tous les réécritures de classe?
-
16-10-2019 - |
Question
Est-il possible d'énumérer tous les réécritures et peut-être d'autres conflits potentiels en plus de l'examen de tous les fichiers de configuration? Je dois analyser certains projets avec beaucoup d'extensions et des modifications personnalisées et je voudrais automatiser autant que possible de cela.
La chose la plus importante est de détecter les extensions qui réécrivent la même classe, mais je voudrais avoir une liste de tous les réécritures en place aussi, de garder une vue d'ensemble. En ce moment, je maintiens cette liste manuellement dans une feuille de calcul.
J'ai trouvé cette extension ( "Extension Conflict") sur Magento Connect mais à en juger par la critiques et notes de version, il semble être dépassée.
La solution
Jetez un oeil à la N98-magerun utilitaire :
Réécrire Liste
Liste tous les réécritures de classe enregistrée:
$ n98-magerun.phar dev:module:rewrite:list
Réécrire conflits
Liste toutes les réécritures dupliqués et vous indique à quelle classe est chargée par Magento. La commande vérifie l'héritage de classe dans l'ordre de vos dépendances de module.
n98-magerun.phar dev:module:rewrite:conflicts [--log-junit="..."]
Si un nom de fichier avec l'option --log-JUnit est défini l'outil génère un fichier XML et pas de sortie sur la sortie standard.
Vous pouvez également enregistrer les conflits dans un fichier XML JUnit style pour une analyse ultérieure, par exemple sur un serveur d'intégration continue.
Disclaimer: semi-auto-link / Je suis impliqué dans ce projet
Autres conseils
Voici un petit-liner qui vous donne tous les réécritures actifs:
print_r(Mage::getConfig()->getNode()->xpath('//global//rewrite'));
Pour limiter par type d'objet, ajouter des modèles, des blocs ou des aides au XPath respectivement.
Par exemple:
Mage::getConfig()->getNode()->xpath('//global/models//rewrite')
Voici un petit script que j'utilise pour vérifier si des modèles, des blocs ou des aides sont remplacés. Malheureusement, il ne fonctionne pas pour les contrôleurs et il prend en compte les modules handicapés aussi. Mais de mon point de vue, ce n'est pas grand.
L'idée principale est d'analyser les fichiers de configuration et recherchez le tag <rewrite>
.
Créez un fichier php sur le même niveau que index.php
. L'appel de Let it rewrites.php
, avec ce contenu:
<?php
$folders = array('app/code/local/', 'app/code/community/');//folders to parse
$configFiles = array();
foreach ($folders as $folder){
$files = glob($folder.'*/*/etc/config.xml');//get all config.xml files in the specified folder
$configFiles = array_merge($configFiles, $files);//merge with the rest of the config files
}
$rewrites = array();//list of all rewrites
foreach ($configFiles as $file){
$dom = new DOMDocument;
$dom->loadXML(file_get_contents($file));
$xpath = new DOMXPath($dom);
$path = '//rewrite/*';//search for tags named 'rewrite'
$text = $xpath->query($path);
foreach ($text as $rewriteElement){
$type = $rewriteElement->parentNode->parentNode->parentNode->tagName;//what is overwritten (model, block, helper)
$parent = $rewriteElement->parentNode->parentNode->tagName;//module identifier that is being rewritten (core, catalog, sales, ...)
$name = $rewriteElement->tagName;//element that is rewritten (layout, product, category, order)
foreach ($rewriteElement->childNodes as $element){
$rewrites[$type][$parent.'/'.$name][] = $element->textContent;//class that rewrites it
}
}
}
echo "<pre>";print_r($rewrites);
lorsque vous appelez dans un navigateur, vous devriez voir quelque chose comme ceci:
Array
(
[models] => Array
(
[core/layout] => Array
(
[0] => Namespace_Module_Model_Core_Layout
[1] => Namespace1_Module1_Model_Core_Layout //if the second element is present it means there is a possible conflict
)
[...] => ....
)
[blocks] => ...
[helpers] => ...
)
Cela signifie que le modèle 'core/layout'
est écrasé par Namespace_Module_Model_Core_Layout
Si vous avez 2 ou plusieurs valeurs dans le tableau [ « core / layout »] cela signifie qu'il ya un conflit.
Et vous pouvez facilement identifier le module qui écrasements quelque chose basé sur Namespace
et Module
J'ai combiné à la fois la réponse et a obtenu une solution agréable
$text = Mage::getConfig()->getNode()->xpath('//global//rewrite');
foreach ($text as $rewriteElement) {
if ($rewriteElement->getParent()->getParent()) {
# what is overwritten (model, block, helper)
$type = $rewriteElement->getParent()->getParent()->getName();
# module identifier that is being rewritten (core, catalog, sales, ...)
$parent = $rewriteElement->getParent()->getName();
# element that is rewritten (layout, product, category, order)
$name = $rewriteElement->getName();
foreach ($rewriteElement->children() as $element) {
# class that rewrites it
$rewrites[$type][$parent.'/'.$name][] = $element;
}
}
}
print_r($rewrites);
die;
Peut-être que peu frais généraux, mais il est agréable de travailler avec la collecte des données de Varien ... Code de https: / /github.com/firegento/firegento-debug
$collection = new Varien_Data_Collection();
$fileName = 'config.xml';
$modules = Mage::getConfig()->getNode('modules')->children();
$rewrites = array();
foreach ($modules as $modName => $module) {
if ($module->is('active')) {
$configFile = Mage::getConfig()->getModuleDir('etc', $modName) . DS . $fileName;
if (file_exists($configFile)) {
$xml = file_get_contents($configFile);
$xml = simplexml_load_string($xml);
if ($xml instanceof SimpleXMLElement) {
$rewrites[$modName] = $xml->xpath('//rewrite');
}
}
}
}
foreach ($rewrites as $rewriteNodes) {
foreach ($rewriteNodes as $n) {
$nParent = $n->xpath('..');
$module = (string)$nParent[0]->getName();
$nSubParent = $nParent[0]->xpath('..');
$component = (string)$nSubParent[0]->getName();
if (!in_array($component, array('blocks', 'helpers', 'models'))) {
continue;
}
$pathNodes = $n->children();
foreach ($pathNodes as $pathNode) {
$path = (string)$pathNode->getName();
$completePath = $module . '/' . $path;
$rewriteClassName = (string)$pathNode;
$instance = Mage::getConfig()->getGroupedClassName(
substr($component, 0, -1),
$completePath
);
$collection->addItem(
new Varien_Object(
array(
'path' => $completePath,
'rewrite_class' => $rewriteClassName,
'active_class' => $instance,
'status' => ($instance == $rewriteClassName)
)
)
);
}
}
}
Pour la sortie, vous pouvez utiliser ...
foreach ($collection as $rewrite) {
var_dump($rewrite->getData());
}