Passed
Push — master ( c09416...643b98 )
by Jens
02:57 queued 16s
created

MultiComponent::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 4
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Created by: Jens
4
 * Date: 25-3-2018
5
 */
6
7
namespace CloudControl\Cms\components;
8
9
10
use CloudControl\Cms\cc\Request;
11
use CloudControl\Cms\components;
12
use CloudControl\Cms\storage\Storage;
13
14
class MultiComponent extends CachableBaseComponent
15
{
16
    /**
17
     * MultiComponent constructor.
18
     * Applies parameters in the namespace "self" to parent
19
     *
20
     * @param string $template
21
     * @param Request $request
22
     * @param array $parameters
23
     * @param $matchedSitemapItem
24
     */
25
    public function __construct($template = '', Request $request, $parameters = array(), $matchedSitemapItem)
26
    {
27
        $selfParameters = $this->getParametersForNameSpace('self');
28
        parent::__construct($template, $request, $selfParameters, $matchedSitemapItem);
29
    }
30
31
    /**
32
     * Runs all components that are set
33
     *
34
     * @param Storage $storage
35
     */
36
    public function run(Storage $storage)
37
    {
38
        parent::run($storage);
39
40
        $components = $this->getParametersWithoutNamespace();
41
42
        foreach ($components as $namespace => $component) {
43
            $this->loadComponent($namespace, $component);
44
        }
45
    }
46
47
    /**
48
     * Tries to determine component class name and wheter it exists
49
     *
50
     * @param $namespace String
51
     * @param $component String
52
     */
53
    private function loadComponent($namespace, $component)
54
    {
55
        $fullyQualifiedCloudControlComponent = '\\CloudControl\\Cms\\components\\' . $component;
56
        $fullyQualifiedComponent = '\\components\\' . $component;
57
        if (class_exists($fullyQualifiedCloudControlComponent, true)) {
58
            $this->runComponent($namespace, $fullyQualifiedCloudControlComponent);
59
        } elseif (class_exists($fullyQualifiedComponent, true)) {
60
            $this->runComponent($namespace, $fullyQualifiedComponent);
61
        }
62
    }
63
64
    /**
65
     * Instantiates the component and runs it
66
     *
67
     * @param $namespace String
68
     * @param $fullyQualifiedComponent String
69
     */
70
    private function runComponent($namespace, $fullyQualifiedComponent)
71
    {
72
        $parameters = $this->getParametersForNameSpace($namespace);
73
        $component = new $fullyQualifiedComponent('', $this->request, $parameters, $this->matchedSitemapItem);
74
        if ($component instanceof components\Component) {
75
            $component->run($this->storage);
76
            $parameters = $component->getParameters();
77
            foreach ($parameters as $name => $value) {
78
                $this->parameters[$namespace . '_' . $name] = $value;
79
            }
80
        }
81
    }
82
83
    /**
84
     * Retrieves all parameters for the given namespace
85
     *
86
     * @param $namespace
87
     * @return array
88
     */
89
    private function getParametersForNameSpace($namespace)
90
    {
91
        $parameters = array();
92
        foreach ($this->parameters as $key => $value) {
93
            if (0 === strpos($key, $namespace . ':')) {
94
                $parameters[substr($key, strlen($namespace) + 1)] = $value;
95
            }
96
        }
97
        return $parameters;
98
    }
99
100
    /**
101
     * Retrieves all parameters that have no namespace
102
     *
103
     * @return array
104
     */
105
    private function getParametersWithoutNamespace()
106
    {
107
        $parameters = array();
108
        foreach ($this->parameters as $key => $value) {
109
            if (strpos($key, ':') === false) {
110
                $parameters[$key] = $value;
111
            }
112
        }
113
        return $parameters;
114
    }
115
}