/** * Execute certain hook handler * * @return void */ public function executeHookHandler() { foreach (\Includes\Utils\ModulesManager::getActiveModules() as $name => $data) { $class = \Includes\Utils\ModulesManager::getClassNameByModuleName($name); $class::runBuildCacheHandler(); } }
/** * Get product modifier types * * @return array */ protected function getProductModifierTypes() { $additional = null; $additionalVariants = null; $wholesale = null; if (!isset($this->productModifierTypes)) { if (\Includes\Utils\ModulesManager::isActiveModule('XC\\ProductVariants')) { // ProductVariants module detected $additional = \XLite\Core\Database::getRepo('XLite\\Module\\XC\\ProductVariants\\Model\\ProductVariant')->getModifierTypesByProduct($this->getProduct()); $additionalVariants = \XLite\Core\Database::getRepo('XLite\\Module\\CDev\\Wholesale\\Model\\ProductVariantWholesalePrice')->getModifierTypesByProduct($this->getProduct()); } if ((!isset($additional) || empty($additional['price'])) && (!isset($additionalVariants) || empty($additionalVariants['price']))) { // ProductVariants module is not detected or product has not variants $wholesale = \XLite\Core\Database::getRepo('XLite\\Module\\CDev\\Wholesale\\Model\\WholesalePrice')->getModifierTypesByProduct($this->getProduct()); } } $result = parent::getProductModifierTypes(); foreach (array($additional, $additionalVariants, $wholesale) as $modifierTypes) { if (isset($modifierTypes)) { $result += $modifierTypes; if (!$result['price'] && $modifierTypes['price']) { $result['price'] = true; } $this->productModifierTypes = $result; } } return $result; }
/** * Return info about installed modules * * @return string */ protected function getModulesMessage() { $result = array(); foreach (\Includes\Utils\ModulesManager::getActiveModules() as $data) { $result[] = '(' . $data['authorName'] . '): ' . $data['moduleName'] . ' (v.' . $data['majorVersion'] . '.' . $data['minorVersion'] . ')'; } return 'Installed modules:' . LC_EOL . ($result ? implode(LC_EOL, $result) : static::t('None')); }
/** * Return URL for module icon * * @return string */ public static function getIconURL() { list($author, $name) = explode('\\', \Includes\Utils\ModulesManager::getModuleNameByClassName(get_called_class())); $path = \Includes\Utils\ModulesManager::getModuleIconFile($author, $name); $url = ''; if (\Includes\Utils\FileManager::isFileReadable($path)) { $url = \XLite\Core\Converter::buildURL('module', null, compact('author', 'name'), 'image.php'); } return $url; }
/** * Execute certain hook handler * * @return void */ public function executeHookHandler() { $modulesNames = array_keys(\Includes\Utils\ModulesManager::getActiveModules()); $classes = array_map(function ($name) { return \Includes\Utils\ModulesManager::getClassNameByModuleName($name); }, $modulesNames); foreach ($classes as $class) { $this->runBuildCacheHandler($class); } }
/** * Execute certain hook handler * * @return void */ public function executeHookHandler() { // To cache data \Includes\Utils\ModulesManager::getActiveModules(); // Walk through the "XLite/Module" directory foreach ($this->getModuleMainFileIterator()->getIterator() as $path => $data) { $dir = $path; $name = basename($dir = dirname($dir)); $author = basename($dir = dirname($dir)); $class = \Includes\Utils\ModulesManager::getClassNameByAuthorAndName($author, $name); if (!\Includes\Utils\Operator::checkIfClassExists($class)) { require_once $path; } \Includes\Utils\ModulesManager::switchModule($author, $name); } \Includes\Utils\ModulesManager::removeFile(); }
/** * Return path where the upgrade helper scripts are placed * * @return string */ protected function getUpgradeHelperPath() { list($author, $name) = explode('\\', $this->getActualName()); return \Includes\Utils\FileManager::getRelativePath(\Includes\Utils\ModulesManager::getAbsoluteDir($author, $name), LC_DIR_ROOT) . LC_DS; }
* @link http://www.x-cart.com/ */ // To avoid superflous checks define('XLITE_INSTALL_MODE', true); define('LC_DO_NOT_REBUILD_CACHE', true); require_once __DIR__ . DIRECTORY_SEPARATOR . 'top.inc.php'; if (isset($_REQUEST['target'])) { $path = null; switch ($_REQUEST['target']) { case 'module': if (!empty($_REQUEST['author']) && !empty($_REQUEST['name'])) { $image = isset($_REQUEST['image']) ? $_REQUEST['image'] : null; switch ($image) { case 'icon.png': default: $path = \Includes\Utils\ModulesManager::getModuleIconFile($_REQUEST['author'], $_REQUEST['name']); break; } } break; default: // ... } if (!empty($path)) { $type = 'png'; $data = \Includes\Utils\FileManager::read($path); $length = strlen($data); header('Content-Type: image/' . $type); header('Content-Length: ' . $length); echo $data; }
/** * Method to access module main class methods * * @param string $method Method to call * @param array $args Call arguments OPTIONAL * * @return mixed */ protected function callModuleMethod($method, array $args = array()) { return \Includes\Utils\ModulesManager::callModuleMethod($this->getActualName(), $method, $args); }
/** * Return info about installed modules * * @return string */ protected function getModulesMessage() { $result = array(); foreach (\Includes\Utils\ModulesManager::getActiveModules() as $data) { $result[] = array($data['authorName'], $data['moduleName'], $data['majorVersion'], $data['minorVersion']); } usort($result, function ($a, $b) { return strcasecmp($a[1], $b[1]); }); $list = array_map(function ($a) { return vsprintf('(%s): %s (v.%s.%s)', $a); }, $result); return 'Installed modules:' . LC_EOL . ($list ? implode(LC_EOL, $list) : static::t('None')); }
function widgetDisplayCode(array $attrs, $target, $module, $name) { $result = ''; if (!isset($module) || \Includes\Utils\ModulesManager::isActiveModule($module)) { $class = isset($attrs['class']) ? $this->flexyAttribute($attrs['class'], false) : null; $arguments = isset($class) ? $this->flexyAttribute($attrs['class']) : (isset($name) ? 'null' : ''); $arguments .= isset($name) ? ', ' . $this->flexyAttribute($name) : ''; $conditions = array(); if (isset($target)) { $target = str_replace(',', '\',\'', preg_replace('/[^\\w,]+/', '', $target)); } elseif (isset($class) && preg_match('/^\\\\?XLite\\\\/i', $class)) { $target = implode('\',\'', $class::getAllowedTargets()); } if (!empty($target)) { $conditions[] = '$this->isDisplayRequired(array(\'' . $target . '\'))'; } if (!empty($attrs['mode'])) { $modes = str_replace(',', '\',\'', preg_replace('/[^\\w,]+/', '', $attrs['mode'])); $conditions[] = '$this->isDisplayRequiredForMode(array(\'' . $modes . '\'))'; } if (isset($attrs['IF'])) { $attrs['IF'] = $this->flexyCondition($attrs['IF']); if (!empty($conditions)) { $attrs['IF'] = '(' . $attrs['IF'] . ')'; } $conditions[] = $attrs['IF']; } $this->unsetAttributes($attrs, array('IF', 'FOREACH', 'class', 'mode')); if (empty($arguments) && 1 == count($attrs) && isset($attrs['template'])) { $result .= '$this->display(' . $this->flexyAttribute($attrs['template']) . ');'; } else { $result .= '$this->getWidget(' . (empty($attrs) ? empty($arguments) ? '' : 'array()' : $this->getAttributesList($attrs)) . (empty($arguments) ? '' : ', ' . $arguments) . ')->display();'; } if (!empty($conditions)) { $result = 'if (' . implode(' && ', $conditions) . '):' . "\n" . ' ' . $result . "\n" . 'endif;'; } } return $result; }
/** * Update module registry * * @return void */ public function updateModuleRegistry() { $calculatedHash = \XLite\Core\Database::getRepo('XLite\\Model\\Module')->calculateEnabledModulesRegistryHash(); if (\Includes\Utils\ModulesManager::getEnabledStructureHash() != $calculatedHash) { \XLite\Core\Database::getRepo('XLite\\Model\\Module')->addEnabledModulesToRegistry(); \Includes\Utils\ModulesManager::saveEnabledStructureHash($calculatedHash); } }
/** * Check if module will be disabled after upgrade * * :TRICKY: check if the "getMajorVersion" is not declared in the main module class * * @param \XLite\Model\Module $module Module to check * * @return boolean */ protected function isModuleToDisable(\XLite\Model\Module $module) { $versionCore = \XLite\Upgrade\Cell::getInstance()->getCoreMajorVersion(); $versionModule = $module->getMajorVersion(); $classModule = \Includes\Utils\ModulesManager::getClassNameByModuleName($module->getActualName()); $reflection = new \ReflectionMethod($classModule, 'getMajorVersion'); $classModule = \Includes\Utils\Converter::prepareClassName($classModule); $classActual = \Includes\Utils\Converter::prepareClassName($reflection->getDeclaringClass()->getName()); return version_compare($versionModule, $versionCore, '<') || $classModule !== $classActual; }
/** * Get module * * @return string */ public function getValidModule() { $result = null; $module = $this->getModule(); if (!empty($module) && preg_match('/\\w+\\\\\\w+/', $module)) { $class = \Includes\Utils\ModulesManager::getClassNameByModuleName($module); if (class_exists($class)) { $result = $module; } } return $result; }
/** * Add all enabled modules to ENABLED registry * * @return void */ public function addEnabledModulesToRegistry() { foreach ($this->findBy(array('enabled' => true)) as $module) { \XLite\Core\Database::getInstance()->registerModuleToEnabledRegistry($module->getActualName(), \Includes\Utils\ModulesManager::getModuleProtectedStructures($module->getAuthor(), $module->getName())); } }
/** * Prepare the fixtures: the list of yaml files for uploading to the database * * @param array $params Database access data and other parameters * @param bool $silentMode Do not display any output during installing * * @return bool */ function doPrepareFixtures(&$params, $silentMode = false) { global $lcSettings; $result = true; if (!$silentMode) { echo '<div style="text-align: left; margin-bottom: 20px;">' . xtr('Preparing data for cache generation...'); } $enabledModules = array(); $moduleYamlFiles = array(); foreach ((array) glob(LC_DIR_MODULES . '*', GLOB_ONLYDIR) as $authorDir) { $author = basename($authorDir); foreach ((array) glob(LC_DIR_MODULES . $author . '/*/Main.php') as $f) { $moduleName = basename(dirname($f)); $enabledModules[$author][$moduleName] = intval(!empty($lcSettings['enable_modules'][$author]) && in_array($moduleName, $lcSettings['enable_modules'][$author])); $dir = 'classes' . LC_DS . 'XLite' . LC_DS . 'Module' . LC_DS . $author . LC_DS . $moduleName; $moduleFile = $dir . LC_DS . 'install.yaml'; if (file_exists(LC_DIR_ROOT . $moduleFile)) { $moduleYamlFiles[] = $moduleFile; } foreach ((array) glob(LC_DIR_ROOT . $dir . LC_DIR . 'install_*.yaml') as $translationFile) { if (file_exists(LC_DIR_ROOT . $translationFile) && is_file(LC_DIR_ROOT . $translationFile)) { $moduleYamlFiles[] = $translationFile; } } } } sort($moduleYamlFiles, SORT_STRING); \Includes\Utils\ModulesManager::saveModulesToFile($enabledModules); // Generate fixtures list $yamlFiles = $lcSettings['yaml_files']['base']; foreach ($moduleYamlFiles as $f) { // Add module fixtures $yamlFiles[] = $f; } if (!empty($params['demo'])) { // Add demo dump to the fixtures foreach ($lcSettings['yaml_files']['demo'] as $f) { $yamlFiles[] = $f; } } // Remove fixtures file (if exists) \Includes\Decorator\Plugin\Doctrine\Utils\FixturesManager::removeFixtures(); // Add fixtures list foreach ($yamlFiles as $file) { \Includes\Decorator\Plugin\Doctrine\Utils\FixturesManager::addFixtureToList($file); } if (!$silentMode) { echo status($result) . '</div>'; } return $result; }
/** * Get iterator for class files * * @return \Includes\Utils\FileFilter */ protected function getFileIterator() { return new \Includes\Utils\FileFilter(LC_DIR_SKINS, \Includes\Utils\ModulesManager::getPathPatternForTemplates()); }
/** * Get specific language help message * * @param \XLite\Model\AEntity $entity Language object * * @return string */ protected function getLanguageHelpMessage(\XLite\Model\AEntity $entity) { $message = null; if ($entity->getValidModule()) { $moduleClass = \Includes\Utils\ModulesManager::getClassNameByModuleName($entity->getModule()); $moduleName = sprintf('%s (%s)', $moduleClass::getModuleName(), $moduleClass::getAuthorName()); $message = static::t('This language is added by module and cannot be removed.', array('module' => $moduleName)); } elseif ('en' == $entity->getCode()) { $message = 'English language cannot be removed as it is primary language for all texts.'; } return $message; }
/** * Get yaml files name to run common helper 'add_labels' * * @return string */ protected function getCommonHelperAddLabelsFiles() { list($author, $name) = explode('\\', $this->getActualName()); $result = array(); $dir = \Includes\Utils\ModulesManager::getAbsoluteDir($author, $name); $file = $dir . 'install.yaml'; if (\Includes\Utils\FileManager::isExists($file)) { $result[] = $file; } foreach ((array) glob($dir . 'install_*.yaml') as $translationFile) { if (\Includes\Utils\FileManager::isExists($translationFile)) { $result[] = $translationFile; } } return $result; }
/** * Lifecycle callback * * @return void * * @PreUpdate */ public function prepareBeforeUpdate() { $changeSet = \XLite\Core\Database::getEM()->getUnitOfWork()->getEntityChangeSet($this); if (!empty($changeSet['enabled'])) { \XLite\Core\Database::getInstance()->setDisabledStructures($this->getActualName(), $this->getEnabled() ? array() : \Includes\Utils\ModulesManager::getModuleProtectedStructures($this->getAuthor(), $this->getName())); $this->switchLinkedModels($this->getEnabled()); } }
/** * Initialization * * @return void */ public static function initialize() { if (static::isDropCacheRequested()) { // Drop classes cache \Includes\Decorator\Utils\CacheManager::cleanupCacheIndicators(); // Redirect to avoid loop \Includes\Utils\Operator::redirect(\XLite::getAdminScript() . '?target=main'); } elseif (static::isSafeModeRequested() && !static::isSafeModeStarted()) { $restorePoint = null; if (static::isRestoreDateSet()) { $restorePoint = \Includes\Utils\ModulesManager::getRestorePoint(static::getRestoreDate()); } if (static::isSoftwareResetEnabled()) { if (!($restorePoint != null ^ static::isRestoreDateSet())) { // Put safe mode indicator \Includes\Utils\FileManager::write(static::getIndicatorFileName(), static::getIndicatorFileContent()); // Clean cache indicators to force cache generation \Includes\Decorator\Utils\CacheManager::cleanupCacheIndicators(); } else { $date = \DateTime::createFromFormat(\Includes\Utils\ModulesManager::RESTORE_DATE_FORMAT, static::getRestoreDate()); \Includes\Decorator\Utils\PersistentInfo::set('restoreFailed', $date->getTimestamp()); } } // Redirect to avoid loop \Includes\Utils\Operator::redirect(\XLite::getAdminScript() . '?target=main'); } }
/** * Return name of the module where the class defined * * @return string */ public function getModuleName() { return \Includes\Utils\ModulesManager::getModuleNameByClassName($this->getClass()); }
/** * Check if module is active * * @param string $file File name * * @return boolean */ protected static function checkFile($file) { $module = \Includes\Utils\ModulesManager::getFileModule($file); return !isset($module) || \Includes\Utils\ModulesManager::isActiveModule($module); }
/** * Return list of mutually exclusive modules * * @return array */ public function getMutualModulesList() { return \Includes\Utils\ModulesManager::callModuleMethod($this->getActualName(), 'getMutualModulesList'); }
/** * Return list of module directories which contain templates * * @return array */ protected function getSkinDirs() { $result = array(); foreach (\XLite\Core\Layout::getInstance()->getSkinsAll() as $interface => $tmp) { $result = array_merge($result, \XLite\Core\Layout::getInstance()->getSkinPaths($interface)); } foreach ($result as $key => &$data) { $path = \Includes\Utils\ModulesManager::getRelativeDir($this->module->getAuthor(), $this->module->getName()); $path = $data['fs'] . LC_DS . 'modules' . LC_DS . $path; if (\Includes\Utils\FileManager::isDirReadable($path)) { $data = $path; } else { unset($result[$key]); } } return array_values(array_unique($result)); }
/** * Uninstall module * * @param \XLite\Model\Module $module Module object * @param array &$messages Messages list * * @return boolean */ public function uninstallModule(\XLite\Model\Module $module, &$messages) { $result = false; // Get module pack $pack = new \XLite\Core\Pack\Module($module); $dirs = $pack->getDirs(); $nonWritableDirs = array(); // Check module directories permissions foreach ($dirs as $dir) { if (\Includes\Utils\FileManager::isExists($dir) && !\Includes\Utils\FileManager::isDirWriteable($dir)) { $nonWritableDirs[] = \Includes\Utils\FileManager::getRelativePath($dir, LC_DIR_ROOT); } } $params = array('name' => sprintf('%s v%s (%s)', $module->getModuleName(), $module->getVersion(), $module->getAuthorName())); if (empty($nonWritableDirs)) { $yamlData = array(); $yamlFiles = \Includes\Utils\ModulesManager::getModuleYAMLFiles($module->getAuthor(), $module->getName()); foreach ($yamlFiles as $yamlFile) { $yamlData[] = \Includes\Utils\FileManager::read($yamlFile); } if (!$module->checkModuleMainClass()) { $classFile = LC_DIR_CLASSES . \Includes\Utils\Converter::getClassFile($module->getMainClass()); if (\Includes\Utils\FileManager::isFileReadable($classFile)) { require_once $classFile; } } // Call uninstall event method $r = $module->callModuleMethod('callUninstallEvent', 111); if (111 == $r) { \XLite\Logger::getInstance()->log($module->getActualName() . ': Method callUninstallEvent() was not called'); } // Remove from FS foreach ($dirs as $dir) { \Includes\Utils\FileManager::unlinkRecursive($dir); } \Includes\Utils\ModulesManager::disableModule($module->getActualName()); \Includes\Utils\ModulesManager::removeModuleFromDisabledStructure($module->getActualName()); // Remove module from DB try { // Refresh module entity as it was changed by disableModule() method above $module = $this->find($module->getModuleID()); $this->delete($module); } catch (\Exception $e) { $messages[] = $e->getMessage(); } if ($module->getModuleID()) { $messages[] = \XLite\Core\Translation::getInstance()->translate('A DB error occured while uninstalling the module X', $params); } else { if (!empty($yamlData)) { foreach ($yamlData as $yaml) { \XLite\Core\Database::getInstance()->unloadFixturesFromYaml($yaml); } } $messages[] = \XLite\Core\Translation::getInstance()->translate('The module X has been uninstalled successfully', $params); $result = true; } } else { $messages[] = \XLite\Core\Translation::getInstance()->translate('Unable to delete module X files: some dirs have no writable permissions: Y', $params + array('dirs' => implode(', ', $nonWritableDirs))); } return $result; }
/** * Uninstall module * * @return void */ protected function doActionUninstall() { $module = $this->getModule(); if ($module) { $pack = new \XLite\Core\Pack\Module($module); $dirs = $pack->getDirs(); $nonWritableDirs = array(); // Check permissions foreach ($dirs as $dir) { if (!\Includes\Utils\FileManager::isDirWriteable($dir)) { $nonWritableDirs[] = \Includes\Utils\FileManager::getRelativePath($dir, LC_DIR_ROOT); } } $params = array('name' => $module->getActualName()); if (empty($nonWritableDirs)) { $yaml = \Includes\Utils\FileManager::read(\Includes\Utils\ModulesManager::getModuleYAMLFile($module->getAuthor(), $module->getName())); // Remove from FS foreach ($dirs as $dir) { \Includes\Utils\FileManager::unlinkRecursive($dir); } // Disable this and depended modules \Includes\Utils\ModulesManager::disableModule($module->getActualName()); \Includes\Utils\ModulesManager::removeModuleFromDisabledStructure($module->getActualName()); // Remove from DB \XLite\Core\Database::getRepo('\\XLite\\Model\\Module')->delete($module); if ($module->getModuleID()) { $message = 'A DB error occured while uninstalling the module "{{name}}"'; $this->showError(__FUNCTION__, $message, $params); } else { if (!empty($yaml)) { \XLite\Core\Database::getInstance()->unloadFixturesFromYaml($yaml); } $message = 'The module "{{name}}" has been uninstalled successfully'; $this->showInfo(__FUNCTION__, $message, $params); } // To restore previous state \XLite\Core\Marketplace::getInstance()->saveAddonsList(0); // Flag to rebuild cache \XLite::setCleanUpCacheFlag(true); } else { $message = 'Unable to delete module "{{name}}" files: some dirs have no writable permissions: {{dirs}}'; $this->showError(__FUNCTION__, $message, $params + array('dirs' => implode(', ', $nonWritableDirs))); } } }
/** * Check if the module can be enabled * * @param \XLite\Model\Module $module Module * * @return boolean */ protected function canEnable(\XLite\Model\Module $module) { $result = $this->isModuleCompatible($module); if ($result) { $dependencies = $module->getDependencies(); if ($dependencies) { $modules = array_keys(\Includes\Utils\ModulesManager::getActiveModules()); $result = !(bool) array_diff($dependencies, $modules); } } return $result; }
/** * Get all active modules and return plain array with the module descriptors * * @return array */ protected static function getModulesGraphIndex() { $index = array(); // Fetch all active modules from database. // Dependencies are checked and corrected by the ModulesManager foreach (\Includes\Utils\ModulesManager::getActiveModules() as $module => $tmp) { // Unconditionally add module to the index (since its dependencies are already checked) $index[$module] = new \Includes\Decorator\DataStructure\Graph\Modules($module); } return $index; }
/** * Hook "init" * * @return void */ public function invokeHookInit() { include_once \Includes\Utils\ModulesManager::getAbsoluteDir('CDev', 'DrupalConnector') . 'Drupal' . LC_DS . 'Include' . LC_DS . 'Callbacks.php'; if (defined('DRUPAL_ROOT') && !\XLite\Core\Config::getInstance()->CDev->DrupalConnector->drupal_root_path) { \XLite\Core\Database::getRepo('XLite\\Model\\Config')->createOption(array('name' => 'drupal_root_path', 'category' => 'CDev\\DrupalConnector', 'value' => DRUPAL_ROOT)); } }