/** * 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; }
/** * Check if we can call method from the module main class * * @return boolean */ public function checkModuleMainClass() { $result = $this->isInstalled(); if ($result && !\Includes\Utils\Operator::checkIfClassExists($this->getMainClass())) { if (defined('LC_MODULE_CONTROL')) { $path = LC_DIR_CLASSES . \Includes\Utils\Converter::getClassFile($this->getMainClass()); if (\Includes\Utils\FileManager::isFileReadable($path)) { require_once $path; } else { $result = false; } } else { $result = false; } } return $result; }
/** * Add code to replace * * @param \Doctrine\ORM\Mapping\ClassMetadata $data Class metadata * @param string $template Template to use * @param array $substitutes List of entries to substitude * * @return void */ protected function addReplacement(\Doctrine\ORM\Mapping\ClassMetadata $data, $template, array $substitutes) { if (!empty($substitutes)) { $file = \Includes\Utils\Converter::getClassFile($data->reflClass->getName()); if (!isset($this->replacements[$file])) { $this->replacements[$file] = ''; } $this->replacements[$file] .= $this->substituteTemplate($template, $substitutes) . PHP_EOL . PHP_EOL; } }
/** * Transform class name into the relative path * * @param string $class Class name OPTIONAL * * @return string */ public function getPath($class = null) { return \Includes\Utils\Converter::getClassFile($class ?: $this->getClass()); }
/** * Check if class is already declared. * NOTE: this function does not use autoloader * * @param string $name Class name * * @return boolean */ public static function checkIfClassExists($name) { $result = class_exists($name, false); if (!$result) { $result = \Includes\Utils\FileManager::isFileReadable(\Includes\Autoloader::getLCAutoloadDir() . \Includes\Utils\Converter::getClassFile($name)); } return $result; }