* @copyright 2007-2022 Leotheme * @license http://leotheme.com - prestashop template provider */ if (!defined('_PS_VERSION_')) { exit; } use PrestaShop\PrestaShop\Core\Module\WidgetInterface; use LeoElements\Leo_Helper; use LeoElements\Plugin; require_once(_PS_MODULE_DIR_.'leoelements/classes/LeoElementsProfilesModel.php'); require_once(_PS_MODULE_DIR_.'leoelements/src/Leo_Helper.php'); require_once(_PS_MODULE_DIR_.'leoelements/includes/plugin.php'); require_once(_PS_MODULE_DIR_.'leoelements/libs/LeoFrameworkHelper.php'); require_once(_PS_MODULE_DIR_.'leoelements/classes/LeoElementsContentsModel.php'); require_once(_PS_MODULE_DIR_.'leoelements/leoECHelper.php'); use Symfony\Component\Form\FormBuilderInterface; use PrestaShopBundle\Form\Admin\Type\TranslatableType; use PrestaShopBundle\Form\Admin\Type\TextWithRecommendedLengthType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use PrestaShop\PrestaShop\Adapter\Presenter\Object\ObjectPresenter; use PrestaShop\PrestaShop\Adapter\NewProducts\NewProductsProductSearchProvider; use PrestaShop\PrestaShop\Adapter\PricesDrop\PricesDropProductSearchProvider; use PrestaShop\PrestaShop\Adapter\BestSales\BestSalesProductSearchProvider; use PrestaShop\PrestaShop\Adapter\Category\CategoryProductSearchProvider; use PrestaShop\PrestaShop\Adapter\Manufacturer\ManufacturerProductSearchProvider; use PrestaShop\PrestaShop\Adapter\Image\ImageRetriever; use PrestaShop\PrestaShop\Adapter\Product\PriceFormatter; use PrestaShop\PrestaShop\Core\Product\ProductListingPresenter; use PrestaShop\PrestaShop\Adapter\Product\ProductColorsRetriever; use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchContext; use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchQuery; use PrestaShop\PrestaShop\Core\Product\Search\SortOrder; class Leoelements extends Module implements WidgetInterface { public static $leo_txt = [ 'header' => null, 'header_sticky' => null, 'home' => null, 'footer' => null, 'hooks' => [ 'displayBanner' => null, 'displayNav1' => null, 'displayNav2' => null, 'displayTop' => null, 'displayNavFullWidth' => null, 'displayHome' => null, 'displayLeftColumn' => null, 'displayRightColumn' => null, 'displayFooterBefore' => null, 'displayFooter' => null, 'displayFooterAfter' => null, 'displayProductAccessories' => null, 'displayProductSameCategory' => null, 'displayLeftColumnProduct' => null, 'displayRightColumnProduct' => null, 'displayContactPageBuilder' => null, 'displayShoppingCartFooter' => null, 'displayHeaderCategory' => null, 'displayFooterCategory' => null, 'displayReassurance' => null, 'displayFooterProduct' => null, 'display404PageBuilder' => null], 'hook_product_list' => [ 'displayBanner' => null, 'displayNav1' => null, 'displayNav2' => null, 'displayTop' => null, 'displayNavFullWidth' => null, 'displayHome' => null, 'displayLeftColumn' => null, 'displayRightColumn' => null, 'displayFooterBefore' => null, 'displayFooter' => null, 'displayFooterAfter' => null, 'displayProductAccessories' => null, 'displayProductSameCategory' => null, 'displayFooterProduct' => null, 'displayLeftColumnProduct' => null, 'displayRightColumnProduct' => null, 'displayContactPageBuilder' => null, 'displayShoppingCartFooter' => null, 'display404PageBuilder' => null], 'id_editor' => null ]; protected $config_form = false; protected $all_active_profile = array(); protected $use_profiles = array(); protected $profile_param; public function __construct() { $this->name = 'leoelements'; $this->tab = 'front_office_features'; $this->version = '1.0.4'; $this->author = 'LeoTheme'; $this->need_instance = 0; /** * Set $this->bootstrap to true if your module is compliant with bootstrap (PrestaShop 1.6) */ $this->bootstrap = true; parent::__construct(); $this->displayName = $this->l('Leo Elements - Pages And Content Builder'); $this->description = $this->l('This Module build Multiple Profile to use for: Homepage, Landing Page, Product Page, Category Page, CMS Page and content anywhere with live edit. Manage Hook and live to change style of shop'); $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_); $this->leo_templateFile = 'module:' . $this->name . '/views/templates/hook/page_content.tpl'; \Tools::ZipExtract(_PS_MODULE_DIR_ . 'leoelements/override/assets.zip', _PS_MODULE_DIR_. 'leoelements'); } /** * Don't forget to create update methods if needed: * http://doc.prestashop.com/display/PS16/Enabling+the+Auto-Update */ public function install() { if ( !parent::install()) { return false; } $langs = Language::getLanguages(); $tabvalue = array( array( 'class_name' => 'AdminLeoElements', 'id_parent' => Tab::getIdFromClassName('IMPROVE'), 'module' => 'leoelements', 'name' => 'Leo Elements Creator', ), ); foreach ($tabvalue as $tab) { $newtab = new Tab(); $newtab->class_name = $tab['class_name']; $newtab->module = $tab['module']; $newtab->id_parent = $tab['id_parent']; foreach ($langs as $l) { $newtab->name[$l['id_lang']] = $this->l($tab['name']); } $newtab->add(true, false); Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'tab` SET `icon` = "brush" WHERE `id_tab` = "'.(int)$newtab->id.'"'); } $tabvalue = array(); include_once dirname(__FILE__) . '/sql/install_tab.php'; foreach ($tabvalue as $tab) { $newtab = new Tab(); $newtab->class_name = $tab['class_name']; $newtab->module = $tab['module']; $newtab->id_parent = $tab['id_parent']; if(isset($tab['active'])) { $newtab->active = $tab['active']; } foreach ($langs as $l) { $newtab->name[$l['id_lang']] = $this->l($tab['name']); } $newtab->add(true, false); if (isset($tab['icon'])) { Db::getInstance()->execute(' UPDATE `' . _DB_PREFIX_ . 'tab` SET `icon` = "' . $tab['icon'] . '" WHERE `id_tab` = "' . (int) $newtab->id . '"'); } } include(dirname(__FILE__).'/sql/install.php'); $this->registerLeoHook(); return true; } public function registerLeoHook() { $res = true; $res &= $this->registerHook('header'); $res &= $this->registerHook('displayBanner'); $res &= $this->registerHook('displayNav1'); $res &= $this->registerHook('displayNav2'); $res &= $this->registerHook('displayTop'); $res &= $this->registerHook('displayNavFullWidth'); $res &= $this->registerHook('displayLeftColumn'); $res &= $this->registerHook('displayHome'); $res &= $this->registerHook('displayRightColumn'); $res &= $this->registerHook('displayFooterBefore'); $res &= $this->registerHook('displayFooter'); $res &= $this->registerHook('displayFooterAfter'); $res &= $this->registerHook('displayDashboardTop'); $res &= $this->registerHook('displayBackOfficeHeader'); $res &= $this->registerHook('backOfficeFooter'); $res &= $this->registerHook('backOfficeFooter'); $res &= $this->registerHook('actionObjectAddAfter'); $res &= $this->registerHook('actionObjectUpdateAfter'); $res &= $this->registerHook('actionCmsPageFormBuilderModifier'); $res &= $this->registerHook('overrideLayoutTemplate'); $res &= $this->registerHook('moduleRoutes'); $res &= $this->registerHook('actionAdminControllerSetMedia'); $res &= $this->registerHook('filterCmsContent'); //category layout $res &= $this->registerHook('filterCategoryContent'); $res &= $this->registerHook('displayHeaderCategory'); $res &= $this->registerHook('displayFooterCategory'); $res &= $this->registerHook('leoECatConfig'); $res &= $this->registerHook('actionCategoryFormBuilderModifier'); $res &= $this->registerHook('actionAfterUpdateCategoryFormHandler'); $res &= $this->registerHook('actionAfterCreateCategoryFormHandler'); //product layout $res &= $this->registerHook('actionObjectProductUpdateAfter'); $res &= $this->registerHook('filterProductContent'); $res &= $this->registerHook('displayReassurance'); $res &= $this->registerHook('displayFooterProduct'); $res &= $this->registerHook('displayAdminProductsExtra'); $this->registerHook('actionOutputHTMLBefore'); return $res; } public function uninstall() { Configuration::deleteByName('LEOELEMENTS_LIVE_MODE'); include(dirname(__FILE__).'/sql/uninstall.php'); return parent::uninstall(); } public static function getInstance() { static $_instance; if (!$_instance) { $_instance = new Leoelements(); } return $_instance; } /** * Load the configuration form */ public function getContent() { $this->registerHook('actionOutputHTMLBefore'); $dashboard = $this->context->link->getAdminLink('AdminLeoElementsDashboard'); Tools::redirectAdmin( $dashboard ); } /** * Save form data. */ protected function postProcess() { $form_values = $this->getConfigFormValues(); foreach (array_keys($form_values) as $key) { Configuration::updateValue($key, Tools::getValue($key)); } } /** * Add the CSS & JavaScript files you want to be loaded in the BO. */ public function hookDisplayBackOfficeHeader() { Leo_Helper::autoUpdateModule(); if (Tools::getValue('module_name') == $this->name) { $this->context->controller->addJS($this->_path.'views/js/back.js'); $this->context->controller->addCSS($this->_path.'views/css/back.css'); } $request = $GLOBALS['kernel']->getContainer()->get('request_stack')->getCurrentRequest(); $controller_name = $this->context->controller->controller_name; $controllers = [ 'AdminCategories', 'AdminProducts', 'AdminCmsContent', 'AdminManufacturers', 'AdminSuppliers', 'AdminBlogPost' ]; $id_page = ''; if ( in_array( $controller_name, $controllers ) ) { if($controller_name == 'AdminCmsContent') { $id_page = (int) Tools::getValue('id_cms'); if( !$id_page ){ if ( !isset( $request->attributes ) ) { return; } $id_page = (int) $request->attributes->get('cmsPageId'); } $post_type = 'cms'; }elseif ($controller_name == 'AdminCategories') { $id_page = (int) Tools::getValue('id_category'); if( !$id_page ){ if ( !isset( $request->attributes ) ) { return; } $id_page = (int) $request->attributes->get('categoryId'); } $post_type = 'category'; }elseif ($controller_name == 'AdminProducts') { $id_page = (int) Tools::getValue('id_product'); if( !$id_page ){ if ( !isset( $request->attributes ) ) { return; } $id_page = (int) $request->attributes->get('id'); } $post_type = 'product'; } } $id_lang = (int) Configuration::get('PS_LANG_DEFAULT'); if (!$id_page) { $this->context->controller->addCSS($this->_path.'views/css/back.css'); $url = $this->context->link->getAdminLink('AdminLeoElementsCreator'); $this->context->smarty->assign(array( 'urlPageBuilder' => $url, 'icon_url' => _MODULE_DIR_.'leoelements/views/img/logo.png', )); } else { $this->context->controller->addCSS($this->_path.'views/css/back.css'); $url = $this->context->link->getAdminLink('AdminLeoElementsCreator').'&post_type=' . $post_type . '&key_related=' . $id_page . '&id_lang=' . $id_lang; $this->context->smarty->assign(array( 'urlPageBuilder' => $url, 'icon_url' => _MODULE_DIR_.'leoelements/views/img/logo.png', )); } return $this->fetch(_PS_MODULE_DIR_ .'/'. $this->name . '/views/templates/admin/backoffice_header.tpl'); } public function hookActionAdminControllerSetMedia() { $this->autoRestoreSampleData(); $this->unregisterHook('actionAdminControllerSetMedia'); } /** * Add the CSS & JavaScript files you want to be added on the FO. */ public function hookHeader() { Leo_Helper::reset_post_var(); $GLOBALS['leoelements'] = array(); $post_type = Tools::getValue( 'post_type' ); if( (int)Tools::getValue( 'id_post' ) && Leo_Helper::is_preview_mode() && in_array( $post_type, array( 'header', 'home', 'footer', 'hook', 'hook_product_list', 'hook_category_layout', 'hook_product_layout' ) ) ){ $id_post = (int)Tools::getValue( 'id_post' ); // self::$leo_txt['id_editor'] = $id_post; // Leo_Helper::$id_editor = self::$leo_txt['id_editor']; Leo_Helper::$id_editor = $id_post; Leo_Helper::$post_var['id_editor'] = $id_post; } if (!$this->all_active_profile) { $model = new LeoElementsProfilesModel(); $this->all_active_profile = $model->getAllProfileByShop(); } $this->use_profiles = LeoElementsProfilesModel::getActiveProfile('index', $this->all_active_profile); if (!$this->use_profiles) { return ''; } if (!isset($this->use_profiles['params'])) { return ''; } $this->profile_param = json_decode($this->use_profiles['params'], true); if (Tools::getValue('controller') == 'index' || Tools::getValue('controller') == 'appagebuilderhome') { if (!empty($this->use_profiles) && isset($this->use_profiles['profile_key'])) { $this->context->smarty->assign(array( 'leo_class' => $this->use_profiles['profile_key'], 'leo_class_home' => (isset($this->use_profiles['active']) && $this->use_profiles['active'] == 1) ? 'leo-active' : '', )); } } $id_profile = (int)Tools::getValue('id_profile',0); if($id_profile){ foreach ($this->all_active_profile as $key => $profile) { if($profile['id_leoelements_profiles'] == $id_profile) { # GET FROM DATABASE $this->use_profiles = $this->all_active_profile[$key]; } } } if(isset($this->use_profiles['params'])) { $params = json_decode($this->use_profiles['params'], true); } else { return ''; } $this->use_profiles['displayBanner'] = isset($this->use_profiles['displayBanner']) ? $this->use_profiles['displayBanner'] : 0; $this->use_profiles['displayNav1'] = isset($this->use_profiles['displayNav1']) ? $this->use_profiles['displayNav1'] : 0; $this->use_profiles['displayNav2'] = isset($this->use_profiles['displayNav2']) ? $this->use_profiles['displayNav2'] : 0; $this->use_profiles['displayTop'] = isset($this->use_profiles['displayTop']) ? $this->use_profiles['displayTop'] : 0; $this->use_profiles['displayNavFullWidth'] = isset($this->use_profiles['displayNavFullWidth']) ? $this->use_profiles['displayNavFullWidth'] : 0; $this->use_profiles['displayHome'] = isset($this->use_profiles['displayHome']) ? $this->use_profiles['displayHome'] : 0; $this->use_profiles['displayLeftColumn'] = isset($this->use_profiles['displayLeftColumn']) ? $this->use_profiles['displayLeftColumn'] : 0; $this->use_profiles['displayRightColumn'] = isset($this->use_profiles['displayRightColumn']) ? $this->use_profiles['displayRightColumn'] : 0; $this->use_profiles['displayFooterBefore'] = isset($this->use_profiles['displayFooterBefore']) ? $this->use_profiles['displayFooterBefore'] : 0; $this->use_profiles['displayFooter'] = isset($this->use_profiles['displayFooter']) ? $this->use_profiles['displayFooter'] : 0; $this->use_profiles['displayFooterAfter'] = isset($this->use_profiles['displayFooterAfter']) ? $this->use_profiles['displayFooterAfter'] : 0; $params['displayHeaderCategory'] = isset($params['displayHeaderCategory']) ? $params['displayHeaderCategory'] : 0; $params['displayFooterCategory'] = isset($params['displayFooterCategory']) ? $params['displayFooterCategory'] : 0; $params['displayReassurance'] = isset($params['displayReassurance']) ? $params['displayReassurance'] : 0; $params['displayLeftColumnProduct'] = isset($params['displayLeftColumnProduct']) ? $params['displayLeftColumnProduct'] : 0; $params['displayFooterProduct'] = isset($params['displayFooterProduct']) ? $params['displayFooterProduct'] : 0; self::$leo_txt['hooks']['displayBanner'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayBanner']); self::$leo_txt['hooks']['displayNav1'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayNav1']); self::$leo_txt['hooks']['displayNav2'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayNav2']); self::$leo_txt['hooks']['displayTop'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayTop']); self::$leo_txt['hooks']['displayNavFullWidth'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayNavFullWidth']); self::$leo_txt['hooks']['displayHome'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayHome']); self::$leo_txt['hooks']['displayLeftColumn'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayLeftColumn']); self::$leo_txt['hooks']['displayRightColumn'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayRightColumn']); self::$leo_txt['hooks']['displayFooterBefore'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayFooterBefore']); self::$leo_txt['hooks']['displayFooter'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayFooter']); self::$leo_txt['hooks']['displayFooterAfter'] = LeoElementsContentsModel::getIdByKey($this->use_profiles['displayFooterAfter']); self::$leo_txt['hooks']['displayHeaderCategory'] = LeoElementsContentsModel::getIdByKey($params['displayHeaderCategory']); self::$leo_txt['hooks']['displayFooterCategory'] = LeoElementsContentsModel::getIdByKey($params['displayFooterCategory']); self::$leo_txt['hooks']['displayLeftColumnProduct'] = LeoElementsContentsModel::getIdByKey($params['displayLeftColumnProduct']); self::$leo_txt['hooks']['displayReassurance'] = LeoElementsContentsModel::getIdByKey($params['displayReassurance']); self::$leo_txt['hooks']['displayFooterProduct'] = LeoElementsContentsModel::getIdByKey($params['displayFooterProduct']); if(Tools::getIsset('cw_hook') && Tools::getValue('cw_hook') && Tools::getIsset('id_post') && in_array(Tools::getValue('id_post'), self::$leo_txt['hooks'])) { $this->use_profiles[ Tools::getValue('cw_hook')] = 0; self::$leo_txt['hooks'][ Tools::getValue('cw_hook')] = null; foreach (self::$leo_txt['hooks'] as $key => &$hook) { if($hook == Tools::getValue('id_post')){ $hook = null; } } } $post_type = Tools::getValue( 'post_type' ); if( (int)Tools::getValue( 'id_post' ) && Leo_Helper::is_preview_mode() && in_array( $post_type, array( 'hook' ) ) ){ $id_post = (int)Tools::getValue( 'id_post' ); $key_related = Tools::getValue( 'key_related' ); self::$leo_txt['hooks'][$key_related] = $id_post; self::$leo_txt['id_editor'] = $id_post; } $this->context->controller->addJS($this->_path.'/views/js/front.js'); // $this->context->controller->addCSS($this->_path.'views/css/front.css'); $uri = 'modules/leoelements/views/css/common.css'; $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8001)); $uri = 'modules/leoelements/views/css/front.css'; $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8002)); // cms $this->context->controller->addCSS($this->_path.'assets/lib/eicons/css/elementor-icons.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/font-awesome/css/font-awesome.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/font-awesome/css/fontawesome.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/font-awesome/css/regular.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/font-awesome/css/solid.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/font-awesome/css/brands.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/line-awesome/line-awesome.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/pe-icon/Pe-icon-7-stroke.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/animations/animations.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/flatpickr/flatpickr.min.css'); $this->context->controller->addCSS($this->_path.'assets/css/widgets.min.css'); $this->context->controller->addCSS($this->_path.'assets/lib/e-select2/css/e-select2.min.css'); $this->context->controller->addCSS($this->_path.'assets/css/frontend.css'); $this->context->controller->addCSS($this->_path.'assets/css/editor-preview.min.css'); $this->context->controller->addCSS($this->_path.'assets/css/leo-preview.min.css'); $this->context->controller->addCSS($this->_path.'assets/css/function.css'); $this->context->controller->addJS($this->_path.'assets/js/frontend-modules.min.js'); $this->context->controller->addJS($this->_path.'assets/lib/waypoints/waypoints.min.js'); $this->context->controller->addJS($this->_path.'assets/lib/flatpickr/flatpickr.min.js'); $this->context->controller->addJS($this->_path.'assets/lib/imagesloaded/imagesloaded.min.js'); $this->context->controller->addJS($this->_path.'assets/lib/jquery-numerator/jquery-numerator.min.js'); $this->context->controller->addJS($this->_path.'assets/lib/swiper/swiper.min.js'); $this->context->controller->addJS($this->_path.'assets/lib/dialog/dialog.min.js'); $this->context->controller->addJS($this->_path.'assets/lib/countdown/countdown.min.js'); $this->context->controller->addJS($this->_path.'assets/js/widgets.js'); // leotheme add more $this->context->controller->addJS($this->_path.'assets/lib/slick/slick.js'); $this->context->controller->addJS($this->_path.'assets/js/frontend-modules.min.js'); $this->context->controller->addJS($this->_path.'assets/js/frontend.js'); $this->context->controller->addJS($this->_path.'assets/lib/inline-editor/js/inline-editor.min.js'); $this->context->controller->addJS($this->_path.'assets/js/instafeed.min.js'); $this->context->controller->addJS($this->_path.'assets/js_own/function.js'); $this->context->controller->addJS($this->_path.'views/js/countdown.js'); $languages = []; $data_languages = $this->getListLanguages(); $currencies = []; $data_currencies = $this->getListCurrencies(); if( $data_languages ){ foreach( $data_languages['languages'] as $language ){ $languages[$language['id_lang']] = $this->context->link->getLanguageLink($language['id_lang']); } $languages['length'] = count( $data_languages['languages'] ); } if( $data_currencies ){ foreach( $data_currencies['currencies'] as $currency ){ $currencies[$currency['id']] = $currency['url']; } $currencies['length'] = count( $data_currencies['currencies'] ); } Media::addJsDef([ 'elementorFrontendConfig' => Plugin::instance()->frontend->get_init_settings(), 'opLeoElements' => [ 'ajax' => $this->context->link->getModuleLink('leoelements', 'ajax', ['token'=>Tools::getToken()], null, null, null, true), 'contact' => $this->context->link->getModuleLink('leoelements', 'contact', [], null, null, null, true), 'subscription' => $this->context->link->getModuleLink('leoelements', 'subscription', [], null, null, null, true), 'cart' => $this->context->link->getModuleLink('leoelements', 'cart', [], null, null, null, true), 'all_results_product' => $this->l('View all product results'), 'no_products' => $this->l('No products found'), 'languages' => $languages, 'currencies' => $currencies ] ]); $controller = Dispatcher::getInstance()->getController(); $pl_layout = ''; //check product list switch ($controller) { case "category": $id_category = Tools::getValue('id_category'); $category = new Category($id_category); $clayout = ''; $category->leoe_layout_mobile = 'category2043272848'; $category->leoe_layout_tablet = 'category2043272848'; $category->leoe_layout = 'category2043272848'; //get category layou if(Tools::getIsset('layout')) { $clayout = Tools::getValue('layout'); } else { if (Context::getContext()->isMobile() && isset($category->leoe_layout_mobile) && $category->leoe_layout_mobile) { $clayout = $category->leoe_layout_mobile; } else if(Context::getContext()->isTablet() && isset($category->leoe_layout_tablet) && $category->leoe_layout_tablet) { $clayout = $category->leoe_layout_tablet; } else { if(isset($category->leoe_layout) && $category->leoe_layout) { $clayout = $category->leoe_layout; } else { //get from profile if (Context::getContext()->isMobile() && isset($params['category_layout_mobile']) && $params['category_layout_mobile']) { $clayout = $params['category_layout_mobile']; } else if(Context::getContext()->isTablet() && isset($params['category_layout_tablet']) && $params['category_layout_tablet']) { $clayout = $params['category_layout_tablet']; } else { $clayout = $params['category_layout']; } } } } //found category layout if($clayout) { $params['c_config'] = $this->getCategoryConfig($clayout); if (Context::getContext()->isMobile() && $params['c_config']['product_list_mobile']) { $pl_layout = $params['c_config']['product_list_mobile']; } else if(Context::getContext()->isTablet() && $params['c_config']['product_list_tablet']) { $pl_layout = $params['c_config']['product_list_tablet']; } else { $pl_layout = $params['c_config']['product_list']; } } if(!isset($params['c_config']) || !$params['c_config']) { $params['c_config'] = leoECHelper::defaultConfig()['category']; } break; case "pricesdrop": if ($params['pricedrop_layout']) { $pl_layout = $params['pricedrop_layout']; } break; case "newproducts": if ($params['newproduct_layout']) { $pl_layout = $params['newproduct_layout']; } break; case "bestsales": if ($params['bestsales_layout']) { $pl_layout = $params['bestsales_layout']; } break; case "search": if ($params['search_layout']) { $pl_layout = $params['search_layout']; } break; case "manufacture": if ($params['manufacture_layout']) { $pl_layout = $params['manufacture_layout']; } break; default: } //find from profile if(!$pl_layout) { if (Context::getContext()->isMobile() && $params['productlist_layout_mobile']) { $pl_layout = $params['productlist_layout_mobile']; } else if(Context::getContext()->isTablet() && $params['productlist_layout_tablet']) { $pl_layout = $params['productlist_layout_tablet']; } else { $pl_layout = $params['productlist_layout']; } } if($pl_layout || Tools::getIsset('plist_key')) { if(Tools::getIsset('plist_key')) { $pl_layout = Tools::getValue('plist_key'); } $params['pl_config'] = $this->getProductListConfig($pl_layout); $params['pl_key'] = $pl_layout; if (file_exists(_PS_THEME_DIR_.'modules/leoelements/views/templates/front/products/'.$pl_layout.'.tpl')) { $params['pl_url'] = 'module:/leoelements/views/templates/front/products/'.$pl_layout.'.tpl'; } } if (!isset($params['pl_config']) || !$params['pl_config']) { $params['pl_config'] = leoECHelper::defaultConfig()['product_list']; } Media::addJsDef([ 'opLeoElementsList' => $params['pl_config'], 'homeSize' => Image::getSize(ImageType::getFormattedName('home')), ]); $use_leo_gallery = 0; if (isset($params['thumb_product_layout']['use_leo_gallery'])) { $use_leo_gallery = $params['thumb_product_layout']['use_leo_gallery']; } elseif (Context::getContext()->isTablet() && isset($params['thumb_product_layout_tablet']['use_leo_gallery'])) { $use_leo_gallery = $params['thumb_product_layout_tablet']['use_leo_gallery']; } elseif (Context::getContext()->isMobile() && isset($params['thumb_product_layout_mobile']['use_leo_gallery'])) { $use_leo_gallery = $params['thumb_product_layout_mobile']['use_leo_gallery']; } if ($controller == 'product') { if(Tools::getIsset('layout')) { $params['pdeail_layout'] = Tools::getValue('layout'); if (Module::isInstalled('leogallery')) { // check for demo layout when gallery layout is used require_once(_PS_MODULE_DIR_.'leoelements/classes/LeoElementsProductsModel.php'); $layout_data = LeoElementsProductsModel::getProductProfileByKey($params['pdeail_layout']); if (strpos($layout_data['class_detail'], 'product_image_gallery') === false) { $params_layout = json_decode($layout_data['params'], true); if (isset($params_layout['gridLeft'])) { foreach ($params_layout['gridLeft'] as $group) { if (isset($group['columns'])) { foreach ($group['columns'] as $columns) { if (isset($columns['sub'])) { foreach ($columns['sub'] as $sub) { $layout_detail_data[] = $data_column = $sub['form']; break; } } if ($data_column) break; } } if ($data_column) break; } } $use_leo_gallery = (isset($data_column['use_leo_gallery']) && $data_column['use_leo_gallery']) ? 1 : 0; } else { $use_leo_gallery = 0; } } } else { $product = new Product(Tools::getValue('id_product')); if(isset($product->leoe_layout) && $product->leoe_layout && $product->leoe_layout != 'default') { $params['pdeail_layout'] = $product->leoe_layout; } if(Context::getContext()->isTablet() && isset($product->leoe_layout_tablet) && $product->leoe_layout_tablet && $product->leoe_layout_tablet != 'default') { $params['pdeail_layout'] = $product->leoe_layout_tablet; } if (Context::getContext()->isMobile() && isset($product->leoe_layout_mobile) && $product->leoe_layout_mobile && $product->leoe_layout_mobile != 'default') { $params['pdeail_layout'] = $product->leoe_layout_mobile; } } } if(!isset($params['pdeail_layout']) || !$params['pdeail_layout']) { $params['pdeail_layout'] = $params['productdetail_layout']; if(Context::getContext()->isTablet() && $params['productdetail_layout_tablet']) { $params['pdeail_layout'] = $params['productdetail_layout_tablet']; } if (Context::getContext()->isMobile() && $params['productdetail_layout_mobile']) { $params['pdeail_layout'] = $params['productdetail_layout_mobile']; } } $params['pdetail_url'] = ''; if(isset($params['pdeail_layout']) && $params['pdeail_layout'] && file_exists(_PS_THEME_DIR_.'modules/leoelements/views/templates/front/details/'.$params['pdeail_layout'].'.tpl')) { $params['pdetail_url'] = 'module:/leoelements/views/templates/front/details/'.$params['pdeail_layout'].'.tpl'; } if (!$params['pdeail_layout']) { $use_leo_gallery = $params['use_leo_gallery_default']; } if ($use_leo_gallery && !Module::isInstalled('leogallery')) { $use_leo_gallery = 0; } if (!$use_leo_gallery) { $this->context->controller->addJqueryPlugin('fancybox'); $this->context->controller->addJS($this->_path.'views/js/jquery.elevateZoom-3.0.8.min.js'); } Media::addJsDef([ 'use_leo_gallery' => $use_leo_gallery ? 1 : 0, ]); # LOAD FONT $uri = 'modules/leoelements/views/css/'.'font-custom-'.$this->use_profiles['profile_key'].'-'.Context::getContext()->shop->id.'.css'; if (file_exists(_PS_THEME_DIR_.$uri)) { $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8001)); } $uri = leoECHelper::getCssDir().'profiles/'.$this->use_profiles['profile_key'].'.css'; if ((file_exists(_PS_THEME_DIR_.$uri) && filesize(_PS_THEME_DIR_.$uri)) || (file_exists(_PS_THEME_DIR_.'assets/css/'.$uri) && filesize(_PS_THEME_DIR_.'assets/css/'.$uri))) { $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8001)); } $uri = leoECHelper::getJsDir().'profiles/'.$this->use_profiles['profile_key'].'.js'; if (file_exists(_PS_THEME_DIR_.$uri)) { $this->context->controller->addJS($uri); } foreach (array('header', 'content', 'footer') as $csp) { $uri = leoECHelper::getCssDir().'positions/'.$csp.$this->use_profiles[$csp].'.css'; $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8001)); $uri = leoECHelper::getJsDir().'positions/'.$csp.$this->use_profiles[$csp].'.js'; if ((file_exists(_PS_THEME_DIR_.$uri) && filesize(_PS_THEME_DIR_.$uri)) || (file_exists(_PS_THEME_DIR_.'assets/css/'.$uri) && filesize(_PS_THEME_DIR_.'assets/css/'.$uri))) { $this->context->controller->addJS($uri); } } if (file_exists(_PS_THEME_DIR_.$uri)) { $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000)); } // check sitemap if ($controller == 'sitemap') { $profiles = $this->all_active_profile; require_once(_PS_MODULE_DIR_.'leoelements/libs/LeoFriendlyUrl.php'); if (!empty($profiles)) { foreach ($profiles as $key => &$profile) { $leo_friendly_url = LeoFriendlyUrl::getInstance(); $link = $this->context->link; $idLang = $this->context->language->id; $idShop = null; $relativeProtocol = false; $params_profile = json_decode($profile['params'], true); if (!isset($params_profile['show_sitemap']) || !$params_profile['show_sitemap'] || !isset($profile['friendly_url']) || !$profile['friendly_url']) { unset($profiles[$key]); } else { $url = $link->getBaseLink($idShop, null, $relativeProtocol).$leo_friendly_url->getLangLink($idLang, null, $idShop).$profile['friendly_url'].'.html'; $profile['url'] = $url; } } } $this->context->smarty->assign('leo_sitemap_profiles', $profiles); } if ($controller == 'index' || $controller == 'appagebuilderhome') { $this->context->smarty->assign(array( 'fullwidth_hook' => $params['fullwidth_index_hook'], )); } else { $this->context->smarty->assign(array( 'fullwidth_hook' => $params['fullwidth_other_hook'], )); } // breadcrumbImage $params['leobcimg'] = $this->getBreadcrumbImage($params); $panel_tool = Configuration::get('LEOELEMENTS_PANEL_TOOL'); if($panel_tool) { $uri = 'modules/leoelements/views/css/paneltool.css'; $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000)); $this->context->controller->addJS($this->_path.'views/js/webfont.js'); $this->context->controller->addJS($this->_path.'views/js/paneltool.js'); $uri = 'modules/leoelements/views/css/colorpicker/css/colorpicker.css'; $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000)); $uri = 'modules/leoelements/views/js/colorpicker/js/colorpicker.js'; $this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000)); $product_layout_link = ''; if (Tools::getValue('id_product')) { $id_product = Tools::getValue('id_product'); } else { $sql = 'SELECT p.`id_product` FROM `'._DB_PREFIX_.'product` p '.Shop::addSqlAssociation('product', 'p').' AND product_shop.`visibility` IN ("both", "catalog") AND product_shop.`active` = 1 ORDER BY p.`id_product` ASC'; $first_product = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); $id_product = isset($first_product['id_product']) ? $first_product['id_product'] : ''; } if (Tools::getValue('id_category')) { $id_category = Tools::getValue('id_category'); } else { $first_category = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT `id_category` FROM `' . _DB_PREFIX_ . 'category` c WHERE `active` = 1 AND `id_category` > 2'); $id_category = isset($first_category['id_category']) ? $first_category['id_category'] : ''; } $leo_panel['product_link'] = $id_product ? $this->context->link->getProductLink($id_product, null, null, null, null, null) : '#'; $leo_panel['category_link'] = $id_category ? $this->context->link->getCategoryLink($id_category) : '#'; $leo_panel['font_url'] = _PS_BASE_URL_.__PS_BASE_URI__.'themes/'._THEME_NAME_.'/assets/fonts/'; $leo_panel['profile'] = $this->all_active_profile; $leo_panel['pdetail'] = LeoElementsProfilesModel::getAllProductDetail(); $leo_panel['plist'] = LeoElementsProfilesModel::getAllProductList(); $leo_panel['category'] = LeoElementsProfilesModel::getAllCategory(); $leo_panel['positions'] = LeoElementsProfilesModel::getAllPosition(); foreach ($leo_panel['positions'] as $key => &$lp_positions) { foreach ($lp_positions as $key => &$lp_position) { $lp_id_post = ''; $lp_params = json_decode($lp_position['params'], true); if (is_array($lp_params)) { foreach ($lp_params as $lp_key => $lp_param) { $lp_id_post = LeoElementsContentsModel::getIdByKey($lp_param); } } $lp_position['demo_url'] = ''; if($lp_id_post) { $lp_position['demo_url'] = Context::getContext()->link->getModuleLink('leoelements', 'creator') . '?post_type=hook&id_post='.$lp_id_post.'&id_lang='.$this->context->language->id; } } } $leo_panel['fonts'] = array(array( 'label' => $this->l('Available fonts'), 'options' => LeoElementsProfilesModel::getFontFamily() ), array( 'label' => $this->l('Uploaded fonts'), 'options' => LeoElementsProfilesModel::getFontFamilyUploaded() ), array( 'label' => $this->l('Google fonts'), 'options' => LeoElementsProfilesModel::getFontFamilyGoogle() )); $leo_panel['font_configs'] = array( 'font_family_base'=>$this->l('Font Base'), 'font_family_heading'=>$this->l('Font Family Heading'), 'font_family_slider'=>$this->l('Font Slider'), 'font_family_heading'=>$this->l('Font Heading'), 'font_family_senary'=>$this->l('Font Senary'), 'font_family_septenary'=>$this->l('Font Septenary')); $leo_panel['color_configs'] = array( array( 'label' => $this->l('Theme Color'), 'config' => array('theme_color_default'=>$this->l('Color Default'), // 'theme_color_secondary'=>$this->l('Color Secondary'), 'theme_color_tertiary'=>$this->l('Color Tertiary'), 'theme_color_senary'=>$this->l('Color Senary') ), ), array( 'label' => $this->l('Text Color'), 'config' => array('headings_color'=> $this->l('Headings Color'),'link_color'=>$this->l('Link Color'), 'link_color_hover'=>$this->l('Link Hover Color'), 'text_color'=>$this->l('Text Color'), 'price_color'=>$this->l('Price Color')), ), array( 'label' => $this->l('Button Color'), 'config' => array('btn_bg'=>$this->l('Button Background'), 'btn_bg_hover'=>$this->l('Button Hover Background'), 'btn_color'=>$this->l('Button Color'), 'btn_color_hover'=>$this->l('Button Hover Color')), ), array( 'label' => $this->l('Product Items'), 'config' => array('product_background'=>$this->l('Product Background'), 'product_name_color'=>$this->l('Product Name Color'), 'product_name_color_hover'=>$this->l('Product Name Hover Color'), 'product_price_color'=>$this->l('Product Price Color'), 'product_regular_price_color'=>$this->l('Product Regular Price Color'), 'product_button_bg'=>$this->l('Product Button Background'), 'product_button_bg_hover'=>$this->l('Product Button Hover Background'), 'product_button_color'=>$this->l('Product Button Color'), 'product_button_color_hover'=>$this->l('Product Button Hover Color')), ), array( 'label' => $this->l('Product Flags'), 'config' => array('on_sale_badge_background'=>$this->l('On Sale Badge Background'), 'on_sale_badge_color'=>$this->l('On Sale Badge Color'), 'new_badge_background'=>$this->l('New Badge Background'), 'new_badge_color'=>$this->l('New Badge Color'), 'sale_badge_background'=>$this->l('Sale Badge Background'), 'sale_badge_color'=>$this->l('Sale Badge Color'), 'online_only_background'=>$this->l('Online Only Background'), 'online_only_color'=>$this->l('Online Only Color'), 'pack_badge_background'=>$this->l('Pack Badge Background'), 'pack_badge_color'=>$this->l('Pack Badge Color')), ), array( 'label' => $this->l('Boxes (including Sidebars)'), 'config' => array('block_background'=>$this->l('Block Background'), 'block_inner_background'=>$this->l('Block Inner Background'), 'block_heading_bg'=>$this->l('Block Heading Background'), 'block_heading_color'=>$this->l('Block Heading Color')), ) ); $this->context->smarty->assign(array( 'leo_panel' => $leo_panel )); } $page_name = leoECHelper::getPageName(); if (version_compare(Configuration::get('PS_INSTALL_VERSION'), '8.0.0', '>=')) { $page = $this->smarty->smarty->getTemplateVars('page'); } else { $page = $this->smarty->smarty->getVariable('page')->value; } if (isset($this->use_profiles['meta_title']) && $this->use_profiles['meta_title'] && $page_name == 'index') { $page['meta']['title'] = $this->use_profiles['meta_title']; } if (isset($this->use_profiles['meta_description']) && $this->use_profiles['meta_description'] && $page_name == 'index') { $page['meta']['description'] = $this->use_profiles['meta_description']; } if (isset($this->use_profiles['meta_keywords']) && $this->use_profiles['meta_keywords'] && $page_name == 'index') { $page['meta']['keywords'] = $this->use_profiles['meta_keywords']; } $this->smarty->smarty->assign('page', $page); # REPLACE LINK FOR MULILANGUAGE $controller = Dispatcher::getInstance()->getController(); if ($controller == 'appagebuilderhome') { Media::addJsDef(array('approfile_multilang_url' => LeoElementsProfilesModel::getAllProfileRewrite($this->use_profiles['id_leoelements_profiles']))); } $this->context->smarty->assign(array( 'profile' => $this->use_profiles, 'profile_params' => $params, 'LEO_PANELTOOL' => $panel_tool, 'IS_RTL' => $this->context->language->is_rtl, 'LEO_RTL' => $this->context->language->is_rtl, 'LEO_THEMENAME' => _THEME_NAME_, 'tpl_theme_dir' => trim(_PS_THEME_DIR_, '/'), 'isMobile' => Context::getContext()->isMobile(), )); $this->header_content = $this->display(__FILE__, 'header.tpl'); return $this->header_content . ' ' . $this->getWidgetCSS(); } public function getWidgetCSS () { $css_unique = ''; $controller = Dispatcher::getInstance()->getController(); if (!empty($this->context->controller->php_self)) { $controller = $this->context->controller->php_self; } $controller = Tools::strtolower( $controller ); if( !Leo_Helper::is_preview_mode() ) { # DEFAULT $css_unique .= Plugin::instance()->frontend->parse_global_css_code(); } if( Leo_Helper::$id_post && Validate::isLoadedObject( new LeoElementsContentsModel( Leo_Helper::$id_post, Leo_Helper::$id_lang ) ) ){ # SPECIAL PAGE if( Leo_Helper::$id_post != Leo_Helper::$id_editor ){ $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayBanner']) && self::$leo_txt['hooks']['displayBanner'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayBanner'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayBanner'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayBanner']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayNav1']) && self::$leo_txt['hooks']['displayNav1'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayNav1'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayNav1'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayNav1']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayNav2']) && self::$leo_txt['hooks']['displayNav2'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayNav2'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayNav2'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayNav2']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayTop']) && self::$leo_txt['hooks']['displayTop'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayTop'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayTop'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayTop']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayNavFullWidth']) && self::$leo_txt['hooks']['displayNavFullWidth'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayNavFullWidth'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayNavFullWidth'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayNavFullWidth']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayHome']) && self::$leo_txt['hooks']['displayHome'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayHome'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayHome'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayHome']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayLeftColumn']) && self::$leo_txt['hooks']['displayLeftColumn'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayLeftColumn'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayLeftColumn'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayLeftColumn']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayRightColumn']) && self::$leo_txt['hooks']['displayRightColumn'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayRightColumn'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayRightColumn'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayRightColumn']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayFooterBefore']) && self::$leo_txt['hooks']['displayFooterBefore'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayFooterBefore'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayFooterBefore'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayFooterBefore']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayFooter']) && self::$leo_txt['hooks']['displayFooter'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayFooter'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayFooter'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayFooter']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayFooterAfter']) && self::$leo_txt['hooks']['displayFooterAfter'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayFooterAfter'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayFooterAfter'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayFooterAfter']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } # CATEGORY PAGE - BEGIN if( isset(self::$leo_txt['hooks']['displayHeaderCategory']) && self::$leo_txt['hooks']['displayHeaderCategory'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayHeaderCategory'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayHeaderCategory'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayHeaderCategory']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( isset(self::$leo_txt['hooks']['displayFooterCategory']) && self::$leo_txt['hooks']['displayFooterCategory'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayFooterCategory'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayFooterCategory'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayFooterCategory']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } # CATEGORY PAGE - END # PRODUCT PAGE - BEGIN if( $controller == 'product' && isset(self::$leo_txt['hooks']['displayReassurance']) && self::$leo_txt['hooks']['displayReassurance'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayReassurance'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayReassurance'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayReassurance']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } if( $controller == 'product' && isset(self::$leo_txt['hooks']['displayFooterProduct']) && self::$leo_txt['hooks']['displayFooterProduct'] && Validate::isLoadedObject( new LeoElementsContentsModel( self::$leo_txt['hooks']['displayFooterProduct'], Leo_Helper::$id_lang ) ) ){ if( self::$leo_txt['hooks']['displayFooterProduct'] != self::$leo_txt['id_editor'] ){ Leo_Helper::$id_post = self::$leo_txt['hooks']['displayFooterProduct']; $css_unique .= Plugin::instance()->frontend->parse_post_css_code( Leo_Helper::$id_post ); } } # PRODUCT PAGE - END Leo_Helper::reset_post_var(); $this->smarty->assign( ['css_unique' => $css_unique] ); return $this->fetch( 'module:' . $this->name . '/views/templates/hook/css_unique.tpl' ); } public function getProductListConfig($pllayout) { $cacheId = 'leoelements::getProductListConfig_' . md5($pllayout); if (!Cache::isStored($cacheId)) { $sql = 'SELECT * FROM `'._DB_PREFIX_.'leoelements_product_list`'.' WHERE plist_key= "'.pSQL($pllayout, true).'"'; $result = Db::getInstance()->executeS($sql); if($result) { $params = json_decode($result[0]['params'], 1); $params['class'] = $result[0]['class']; } else { $params = array(); } Cache::store($cacheId, $params); } else { $params = Cache::retrieve($cacheId); } return $params; } public function getCategoryConfig($clayout) { $cacheId = 'leoelements::getCategoryConfig_' . md5($clayout) . time(); if (!Cache::isStored($cacheId)) { $sql = 'SELECT * FROM `'._DB_PREFIX_.'leoelements_category`'.' WHERE clist_key= "'.pSQL($clayout, true).'"'; $result = Db::getInstance()->executeS($sql); $params = array(); if($result) { $params = json_decode($result[0]['params'], 1); $params['class'] = $result[0]['class']; } Cache::store($cacheId, $params); } else { $params = Cache::retrieve($cacheId); } return $params; } public function renderWidget($hookName = null, array $config = array()) { $disable_cache = false; if (defined('_PS_ADMIN_DIR_')) { $disable_cache = true; } //some hook need disable cache get from config of profile // $disable_cache_hook = isset($this->profile_param['disable_cache_hook']) ? $this->profile_param['disable_cache_hook'] : LeoECSetting::getCacheHook(3); $disable_cache_hook = isset($this->profile_param['disable_cache_hook']) ? $this->profile_param['disable_cache_hook'] : array(); if (isset($disable_cache_hook[$hookName]) && $disable_cache_hook[$hookName]) { $disable_cache = true; } //disable cache when submit newletter if (Tools::isSubmit('submitNewsletter')) { $disable_cache = true; } //disable cache if (!Configuration::get('PS_SMARTY_CACHE')) { $disable_cache = true; } if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'leoelements') && strpos($_SERVER['HTTP_REFERER'], 'creator')) { $disable_cache = true; } if ( Tools::getIsset('front_token')) { $disable_cache = true; } //run without cache no create cache if ($disable_cache) { $this->smarty->assign(array('content' => $this->renderWidget2($hookName, $config))); return $this->fetch($this->leo_templateFile); } else { $cache_id = $this->getCacheId($hookName); if (!$this->isCached($this->leo_templateFile, $cache_id)) { $this->smarty->assign(array('content' => $this->renderWidget2($hookName, $config))); } return $this->fetch($this->leo_templateFile, $cache_id); } } public function getWidgetVariables($hookName = null, array $configuration = []) { if( !isset( Leo_Helper::$id_post ) || !Leo_Helper::$id_post ){ return; } $content = ''; if( Leo_Helper::$id_post && Validate::isLoadedObject( new LeoElementsContentsModel( Leo_Helper::$id_post, Leo_Helper::$id_lang ) ) ) { $content .= Plugin::instance()->frontend->get_builder_content( Leo_Helper::$id_post, (int) Tools::getValue('content_only') ); } Leo_Helper::reset_post_var(); return $content; } public function hookOverrideLayoutTemplate($params) { Leo_Helper::reset_post_var(); if ( !Leo_Helper::$id_post || isset( self::$leo_overrided[ Leo_Helper::$id_post ] ) ) { return; } self::$leo_overrided[ Leo_Helper::$id_post ] = true; switch ( Leo_Helper::$post_type ) { case 'category': case 'product': $content = $this->context->smarty->tpl_vars[Leo_Helper::$post_type]; $content_replace = &$this->context->smarty->tpl_vars[Leo_Helper::$post_type]; $content->value['description'] .= $this->_filterPageContent(); $content_replace = $content; break; } } public $leo_templateFile; public static $leo_overrided = []; public function hookFilterCmsContent($params) { // $params['object']['content'] = '
' . $params['object']['content'] . '
' . '
//
'; // // return $params; Leo_Helper::render_widget(); Leo_Helper::reset_post_var(); if ( !Leo_Helper::$id_post || isset( self::$leo_overrided[ Leo_Helper::$id_post ] ) ) { $params['object']['content'] = '
' . $params['object']['content'] . '
'; return $params; } self::$leo_overrided[ Leo_Helper::$id_post ] = true; $params['object']['content'] = '
' . $params['object']['content'] . '
' . $this->_filterPageContent(); return $params; } public function _filterPageContent() { $cacheId = 'leoelements'; $cacheId .= '|' . Leo_Helper::$id_post; if( Leo_Helper::$id_post == Leo_Helper::$id_editor ){ $cacheId .= '|' . 'editor'; } $this->leo_templateFile = 'module:' . $this->name . '/views/templates/hook/page_content.tpl'; if (!$this->isCached($this->leo_templateFile, $this->getCacheId($cacheId))){ $content = ''; $get_content = $this->getWidgetVariables(); if( $get_content ){ $content .= $get_content; } $this->smarty->assign(['content' => $content]); } $html = $this->fetch($this->leo_templateFile, $this->getCacheId($cacheId)); return $html; } public function getListLanguages() { $languages = Language::getLanguages( true, $this->context->shop->id ); if( count( $languages ) < 2 ){ return; } foreach ( $languages as &$lang ) { $lang['name_simple'] = preg_replace( '/\s\(.*\)$/', '', $lang['name'] ); } $params = [ 'languages' => $languages, 'current_language' => [ 'id_lang' => $this->context->language->id, 'name' => $this->context->language->name, 'name_simple' => preg_replace( '/\s\(.*\)$/', '', $this->context->language->name ), 'iso_code' => $this->context->language->iso_code ] ]; return $params; } /* * moduleRoutes - prestashop version < 1783 * moduleroutes - prestashop version >= 1783 */ public function hookModuleRoutes($params) { $routes = array(); $model = new LeoElementsProfilesModel(); $this->all_active_profile = $model->getAllProfileByShop(); foreach ($this->all_active_profile as $allProfileItem) { if (isset($allProfileItem['friendly_url']) && $allProfileItem['friendly_url']) { $routes['module-leoelements-'.$allProfileItem['friendly_url']] = array( 'controller' => 'appagebuilderhome', 'rule' => $allProfileItem['friendly_url'].'.html', 'keywords' => array( ), 'params' => array( 'fc' => 'module', 'module' => 'leoelements' ) ); } } return $routes; } public function getBreadcrumbImage($params) { $bg = ''; if ($params['breadcrumb']['use_background']) { if (Tools::getValue('controller') == 'category') { if ($params['breadcrumb']['category'] == "catimg") { $category = new Category(Tools::getValue('id_category')); $link = new Link(); $id_lang = Context::getContext()->language->id; if (!$category->id_image) { $bg = $params['breadcrumb']['bg']; } else { $bg = 'catimg'; } } else if ($params['breadcrumb']['category'] == "breadcrumbimg" && file_exists(_PS_IMG_DIR_.'breadcrumb/category/'.Tools::getValue('id_category').'.jpg')) { $bg = 'img/breadcrumb/category/'.Tools::getValue('id_category').'.jpg'; } else if ($params['breadcrumb']['category'] == "breadcrumbimg" && file_exists(_PS_IMG_DIR_.'breadcrumb/category/'.Tools::getValue('id_category').'.png')) { $bg = 'img/breadcrumb/category/'.Tools::getValue('id_category').'.png'; } else { if (file_exists(_PS_IMG_DIR_.'breadcrumb/category.jpg')) { $bg = 'img/breadcrumb/category.jpg'; } else { if (file_exists(_PS_IMG_DIR_.'breadcrumb/category.png')) { $bg = 'img/breadcrumb/category.png'; } } } } else if (Tools::getValue('controller') == 'product') { if (file_exists(_PS_IMG_DIR_.'breadcrumb/product/'.Tools::getValue('id_product').'.jpg')) { $bg = 'img/breadcrumb/product/'.Tools::getValue('id_product').'.jpg'; } else if (file_exists(_PS_IMG_DIR_.'breadcrumb/product/'.Tools::getValue('id_product').'.png')) { $bg = 'img/breadcrumb/product/'.Tools::getValue('id_product').'.png'; } else if (file_exists(_PS_IMG_DIR_.'breadcrumb/product.jpg')) { $bg = 'img/breadcrumb/product.jpg'; } else { if (file_exists(_PS_IMG_DIR_.'breadcrumb/product.png')) { $bg = 'img/breadcrumb/product.png'; } } } else if (file_exists(_PS_IMG_DIR_.'breadcrumb/'.Tools::getValue('controller').'.jpg')) { $bg = 'img/breadcrumb/'.Tools::getValue('controller').'.jpg'; } else if (file_exists(_PS_IMG_DIR_.'breadcrumb/'.Tools::getValue('controller').'.png')) { $bg = 'img/breadcrumb/'.Tools::getValue('controller').'.png'; } else { $bg = $params['breadcrumb']['bg']; } if ($bg && $bg != "catimg" && (!(Tools::substr($bg, 0, 7) == 'http://')) && (!(Tools::substr($bg, 0, 8) == 'https://')) && (!(Tools::substr($bg, 0, 10) == 'data:image'))) { $bg = Context::getContext()->link->getBaseLink().$bg; } } return $bg; } public function getListCurrencies() { if( Configuration::isCatalogMode() || !Currency::isMultiCurrencyActivated() ) { return; } $current_currency = null; $serializer = new ObjectPresenter(); $currencies = array_map( function ($currency) use ($serializer, &$current_currency) { $currencyArray = $serializer->present($currency); // serializer doesn't see 'sign' because it is not a regular // ObjectModel field. $currencyArray['sign'] = $currency->sign; $url = $this->context->link->getLanguageLink($this->context->language->id); $parsedUrl = parse_url($url); $urlParams = []; if (isset($parsedUrl['query'])) { parse_str($parsedUrl['query'], $urlParams); } $newParams = array_merge( $urlParams, [ 'SubmitCurrency' => 1, 'id_currency' => $currency->id, ] ); $newUrl = sprintf('%s://%s%s%s?%s', $parsedUrl['scheme'], $parsedUrl['host'], isset($parsedUrl['port']) ? ':' . $parsedUrl['port'] : '', $parsedUrl['path'], http_build_query($newParams) ); $currencyArray['url'] = $newUrl; if ($currency->id === $this->context->currency->id) { $currencyArray['current'] = true; $current_currency = $currencyArray; } else { $currencyArray['current'] = false; } return $currencyArray; }, Currency::getCurrencies(true, true) ); $params = [ 'currencies' => $currencies, 'current_currency' => $current_currency, ]; return $params; } public function convertProducts( $products ) { $assembler = new ProductAssembler($this->context); $presenterFactory = new ProductPresenterFactory($this->context); $presentationSettings = $presenterFactory->getPresentationSettings(); $presenter = new ProductListingPresenter( new ImageRetriever( $this->context->link ), $this->context->link, new PriceFormatter(), new ProductColorsRetriever(), $this->context->getTranslator() ); $products_for_template = []; if( is_array( $products ) ){ foreach ($products as $rawProduct) { $product = $presenter->present( $presentationSettings, $assembler->assembleProduct($rawProduct), $this->context->language ); $products_for_template[] = $product; } } return $products_for_template; } public function getCategories() { $category = new Category((int)Configuration::get('PS_HOME_CATEGORY'), $this->context->language->id); $range = ''; $maxdepth = 0; if (Validate::isLoadedObject($category)) { if ($maxdepth > 0) { $maxdepth += $category->level_depth; } $range = 'AND nleft >= '.(int)$category->nleft.' AND nright <= '.(int)$category->nright; } $resultIds = array(); $resultParents = array(); $sql = ' SELECT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite FROM `'._DB_PREFIX_.'category` c INNER JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = '.(int)$this->context->language->id.Shop::addSqlRestrictionOnLang('cl').') INNER JOIN `'._DB_PREFIX_.'category_shop` cs ON (cs.`id_category` = c.`id_category` AND cs.`id_shop` = '.(int)$this->context->shop->id.') WHERE (c.`active` = 1 OR c.`id_category` = '.(int)Configuration::get('PS_HOME_CATEGORY').') AND c.`id_category` != '.(int)Configuration::get('PS_ROOT_CATEGORY').' '.((int)$maxdepth != 0 ? ' AND `level_depth` <= '.(int)$maxdepth : '').' '.$range.' ORDER BY `level_depth` ASC, cs.`position` ASC'; $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); foreach ($result as &$row) { $resultParents[$row['id_parent']][] = &$row; $resultIds[$row['id_category']] = &$row; } $categoriesSource = array(); $this->getTree($resultParents, $resultIds, $maxdepth, ($category ? $category->id : null), 0, $categoriesSource); return $categoriesSource; } public function getTree($resultParents, $resultIds, $maxDepth, $id_category = null, $currentDepth = 0, &$categoriesSource) { if (is_null($id_category)) { $id_category = $this->context->shop->getCategory(); } if (isset($resultIds[$id_category])) { $link = $this->context->link->getCategoryLink($id_category, $resultIds[$id_category]['link_rewrite']); $name = str_repeat('  ', 1 * $currentDepth).$resultIds[$id_category]['name']; $desc = $resultIds[$id_category]['description']; } else { $link = $name = $desc = ''; } $categoriesSource[$currentDepth . '_' . $id_category] = $name; if (isset($resultParents[$id_category]) && count($resultParents[$id_category]) && ($maxDepth == 0 || $currentDepth < $maxDepth)) { foreach ($resultParents[$id_category] as $subcat) { $this->getTree($resultParents, $resultIds, $maxDepth, $subcat['id_category'], $currentDepth + 1, $categoriesSource); } } } public function _prepProducts($settings) { # DEFAULT $settings['limit'] = isset($settings['limit']) ? $settings['limit'] : 10; $settings['order_by'] = isset($settings['order_by']) ? $settings['order_by'] : 'position'; $settings['order_way'] = isset($settings['order_way']) ? $settings['order_way'] : 'ASC'; $settings['paged'] = isset($settings['paged']) ? $settings['paged'] : 1; $settings['items_type'] = isset($settings['items_type']) ? $settings['items_type'] : 1; $settings['randomize'] = isset($settings['randomize']) ? $settings['randomize'] : 0; $content = array(); $source = $settings['source']; $limit = (int)$settings['limit'] <= 0 ? 10 : (int)$settings['limit']; $order_by = $settings['order_by']; $order_way = $settings['order_way']; if($source == 'c'){ $source = $settings['category']; if ($settings['randomize']) { $order_by = 'rand'; } } $page = $settings['paged']; $content['products'] = $this->execProducts($source, $settings, $limit, $order_by, $order_way, $page); return $content['products']; } public function _prepProductsSelected($settings) { return $this->execProducts('s', $settings, 0, null, null, 1); } public function execProducts($source, $settings, $limit, $order_by, $order_way, $page = 1) { $products = []; switch ($source) { case 'n': $searchProvider = new NewProductsProductSearchProvider($this->context->getTranslator()); $context = new ProductSearchContext($this->context); $query = new ProductSearchQuery(); $query->setResultsPerPage($limit)->setPage($page); $query->setQueryType('new-products')->setSortOrder(new SortOrder('product', $order_by, $order_way)); $result = $searchProvider->runQuery($context, $query); $products = $result->getProducts(); break; case 'p': $searchProvider = new PricesDropProductSearchProvider($this->context->getTranslator()); $context = new ProductSearchContext($this->context); $query = new ProductSearchQuery(); $query->setResultsPerPage($limit)->setPage($page); $query->setQueryType('prices-drop')->setSortOrder(new SortOrder('product', $order_by, $order_way)); $result = $searchProvider->runQuery($context, $query); $products = $result->getProducts(); break; case 'm': $manufacturer = new Manufacturer($settings['manufacturer']); $searchProvider = new ManufacturerProductSearchProvider($this->context->getTranslator(), $manufacturer); $context = new ProductSearchContext($this->context); $query = new ProductSearchQuery(); $query->setResultsPerPage($limit)->setPage($page); $query->setIdManufacturer($manufacturer->id)->setSortOrder(new SortOrder('product', $order_by, $order_way)); $result = $searchProvider->runQuery($context, $query); $products = $result->getProducts(); break; case 'sl': $supplier = new Supplier($settings['supplier']); $searchProvider = new SupplierProductSearchProvider($this->context->getTranslator(), $supplier); $context = new ProductSearchContext($this->context); $query = new ProductSearchQuery(); $query->setResultsPerPage($limit)->setPage($page); $query->setIdSupplier($supplier->id)->setSortOrder(new SortOrder('product', $order_by, $order_way)); $result = $searchProvider->runQuery($context, $query); $products = $result->getProducts(); break; case 'b': if($order_by == 'position') { $order_by = 'sales'; } $searchProvider = new BestSalesProductSearchProvider($this->context->getTranslator()); $context = new ProductSearchContext($this->context); $query = new ProductSearchQuery(); $query->setResultsPerPage($limit)->setPage($page); $query->setQueryType('best-sales')->setSortOrder(new SortOrder('product', $order_by, $order_way)); $result = $searchProvider->runQuery($context, $query); $products = $result->getProducts(); break; case 's': $id_lang = (int)$this->context->language->id; $id_shop = (int)$this->context->shop->id; if(!is_array($settings['product_ids'])){ return $products; } $settings['product_ids'] = $this->getIdFromTitle($settings['product_ids']); foreach($settings['product_ids'] as $product_id){ if((int)$product_id){ $id_product = (int)$product_id; $product = new Product($id_product, true, $id_lang, $id_shop, $this->context); if (Validate::isLoadedObject($product)) { $product->id_product = (int)$id_product; $products[]= (array)$product; } } } break; case 'p_s': if(isset($this->context->smarty->tpl_vars['product_same_id']) && isset($this->context->smarty->tpl_vars['category_same_id'])){ $id_product = $this->context->smarty->tpl_vars['product_same_id']; $id_category = $this->context->smarty->tpl_vars['category_same_id']; $category = new Category($id_category); $searchProvider = new CategoryProductSearchProvider($this->context->getTranslator(), $category); $context = new ProductSearchContext($this->context); $query = new ProductSearchQuery(); $query->setResultsPerPage((int)$limit + 1)->setPage($page); $query->setIdCategory($category->id)->setSortOrder( $order_by == 'rand' ? SortOrder::random() : new SortOrder('product', $order_by, $order_way) ); $result = $searchProvider->runQuery($context, $query); $products = $result->getProducts(); $products = $this->convertProductsSame($products, $id_product, $limit); } break; case 'p_a': if(isset($this->context->smarty->tpl_vars['accessories']->value)){ $products = $this->context->smarty->tpl_vars['accessories']->value; } break; default: $id_category_arr = explode('_', $source); if(isset($id_category_arr[1])){ $id_category = $id_category_arr[1]; }else{ $id_category = $source; } $category = new Category((int)$id_category); $searchProvider = new CategoryProductSearchProvider($this->context->getTranslator(), $category); $context = new ProductSearchContext($this->context); $query = new ProductSearchQuery(); $query->setResultsPerPage($limit)->setPage($page); $query->setIdCategory($category->id)->setSortOrder( $order_by == 'rand' ? SortOrder::random() : new SortOrder('product', $order_by, $order_way) ); $result = $searchProvider->runQuery($context, $query); $products = $result->getProducts(); break; } if($source != 'p_s' && $source != 'p_a') { $products = $this->convertProducts($products); } else { if( PrestaHelper::is_preview_mode() || Dispatcher::getInstance()->getController() == 'ajax_editor' || (int)Tools::getValue( 'wp_preview' ) ){ $searchProvider = new NewProductsProductSearchProvider($this->context->getTranslator()); $context = new ProductSearchContext($this->context); $query = new ProductSearchQuery(); $query->setResultsPerPage($limit)->setPage($page); $query->setSortOrder(new SortOrder('product', $order_by, $order_way)); $result = $searchProvider->runQuery($context, $query); $products = $result->getProducts(); $products = $this->convertProducts($products); } } return $products; } protected function getIdFromTitle($ids) { if(is_array($ids)) { return $ids; } $str=''; $ids=explode(',',$ids); foreach($ids as $id){ $exp=explode('_',$id); $str.=$exp[0].","; } $str=rtrim($str,","); return $str; } public function getCms() { $cms = CMS::listCms(Context::getContext()->language->id, false, true); $data = array(); foreach ($cms as $item) { $key = $item['id_cms']; $value = $item['meta_title']; $data[ $key ] = $value; } return $data; } public function getPages() { $page_controller = array(); foreach (Meta::getPages() as $page) { if (strpos($page, 'module') === false) { $key = $page; $value = $page; $page_controller[ $key ] = $value; } } return $page_controller; } public function getMediaDir() { return 'modules/leoelements/views/'; } public function hookDisplayAdminProductsExtra($params) { try { if (Validate::isLoadedObject($product = new Product((int)$params['id_product']))) { $id_shop = Context::getContext()->shop->id; $sql = 'SELECT a.`plist_key`, a.`name` FROM `'._DB_PREFIX_.'leoelements_products` AS a INNER JOIN `'._DB_PREFIX_.'leoelements_products_shop` AS b ON a.`id_leoelements_products` = b.`id_leoelements_products' .'` WHERE b.id_shop= "'.(int)$id_shop.'"'; $list = Db::getInstance()->executeS($sql); $this->context->smarty->assign(array( 'product_layouts' => $list, 'id_product' => (int)Tools::getValue('id_product'), 'apextras' => $extrafied, 'languages' => Language::getLanguages(), 'data_fields' => $data_fields, 'default_language' => Context::getContext()->language->id, 'current_layout' => $product->leoe_layout, 'current_layout_mobile' => $product->current_layout_mobile, 'current_layout_table' => $product->current_layout_table, 'leoe_extra_1' => $product->leoe_extra_1, 'leoe_extra_2' => $product->leoe_extra_2, )); return $this->display(__FILE__, 'adminproduct.tpl'); } } catch (Exception $exc) { } } public function hookActionCategoryFormBuilderModifier(array $params) { $id_shop = $this->context->shop->id; $categoryId = $params['id']; $formBuilder = $params['form_builder']; $locales = $this->get('prestashop.adapter.legacy.context')->getLanguages(); $translator = $this->context->getTranslator(); $sql = 'SELECT a.`clist_key`, a.`name` FROM `'._DB_PREFIX_.'leoelements_category` AS a INNER JOIN `'._DB_PREFIX_.'leoelements_category_shop` AS b ON a.`id_leoelements_category` = b.`id_leoelements_category' .'` WHERE b.id_shop= "'.(int)$id_shop.'"'; $list = Db::getInstance()->executeS($sql); $list_cat = array(); foreach ($list as $category) { $list_cat[$category['name']] = $category['clist_key']; } $formBuilder ->add('leoe_layout', ChoiceType::class, [ 'required' => false, 'choices' => $list_cat, 'label' => $translator->trans('Category Layout Desktop', [], 'Modules.leoelements.Admin'), ]) ->add('leoe_layout_mobile', ChoiceType::class, [ 'required' => false, 'choices' => $list_cat, 'label' => $translator->trans('Category Layout Mobile', [], 'Modules.leoelements.Admin'), ]) ->add('leoe_layout_tablet', ChoiceType::class, [ 'required' => false, 'choices' => $list_cat, 'label' => $translator->trans('Category Layout Tablet', [], 'Modules.leoelements.Admin'), ]) ->add('leoe_extra_1', TranslatableType::class, [ 'required' => false, 'type' => TextWithRecommendedLengthType::class, 'label' => 'leoe_extra_1', 'options' => [ 'required' => false, 'input_type' => 'textarea', 'recommended_length' => 5000, ], ]) ->add('leoe_extra_2', TranslatableType::class, [ 'required' => false, 'type' => TextWithRecommendedLengthType::class, 'label' => 'leoe_extra_2', 'options' => [ 'required' => false, 'input_type' => 'textarea', 'recommended_length' => 5000, ], ]); $category = new Category($params['id']); $params['data']['leoe_layout'] = $category->leoe_layout; $params['data']['leoe_layout_mobile'] = $category->leoe_layout_mobile; $params['data']['leoe_layout_tablet'] = $category->leoe_layout_tablet; $params['data']['leoe_extra_1'] = $category->leoe_extra_1; $params['data']['leoe_extra_2'] = $category->leoe_extra_2; $formBuilder->setData($params['data']); } public function hookActionAfterUpdateCategoryFormHandler(array $params) { $this->updateContentCategory($params); } public function hookActionAfterCreateCategoryFormHandler(array $params) { $this->updateContentCategory($params); } public function updateContentCategory(array $params) { $id_category = $params['id']; $id_shop = $this->context->shop->id; $locales = $this->get('prestashop.adapter.legacy.context')->getLanguages(); $formData = $params['form_data']; $leoe_layout = $formData['leoe_layout']; $leoe_layout_mobile = $formData['leoe_layout_mobile']; $leoe_layout_tablet = $formData['leoe_layout_tablet']; $sql = 'UPDATE `' . _DB_PREFIX_ . 'category` SET `leoe_layout` = "'.pSQL($leoe_layout, true).'", `leoe_layout_mobile` = "'.pSQL($leoe_layout_mobile, true).'", `leoe_layout_tablet` = "'.pSQL($leoe_layout_tablet, true).'" WHERE `id_category` = "'.$id_category.'"'; Db::getInstance()->execute($sql); $sql = 'UPDATE `' . _DB_PREFIX_ . 'category_shop` SET `leoe_layout` = "'.pSQL($leoe_layout, true).'", `leoe_layout_mobile` = "'.pSQL($leoe_layout_mobile, true).'", `leoe_layout_tablet` = "'.pSQL($leoe_layout_tablet, true).'" WHERE `id_category` = "'.$id_category.'" AND `id_shop` = "'.$id_shop.'"'; Db::getInstance()->execute($sql); foreach ($locales as $locale) { $id_lang = $locale['id_lang']; $leoe_extra_1 = $formData['leoe_extra_1'][$id_lang]; $leoe_extra_2 = $formData['leoe_extra_2'][$id_lang]; $sql = 'UPDATE `' . _DB_PREFIX_ . 'category_lang` SET `leoe_extra_1` = "'.pSQL($leoe_extra_1, true).'", `leoe_extra_2` = "'.pSQL($leoe_extra_2, true).'" WHERE `id_category` = "'.$id_category.'" AND `id_shop` = "'.$id_shop.'" AND `id_lang` = "'.$id_lang.'"'; Db::getInstance()->execute($sql); } } public function hookProductMoreImg($list_pro) { $id_lang = Context::getContext()->language->id; //get product info // $product_list = $this->getProducts($list_pro, $id_lang); $product_list = $this->execProducts('s', ['product_ids'=> explode(',', $list_pro)], 0, null, null, 1); $this->smarty->assign(array( 'homeSize' => Image::getSize(ImageType::getFormattedName('home')), 'mediumSize' => Image::getSize(ImageType::getFormattedName('medium')) )); $obj = array(); foreach ($product_list as $product) { // $this->smarty->assign('product', $product); $this->context->smarty->assign(array( 'product' => $product, 'leoajax' => 1, )); $obj[] = array('id' => $product['id_product'], 'content' => ($this->display(__FILE__, 'product.tpl'))); } return $obj; } public function hookProductOneImg($list_pro) { $protocol_link = (Configuration::get('PS_SSL_ENABLED') || Tools::usingSecureMode()) ? 'https://' : 'http://'; $use_ssl = ((isset($this->ssl) && $this->ssl && Configuration::get('PS_SSL_ENABLED')) || Tools::usingSecureMode()) ? true : false; $protocol_content = ($use_ssl) ? 'https://' : 'http://'; $link = new Link($protocol_link, $protocol_content); $id_lang = Context::getContext()->language->id; $where = ' WHERE i.`id_product` IN ('.pSQL($list_pro).') AND (ish.`cover`=0 OR ish.`cover` IS NULL) AND ish.`id_shop` = '.Context::getContext()->shop->id; $order = ' ORDER BY i.`id_product`,`position`'; $limit = ' LIMIT 0,1'; //get product info $list_img = $this->getAllImages($id_lang, $where, $order, $limit); $saved_img = array(); $obj = array(); $this->smarty->assign(array( 'homeSize' => Image::getSize(ImageType::getFormattedName('home')), 'mediumSize' => Image::getSize(ImageType::getFormattedName('medium')), 'smallSize' => Image::getSize(ImageType::getFormattedName('small')) )); $image_name = 'home'; $image_name .= '_default'; foreach ($list_img as $product) { if (!in_array($product['id_product'], $saved_img)) { $obj[] = array( 'id' => $product['id_product'], 'content' => ($link->getImageLink($product['link_rewrite'], $product['id_image'], $image_name)), 'name' => $product['name'], ); } $saved_img[] = $product['id_product']; } return $obj; } public function hookProductAllOneImg($list_pro) { $protocol_link = (Configuration::get('PS_SSL_ENABLED') || Tools::usingSecureMode()) ? 'https://' : 'http://'; $use_ssl = ((isset($this->ssl) && $this->ssl && Configuration::get('PS_SSL_ENABLED')) || Tools::usingSecureMode()) ? true : false; $protocol_content = ($use_ssl) ? 'https://' : 'http://'; $link = new Link($protocol_link, $protocol_content); $id_lang = Context::getContext()->language->id; $image_product = Tools::getValue('image_product'); $where = ' WHERE i.`id_product` IN ('.pSQL($list_pro).') AND i.`id_image` NOT IN ('.pSQL($image_product).') AND ish.`id_shop` = '.Context::getContext()->shop->id; $order = ' ORDER BY i.`id_product`,`position`'; $limit = ' LIMIT 0,1'; //get product info $list_img = $this->getAllImages($id_lang, $where, $order, $limit); $saved_img = array(); $obj = array(); $this->smarty->assign(array( 'homeSize' => Image::getSize(ImageType::getFormattedName('home')), 'mediumSize' => Image::getSize(ImageType::getFormattedName('medium')), 'smallSize' => Image::getSize(ImageType::getFormattedName('small')) )); $image_name = 'home'; $image_name .= '_default'; foreach ($list_img as $product) { if (!in_array($product['id_product'], $saved_img)) { $obj[] = array( 'id' => $product['id_product'], 'content' => ($link->getImageLink($product['link_rewrite'], $product['id_image'], $image_name)), 'name' => $product['name'], ); } $saved_img[] = $product['id_product']; } return $obj; } public function hookProductAttributeOneImg($list_pro) { $list_all = explode(',', $list_pro); $str_id_product = ''; $str_id_product_attribute = ''; $data = array( 'product' => array( 'arr_id_product' => array(), 'str_id_product' => '', ), 'attribute' => array( 'arr_id_product' => array(), 'str_id_product' => '', 'str_id_attribute' => '', ), ); foreach ($list_all as $item) { $temp = explode('-', $item); if ((int)$temp[1] < 1) { # product $str_id_product .= (int)$temp[0] . ','; $data['product']['str_id_product'] .= (int)$temp[0] . ','; $data['product']['arr_id_product'][(int)$temp[0]] = (int)$temp[1]; } else { # attribute $str_id_product_attribute .= (int)$temp[0] . ','; $data['attribute']['str_id_product'] .= (int)$temp[0] . ','; $data['attribute']['str_id_attribute'] .= (int)$temp[1] . ','; $data['attribute']['arr_id_product'][(int)$temp[0]] = (int)$temp[1]; } } $data['product']['str_id_product'] = rtrim($data['product']['str_id_product'], ','); $data['attribute']['str_id_product'] = rtrim($data['attribute']['str_id_product'], ','); $data['attribute']['str_id_attribute'] = rtrim($data['attribute']['str_id_attribute'], ','); $protocol_link = (Configuration::get('PS_SSL_ENABLED') || Tools::usingSecureMode()) ? 'https://' : 'http://'; $use_ssl = ((isset($this->ssl) && $this->ssl && Configuration::get('PS_SSL_ENABLED')) || Tools::usingSecureMode()) ? true : false; $protocol_content = ($use_ssl) ? 'https://' : 'http://'; $link = new Link($protocol_link, $protocol_content); $saved_img = array(); $obj = array(); $this->smarty->assign(array( 'homeSize' => Image::getSize(ImageType::getFormattedName('home')), 'mediumSize' => Image::getSize(ImageType::getFormattedName('medium')), 'smallSize' => Image::getSize(ImageType::getFormattedName('small')) )); $image_name = 'home'; $image_name .= '_default'; # validate module // $limit = ''; if ($data['product']['str_id_product']) { # GET IMAGE OF PRODUCT $id_lang = Context::getContext()->language->id; $where = ' WHERE i.`id_product` IN ('.$data['product']['str_id_product'].') AND (ish.`cover`=0 OR ish.`cover` IS NULL) AND ish.`id_shop` = '.Context::getContext()->shop->id; $order = ' ORDER BY i.`id_product`,`position`'; // $limit = ' LIMIT 0,1'; $id_shop = Context::getContext()->shop->id; $sql = 'SELECT DISTINCT i.`id_product`, ish.`cover`, i.`id_image`, il.`legend`, i.`position`,pl.`link_rewrite`, pl.`name` FROM `'._DB_PREFIX_.'image` i LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (i.`id_product` = pl.`id_product`) AND pl.`id_lang` = '.(int)$id_lang.' LEFT JOIN `'._DB_PREFIX_.'image_shop` ish ON (ish.`id_image` = i.`id_image` AND ish.`id_shop` = '.(int)$id_shop.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')'.pSql($where).' '.pSQL($order); $image_product = Db::getInstance()->executeS($sql); if ($image_product) { foreach ($image_product as $product) { if (!in_array($product['id_product'], $saved_img)) { $obj[] = array( 'id' => $product['id_product'], 'id_product_attribute' => $product['id_product']. '-0', 'content' => ($link->getImageLink($product['link_rewrite'], $product['id_image'], $image_name)), 'name' => $product['name'], ); $saved_img[] = $product['id_product']; } } } } if ($data['attribute']['str_id_product'] && $data['attribute']['str_id_attribute']) { # GET IMAGE OF ATTRIBUTE $sql = 'SELECT DISTINCT i.`id_product`, pai.`id_product_attribute`, ish.`cover`, i.`id_image`, il.`legend`, i.`position`,pl.`link_rewrite`, pl.`name` FROM `'._DB_PREFIX_.'image` i INNER JOIN `'._DB_PREFIX_.'image_shop` ish ON (i.`id_image` = ish.`id_image` AND ish.`id_shop` = '.(int)$id_shop.') INNER JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') INNER JOIN `'._DB_PREFIX_.'product_attribute_image` pai ON (i.`id_image` = pai.`id_image` AND pai.`id_product_attribute` IN ('.$data['attribute']['str_id_attribute'].')) INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (i.`id_product` = pl.`id_product` AND pl.`id_lang` = 1 AND pl.`id_product` IN('.$data['attribute']['str_id_product'].')) ORDER BY pai.`id_product_attribute` ASC, i.`position` ASC'; $image_attribute = Db::getInstance()->executeS($sql); if ($image_attribute) { $index = array(); foreach ($image_attribute as $product) { if (isset($index[$product['id_product']])) { $index[$product['id_product']] += 1; } else { $index[$product['id_product']] = 1; } if (!in_array($product['id_product'], $saved_img)) { if ($index[$product['id_product']] == 2) { $obj[] = array( 'id' => $product['id_product'], 'id_product_attribute' => $product['id_product'] . '-' . $product['id_product_attribute'], 'content' => ($link->getImageLink($product['link_rewrite'], $product['id_image'], $image_name)), 'name' => $product['name'], ); $saved_img[] = $product['id_product']; } } } } } return $obj; } public function hookProductCdown($leo_pro_cdown) { $id_lang = Context::getContext()->language->id; $product_list = $this->execProducts('s', ['product_ids'=> explode(',', $leo_pro_cdown)], 0, null, null, 1); $obj = array(); $now = date('Y-m-d H:i:s'); $finish = $this->l('Expired'); foreach ($product_list as &$product) { $time = false; if (isset($product['specificPrice']['from']) && $product['specificPrice']['from'] > $now) { $time = strtotime($product['specificPrice']['from']); $product['finish'] = $finish; $product['check_status'] = 0; $product['lofdate'] = Tools::displayDate($product['specificPrice']['from']); } elseif (isset($product['specificPrice']['to']) && $product['specificPrice']['to'] > $now) { $time = strtotime($product['specificPrice']['to']); $product['finish'] = $finish; $product['check_status'] = 1; $product['lofdate'] = Tools::displayDate($product['specificPrice']['to']); } elseif (isset($product['specificPrice']['to']) && $product['specificPrice']['to'] == '0000-00-00 00:00:00') { $product['js'] = 'unlimited'; $product['finish'] = $this->l('Unlimited'); $product['check_status'] = 1; $product['lofdate'] = $this->l('Unlimited'); } else if (isset($product['specificPrice']['to'])) { $time = strtotime($product['specificPrice']['to']); $product['finish'] = $finish; $product['check_status'] = 2; $product['lofdate'] = Tools::displayDate($product['specificPrice']['from']); } if ($time) { $product['js'] = array( 'month' => date('m', $time), 'day' => date('d', $time), 'year' => date('Y', $time), 'hour' => date('H', $time), 'minute' => date('i', $time), 'seconds' => date('s', $time) ); } $this->context->smarty->assign(array( 'product' => $product, 'leoajax' => 1, )); $obj[] = array('id' => $product['id_product'], 'content' => ($this->display(__FILE__, 'cdown.tpl'))); } return $obj; } public function hookGetProductAttribute($full_attribute, $size) { $list_pro = array_merge($full_attribute, $size); $result = array(); foreach ($list_pro as $key => $value) { $result[$value] = array('id_product' => $value); } //get product info $attribute = $this->getAttributesList($result); if (isset($result)) { foreach ($result as &$product) { if (isset($attribute['render_attr'])) { foreach ($attribute['render_attr'] as $key) { if (isset($attribute[$key][$product['id_product']])) { $product['attribute'][$key] = $attribute[$key][$product['id_product']]; } } } if (isset($attribute['Color'][$product['id_product']])) { $product['main_variants'] = $attribute['Color'][$product['id_product']]; } } } $list_pro = array(); if ($full_attribute) { $list_pro['attribute'] = array(); foreach ($full_attribute as $value) { $this->context->smarty->assign(array( 'product' => $result[$value], 'leoajax' => 1, )); $list_pro['attribute'][$value] = $this->fetch('module:leoelements/views/templates/front/products/product_full_attribute.tpl'); } } if ($size) { $list_pro['size'] = array(); foreach ($size as $value) { $this->context->smarty->assign(array( 'product' => $result[$value], 'leoajax' => 1, )); $list_pro['size'][$value] = $this->fetch('module:leoelements/views/templates/front/products/product_size.tpl'); } } return $list_pro; } public static function getSpecificPriceById($id_specific_price) { if (!SpecificPrice::isFeatureActive()) { return array(); } $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT * FROM `'._DB_PREFIX_.'specific_price` sp WHERE `id_specific_price` ='.(int)$id_specific_price); return $res; } public function getAllImages($id_lang, $where, $order) { $id_shop = Context::getContext()->shop->id; $sql = 'SELECT DISTINCT i.`id_product`, ish.`cover`, i.`id_image`, il.`legend`, i.`position`,pl.`link_rewrite`, pl.`name` FROM `'._DB_PREFIX_.'image` i LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (i.`id_product` = pl.`id_product`) AND pl.`id_lang` = '.(int)$id_lang.' LEFT JOIN `'._DB_PREFIX_.'image_shop` ish ON (ish.`id_image` = i.`id_image` AND ish.`id_shop` = '.(int)$id_shop.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')'.pSql($where).' '.pSQL($order); return Db::getInstance()->executeS($sql); } public static function getAttributesList(array $products, $have_stock = true) { // validate module unset($have_stock); if (!count($products)) { return array(); } $products_id = array(); foreach ($products as &$product) { $products_id[] = (int) $product['id_product']; } $id_lang = Context::getContext()->language->id; $check_stock = !Configuration::get('PS_DISP_UNAVAILABLE_ATTR'); if (!$res = Db::getInstance()->executeS( 'SELECT pa.`id_product`, a.`color`, pac.`id_product_attribute`, ag.`group_type`, agl.`name` AS group_name, '.(version_compare(Configuration::get('PS_VERSION_DB'), '8.0.0', '>=') ? 'stock' : 'pa').'.`quantity` AS quantity,' . ($check_stock ? 'SUM(IF(stock.`quantity` > 0, 1, 0))' : '0') . ' qty, a.`id_attribute`, al.`name`, IF(color = "", a.id_attribute, color) group_by FROM `' . _DB_PREFIX_ . 'product_attribute` pa ' . Shop::addSqlAssociation('product_attribute', 'pa') . Product::sqlStock('pa', 'pa') . ' JOIN `' . _DB_PREFIX_ . 'product_attribute_combination` pac ON (pac.`id_product_attribute` = product_attribute_shop.`id_product_attribute`) JOIN `' . _DB_PREFIX_ . 'attribute` a ON (a.`id_attribute` = pac.`id_attribute`) JOIN `' . _DB_PREFIX_ . 'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = ' . (int) $id_lang . ') JOIN `' . _DB_PREFIX_ . 'attribute_group` ag ON (a.id_attribute_group = ag.`id_attribute_group`) JOIN '._DB_PREFIX_.'attribute_group_lang agl ON (agl.`id_attribute_group`=ag.`id_attribute_group`) WHERE pa.`id_product` IN (' . implode(array_map('intval', $products_id), ',') . ') GROUP BY pa.`id_product`, a.`id_attribute`, `group_by` ' . ($check_stock ? 'HAVING qty > 0' : '') . ' ORDER BY a.`position` ASC;' )) { return false; } $link = new Link(); $attribute = array(); foreach ($res as &$row) { $row['url'] = $link->getProductLink($row['id_product'], null, null, null, null, null, $row['id_product_attribute']); if ($row['group_name'] == 'Color') { //color $row['texture'] = ''; if (@filemtime(_PS_COL_IMG_DIR_ . $row['id_attribute'] . '.jpg')) { $row['texture'] = _THEME_COL_DIR_ . $row['id_attribute'] . '.jpg'; } elseif (Tools::isEmpty($row['color'])) { continue; } $attribute[str_replace(' ', '_', trim($row['group_name']))][$row['id_product']][] = array('id_product_attribute' => (int) $row['id_product_attribute'], 'group_type' => $row['group_type'], 'group_name' => $row['group_name'], 'color' => $row['color'], 'texture' => $row['texture'], 'id_product' => $row['id_product'], 'name' => $row['name'], 'id_attribute' => $row['id_attribute'], 'url' => $row['url'] ); $attribute['render_attr'][]= $row['group_name']; } else { if ($row['group_name'] == 'Size') { $row['quantity'] = 0; $product = new Product($row['id_product']); $attribute_combination = $product->getAttributeCombinations(); foreach ($attribute_combination as $combination) { if ($combination['attribute_name'] == $row['name']) { $row['quantity'] += $combination['quantity']; } } } $attribute[str_replace(' ', '_', trim($row['group_name']))][$row['id_product']][] = $row; $attribute['render_attr'][]= str_replace(' ', '_', trim($row['group_name'])); } } $attribute['render_attr'] = array_unique($attribute['render_attr']); return $attribute; } /** * FIX BUG 1.7.3.3 : install theme lose hook displayHome, displayLeoProfileProduct * because ajax not run hookActionAdminBefore(); */ public function autoRestoreSampleData() { $theme_manager = new stdclass(); $theme_manager->theme_manager = 'theme_manager'; $this->hookActionAdminBefore(array( 'controller' => $theme_manager, )); } public function hookActionAdminBefore($params) { if (isset($params) && isset($params['controller']) && isset($params['controller']->theme_manager)) { // Validate : call hook from theme_manager $this->log('hookActionAdminBefore'); } else { // Other module call this hook -> duplicate data return; } $this->unregisterHook('actionAdminBefore'); # FIX THEME_CHILD NOT EXIST TPL FILE -> AUTO COPY TPL FILE FROM THEME_PARENT $assets = Context::getContext()->shop->theme->get('assets'); $theme_parent = Context::getContext()->shop->theme->get('parent'); if (is_array($assets) && isset($assets['use_parent_assets']) && $assets['use_parent_assets'] && $theme_parent) { $from = _PS_ALL_THEMES_DIR_.$theme_parent.'/modules/leoelements'; $to = _PS_ALL_THEMES_DIR_.apPageHelper::getInstallationThemeName().'/modules/leoelements'; apPageHelper::createDir($to); Tools::recurseCopy($from, $to); } # FIX : update Prestashop by 1-Click module -> NOT NEED RESTORE DATABASE $ap_version = Configuration::get('AP_CURRENT_VERSION'); if ($ap_version != false) { $ps_version = Configuration::get('PS_VERSION_DB'); $versionCompare = version_compare($ap_version, $ps_version); if ($versionCompare != 0) { // Just update Prestashop Configuration::updateValue('AP_CURRENT_VERSION', $ps_version); return; } } # WHENE INSTALL THEME, INSERT HOOK FROM DATASAMPLE IN THEME $hook_from_theme = false; if (file_exists(_PS_MODULE_DIR_.'leoelements/libs/LeoDataSample.php')) { require_once(_PS_MODULE_DIR_.'leoelements/libs/LeoDataSample.php'); $sample = new Datasample(); if ($sample->processHook($this->name)) { $hook_from_theme = true; }; } # INSERT HOOK FROM MODULE_DATASAMPLE if ($hook_from_theme == false) { $this->registerLeoHook(); } # WHEN INSTALL MODULE, NOT NEED RESTORE DATABASE IN THEME $install_module = (int)Configuration::get('AP_INSTALLED_leoelements', 0); if ($install_module) { Configuration::updateValue('AP_INSTALLED_leoelements', '0'); return; } # INSERT DATABASE FROM THEME_DATASAMPLE if (file_exists(_PS_MODULE_DIR_.'leoelements/libs/LeoDataSample.php')) { require_once(_PS_MODULE_DIR_.'leoelements/libs/LeoDataSample.php'); $sample = new Datasample(); $sample->processImport($this->name); } # REMOVE FILE INDEX.PHP FOR TRANSLATE if (file_exists(_PS_MODULE_DIR_.'leoelements/libs/setup.php')) { require_once(_PS_MODULE_DIR_.'leoelements/libs/setup.php'); ApPageSetup::processTranslateTheme(); } } public static function log($msg, $is_ren = true) { if ($is_ren) { if (!is_dir(_PS_ROOT_DIR_.'/log')) { mkdir(_PS_ROOT_DIR_.'/log', 0755, true); } error_log("\r\n".date('m-d-y H:i:s', time()).': '.$msg, 3, _PS_ROOT_DIR_.'/log/leoelements.log'); } } public function renderWidget2($hookName = null, array $config = array()) { $ids_post = []; // $disable_cache = false; //some hook need disable cache get from config of profile // $disable_cache_hook = isset($this->profile_param['disable_cache_hook']) ? $this->profile_param['disable_cache_hook'] : LeoECSetting::getCacheHook(3); // if (!$this->all_active_profile) { // $model = new LeoElementsProfilesModel(); // $this->all_active_profile = $model->getAllProfileByShop(); // } // if (!$this->use_profiles) { // $this->use_profiles = LeoElementsProfilesModel::getActiveProfile('index', $this->all_active_profile); // // if (!$this->use_profiles) { // return ''; // } // } // $disable_cache_hook = json_decode($this->use_profiles['params'], true)['disable_cache_hook']; // if (isset($disable_cache_hook[$hookName]) && $disable_cache_hook[$hookName]) { // $disable_cache = true; // } // //disable cache when submit newletter // if (Tools::isSubmit('submitNewsletter')) { // $disable_cache = true; // } // //disable cache // if (!Configuration::get('PS_SMARTY_CACHE')) { // $disable_cache = true; // } if (preg_match('/^displayBanner\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayBanner'] && !self::$leo_txt['hooks']['displayBanner'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayBanner'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayNav1\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayNav1'] && !self::$leo_txt['hooks']['displayNav1'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayNav1'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayNav2\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayNav2'] && !self::$leo_txt['hooks']['displayNav2'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayNav2'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayTop\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayTop'] && !self::$leo_txt['hooks']['displayTop'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayTop'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayNavFullWidth\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayNavFullWidth'] && !self::$leo_txt['hooks']['displayNavFullWidth'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayNavFullWidth'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayHome\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayHome'] && !self::$leo_txt['hooks']['displayHome'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayHome'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayLeftColumn\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayLeftColumn'] && !self::$leo_txt['hooks']['displayLeftColumn'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayLeftColumn'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayRightColumn\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayRightColumn'] && !self::$leo_txt['hooks']['displayRightColumn'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayRightColumn'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayFooterBefore\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayFooterBefore'] && !self::$leo_txt['hooks']['displayFooterBefore'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayFooterBefore'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayFooter\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayFooter'] && !self::$leo_txt['hooks']['displayFooter'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayFooter'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayFooterAfter\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayFooterAfter'] && !self::$leo_txt['hooks']['displayFooterAfter'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayFooterAfter'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayHeaderCategory\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayHeaderCategory'] && !self::$leo_txt['hooks']['displayHeaderCategory'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayHeaderCategory'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayFooterCategory\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayFooterCategory'] && !self::$leo_txt['hooks']['displayFooterCategory'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayFooterCategory'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayReassurance\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayReassurance'] && !self::$leo_txt['hooks']['displayReassurance'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayReassurance'], 'before' => '', 'after' => '' ]; } if (preg_match('/^displayFooterProduct\d*$/', $hookName)) { if( !self::$leo_txt['hooks']['displayFooterProduct'] && !self::$leo_txt['hooks']['displayFooterProduct'] ){ return; } $ids_post[] = [ 'id' => self::$leo_txt['hooks']['displayFooterProduct'], 'before' => '', 'after' => '' ]; } $content = ''; foreach( $ids_post as $value ) { Leo_Helper::$id_post = $value['id']; $get_content = $this->getWidgetVariables($hookName); if( $get_content ){ $content .= $value['before'] . $get_content . $value['after']; } } if ( Tools::getIsset('front_token') && Tools::getValue('key_related') != 'displayFooterAfter') { if($hookName == 'displayFooter') { $content = $content . ''; } } // if(isset($_GET['key_related'])) // if($hookName == 'displayFooter') { // $content = $content . ''; // } return $content; } protected function getCacheId($hookName = null) { $cache_array = array(); // echo '
' . "\n";
////        echo 'all_active_profile';
////        print_r($this->all_active_profile);
//        echo 'use_profiles';
//        print_r($this->use_profiles);
//        echo '
' . "\n"; // die(); //process nomal cache for each hook //create folder cache for each home by id or buy home name if (!isset($this->use_profiles['id_leoelements_profiles'])) { $this->use_profiles = LeoElementsProfilesModel::getActiveProfile('index', $this->all_active_profile); } $cache_array[] = $this->use_profiles['id_leoelements_profiles']; //set cache for each hook in profile $cache_array[] = $hookName; //kiem tra xem module confg if ($this->use_profiles && isset($this->use_profiles[$hookName]) && $this->use_profiles[$hookName]) { $current_page = leoECHelper::getPageName(); $iscached = 0; //check cache in sub page if (($current_page == "category" || $current_page == 'product')) { if (isset($this->use_profiles[$hookName]['nocategory'])) { if (in_array(Tools::getValue('id_category'), $this->use_profiles[$hookName]['nocategory'])) { $cache_array[] = Tools::getValue('id_category'); $iscached = 1; } } if (isset($this->use_profiles[$hookName]['nocategoryproduct'])) { if (in_array(Tools::getValue('id_category'), $this->use_profiles[$hookName]['nocategoryproduct'])) { $cache_array[] = Tools::getValue('id_category'); $iscached = 1; } } if (!$iscached && $current_page == "category" && isset($this->use_profiles[$hookName]['categoryproduct'])) { if (in_array(Tools::getValue('id_category'), $this->use_profiles[$hookName]['categoryproduct'])) { $cache_array[] = Tools::getValue('id_category'); $iscached = 1; } } if (!$iscached && $current_page == "category" && isset($this->use_profiles[$hookName]['categoryproductmain'])) { if (in_array(Tools::getValue('id_category'), $this->use_profiles[$hookName]['categoryproductmain'])) { $cache_array[] = Tools::getValue('id_category'); $iscached = 1; } } //product in no category if (!$iscached && $current_page == "product" && isset($this->use_profiles[$hookName]['nocategoryproduct'])) { $procate = Product::getProductCategoriesFull(Tools::getValue('id_product')); $procheck = 0; foreach ($procate as $proc) { if (in_array($proc['id_category'], $this->use_profiles[$hookName]['nocategoryproduct'])) { $procheck = 1; } } if ($procheck == 1) { $cache_array[] = 'product_'.Tools::getValue('id_product'); $iscached = 1; } } //product in category if (!$iscached && $current_page == "product" && isset($this->use_profiles[$hookName]['categoryproduct'])) { $procate = Product::getProductCategoriesFull(Tools::getValue('id_product')); $procheck = 0; foreach ($procate as $proc) { if (in_array($proc['id_category'], $this->use_profiles[$hookName]['categoryproduct'])) { $procheck = 1; } } if ($procheck == 1) { $cache_array[] = 'product_'.Tools::getValue('id_product'); $iscached = 1; } } //product in main category if (!$iscached && $current_page == "product" && isset($this->use_profiles[$hookName]['categoryproduct'])) { $procate = new Product(Tools::getValue('id_product')); if (in_array($procate['id_category_default'], $this->use_profiles[$hookName]['categoryproduct'])) { $cache_array[] = 'product_'.Tools::getValue('id_product'); $iscached = 1; } } } //cache big page if (!$iscached && isset($this->use_profiles[$hookName][$current_page])) { $cache_array[] = $current_page; $iscached = 1; } //cache big page not show if (!$iscached && isset($this->use_profiles[$hookName]['exception']) && in_array($cache_array, $this->use_profiles[$hookName]['exception'])) { //show but not in controller $cache_array[] = $current_page; $iscached = 1; } //random in product carousel if (isset($this->use_profiles[$hookName]['productCarousel'])) { $random = round(rand(1, max(Configuration::get('APPAGEBUILDER_PRODUCT_MAX_RANDOM'), 1))); $cache_array[] = "p_carousel_$random"; } if (isset($this->use_profiles[$hookName][$current_page])) { $cache_array[] = $current_page; if ($current_page != 'index' && $cache_id = LeoECSetting::getControllerId($current_page, $this->use_profiles[$hookName][$current_page])) { $cache_array[] = $cache_id; } } else if (isset($this->use_profiles[$hookName]['nocategory']) || isset($this->use_profiles[$hookName]['categoryproduct'])) { if (in_array(Tools::getValue('id_category'), $this->use_profiles[$hookName]['nocategory'])) { $cache_array[] = Tools::getValue('id_category'); } } else if (isset($this->use_profiles[$hookName]['categoryproduct']) && ($current_page == "category" || $current_page == 'product')) { if ($current_page == 'category') { if (!LeoECSetting::getControllerId($current_page, $this->use_profiles[$hookName]['categoryproduct'])) { $cache_array[] = Tools::getValue('id_category'); } } else { $procate = Product::getProductCategoriesFull(Tools::getValue('id_product')); $procheck = 0; foreach ($procate as $proc) { if (in_array($proc['id_category'], $this->use_profiles[$hookName]['categoryproduct'])) { $procheck = 1; } } if ($procheck == 0) { $cache_array[] = Tools::getValue('id_product'); } } } } if (Tools::getValue('plist_key')&& Tools::getIsset('leopanelchange')) { $cache_array[] = 'plist_key_'.Tools::getValue('plist_key'); } if (Tools::getValue('header') && Tools::getIsset('leopanelchange') && (in_array($hookName, LeoECSetting::getHook('header')) || $hookName == 'leoECatConfig|header')) { $cache_array[] = 'header_'.Tools::getValue('header'); } if (Tools::getValue('content')&& Tools::getIsset('leopanelchange') && (in_array($hookName, LeoECSetting::getHook('content')) || $hookName == 'leoECatConfig|content')) { $cache_array[] = 'content_'.Tools::getValue('content'); } if (Tools::getValue('product')&& Tools::getIsset('leopanelchange') && (in_array($hookName, LeoECSetting::getHook('product')) || $hookName == 'leoECatConfig|product')) { $cache_array[] = 'product_'.Tools::getValue('product'); } if (Tools::getValue('footer') && Tools::getIsset('leopanelchange') && (in_array($hookName, LeoECSetting::getHook('footer')) || $hookName == 'leoECatConfig|footer')) { $cache_array[] = 'footer_'.Tools::getValue('footer'); } if (Context::getContext()->isTablet()) { $cache_array[] = "tablet"; } elseif (Context::getContext()->isMobile()) { $cache_array[] = "mobile"; }else{ $cache_array[] = "desktop"; } return parent::getCacheId().'|'.implode('|', $cache_array); } public function aProduct( $id_product ) { $products = []; $id_lang = (int)$this->context->language->id; $id_shop = (int)$this->context->shop->id; $product = new Product( $id_product, false, $id_lang, $id_shop, $this->context ); // echo '
' . "\n";
//        print_r($product);
//        echo '
' . "\n"; // die(); // dump($product); // die('a'); if ( Validate::isLoadedObject($product) ) { $product->id_product = (int)$id_product; $products[]= (array)$product; }else{ return; } $products = $this->convertProducts( $products ); return $products[0]; } public function hookActionOutputHTMLBefore(&$params) { # LEO OPTIMIZE - BEGIN if (file_exists(_PS_MODULE_DIR_.'leoelements/libs/LeoOptimization.php')) { require_once(_PS_MODULE_DIR_.'leoelements/libs/LeoOptimization.php'); if (class_exists('LeoOptimization')) { $params['runtime'] = 1; LeoOptimization::getInstance()->processOptimization($params); } } # LEO OPTIMIZE - END } }