* @copyright Copyright (c) 2010 Samuel Marshall
* @license GNU/GPLv3, See LICENSE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* If LICENSE file missing, see
Couldn't copy the config.xml file
"; Log::add($msg, Log::WARNING, 'jerror'); } File::delete(JPATH_ADMINISTRATOR . '/components/com_jchoptimize/config_j3.xml'); File::delete(JPATH_ADMINISTRATOR . '/components/com_jchoptimize/config_j4.xml'); } if ($type == 'update') { // Remove obsolete files and folders $this->removeFiles(); //Update new settings $this->updateNewSettings(); } } /** * Runs on uninstallation * * @param ComponentAdapter $parent Parent object * * @return void */ public function uninstall(ComponentAdapter $parent): void { // Clean up Htaccess file @include_once(JPATH_ADMINISTRATOR . '/components/com_jchoptimize/autoload.php'); Tasks::cleanHtaccess(); Folder::delete(JPATH_ROOT . '/images/jch-optimize'); Folder::delete(JPATH_ROOT . '/jchoptimizecapturecache'); Folder::delete(JPATH_ROOT . '/.jch'); $container = ContainerFactory::getContainer(); $container->get(Cache::class)->cleanCache(); } private function updateNewSettings() { $extensionIds = $this->getInstances(false); $id = (int)$extensionIds[0]; //Settings to add or update $newParams = []; //Settings to remove $removeParams = []; //Update storage adapter $adapter = $this->getParam('pro_cache_storage_adapter', $id); if ($adapter == 'global') { $storageMap = [ 'file' => 'filesystem', 'redis' => 'redis', 'apcu' => 'apcu', 'memcached' => 'memcached', 'wincache' => 'wincache' ]; $app = Factory::getApplication(); $handler = $app->get('cache_handler', 'file'); $newParams['pro_cache_storage_adapter'] = $storageMap[$handler]; if ($handler == 'memcached') { $newParams['memcached_server_host'] = $app->get('memcached_server_host', '1.7.0.0.1'); $newParams['memcached_server_port'] = $app->get('memcached_server_port', 11211); } if ($handler == 'redis') { $newParams['redis_server_host'] = $app->get('redis_server_host', '127.0.0.1'); $newParams['redis_server_port'] = $app->get('redis_server_port', 6379); $newParams['redis_server_auth'] = $app->get('redis_server_auth', ''); $newParams['redis_server_db'] = $app->get('redis_server_db', 0); } } //Update Smart Combine settings $smartCombineValues = $this->getParam('pro_smart_combine_values', $id); if (!empty($smartCombineValues) && is_array($smartCombineValues)) { $newParams['pro_smart_combine_values'] = json_encode($smartCombineValues); } //Update obsolete settings $settingsMap = [ 'pro_remove_unused_js_enable' => 'pro_reduce_unused_js_enable', 'pro_remove_unused_css' => 'pro_reduce_unused_css', 'pro_optimize_gfont_enable' => 'pro_optimizeFonts_enable' ]; foreach ($settingsMap as $oldSetting => $newSetting) { $setting = $this->getParam($oldSetting, $id); if (!is_null($setting)) { $newParams[$newSetting] = $setting; $removeParams[$oldSetting] = $setting; } } //Update new load WEBP setting $loadWebp = $this->getParam('pro_load_webp_images', $id); $nextGenImages = $this->getParam('pro_next_gen_images', $id); if (is_null($loadWebp) && $nextGenImages) { $newParams['pro_load_webp_images'] = '1'; } //Update Exclude JavaScript settings $oldJsSettings = [ 'excludeJs_peo', 'excludeJsComponents_peo', 'excludeScripts_peo', 'excludeJs', 'excludeJsComponents', 'excludeScripts', 'dontmoveJs', 'dontmoveScripts', ]; $updateJsSettings = false; foreach ($oldJsSettings as $oldJsSetting) { $oldJsSettingValue = $this->getParam($oldJsSetting, $id); if ($oldJsSettingValue) { if (!isset($oldJsSettingValue[0]['url']) && !isset($oldJsSettingValue[0]['script'])) { $updateJsSettings = true; } break; } } if ($updateJsSettings) { $dontmoveJs = (array)$this->getParam('dontmoveJs', $id); $dontmoveScripts = (array)$this->getParam('dontmoveScripts', $id); $removeParams['dontmoveJs'] = '1'; $removeParams['dontmoveScripts'] = '1'; $excludeJsPeoSettingsMap = [ 'excludeJs_peo' => [ 'ieo' => 'excludeJs', 'valueType' => 'url', 'dontmove' => $dontmoveJs ], 'excludeJsComponents_peo' => [ 'ieo' => 'excludeJsComponents', 'valueType' => 'url', 'dontmove' => $dontmoveJs ], 'excludeScripts_peo' => [ 'ieo' => 'excludeScripts', 'valueType' => 'script', 'dontmove' => $dontmoveScripts ], ]; foreach ($excludeJsPeoSettingsMap as $excludeJsPeoSettingName => $settingsMap) { $excludeJsPeoSetting = (array)$this->getParam($excludeJsPeoSettingName, $id); $removeParams[$excludeJsPeoSettingName] = '1'; $newExcludeJs_peo = []; $i = 0; foreach ($excludeJsPeoSetting as $excludeJsPeoSettingValue) { $newExcludeJs_peo[$i][$settingsMap['valueType']] = $excludeJsPeoSettingValue; foreach ($settingsMap['dontmove'] as $dontmoveValue) { if (strpos($excludeJsPeoSettingValue, $dontmoveValue) !== false) { $newExcludeJs_peo[$i]['dontmove'] = 'on'; } } $i++; } $excludeJsIeoSetting = (array)$this->getParam($settingsMap['ieo'], $id); $removeParams[$settingsMap['ieo']] = '1'; foreach ($excludeJsIeoSetting as $excludeJsIeoSettingValue) { $i++; $newExcludeJs_peo[$i][$settingsMap['valueType']] = $excludeJsIeoSettingValue; $newExcludeJs_peo[$i]['ieo'] = 'on'; foreach ($settingsMap['dontmove'] as $dontmoveValue) { if (strpos($excludeJsIeoSettingValue, $dontmoveValue) !== false) { $newExcludeJs_peo[$i]['dontmove'] = 'on'; } } } $newParams[$excludeJsPeoSettingName] = $newExcludeJs_peo; } } if (!empty($removeParams)) { $this->setParams($removeParams, 'remove', $id); } if (!empty($newParams)) { $this->setParams($newParams, 'edit', $id); } } /** * Gets parameter value in the extensions row of the extension table * * @param string $name The name of the parameter to be retrieved * @param int $id The id of the item in the Param Table * * @return string The parameter desired * * @since 3.6 */ public function getParam($name, $id = 0) { if (!\is_int($id) || $id == 0) { // Return false if there is no item given return false; } $params = $this->getItemArray('params', $this->paramTable, $this->primaryKey, $id); return $params[$name]; } /** * Sets parameter values in the extensions row of the extension table. Note that the * this must be called separately for deleting and editing. Note if edit is called as a * type then if the param doesn't exist it will be created * * @param array $paramArray The array of parameters to be added/edited/removed * @param string $type The type of change to be made to the param (edit/remove) * @param int $id The id of the item in the relevant table * * @return bool True on success * * @since 3.6 */ public function setParams($paramArray = null, $type = 'edit', $id = 0) { if (!\is_int($id) || $id == 0) { // Return false if there is no valid item given return false; } $params = $this->getItemArray('params', $this->paramTable, $this->primaryKey, $id); if ($paramArray) { foreach ($paramArray as $name => $value) { if ($type === 'edit') { // Add or edit the new variable(s) to the existing params if (\is_array($value)) { // Convert an array into a json encoded string $params[(string)$name] = array_values($value); } else { $params[(string)$name] = (string)$value; } } elseif ($type === 'remove') { // Unset the parameter from the array unset($params[(string)$name]); } } } // Store the combined new and existing values back as a JSON string $paramsString = json_encode($params); $db = Factory::getDbo(); $query = $db->getQuery(true) ->update($db->quoteName($this->paramTable)) ->set($db->quoteName('params') . ' = ' . $db->quote($paramsString)) ->where($db->quoteName($this->primaryKey) . ' = ' . $db->quote($id)); // Update table $db->setQuery($query)->execute(); return true; } /** * Gets each instance of a module in the #__modules table or extension in the #__extensions table * * @param bool $isModule True if the extension is a module as this can have multiple instances * @param string $extension Name of extension to find instance of * * @return array An array of ID's of the extension * * @since 3.6 */ public function getInstances($isModule, $extension = null) { $extension = $extension ?? $this->extension; $db = Factory::getDbo(); $query = $db->getQuery(true); // Select the item(s) and retrieve the id if ($isModule) { $query->select($db->quoteName('id')); $query->from($db->quoteName('#__modules')) ->where($db->quoteName('module') . ' = ' . $db->quote($extension)); } else { $query->select($db->quoteName('extension_id')); $query->from($db->quoteName('#__extensions')); //Special handling for plugins, we extract the element and folder from the extension name $parts = explode('_', $extension, 3); if (count($parts) == 3 && $parts[0] == 'plg') { $extension = $parts[2]; $folder = $parts[1]; $query->where($db->quoteName('folder') . ' = ' . $db->quote($folder)); } $query->where($db->quoteName('element') . ' = ' . $db->quote($extension)); } // Set the query and obtain an array of id's return $db->setQuery($query)->loadColumn(); } }