1 <?php
  2 
  3 /**
  4  * @package redaxo\core\packages
  5  */
  6 class rex_addon_manager extends rex_package_manager
  7 {
  8     /**
  9      * Constructor.
 10      *
 11      * @param rex_addon $addon Addon
 12      */
 13     protected function __construct(rex_addon $addon)
 14     {
 15         parent::__construct($addon, 'addon_');
 16     }
 17 
 18     /**
 19      * {@inheritdoc}
 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      * {@inheritdoc}
 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      * {@inheritdoc}
 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         // create the managers for all available plugins
 78         foreach ($this->package->getAvailablePlugins() as $plugin) {
 79             $plugins[$plugin] = rex_plugin_manager::factory($plugin);
 80             $plugins[$plugin]->generatePackageOrder = false;
 81         }
 82         // mark all plugins whose requirements are not met
 83         // to consider dependencies among each other, iterate over all plugins until no plugin was marked in a round
 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         // deactivate all marked plugins
 99         foreach ($deactivate as $pluginManager) {
100             $pluginManager->deactivate();
101         }
102 
103         self::generatePackageOrder();
104 
105         return true;
106     }
107 
108     /**
109      * {@inheritdoc}
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      * {@inheritdoc}
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