Completed
Push — develop ( b1079f...28eb99 )
by Tom
04:31
created

AbstractRewriteCommand   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 107
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 13
c 1
b 0
f 0
lcom 1
cbo 1
dl 0
loc 107
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
C loadRewrites() 0 41 8
A loadAutoloaderRewrites() 0 7 1
B loadAutoloaderRewritesByCodepool() 0 31 4
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 = dom_import_simplexml($element)->parentNode->parentNode->nodeName;
48
                if (!isset($return[$type])) {
49
                    continue;
50
                }
51
52
                foreach ($element->children() as $child) {
53
                    $groupClassName = dom_import_simplexml($element)->parentNode->nodeName;
54
                    $modelName = $child->getName();
55
                    $return[$type][$groupClassName . '/' . $modelName][] = (string) $child;
56
                }
57
            }
58
        }
59
60
        return $return;
61
    }
62
63
    /**
64
     * Check codepools for core overwrites.
65
     *
66
     * @return array
67
     */
68
    protected function loadAutoloaderRewrites()
69
    {
70
        $return = $this->loadAutoloaderRewritesByCodepool('community');
71
        $return = array_merge($return, $this->loadAutoloaderRewritesByCodepool('local'));
72
73
        return $return;
74
    }
75
76
    /**
77
     * Searches for all rewrites over autoloader in "app/code/<codepool>" of
78
     * Mage, Enterprise Zend, Varien namespaces.
79
     *
80
     * @param string $codePool
81
     * @return array
82
     */
83
    protected function loadAutoloaderRewritesByCodepool($codePool)
84
    {
85
        $return = array();
86
        $localCodeFolder = \Mage::getBaseDir('code') . '/' . $codePool;
87
88
        $folders = array(
89
            'Mage'       => $localCodeFolder . '/Mage',
90
            'Enterprise' => $localCodeFolder . '/Enterprise',
91
            'Varien'     => $localCodeFolder . '/Varien',
92
            'Zend'       => $localCodeFolder . '/Zend',
93
        );
94
95
        foreach ($folders as $vendorPrefix => $folder) {
96
            if (is_dir($folder)) {
97
                $finder = new Finder();
98
                $finder
99
                    ->files()
100
                    ->ignoreUnreadableDirs(true)
101
                    ->followLinks()
102
                    ->in($folder);
103
                foreach ($finder as $file) {
104
                    $classFile = trim(str_replace($folder, '', $file->getPathname()), '/');
105
                    $className = $vendorPrefix . '_' . str_replace(DIRECTORY_SEPARATOR, '_', $classFile);
106
                    $className = substr($className, 0, -4); // replace .php extension
107
                    $return['autoload: ' . $vendorPrefix][$className][] = $className;
108
                }
109
            }
110
        }
111
112
        return $return;
113
    }
114
}
115