Completed
Pull Request — master (#114)
by Bart
02:28
created

Plugins::import()   C

Complexity

Conditions 7
Paths 8

Size

Total Lines 27
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 7

Importance

Changes 0
Metric Value
dl 0
loc 27
rs 6.7272
c 0
b 0
f 0
ccs 9
cts 9
cp 1
cc 7
eloc 17
nc 8
nop 2
crap 7
1
<?php
2
3
namespace NerdsAndCompany\Schematic\Services;
4
5
use Craft;
6
use NerdsAndCompany\Schematic\Schematic;
7
use NerdsAndCompany\Schematic\Interfaces\MappingInterface;
8
use yii\base\Component as BaseComponent;
9
10
/**
11
 * Schematic Plugins Service.
12
 *
13
 * Sync Craft Setups.
14
 *
15
 * @author    Nerds & Company
16
 * @copyright Copyright (c) 2015-2018, Nerds & Company
17
 * @license   MIT
18
 *
19
 * @see      http://www.nerds.company
20
 */
21
class Plugins extends BaseComponent implements MappingInterface
22
{
23
    /**
24
     * {@inheritdoc}
25 6
     */
26
    public function export(array $plugins): array
27 6
    {
28
        $pluginDefinitions = [];
29
        foreach ($plugins as $handle => $pluginInfo) {
30
            $pluginDefinitions[$handle] = $this->getPluginDefinition($handle, $pluginInfo);
31
        }
32
        ksort($pluginDefinitions);
33 5
34
        return $pluginDefinitions;
35 5
    }
36
37
    /**
38
     * @param string $handle
39
     * @param array  $pluginInfo
40
     *
41
     * @return array
42
     */
43 3
    private function getPluginDefinition(string $handle, array $pluginInfo)
44
    {
45 3
        $settings = null;
46
        $plugin = Craft::$app->plugins->getPlugin($handle);
47
        if ($plugin) {
48 3
            $settings = $plugin->getSettings();
49 3
        }
50 1
51
        return [
52 3
          'isEnabled' => $pluginInfo['isEnabled'],
53
          'isInstalled' => $pluginInfo['isInstalled'],
54
          'settings' => $settings ? $settings->attributes : [],
55
        ];
56
    }
57
58
    /**
59 1
     * {@inheritdoc}
60
     */
61 1
    public function import(array $pluginDefinitions, array $plugins): array
62 1
    {
63
        foreach ($pluginDefinitions as $handle => $definition) {
64
            if (!array_key_exists($handle, $plugins)) {
65
                Schematic::error(' - Plugin info not found for '.$handle.', make sure it is installed with composer');
66
                continue;
67
            }
68
            if (!$definition['isInstalled']) {
69
                continue;
70
            }
71 5
            Schematic::info('- Installing plugin '.$handle);
72
            $pluginInfo = $plugins[$handle];
73 5
            $this->savePlugin($handle, $definition, $pluginInfo);
74 5
            unset($plugins[$handle]);
75 1
        }
76 1
77
        if (Schematic::$force) {
78 5
            foreach (array_keys($plugins) as $handle) {
79
                if ($plugins[$handle]['isInstalled']) {
80
                    Schematic::info('- Uninstalling plugin '.$handle);
81
                    Craft::$app->plugins->uninstallPlugin($handle);
82
                }
83
            }
84
        }
85
86
        return $plugins;
87 3
    }
88
89 3
    /**
90 2
     * Install, enable, disable and/or update plugin.
91 2
     *
92 1
     * @param string $handle
93
     * @param array  $definition
94 3
     * @param array  $pluginInfo
95
     */
96
    private function savePlugin(string $handle, array $definition, array $pluginInfo)
97
    {
98
        if (!$pluginInfo['isInstalled']) {
99
            Craft::$app->plugins->installPlugin($handle);
100
        }
101 1
        if ($definition['isEnabled']) {
102
            Craft::$app->plugins->enablePlugin($handle);
103
        } else {
104 1
            Craft::$app->plugins->disablePlugin($handle);
105 1
        }
106 1
        $plugin = Craft::$app->plugins->getPlugin($handle);
107 1
        if ($plugin && $plugin->getSettings()) {
108
            Craft::$app->plugins->savePluginSettings($plugin, $definition['settings']);
109
        }
110
    }
111
}
112