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; }
/** * Инициализация хуков и префильтра 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); } } }