1 <?php
2
3 4 5
6 class rex_addon_manager extends rex_package_manager
7 {
8 9 10 11 12
13 protected function __construct(rex_addon $addon)
14 {
15 parent::__construct($addon, 'addon_');
16 }
17
18 19 20
21 public function install($installDump = true)
22 {
23 $installed = $this->package->isInstalled();
24 $this->generatePackageOrder = false;
25 $return = parent::install($installDump);
26 $this->generatePackageOrder = true;
27
28 if (true === $return) {
29 if (!$installed) {
30 foreach ($this->package->getSystemPlugins() as $plugin) {
31 $manager = rex_plugin_manager::factory($plugin);
32 $manager->generatePackageOrder = false;
33 $manager->install();
34 }
35 }
36
37 self::generatePackageOrder();
38 }
39
40 return $return;
41 }
42
43 44 45
46 public function uninstall($installDump = true)
47 {
48 $isActivated = $this->package->isAvailable();
49 if ($isActivated && !$this->deactivate()) {
50 return false;
51 }
52 foreach ($this->package->getInstalledPlugins() as $plugin) {
53 $plugin->setProperty('status', false);
54 $manager = rex_plugin_manager::factory($plugin);
55 if (!$manager->uninstall($installDump)) {
56 $this->message = $manager->getMessage();
57 return false;
58 }
59 }
60 return parent::uninstall($installDump);
61 }
62
63 64 65
66 public function activate()
67 {
68 $this->generatePackageOrder = false;
69 $state = parent::activate();
70 $this->generatePackageOrder = true;
71
72 if ($state !== true) {
73 return false;
74 }
75
76 $plugins = new SplObjectStorage();
77
78 foreach ($this->package->getAvailablePlugins() as $plugin) {
79 $plugins[$plugin] = rex_plugin_manager::factory($plugin);
80 $plugins[$plugin]->generatePackageOrder = false;
81 }
82
83
84 $deactivate = [];
85 $finished = false;
86 while (!$finished && count($plugins) > 0) {
87 $finished = true;
88 foreach ($plugins as $plugin) {
89 $pluginManager = $plugins[$plugin];
90 if (!$pluginManager->checkRequirements() || !$pluginManager->checkConflicts()) {
91 $plugin->setProperty('status', false);
92 $deactivate[] = $pluginManager;
93 $finished = false;
94 unset($plugins[$plugin]);
95 }
96 }
97 }
98
99 foreach ($deactivate as $pluginManager) {
100 $pluginManager->deactivate();
101 }
102
103 self::generatePackageOrder();
104
105 return true;
106 }
107
108 109 110
111 public function checkDependencies()
112 {
113 $check = $addonCheck = parent::checkDependencies();
114 $dependencies = [];
115 foreach ($this->package->getAvailablePlugins() as $plugin) {
116 $manager = rex_plugin_manager::factory($plugin);
117 if (!$manager->checkDependencies()) {
118 $dependencies[] = $manager->getMessage();
119 $check = false;
120 }
121 }
122 if (!empty($dependencies)) {
123 if (!$addonCheck) {
124 $this->message .= '<br />';
125 }
126 $this->message .= implode('<br />', $dependencies);
127 }
128 return $check;
129 }
130
131 132 133
134 protected function wrongPackageId($addonName, $pluginName = null)
135 {
136 if ($pluginName !== null) {
137 return $this->i18n('is_plugin', $addonName, $pluginName);
138 }
139 return $this->i18n('wrong_dir_name', $addonName);
140 }
141 }
142