* @copyright 2010-2020 Webkul IN * @license https://store.webkul.com/license.html */ class AdminModulesCatalogControllerCore extends AdminController { public $modules; const CATALOG_RECOMMENDATION_CONTENT = '/cache/catalog_recommendation.html'; const ELEMENT_TYPE_MODULE = 1; const ELEMENT_TYPE_THEME = 2; const MODULES_PER_PAGE = 18; public function __construct() { $this->bootstrap = true; parent::__construct(); } public function init() { parent::init(); $this->initSuggestedModulesList(); } public function initContent() { parent::initContent(); $suggestedModules = Module::getSuggestedModules(); $modulesToAdd = array(); $dirModules = ModuleCore::getModulesOnDisk(); $modules_name = array_column($suggestedModules, 'name'); foreach ($dirModules as $mod) { if (($id = array_search($mod->name, $modules_name)) !== false) { if ($mod->installed) { unset($suggestedModules[$id]); } else { $suggestedModules[$id]->not_on_disk = false; } } else { if (!$mod->installed) { $modulesToAdd[] = $mod; } } } $modules = array_merge($suggestedModules, $modulesToAdd); $link_admin_modules = $this->context->link->getAdminLink('AdminModules', true); foreach ($modules as $key => $module) { $module->options['install_url'] = $link_admin_modules.'&install='.urlencode($module->name).'&tab_module='.$module->tab.'&module_name='.$module->name.'&anchor='.ucfirst($module->name); $module->element_type = self::ELEMENT_TYPE_MODULE; $module->logo = '../../img/questionmark.png'; if (@filemtime(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.basename(_PS_MODULE_DIR_).DIRECTORY_SEPARATOR.$module->name .DIRECTORY_SEPARATOR.'logo.gif')) { $module->logo = 'logo.gif'; } if (@filemtime(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.basename(_PS_MODULE_DIR_).DIRECTORY_SEPARATOR.$module->name .DIRECTORY_SEPARATOR.'logo.png')) { $module->logo = 'logo.png'; } $modules[$key] = $module; } $this->sortList($modules, 'module'); $this->modules = $modules; $this->themes = $this->getSuggestedThemes(); $this->assignSortCriteria(); $this->context->smarty->assign(array( 'modules' => $this->modules, 'themes' => $this->themes, 'modules_uri' => __PS_BASE_URI__.basename(_PS_MODULE_DIR_), 'element_type_module' => self::ELEMENT_TYPE_MODULE, 'element_type_theme' => self::ELEMENT_TYPE_THEME, )); } public function initModal() { parent::initModal(); $modal_content = $this->context->smarty->fetch('controllers/modules/'.(($this->context->mode == Context::MODE_HOST) ? 'modal_not_trusted_blocked.tpl' : 'modal_not_trusted.tpl')); $this->modals[] = array( 'modal_id' => 'moduleNotTrusted', 'modal_class' => 'modal-lg', 'modal_title' => ($this->context->mode == Context::MODE_HOST) ? $this->l('This module cannot be installed') : $this->l('Important Notice'), 'modal_content' => $modal_content ); } public function assignSortCriteria() { $sortCriterta = array( array ( 'key' => 'popularity', 'value' => 'popularity', 'title' => $this->l('Popularity') ), array ( 'key' => 'name', 'value' => 'name', 'title' => $this->l('Name') ), array ( 'key' => 'price_increasing', 'value' => 'price_increasing', 'title' => $this->l('Price (low to high)') ), array ( 'key' => 'price_decreasing', 'value' => 'price_decreasing', 'title' => $this->l('Price (high to low)') ), ); $this->context->smarty->assign(array( 'sort_criterta' => $sortCriterta, 'module_sort' => Configuration::get('PS_SORT_MODULE_MODULES_CATALOG_'.(int)$this->context->employee->id), 'theme_sort' => Configuration::get('PS_SORT_THEME_MODULES_CATALOG_'.(int)$this->context->employee->id), )); } public function getSuggestedThemes() { $installedThemes = array(); $themes = Theme::getAllThemes()->getAll(); foreach ($themes as $theme) { $installedThemes[] = Theme::getThemeInfo($theme->id); } $files_list = array( array('type' => 'addonsMustHave', 'file' => _PS_ROOT_DIR_.Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, 'loggedOnAddons' => 0), ); $theme_list = array(); foreach ($files_list as $f) { $file = $f['file']; $content = Tools::file_get_contents($file); $xml = @simplexml_load_string($content, null, LIBXML_NOCDATA); if ($xml && isset($xml->theme)) { foreach ($xml->theme as $modthemes) { foreach ($installedThemes as $theme) { if ($theme['theme_name'] == $modthemes->name) continue; $item = new stdClass(); $item->id = 0; $item->warning = ''; $item->type = strip_tags((string)$f['type']); $item->element_type = self::ELEMENT_TYPE_THEME; $item->name = strip_tags((string)$modthemes->name); $item->version = strip_tags((string)$modthemes->version); $item->displayName = strip_tags((string)$modthemes->displayName); $item->description = stripslashes(strip_tags((string)$modthemes->description)); $item->description_full = stripslashes(strip_tags((string)$modthemes->description_full)); $item->author = strip_tags((string)$modthemes->author); $item->limited_countries = array(); $item->parent_class = ''; $item->onclick_option = false; $item->available_on_addons = 1; $item->active = 0; $item->additional_description = isset($modthemes->additional_description) ? stripslashes($modthemes->additional_description) : null; $item->compatibility = isset($modthemes->compatibility) ? (array)$modthemes->compatibility : null; $item->nb_rates = isset($modthemes->nb_rates) ? (array)$modthemes->nb_rates : null; $item->avg_rate = isset($modthemes->avg_rate) ? (array)$modthemes->avg_rate : null; $item->badges = isset($modthemes->badges) ? (array)$modthemes->badges : null; $item->url = isset($modthemes->url) ? $modthemes->url : null; if (isset($modthemes->img)) { if (!file_exists(_PS_TMP_IMG_DIR_.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg')) { if (!file_put_contents(_PS_TMP_IMG_DIR_.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg', Tools::file_get_contents($modthemes->img))) { copy(_PS_IMG_DIR_.'404.gif', _PS_TMP_IMG_DIR_.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg'); } } if (file_exists(_PS_TMP_IMG_DIR_.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg')) { $item->image = '../img/tmp/'.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg'; } } if ($item->type == 'addonsMustHave') { $item->addons_buy_url = strip_tags((string)$modthemes->url); $prices = (array)$modthemes->price; $id_default_currency = Configuration::get('PS_CURRENCY_DEFAULT'); foreach ($prices as $currency => $price) { if ($id_currency = Currency::getIdByIsoCode($currency)) { $item->price = (float)$price; $item->id_currency = (int)$id_currency; if ($id_default_currency == $id_currency) { break; } } } } $theme_list[$modthemes->id.'-'.$item->name] = $item; } } } } $theme_list = array_values($theme_list); $this->sortList($theme_list, 'theme'); return $theme_list; } public function initToolbar() { parent::initToolbar(); $this->page_header_toolbar_btn['addons'] = array( 'href' => 'https://QloApps.com/addons/', 'desc' => $this->l('Explore all Addons'), 'imgclass' => 'modules-list', 'target' => true ); } public function getRecommendationContent() { if (!Tools::isFresh(self::CATALOG_RECOMMENDATION_CONTENT, _TIME_1_DAY_, false)) { @file_put_contents(_PS_ROOT_DIR_.self::CATALOG_RECOMMENDATION_CONTENT, Tools::addonsRequest('catalog-recommendation')); } if (file_exists(_PS_ROOT_DIR_.self::CATALOG_RECOMMENDATION_CONTENT)) { return Tools::file_get_contents(_PS_ROOT_DIR_.self::CATALOG_RECOMMENDATION_CONTENT); } return false; } public function sortList(&$list, $type) { switch($type) { case 'module': $criteria = Configuration::get('PS_SORT_MODULE_MODULES_CATALOG_'.(int)$this->context->employee->id); break; case 'theme': $criteria = Configuration::get('PS_SORT_THEME_MODULES_CATALOG_'.(int)$this->context->employee->id); break; } if ($criteria != 'popularity') { usort($list, function($a, $b) use($criteria){ if ($criteria == 'name') { return strnatcasecmp($a->displayName, $b->displayName); } else if ($criteria == 'price_increasing') { if (isset($a->price) && isset($b->price)) return $a->price > $b->price; else if (isset($b->price) && $b->price) return true; } else if ($criteria == 'price_decreasing') { if (isset($a->price) && isset($b->price)) return $a->price < $b->price; else if (isset($b->price) && $b->price) return true; } }); } return true; } protected function setSorting($module_sorting, $theme_sorting) { Configuration::updateValue('PS_SORT_MODULE_MODULES_CATALOG_'.(int)$this->context->employee->id, $module_sorting); Configuration::updateValue('PS_SORT_THEME_MODULES_CATALOG_'.(int)$this->context->employee->id, $theme_sorting); } public function ajaxProcessSetSorting() { $this->setSorting(Tools::getValue('module_sorting'), Tools::getValue('theme_sorting')); $this->ajaxDie(json_encode(array( 'success' => true ))); } protected function initSuggestedModulesList() { if (!Tools::isFresh(Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, _TIME_1_DAY_)) { file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, Tools::addonsRequest('native')); } if (!Tools::isFresh(Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, _TIME_1_DAY_)) { @file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, Tools::addonsRequest('must-have')); } } public function setMedia() { parent::setMedia(); $this->addJS(_PS_JS_DIR_.'admin/modules_catalog.js'); $this->context->controller->addJS(_PS_JS_DIR_.'/twbs-pagination/jquery.twbsPagination.min.js'); Media::addJSdef(array( 'num_block_per_page' => self::MODULES_PER_PAGE )); } }