Example #1
0
 public function Activate($sPlugin)
 {
     $aConditions = array('<' => 'lt', 'lt' => 'lt', '<=' => 'le', 'le' => 'le', '>' => 'gt', 'gt' => 'gt', '>=' => 'ge', 'ge' => 'ge', '==' => 'eq', '=' => 'eq', 'eq' => 'eq', '!=' => 'ne', '<>' => 'ne', 'ne' => 'ne');
     $aPlugins = $this->GetList();
     if (!isset($aPlugins[$sPlugin])) {
         return null;
     }
     $sPluginName = ucfirst($sPlugin);
     $sFile = ACE::FilePath("{$this->sPluginsDir}{$sPlugin}/Plugin{$sPluginName}.class.php");
     if (is_file($sFile)) {
         ACE::FileInclude($sFile);
         $sClassName = "Plugin{$sPluginName}";
         $oPlugin = new $sClassName();
         // * Проверяем совместимость с версией LS
         if (defined('LS_VERSION') and version_compare(LS_VERSION, $aPlugins[$sPlugin]['property']->requires->livestreet, '=<')) {
             $this->Message_AddError($this->Lang_Get('plugins_activation_version_error', array('version' => $aPlugins[$sPlugin]['property']->requires->livestreet)), $this->Lang_Get('error'), true);
             return false;
         }
         // * Проверяем системные требования
         if ($aPlugins[$sPlugin]['property']->requires->system) {
             // Версия PHP
             if ($aPlugins[$sPlugin]['property']->requires->system->php and !version_compare(PHP_VERSION, $aPlugins[$sPlugin]['property']->requires->system->php, '>=')) {
                 $this->Message_AddError($this->Lang_Get('adm_plugin_activation_error_php', array('version' => $aPlugins[$sPlugin]['property']->requires->system->php)), $this->Lang_Get('error'), true);
                 return false;
             }
         }
         // * Проверяем наличие require-плагинов
         if ($aPlugins[$sPlugin]['property']->requires->plugins) {
             $aActivePlugins = $this->GetActivePlugins();
             $iError = 0;
             foreach ($aPlugins[$sPlugin]['property']->requires->plugins->children() as $sReqPlugin) {
                 // * Есть ли требуемый активный плагин
                 if (!in_array($sReqPlugin, $aActivePlugins)) {
                     $iError++;
                     $this->Message_AddError($this->Lang_Get('plugins_activation_requires_error', array('plugin' => ucfirst($sReqPlugin))), $this->Lang_Get('error'), true);
                 } else {
                     if (isset($sReqPlugin['name'])) {
                         $sReqPluginName = (string) $sReqPlugin['name'];
                     } else {
                         $sReqPluginName = ucfirst($sReqPlugin);
                     }
                     if (isset($sReqPlugin['version'])) {
                         $sReqVersion = $sReqPlugin['version'];
                         if (isset($sReqPlugin['condition']) and array_key_exists((string) $sReqPlugin['condition'], $aConditions)) {
                             $sReqCondition = $aConditions[(string) $sReqPlugin['condition']];
                         } else {
                             $sReqCondition = 'eq';
                         }
                         $sClassName = "Plugin{$sReqPlugin}";
                         $oReqPlugin = new $sClassName();
                         // * Версия может задаваться константой
                         // * или возвращаться методом плагина GetVersion()
                         if (method_exists($oReqPlugin, 'GetVersion')) {
                             $sReqPluginVersion = $oReqPlugin->GetVersion();
                         } elseif (Config::Get('plugin.' . strtolower($sReqPlugin) . '.version')) {
                             $sReqPluginVersion = Config::Get('plugin.' . strtolower($sReqPlugin) . '.version');
                         } elseif (defined(strtoupper('VERSION_' . $sReqPluginName))) {
                             $sReqPluginVersion = constant(strtoupper('VERSION_' . $sReqPluginName));
                         } elseif (defined(strtoupper($sReqPluginName . '_VERSION'))) {
                             $sReqPluginVersion = constant(strtoupper($sReqPluginName . '_VERSION'));
                         } else {
                             $sReqPluginVersion = false;
                         }
                         if (!$sReqPluginVersion) {
                             $iError++;
                             $this->Message_AddError($this->Lang_Get('adm_plugin_havenot_getversion_method', array('plugin' => $sReqPluginName)), $this->Lang_Get('error'), true);
                         } else {
                             // * Если требуемый плагин возвращает версию, то проверяем ее
                             if (!version_compare($sReqPluginVersion, $sReqVersion, $sReqCondition)) {
                                 $sTextKey = 'adm_plugin_activation_reqversion_error_' . $sReqCondition;
                                 $iError++;
                                 $this->Message_AddError($this->Lang_Get($sTextKey, array('plugin' => $sReqPluginName, 'version' => $sReqVersion)), $this->Lang_Get('error'), true);
                             }
                         }
                     }
                 }
             }
             if ($iError) {
                 return false;
             }
         }
         // * Проверяем, не вступает ли данный плагин в конфликт с уже активированными
         // * (по поводу объявленных делегатов)
         $aPluginDelegates = $oPlugin->GetDelegates();
         $iError = 0;
         foreach ($this->aDelegates as $sGroup => $aReplaceList) {
             $iCount = 0;
             if (isset($aPluginDelegates[$sGroup]) and is_array($aPluginDelegates[$sGroup]) and $iCount = sizeof($aOverlap = array_intersect_key($aReplaceList, $aPluginDelegates[$sGroup]))) {
                 $iError += $iCount;
                 foreach ($aOverlap as $sResource => $aConflict) {
                     $this->Message_AddError($this->Lang_Get('plugins_activation_overlap', array('resource' => $sResource, 'delegate' => $aConflict['delegate'], 'plugin' => $aConflict['sign'])), $this->Lang_Get('error'), true);
                 }
             }
             if ($iCount) {
                 return false;
             }
         }
         $bResult = $oPlugin->Activate();
     } else {
         // * Исполняемый файл плагина не найден
         $this->Message_AddError($this->Lang_Get('adm_plugin_file_not_found', array('file' => $sFile)), $this->Lang_Get('error'), true);
         return false;
     }
     if ($bResult) {
         // Надо обязательно очистить кеш здесь
         ACE::ClearAllCache();
         // * Переопределяем список активированных пользователем плагинов
         $aActivePlugins = $this->GetActivePlugins();
         $aActivePlugins[] = $sPlugin;
         $bResult = $this->SetActivePlugins($aActivePlugins);
         if ($bResult) {
             // немного извращаемся, ибо костыль для сортировки по приоритету
             $aPluginList = $this->GetPluginList();
             $aPlugins = array();
             foreach ($aPluginList as $sPlugin => $oPlugin) {
                 if ($oPlugin->isActive()) {
                     $aPlugins[] = $sPlugin;
                 }
             }
             $this->SetActivePlugins($aPlugins);
         }
         if (!$bResult) {
             $this->Message_AddError($this->Lang_Get('adm_plugin_write_error', array('file' => $this->sPluginsDatFile)), $this->Lang_Get('error'), true);
         }
     }
     return $bResult;
 }
Example #2
0
 /**
  * Инициализация хуков и префильтра Smarty
  */
 protected function _initTplHooks()
 {
     if ($this->aTplHooks or Config::Get('plugin.aceadminpanel.smarty.options.mark_template')) {
         if (!class_exists('DomFrag')) {
             ACE::FileInclude('plugin:aceadminpanel:lib/DomFrag.class.php');
         }
         if (class_exists('DomFrag')) {
             // Подключаем Smarty-плагин
             $this->oSmarty->loadFilter('pre', 'tplhook');
             $this->Assign('aTplHooks', $this->aTplHooks);
         }
     }
 }