Completed
Push — develop ( 21139f...eaa140 )
by Tom
12s
created

AbstractRewriteCommand::loadRewrites()   D

Complexity

Conditions 9
Paths 5

Size

Total Lines 43
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 43
rs 4.909
c 0
b 0
f 0
cc 9
eloc 24
nc 5
nop 0
1
<?php
2
3
namespace N98\Magento\Command\Developer\Module\Rewrite;
4
5
use N98\Magento\Command\AbstractMagentoCommand;
6
use Symfony\Component\Finder\Finder;
7
8
abstract class AbstractRewriteCommand extends AbstractMagentoCommand
9
{
10
    protected $_rewriteTypes = array(
11
        'blocks',
12
        'helpers',
13
        'models',
14
    );
15
16
    /**
17
     * Return all rewrites
18
     *
19
     * @return array
20
     */
21
    protected function loadRewrites()
22
    {
23
        $prototype = $this->_rewriteTypes;
24
        $return    = array_combine($prototype, array_fill(0, count($prototype), array()));
25
26
        // Load config of each module because modules can overwrite config each other. Global config is already merged
27
        $modules = \Mage::getConfig()->getNode('modules')->children();
28
        foreach ($modules as $moduleName => $moduleData) {
29
            // Check only active modules
30
            if (!$moduleData->is('active')) {
31
                continue;
32
            }
33
34
            // Load config of module
35
            $configXmlFile = \Mage::getConfig()->getModuleDir('etc', $moduleName) . DIRECTORY_SEPARATOR . 'config.xml';
36
            if (!is_readable($configXmlFile)) {
37
                continue;
38
            }
39
40
            $xml = \simplexml_load_file($configXmlFile);
41
            if (!$xml) {
42
                continue;
43
            }
44
45
            $rewriteElements = $xml->xpath('//*/*/rewrite');
46
            foreach ($rewriteElements as $element) {
47
                $type = \simplexml_import_dom(dom_import_simplexml($element)->parentNode->parentNode)->getName();
48
                if (!isset($return[$type])) {
49
                    continue;
50
                }
51
52
                foreach ($element->children() as $child) {
53
                    $groupClassName = \simplexml_import_dom(dom_import_simplexml($element)->parentNode)->getName();
54
                    if (!isset($return[$type][$groupClassName . '/' . $child->getName()])) {
55
                        $return[$type][$groupClassName . '/' . $child->getName()] = array();
56
                    }
57
                    $return[$type][$groupClassName . '/' . $child->getName()][] = (string) $child;
58
                }
59
            }
60
        }
61
62
        return $return;
63
    }
64
65
    /**
66
     * Check codepools for core overwrites.
67
     *
68
     * @return array
69
     */
70
    protected function loadAutoloaderRewrites()
71
    {
72
        $return = $this->loadAutoloaderRewritesByCodepool('community');
73
        $return = array_merge($return, $this->loadAutoloaderRewritesByCodepool('local'));
74
75
        return $return;
76
    }
77
78
    /**
79
     * Searches for all rewrites over autoloader in "app/code/<codepool>" of
80
     * Mage, Enterprise Zend, Varien namespaces.
81
     *
82
     * @param string $codePool
83
     * @return array
84
     */
85
    protected function loadAutoloaderRewritesByCodepool($codePool)
86
    {
87
        $return = array();
88
        $localCodeFolder = \Mage::getBaseDir('code') . '/' . $codePool;
89
90
        $folders = array(
91
            'Mage'       => $localCodeFolder . '/Mage',
92
            'Enterprise' => $localCodeFolder . '/Enterprise',
93
            'Varien'     => $localCodeFolder . '/Varien',
94
            'Zend'       => $localCodeFolder . '/Zend',
95
        );
96
97
        foreach ($folders as $vendorPrefix => $folder) {
98
            if (is_dir($folder)) {
99
                $finder = new Finder();
100
                $finder
101
                    ->files()
102
                    ->ignoreUnreadableDirs(true)
103
                    ->followLinks()
104
                    ->in($folder);
105
                foreach ($finder as $file) {
106
                    $classFile = trim(str_replace($folder, '', $file->getPathname()), '/');
107
                    $className = $vendorPrefix . '_' . str_replace(DIRECTORY_SEPARATOR, '_', $classFile);
108
                    $className = substr($className, 0, -4); // replace .php extension
109
                    $return['autoload: ' . $vendorPrefix][$className][] = $className;
110
                }
111
            }
112
        }
113
114
        return $return;
115
    }
116
}
117