* @copyright 2007-2018 PrestaShop SA * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA **/ if (file_exists(_PS_MODULE_DIR_ . 'ps_themecusto/vendor/autoload.php')) { require_once _PS_MODULE_DIR_ . 'ps_themecusto/vendor/autoload.php'; } class AdminPsThemeCustoConfigurationController extends ModuleAdminController { public $isPsVersion174Plus; public $controller_quick_name; public $aModuleActions; public $moduleActionsNames; public $categoryList; public function __construct() { parent::__construct(); $this->isPsVersion174Plus = (bool) version_compare(_PS_VERSION_, '1.7.4', '>='); $this->controller_quick_name = 'configuration'; $this->aModuleActions = ['uninstall', 'install', 'configure', 'enable', 'disable', 'disable_mobile', 'enable_mobile', 'reset']; $this->moduleActionsNames = [ $this->l('Uninstall'), $this->l('Install'), $this->l('Configure'), $this->l('Enable'), $this->l('Disable'), $this->l('Disable Mobile'), $this->l('Enable Mobile'), $this->l('Reset'), ]; $this->categoryList = [ 'menu' => $this->l('Menu'), 'slider' => $this->l('Slider'), 'home_products' => $this->l('Home Products'), 'block_text' => $this->l('Text block'), 'banner' => $this->l('Banner'), 'social_newsletter' => $this->l('Social & Newsletter'), 'footer' => $this->l('Footer'), 'content' => $this->l('content'), 'categories' => $this->l('Categories'), 'navigation_column' => $this->l('Navigation column'), 'product_management' => $this->l('Product management'), 'product_detail' => $this->l('Product detail'), 'product_block' => $this->l('Product block'), ]; } /** * Get homepage list of modules to show * * @return array */ public function getHomepageListConfiguration() { if ($this->isPsVersion174Plus) { $footerModules = [ 'blockreassurance' => 22312, 'ps_linklist' => 24360, ]; } else { $footerModules = [ 'ps_linklist' => 24360, ]; } return [ 'menu' => [ 'pages' => [ 'AdminCategories' => [ $this->l('Categories'), $this->l('Create here a full range of categories and subcategories to classify your products and manage your catalog easily.'), ], 'AdminCmsContent' => [ $this->l('Content pages'), $this->l('Add and manage your content pages to make your store interesting and trustworthy.'), ], 'AdminManufacturers' => [ $this->l('Brands and Suppliers'), $this->l('Manage both your brands and suppliers at the same place !'), ], ], 'modules' => [ 'ps_mainmenu' => 22321, ], ], 'slider' => [ 'modules' => [ $this->getModule()->ready ? 'pshomeslider' : 'ps_imageslider' => $this->getModule()->ready ? 27562 : 22320, ], ], 'home_products' => [ 'modules' => [ 'ps_featuredproducts' => 22319, 'ps_bestsellers' => 24566, 'ps_newproducts' => 24671, 'ps_specials' => 24672, ], ], 'block_text' => [ 'modules' => [ 'ps_customtext' => 22317, ], ], 'banner' => [ 'modules' => [ 'ps_banner' => 22313, ], ], 'social_newsletter' => [ 'modules' => [ 'ps_emailsubscription' => 22318, 'ps_socialfollow' => 22323, ], ], 'footer' => [ 'modules' => $footerModules, 'pages' => [ 'AdminStores' => [ $this->l('Shop details'), $this->l('Display additional information about your store or how to contact you to make it easy for your customers to reach you.'), ], ], ], ]; } /** * Get category list of modules to show * * @return array */ public function getCategoryListConfiguration() { if ($this->isPsVersion174Plus) { $category = [ 'sfRoutePages' => [ 'admin_product_preferences' => [ $this->l('Pagination'), $this->l('Set the numbers of products you want to display per page and how.'), ], ], ]; $footerModules = [ 'blockreassurance' => 22312, 'ps_linklist' => 24360, ]; $menu = [ 'pages' => [ 'AdminCmsContent' => [ $this->l('Content pages'), $this->l('Add and manage your content pages to make your store interesting and trustworthy.'), ], 'AdminManufacturers' => [ $this->l('Brands and Suppliers'), $this->l('Manage both your brands and suppliers at the same place !'), ], ], 'modules' => [ 'ps_mainmenu' => 22321, ], ]; } else { $category = [ 'pages' => [ 'AdminPPreferences' => [ $this->l('Pagination'), $this->l('Set the numbers of products you want to display per page and how.'), ], ], ]; $footerModules = [ 'ps_linklist' => 24360, ]; $menu = [ 'pages' => [ 'AdminCmsContent' => [ $this->l('Content pages'), $this->l('Add and manage your content pages to make your store interesting and trustworthy.'), ], 'AdminManufacturers' => [ $this->l('Brands and Suppliers'), $this->l('Manage both your brands and suppliers at the same place !'), ], ], 'modules' => [ 'ps_mainmenu' => 22321, ], ]; } return [ 'menu' => $menu, 'categories' => [ 'pages' => [ 'AdminCategories' => [ $this->l('Categories'), $this->l('Create a full range of Categories and Subcategories to classify your products, add categoryies desciptions and manage your catalog easily.'), ], ], ], 'navigation_column' => [ 'modules' => [ 'ps_categorytree' => 22314, 'ps_facetedsearch' => 23867, ], ], 'content' => $category, 'social_newsletter' => [ 'modules' => [ 'ps_emailsubscription' => 22318, 'ps_socialfollow' => 22323, ], ], 'footer' => [ 'modules' => $footerModules, 'pages' => [ 'AdminStores' => [ $this->l('Shop details'), $this->l('Display additional information about your store or how to contact you to make it easy for your customers to reach you.'), ], ], ], ]; } /** * Get product list of modules to show * * @return array */ public function getProductListConfiguration() { if ($this->isPsVersion174Plus) { $productManagement = [ 'sfRoutePages' => [ 'admin_product_catalog' => [ $this->l('Catalog'), $this->l('Access your list of products to manage your catalog efficiently.'), ], 'admin_stock_overview' => [ $this->l('Stock'), $this->l('Manage your stock and edit product quantities right here.'), ], ], 'pages' => [ 'AdminAttributesGroups' => [ $this->l('Product attributes'), $this->l('Create or manage your attributes : colors, sizes, materials, ...'), ], ], ]; $productDetailsModules = [ 'blockreassurance' => 22312, 'ps_sharebuttons' => 22322, ]; if (version_compare(_PS_VERSION_, '1.7.6', '>=')) { $productDetailsModules['productcomments'] = 9144; } } else { $productManagement = [ 'sfRoutePages' => [ 'admin_product_catalog' => [ $this->l('Catalog'), $this->l('Access your list of products to manage your catalog efficiently.'), ], ], 'pages' => [ 'AdminAttributesGroups' => [ $this->l('Product attributes'), $this->l('Create or manage your attributes : colors, sizes, materials, ...'), ], 'AdminPPreferences' => [ $this->l('Quantities and stock availability'), $this->l('Choose the way you display quantities and stock availability on your product page.'), ], 'AdminStockManagement' => [ $this->l('Stock'), $this->l('Manage your stock and edit product quantities right here.'), ], ], ]; $productDetailsModules = [ 'ps_sharebuttons' => 22322, ]; } return [ 'menu' => [ 'pages' => [ 'AdminCategories' => [ $this->l('Categories'), $this->l('Create here a full range of categories and subcategories to classify your products and manage your catalog easily.'), ], 'AdminCmsContent' => [ $this->l('Content pages'), $this->l('Add and manage your content pages to make your store interesting and trustworthy.'), ], 'AdminManufacturers' => [ $this->l('Brands and Suppliers'), $this->l('Manage both your brands and suppliers at the same place !'), ], ], 'modules' => [ 'ps_mainmenu' => 22321, ], ], 'product_management' => $productManagement, 'product_detail' => [ 'modules' => $productDetailsModules, ], 'product_block' => [ 'modules' => [ 'ps_categoryproducts' => 24588, 'ps_viewedproduct' => 24674, 'ps_crossselling' => 24696, ], ], 'social_newsletter' => [ 'modules' => [ 'ps_emailsubscription' => 22318, 'ps_socialfollow' => 22323, ], ], 'footer' => [ 'pages' => [ 'AdminStores' => [ $this->l('Shop details'), $this->l('Display additional information about your store or how to contact you to make it easy for your customers to reach you.'), ], ], 'modules' => [ 'ps_linklist' => 24360, ], ], ]; } /** * Initialize the content by adding Boostrap and loading the TPL */ public function initContent() { parent::initContent(); if (Module::isInstalled('ps_mbo')) { $selectionModulePage = $this->context->link->getAdminLink('AdminPsMboModule'); } else { $selectionModulePage = $this->context->link->getAdminLink('AdminModulesCatalog'); } $installedModulePage = $this->context->link->getAdminLink('AdminModulesManage'); $homepageListToConfigure = $this->getHomepageListConfiguration(); $categoryListToConfigure = $this->getCategoryListConfiguration(); $productListToConfigure = $this->getProductListConfiguration(); $this->context->smarty->assign([ 'enable' => $this->getModule()->active, 'moduleName' => $this->getModule()->displayName, 'bootstrap' => 1, 'configure_type' => $this->controller_quick_name, 'iconConfiguration' => $this->getModule()->img_path . '/controllers/configuration/icon_configurator.png', 'listCategories' => $this->categoryList, 'homePageList' => $this->setFinalList($homepageListToConfigure), 'categoryPageList' => $this->setFinalList($categoryListToConfigure), 'productPageList' => $this->setFinalList($productListToConfigure), 'selectionModulePage' => $selectionModulePage, 'installedModulePage' => $installedModulePage, 'moduleImgUri' => $this->getModule()->img_path . '/controllers/configuration/', 'moduleActions' => $this->aModuleActions, 'moduleActionsNames' => $this->moduleActionsNames, 'themeConfiguratorUrl' => $this->context->link->getAdminLink( 'AdminModules', true, false, ['configure' => 'ps_themeconfigurator'] ), 'isPsReady' => $this->getModule()->ready, 'ps_uri' => $this->getModule()->ps_uri, ]); $aJsDef = [ 'admin_module_controller_psthemecusto' => $this->getModule()->controller_name[1], 'admin_module_ajax_url_psthemecusto' => $this->getModule()->front_controller[1], 'module_action_sucess' => $this->l('Action on the module successfully completed'), 'module_action_failed' => $this->l('Action on module failed'), ]; $jsPath = [$this->getModule()->js_path . '/controllers/' . $this->controller_quick_name . '/back.js']; $cssPath = [$this->getModule()->css_path . '/controllers/' . $this->controller_quick_name . '/back.css']; $this->getModule()->setMedia($aJsDef, $jsPath, $cssPath); $this->setTemplate($this->getModule()->template_dir . 'page.tpl'); } /** * AJAX : Do a module action like Install, disable, enable ... * * @return mixed */ public function ajaxProcessUpdateModule() { if (!$this->getModule()->hasEditRight()) { exit($this->l('You do not have permission to edit this.')); } $sModuleName = pSQL(Tools::getValue('module_name')); $sModuleAction = pSQL(Tools::getValue('action_module')); $oModule = Module::getInstanceByName($sModuleName); $sUrlActive = $oModule->isEnabled($oModule->name) ? 'configure' : 'enable'; switch ($sModuleAction) { case 'uninstall': if ($this->getModule()->ready === true) { break; } $oModule->uninstall(); $sUrlActive = 'install'; break; case 'install': if ($this->getModule()->ready === true) { break; } $oModule->install(); $sUrlActive = method_exists($oModule, 'getContent') ? 'configure' : 'disable'; break; case 'enable': $oModule->enable(); $sUrlActive = method_exists($oModule, 'getContent') ? 'configure' : 'disable'; break; case 'disable': $oModule->disable(); $sUrlActive = 'enable'; break; case 'disable_mobile': $oModule->disableDevice(Context::DEVICE_MOBILE); $sUrlActive = method_exists($oModule, 'getContent') ? 'configure' : 'disable'; break; case 'enable_mobile': $oModule->enableDevice(Context::DEVICE_MOBILE); $sUrlActive = method_exists($oModule, 'getContent') ? 'configure' : 'disable'; break; case 'reset': $oModule->uninstall(); $oModule->install(); $sUrlActive = method_exists($oModule, 'getContent') ? 'configure' : 'disable'; break; default: exit(0); } $aModule['id_module'] = $oModule->id; $aModule['name'] = $oModule->name; $aModule['displayName'] = $oModule->displayName; $aModule['url_active'] = $sUrlActive; $aModule['active'] = ThemeCustoRequests::getModuleDeviceStatus($oModule->id); $aModule['actions_url']['configure'] = $this->context->link->getAdminLink('AdminModules', true, false, ['configure' => $oModule->name]); $aModule['can_configure'] = method_exists($oModule, 'getContent') ? true : false; $aModule['enable_mobile'] = (int) Db::getInstance()->getValue('SELECT enable_device FROM ' . _DB_PREFIX_ . 'module_shop WHERE id_module = ' . (int) $oModule->id); $this->context->smarty->assign([ 'module' => $aModule, 'moduleActions' => $this->aModuleActions, 'moduleActionsNames' => $this->moduleActionsNames, 'isPsReady' => $this->getModule()->ready, ]); $this->ajaxDie($this->context->smarty->fetch(__DIR__ . '/../../views/templates/admin/controllers/' . $this->controller_quick_name . '/elem/module_actions.tpl')); } /** * get list to show * * @param array $aList * * @return array */ public function setFinalList($aList) { $modulesOnDisk = Module::getModulesDirOnDisk(); $aModuleFinalList = []; foreach ($aList as $sSegmentName => $aElementListByType) { foreach ($aElementListByType as $sType => $aElementsList) { if ($sType == 'pages') { foreach ($aElementsList as $sController => $aPage) { $aModuleFinalList[$sSegmentName][$sType][$sController]['name'] = $sController; $aModuleFinalList[$sSegmentName][$sType][$sController]['displayName'] = $this->l($aPage[0]); $aModuleFinalList[$sSegmentName][$sType][$sController]['url'] = $this->context->link->getAdminLink($sController); $aModuleFinalList[$sSegmentName][$sType][$sController]['description'] = $this->l($aPage[1]); $aModuleFinalList[$sSegmentName][$sType][$sController]['action'] = $this->l('Configure'); } } elseif ($sType == 'sfRoutePages') { $container = PrestaShop\PrestaShop\Adapter\SymfonyContainer::getInstance(); foreach ($aElementsList as $sController => $aPage) { $aModuleFinalList[$sSegmentName][$sType][$sController]['name'] = $sController; $aModuleFinalList[$sSegmentName][$sType][$sController]['displayName'] = $this->l($aPage[0]); $aModuleFinalList[$sSegmentName][$sType][$sController]['url'] = $container->get('router')->generate($sController); $aModuleFinalList[$sSegmentName][$sType][$sController]['description'] = $this->l($aPage[1]); $aModuleFinalList[$sSegmentName][$sType][$sController]['action'] = $this->l('Configure'); } } else { foreach ($aElementsList as $sModuleName => $iModuleId) { if (!in_array($sModuleName, $modulesOnDisk)) { if ($this->getModule()->ready !== false) { continue; } /* For a module coming from outside. It will be downloaded and installed */ $length = file_put_contents(_PS_MODULE_DIR_ . basename($sModuleName) . '.zip', Tools::addonsRequest('module', ['id_module' => $iModuleId])); if (!empty($length) && Tools::ZipExtract(_PS_MODULE_DIR_ . basename($sModuleName) . '.zip', _PS_MODULE_DIR_)) { unlink(_PS_MODULE_DIR_ . basename($sModuleName) . '.zip'); } else { continue; } } $aModuleFinalList[$sSegmentName][$sType][$sModuleName] = $this->setModuleFinalList(Module::getInstanceByName($sModuleName), Module::isInstalled($sModuleName)); } } } if (!isset($aModuleFinalList[$sSegmentName])) { $aModuleFinalList[$sSegmentName] = null; } if (isset($aModuleFinalList[$sSegmentName]['modules']) && is_array($aModuleFinalList[$sSegmentName]['modules']) && is_callable([$this, 'sortArrayInstalledModulesFirst'])) { uasort($aModuleFinalList[$sSegmentName]['modules'], [$this, 'sortArrayInstalledModulesFirst']); } } return $aModuleFinalList; } /** * Render final list of modules * * @param Module $oModuleInstance * @param bool $bIsInstalled * * @return array */ public function setModuleFinalList($oModuleInstance, $bIsInstalled) { $aModule = []; $aModule['id_module'] = $oModuleInstance->id; $aModule['active'] = $oModuleInstance->active; if ($bIsInstalled === true) { $aModule['can_configure'] = (method_exists($oModuleInstance, 'getContent')) ? true : false; if (method_exists($oModuleInstance, 'getContent')) { $aModule['url_active'] = $this->l(($oModuleInstance->active ? 'configure' : 'enable')); } else { $aModule['url_active'] = $this->l(($oModuleInstance->active ? 'disable' : 'enable')); } $aModule['installed'] = 1; } else { $aModule['can_configure'] = false; $aModule['url_active'] = 'install'; $aModule['installed'] = 0; } $aModule['enable_mobile'] = (int) Db::getInstance()->getValue('SELECT enable_device FROM ' . _DB_PREFIX_ . 'module_shop WHERE id_module = ' . (int) $oModuleInstance->id); $aModule['name'] = $oModuleInstance->name; $aModule['displayName'] = $oModuleInstance->displayName; $aModule['description'] = $oModuleInstance->description; $aModule['controller_name'] = (isset($oModuleInstance->controller_name) ? $oModuleInstance->controller_name : ''); $aModule['logo'] = '/modules/' . $oModuleInstance->name . '/logo.png'; $aModule['actions_url']['configure'] = $this->context->link->getAdminLink('AdminModules', true, false, ['configure' => $oModuleInstance->name]); return $aModule; } /** * Order Final array for having installed module first * * @param array $a * @param array $b * * @return int */ public function sortArrayInstalledModulesFirst($a, $b) { return strcmp($b['installed'], $a['installed']); } /** * @return ps_themecusto */ private function getModule() { /* @phpstan-ignore-next-line */ return $this->module; } }