Files
kalsport.pl/modules/appagebuilder/appagebuilder.php
2024-11-05 12:22:50 +01:00

4092 lines
197 KiB
PHP

<?php
/**
* 2007-2015 Apollotheme
*
* NOTICE OF LICENSE
*
* ApPageBuilder is module help you can build content for your shop
*
* DISCLAIMER
*
* @author Apollotheme <apollotheme@gmail.com>
* @copyright Apollotheme
* @license http://apollotheme.com - prestashop template provider
*/
if (!defined('_PS_VERSION_')) {
# module validation
exit;
}
use PrestaShop\PrestaShop\Core\Module\WidgetInterface;
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/Helper.php');
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoFrameworkHelper.php');
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoOptimization.php');
require_once(_PS_MODULE_DIR_.'appagebuilder/classes/ApPageSetting.php');
require_once(_PS_MODULE_DIR_.'appagebuilder/classes/ApPageBuilderModel.php');
require_once(_PS_MODULE_DIR_.'appagebuilder/classes/ApPageBuilderProfilesModel.php');
require_once(_PS_MODULE_DIR_.'appagebuilder/classes/ApPageBuilderProductsModel.php');
require_once(_PS_MODULE_DIR_.'appagebuilder/classes/ApPageBuilderShortcodeModel.php');
class APPageBuilder extends Module implements WidgetInterface
{
protected $default_language;
protected $languages;
protected $theme_name;
protected $data_index_hook;
protected $profile_data;
protected $all_active_profile;
protected $hook_index_data;
protected $profile_param;
protected $path_resource;
protected $product_active;
protected $backup_dir;
protected $header_content;
protected $_confirmations = array();
protected $_errors = array();
protected $_warnings = array();
private $templateFile;
public function __construct()
{
$this->name = 'appagebuilder';
$this->module_key = '9da746af2f0aa356120277ab2a148484';
$this->tab = 'front_office_features';
$this->version = '2.4.1';
$this->author = 'ApolloTheme';
$this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_);
$this->need_instance = 0;
$this->secure_key = Tools::encrypt($this->name);
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('Apollo Page Builder');
$this->description = $this->l('Apollo Page Builder build content for your site.');
$this->theme_name = apPageHelper::getThemeName();
$this->default_language = Language::getLanguage(Context::getContext()->language->id);
$this->languages = Language::getLanguages();
$this->path_resource = $this->_path.'views/';
$this->templateFile = 'module:appagebuilder/views/templates/hook/appagebuilder.tpl';
}
public static function getInstance()
{
static $_instance;
if (!$_instance) {
$_instance = new APPageBuilder();
}
return $_instance;
}
public function install()
{
require_once(_PS_MODULE_DIR_.$this->name.'/libs/setup.php');
//DONGND:: build shortcode, create folder for override
apPageHelper::createShortCode();
if (!parent::install() || !ApPageSetup::installConfiguration() || !ApPageSetup::createTables() || !ApPageSetup::installModuleTab() || !$this->registerLeoHook()) {
return false;
}
# NOT LOAD DATASAMPLE AGAIN
Configuration::updateValue('AP_INSTALLED_APPAGEBUILDER', '1');
# REMOVE FILE INDEX.PHP FOR TRANSLATE
ApPageSetup::processTranslateTheme();
Configuration::updateValue('APPAGEBUILDER_OVERRIDED', 1);
$this->installHostDemo();
return true;
}
public function uninstall()
{
require_once(_PS_MODULE_DIR_.$this->name.'/libs/setup.php');
#shortcode to tinymce : rollback default file config for tinymce
Tools::copy(_PS_MODULE_DIR_.$this->name.'/views/js/shortcode/backup/tinymce.inc.js', _PS_ROOT_DIR_.'/js/admin/tinymce.inc.js');
#shortcode to tinymce : CATEGORY IN ADMIN
Tools::copy(_PS_MODULE_DIR_.'appagebuilder/views/js/shortcode/backup/category.bundle.js', _PS_ADMIN_DIR_.'/themes/new-theme/public/category.bundle.js');
#shortcode to tinymce : CMS PAGE IN ADMIN
Tools::copy(_PS_MODULE_DIR_.'appagebuilder/views/js/shortcode/backup/cms_page_form.bundle.js', _PS_ADMIN_DIR_.'/themes/new-theme/public/cms_page_form.bundle.js');
if (!parent::uninstall()|| !ApPageSetup::uninstallModuleTab() || !ApPageSetup::deleteTables() || !ApPageSetup::uninstallConfiguration()) {
return false;
}
//DONGND:: remove overrider folder
// $this->uninstallOverrides();
Configuration::updateValue('APPAGEBUILDER_OVERRIDED', 0);
return true;
}
public function hookActionModuleRegisterHookAfter($params)
{
if (isset($params['hook_name']) && ($params['hook_name'] == 'header' || $params['hook_name']=='displayheader')) {
if ($this->getConfig('MOVE_END_HEADER')) {
$hook_name = 'header';
$id_hook = Hook::getIdByName($hook_name);
$id_module = $this->id;
$id_shop = Context::getContext()->shop->id;
// Get module position in hook
$sql = 'SELECT MAX(`position`) AS position
FROM `'._DB_PREFIX_.'hook_module`
WHERE `id_hook` = '.(int)$id_hook.' AND `id_shop` = '.(int)$id_shop . ' AND id_module != '.(int) $id_module;
if (!$position = Db::getInstance()->getValue($sql)) {
$position = 0;
}
$sql = 'UPDATE `'._DB_PREFIX_.'hook_module'.'` SET `position` =' . (int)($position + 1) . ' WHERE '
. '`id_module` = '.(int) $id_module
. ' AND `id_hook` = '.(int) $id_hook
. ' AND `id_shop` = '.(int) $id_shop;
Db::getInstance()->execute($sql);
}
}
}
public function postProcess()
{
if (count($this->errors) > 0) {
return;
}
if (Tools::isSubmit('installdemo')) {
require_once(_PS_MODULE_DIR_.$this->name.'/libs/setup.php');
ApPageSetup::installSample();
} else if (Tools::isSubmit('resetmodule')) {
require_once(_PS_MODULE_DIR_.$this->name.'/libs/setup.php');
ApPageSetup::createTables(1);
} else if (Tools::isSubmit('deleteposition')) {
apPageHelper::processDeleteOldPosition();
$this->_confirmations[] = 'POSITIONS NOT USE have been deleted successfully.';
} else if (Tools::isSubmit('submitUpdateModule')) {
apPageHelper::processCorrectModule();
$this->_confirmations[] = 'Update and Correct Module is successful';
} else if (Tools::isSubmit('backup')) {
$this->processBackup();
$this->_confirmations[] = 'Back-up to PHP file is successful';
} else if (Tools::isSubmit('restore')) {
$this->processRestore();
$this->_confirmations[] = 'Restore Back-up File is successful';
} else if (Tools::isSubmit('autochangelazy')) {
$this->processLazyImg();
$this->_confirmations[] = 'You change img src to data-src';
} else if (Tools::isSubmit('autorolbacklazy')) {
$this->processRolbaclLazyImg();
$this->_confirmations[] = 'You change img data-src to src';
} else if (Tools::isSubmit('autodatabaselazy')) {
$this->processDatabaseLazy();
$this->_confirmations[] = 'You change src to data-src in database';
} else if (Tools::isSubmit('autorolbackdatabaselazy')) {
$this->processRolbackDatabaseLazy();
$this->_confirmations[] = 'You change data-src to src';
} else if (Tools::isSubmit('submitApPageBuilder')) {
$load_owl = Tools::getValue('APPAGEBUILDER_LOAD_OWL');
$header_hook = Tools::getValue('APPAGEBUILDER_HEADER_HOOK');
$content_hook = Tools::getValue('APPAGEBUILDER_CONTENT_HOOK');
$footer_hook = Tools::getValue('APPAGEBUILDER_FOOTER_HOOK');
$product_hook = Tools::getValue('APPAGEBUILDER_PRODUCT_HOOK');
Configuration::updateValue('APPAGEBUILDER_LOAD_OWL', (int)$load_owl);
Configuration::updateValue('APPAGEBUILDER_LOAD_SWIPER', Tools::getValue('APPAGEBUILDER_LOAD_SWIPER'));
Configuration::updateValue('APPAGEBUILDER_LOAD_SLICK', Tools::getValue('APPAGEBUILDER_LOAD_SLICK'));
Configuration::updateValue('APPAGEBUILDER_COOKIE_PROFILE', Tools::getValue('APPAGEBUILDER_COOKIE_PROFILE'));
Configuration::updateValue('APPAGEBUILDER_SLIDE_IMAGE', Tools::getValue('APPAGEBUILDER_SLIDE_IMAGE'));
Configuration::updateValue('APPAGEBUILDER_HEADER_HOOK', $header_hook);
Configuration::updateValue('APPAGEBUILDER_CONTENT_HOOK', $content_hook);
Configuration::updateValue('APPAGEBUILDER_FOOTER_HOOK', $footer_hook);
Configuration::updateValue('APPAGEBUILDER_PRODUCT_HOOK', $product_hook);
// Configuration::updateValue('APPAGEBUILDER_LOAD_AJAX', Tools::getValue('APPAGEBUILDER_LOAD_AJAX'));
Configuration::updateValue('APPAGEBUILDER_LOAD_STELLAR', Tools::getValue('APPAGEBUILDER_LOAD_STELLAR'));
Configuration::updateValue('APPAGEBUILDER_LOAD_WAYPOINTS', Tools::getValue('APPAGEBUILDER_LOAD_WAYPOINTS'));
Configuration::updateValue('APPAGEBUILDER_LOAD_INSTAFEED', Tools::getValue('APPAGEBUILDER_LOAD_INSTAFEED'));
Configuration::updateValue('APPAGEBUILDER_LOAD_IMAGE360', Tools::getValue('APPAGEBUILDER_LOAD_IMAGE360'));
Configuration::updateValue('APPAGEBUILDER_LOAD_IMAGEHOTPOT', Tools::getValue('APPAGEBUILDER_LOAD_IMAGEHOTPOT'));
Configuration::updateValue('APPAGEBUILDER_LOAD_HTML5VIDEO', Tools::getValue('APPAGEBUILDER_LOAD_HTML5VIDEO'));
Configuration::updateValue('APPAGEBUILDER_SAVE_MULTITHREARING', Tools::getValue('APPAGEBUILDER_SAVE_MULTITHREARING'));
Configuration::updateValue('APPAGEBUILDER_SAVE_SUBMIT', Tools::getValue('APPAGEBUILDER_SAVE_SUBMIT'));
Configuration::updateValue('APPAGEBUILDER_LOAD_PRODUCTZOOM', Tools::getValue('APPAGEBUILDER_LOAD_PRODUCTZOOM'));
Configuration::updateValue('APPAGEBUILDER_LOAD_TABCOLLAPSE', Tools::getValue('APPAGEBUILDER_LOAD_TABCOLLAPSE'));
Configuration::updateValue('APPAGEBUILDER_LOAD_LAZY', Tools::getValue('APPAGEBUILDER_LOAD_LAZY'));
Configuration::updateValue('APPAGEBUILDER_LOAD_NUMSCROLLER', Tools::getValue('APPAGEBUILDER_LOAD_NUMSCROLLER'));
Configuration::updateValue('APPAGEBUILDER_LOAD_FULLPAGEJS', Tools::getValue('APPAGEBUILDER_LOAD_FULLPAGEJS'));
Configuration::updateValue('APPAGEBUILDER_LOAD_PN', Tools::getValue('APPAGEBUILDER_LOAD_PN'));
Configuration::updateValue('APPAGEBUILDER_LOAD_TRAN', Tools::getValue('APPAGEBUILDER_LOAD_TRAN'));
Configuration::updateValue('APPAGEBUILDER_LOAD_IMG', Tools::getValue('APPAGEBUILDER_LOAD_IMG'));
Configuration::updateValue('APPAGEBUILDER_LOAD_COUNT', Tools::getValue('APPAGEBUILDER_LOAD_COUNT'));
// Configuration::updateValue('APPAGEBUILDER_LOAD_COLOR', Tools::getValue('APPAGEBUILDER_LOAD_COLOR'));
Configuration::updateValue('APPAGEBUILDER_COLOR', Tools::getValue('APPAGEBUILDER_COLOR'));
// Configuration::updateValue('APPAGEBUILDER_LOAD_ACOLOR', Tools::getValue('APPAGEBUILDER_LOAD_ACOLOR'));
Configuration::updateValue('APPAGEBUILDER_PRODUCT_MAX_RANDOM', Tools::getValue('APPAGEBUILDER_PRODUCT_MAX_RANDOM'));
Configuration::updateValue('APPAGEBUILDER_LOAD_COOKIE', Tools::getValue('APPAGEBUILDER_LOAD_COOKIE'));
Configuration::updateValue('APPAGEBUILDER_CHECK_UPDATE', 1);
//nghiatd - update extrafield
$this->saveConfigExtrafields('APPAGEBUILDER_PRODUCT_TEXTEXTRA', 'APPAGEBUILDER_PRODUCT_EDITOREXTRA', 'product');
$this->saveConfigExtrafields('APPAGEBUILDER_CATEGORY_TEXTEXTRA', 'APPAGEBUILDER_CATEGORY_EDITOREXTRA', 'category');
}
}
public function getContent()
{
$this->errors = array();
if (!$this->access('configure')) {
$this->errors[] = $this->trans('You do not have permission to configure this.', array(), 'Admin.Notifications.Error');
$this->context->smarty->assign('errors', $this->errors);
}
$this->postProcess();
$output = '';
$this->backup_dir = str_replace('\\', '/', _PS_CACHE_DIR_.'backup/modules/appagebuilder/');
$create_profile_link = $this->context->link->getAdminLink('AdminApPageBuilderProfiles').'&addappagebuilder_profiles';
$profile_link = $this->context->link->getAdminLink('AdminApPageBuilderProfiles');
$position_link = $this->context->link->getAdminLink('AdminApPageBuilderPositions');
$product_link = $this->context->link->getAdminLink('AdminApPageBuilderProducts');
$path_guide = _PS_MODULE_DIR_.$this->name.'/views/templates/admin/guide.tpl';
$guide_box = ApPageSetting::buildGuide($this->context, $path_guide, 1);
$module_link = $this->context->link->getAdminLink('AdminModules', false)
.'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules');
$back_up_file = @Tools::scandir($this->backup_dir, 'php');
arsort($back_up_file);
$data = Tools::jsonEncode(
array(
'theme_name' => $this->context->shop->theme_name,
'shop_name' => $this->context->shop->name,
'shop_url' => $this->context->link->getPageLink('index', true),
'email' => $this->context->employee->email,
'name' => $this->context->employee->firstname.' '.$this->context->employee->lastname,
'module_name' => $this->name,
'version' => $this->version,
)
);
$this->context->smarty->assign(array(
'guide_box' => $guide_box,
'create_profile_link' => $create_profile_link,
'profile_link' => $profile_link,
'position_link' => $position_link,
'product_link' => $product_link,
'module_link' => $module_link,
'back_up_file' => $back_up_file,
'backup_dir' => $this->backup_dir,
'module_version' => $this->version,
'data_shop' => $data,
'check_update' => Configuration::get('APPAGEBUILDER_CHECK_UPDATE', 0)
));
$output = $this->generateLeoHtmlMessage();
$output .= $this->context->smarty->fetch($this->local_path.'views/templates/admin/configure.tpl');
Media::addJsDef(array('js_ap_controller' => 'module_configuration'));
return $output.$this->renderForm();
}
public function saveConfigExtrafields($ft, $fe, $type)
{
$field_text = array_unique(explode(',', Tools::getValue($ft)));
$field_default = array('name', 'description', 'description_short', 'link_rewrite', 'meta_description', 'meta_keywords', 'meta_title', 'name', 'available_now', 'available_later', 'online_only', 'ean13', 'isbn', 'upc', 'ecotax', 'quantity', 'minimal_quantity', 'price', 'wholesale_price', 'unity', 'unit_price_ratio', 'additional_shipping_cost', 'reference', 'supplier_reference', 'location', 'width', 'height', 'depth', 'weight', 'out_of_stock', 'quantity_discount', 'customizable', 'uploadable_files', 'text_fields', 'active', 'redirect_type', 'id_type_redirected', 'available_date', 'show_condition', 'condition', 'show_price', 'indexed', 'cache_is_pack', 'cache_has_attachments', 'is_virtual', 'cache_default_attribute', 'date_add', 'date_upd', 'advanced_stock_management', 'pack_stock_type', 'state');
$field_text_valid = array();
foreach ($field_text as $k => $v) {
// validate module
unset($k);
$v = str_replace(' ', '_', trim($v));
$v = preg_replace('/[^A-Za-z0-9\_]/', '', $v);
if ($v && !in_array($v, $field_default)) {
$field_text_valid[] = $v;
}
}
Configuration::updateValue($ft, implode(',', $field_text_valid));
$this->processExtrafield($field_text_valid, $type, 'varchar(255)');
$field_editor = array_unique(explode(',', Tools::getValue($fe)));
$field_editor_valid = array();
foreach ($field_editor as $k => $v) {
// validate module
unset($k);
$v = str_replace(' ', '_', trim($v));
$v = preg_replace('/[^A-Za-z0-9\_]/', '', $v);
if ($v && !in_array($v, $field_text) && !in_array($v, $field_default)) {
$field_editor_valid[] = $v;
}
}
Configuration::updateValue($fe, implode(',', $field_editor_valid));
$this->processExtrafield($field_editor_valid, $type, 'text');
}
//add by nghiatd
public function processExtrafield($submit_fields, $type, $field_type)
{
$table = ($type == 'product')?_DB_PREFIX_.'appagebuilder_extrapro':_DB_PREFIX_.'appagebuilder_extracat';
$id = ($type == 'product')?'id_product':'id_category';
//$field_type = ($field_type == 'varchar(255)')?'VARCHAR(255) NULL;':'TEXT;';
$files = array();
//check table exist and return field
$sql = 'SELECT * FROM information_schema.tables
WHERE table_schema = "'._DB_NAME_.'"
AND table_name = "'.pSQL($table).'"';
$result = Db::getInstance()->getValue($sql);
if (!empty($result)) {
$sql = 'SHOW FIELDS FROM `'.pSQL($table) .'`';
$result = Db::getInstance()->executeS($sql);
foreach ($result as $value) {
$files[$value['Field']] = $value['Type'];
}
} else {
#select product layout
$this->registerHook('actionObjectProductUpdateAfter');
$this->registerHook('displayAdminProductsExtra');
$this->registerHook('filterProductContent');
#select category layout
$this->registerHook('actionObjectCategoryUpdateAfter');
$this->registerHook('displayBackOfficeCategory');
$this->registerHook('filterCategoryContent');
Db::getInstance()->execute('
CREATE TABLE IF NOT EXISTS `'.pSQL($table).'` (
`'.pSQL($id).'` int(11) unsigned NOT NULL,
`id_shop` int(11) unsigned NOT NULL DEFAULT \'1\',
`id_lang` int(10) unsigned NOT NULL,
PRIMARY KEY (`'.pSQL($id).'`, `id_shop`, `id_lang`)
) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8;
');
}
//add field
foreach ($submit_fields as $value) {
if ($value && !array_key_exists($value, $files)) {
$sql = 'ALTER TABLE `'.pSQL($table).'` ADD `'.pSQL($value).'` '.pSQL($field_type);
//echo $sql.'<br>';
Db::getInstance()->execute($sql);
$files[$value] = $field_type;
}
}
//delete field
foreach ($files as $key => $value) {
if (!in_array($key, $submit_fields) && $key != $id && $key != 'id_shop' && $key != 'id_lang' && $value == $field_type) {
$sql = 'ALTER TABLE `'.pSQL($table).'` DROP `'.pSQL($key).'`';
//echo $sql.'<br>';
Db::getInstance()->execute($sql);
unset($files[$key]);
}
}
unset($files['id_product']);
unset($files['id_category']);
unset($files['id_shop']);
unset($files['id_lang']);
return implode(',', array_keys($files));
}
public function processDatabaseLazy()
{
if (Module::isInstalled('leobootstrapmenu') && Module::isEnabled('leobootstrapmenu')) {
include_once(_PS_MODULE_DIR_.'leobootstrapmenu/leobootstrapmenu.php');
$module = new Leobootstrapmenu();
if (method_exists($module, 'lazydatabase')) {
$module->lazydatabase();
}
}
}
public function processRolbackDatabaseLazy()
{
if (Module::isInstalled('leobootstrapmenu') && Module::isEnabled('leobootstrapmenu')) {
include_once(_PS_MODULE_DIR_.'leobootstrapmenu/leobootstrapmenu.php');
$module = new Leobootstrapmenu();
if (method_exists($module, 'lazyrolbackdatabase')) {
$module->lazyrolbackdatabase();
}
}
}
public function processLazyImg()
{
$files = Tools::scandir(_PS_THEME_DIR_, 'tpl', '', 1);
foreach ($files as $file) {
$content = Tools::file_get_contents(_PS_THEME_DIR_.$file, false);
if (strpos($content, '<img') !== false) {
preg_match_all('/<img[^>]+>/i', $content, $imgs);
$icheck = 0;
foreach ($imgs[0] as $img) {
//if have lazy break
if (strpos($img, 'lazy') === false && strpos($img, 'js-thumb') === false && strpos($img, 'zoom_product') === false && strpos($img, 'lazyOwl') === false && strpos($img, 'data-src') === false) {
$imga = str_replace('src', 'data-src', $img);
//has class add more class
if (strpos($imga, "class") !== false) {
$imga = str_replace('class="', 'class="lazy ', $imga);
$imga = str_replace("class='", "class='lazy ", $imga);
} else {
$imga = str_replace('<img', '<img class="lazy"', $imga);
}
$content = str_replace($img, $imga, $content);
$icheck = 1;
}
}
if ($icheck) {
@file_put_contents(_PS_THEME_DIR_.$file, $content);
}
}
}
}
public function processRolbaclLazyImg()
{
$files = Tools::scandir(_PS_THEME_DIR_, 'tpl', '', 1);
foreach ($files as $file) {
$content = Tools::file_get_contents(_PS_THEME_DIR_.$file, false);
if (strpos($content, '<img') !== false) {
preg_match_all('/<img[^>]+>/i', $content, $imgs);
$icheck = 0;
foreach ($imgs[0] as $img) {
//if have lazy break
if (strpos($img, 'lazy ') !== false || strpos($img, '"lazy') !== false || strpos($img, "'lazy") !== false || strpos($img, " lazy") !== false) {
$imga = str_replace('data-src', 'src', $img);
$imga = str_replace('<img class="lazy"', '<img', $imga);
$imga = str_replace('lazy ', '', $imga);
$imga = str_replace(' lazy', '', $imga);
$content = str_replace($img, $imga, $content);
$icheck = 1;
}
}
if ($icheck) {
@file_put_contents(_PS_THEME_DIR_.$file, $content);
}
}
}
}
public function processRestore()
{
$file = Tools::getValue('backupfile');
if (file_exists($this->backup_dir.$file)) {
$query = $dataLang = '';
require_once($this->backup_dir.$file);
if (isset($query) && !empty($query)) {
$query = str_replace('_DB_PREFIX_', _DB_PREFIX_, $query);
$query = str_replace('_MYSQL_ENGINE_', _MYSQL_ENGINE_, $query);
$query = str_replace('LEO_ID_SHOP', (int)Context::getContext()->shop->id, $query);
$query = str_replace("\\'", "\'", $query);
$db_data_settings = preg_split("/;\s*[\r\n]+/", $query);
foreach ($db_data_settings as $query) {
$query = trim($query);
if (!empty($query)) {
if (!Db::getInstance()->Execute($query)) {
$this->_html['error'][] = 'Can not restore for '.$this->name;
return false;
}
}
}
if (isset($dataLang) && !empty($dataLang)) {
$languages = Language::getLanguages(true, Context::getContext()->shop->id);
foreach ($languages as $lang) {
if (isset($dataLang[Tools::strtolower($lang['iso_code'])])) {
$query = str_replace('_DB_PREFIX_', _DB_PREFIX_, $dataLang[Tools::strtolower($lang['iso_code'])]);
//if not exist language in list, get en
} else {
if (isset($dataLang['en'])) {
$query = str_replace('_DB_PREFIX_', _DB_PREFIX_, $dataLang['en']);
} else {
//firt item in array
foreach (array_keys($dataLang) as $key) {
$query = str_replace('_DB_PREFIX_', _DB_PREFIX_, $dataLang[$key]);
break;
}
}
}
$query = str_replace('_MYSQL_ENGINE_', _MYSQL_ENGINE_, $query);
$query = str_replace('LEO_ID_SHOP', (int)Context::getContext()->shop->id, $query);
$query = str_replace('LEO_ID_LANGUAGE', (int)$lang['id_lang'], $query);
$query = str_replace("\\\'", "\'", $query);
$db_data_settings = preg_split("/;\s*[\r\n]+/", $query);
foreach ($db_data_settings as $query) {
$query = trim($query);
if (!empty($query)) {
if (!Db::getInstance()->Execute($query)) {
$this->_html['error'][] = 'Can not restore for data lang '.$this->name;
return false;
}
}
}
}
}
}
}
}
public function processBackup()
{
$install_folder = $this->backup_dir;
if (!is_dir($install_folder)) {
mkdir($install_folder, 0755, true);
}
$list_table = Db::getInstance()->executeS("SHOW TABLES LIKE '%appagebuilder%'");
$create_table = '';
$data_with_lang = '';
$backup_file = $install_folder.$this->name.date('_Y_m_d_H_i_s').'.php';
$fp = @fopen($backup_file, 'w');
if ($fp === false) {
die('Unable to create backup file '.addslashes($backup_file));
}
fwrite($fp, '<?php');
fwrite($fp, "\n/* back up for module ".$this->name." */\n");
$data_language = array();
$list_lang = array();
$languages = Language::getLanguages(true, Context::getContext()->shop->id);
foreach ($languages as $lang) {
$list_lang[$lang['id_lang']] = $lang['iso_code'];
}
foreach ($list_table as $table) {
$table = current($table);
$table_name = str_replace(_DB_PREFIX_, '_DB_PREFIX_', $table);
// Skip tables which do not start with _DB_PREFIX_
if (Tools::strlen($table) < Tools::strlen(_DB_PREFIX_) || strncmp($table, _DB_PREFIX_, Tools::strlen(_DB_PREFIX_)) != 0) {
continue;
}
$schema = Db::getInstance()->executeS('SHOW CREATE' . ' TABLE `'.pSQL($table).'`');
if (count($schema) != 1 || !isset($schema[0]['Table']) || !isset($schema[0]['Create Table'])) {
fclose($fp);
die($this->l('An error occurred while backing up. Unable to obtain the schema of').' '.$table);
}
$create_table .= 'DROP TABLE IF EXISTS `'.$table_name."`;\n".$schema[0]['Create Table'].";\n";
if (strpos($schema[0]['Create Table'], '`id_shop`')) {
$data = Db::getInstance()->query('SELECT * FROM `'.pSQL($schema[0]['Table']).'` WHERE `id_shop`='.(int)Context::getContext()->shop->id, false);
} else {
$data = Db::getInstance()->query('SELECT * FROM `'.pSQL($schema[0]['Table']).'`', false);
}
$sizeof = DB::getInstance()->NumRows();
$lines = explode("\n", $schema[0]['Create Table']);
if ($data && $sizeof > 0) {
//if table is language
$id_language = 0;
if (strpos($schema[0]['Table'], 'lang') !== false) {
$data_language[$schema[0]['Table']] = array();
$i = 1;
while ($row = DB::getInstance()->nextRow($data)) {
$s = '(';
foreach ($row as $field => $value) {
if ($field == 'id_lang') {
$id_language = $value;
$tmp = "'".pSQL('LEO_ID_LANGUAGE', true)."',";
} else if ($field == 'ID_SHOP') {
$tmp = "'".pSQL('ID_SHOP', true)."',";
} else {
$tmp = "'".pSQL($value, true)."',";
}
if ($tmp != "'',") {
$s .= $tmp;
} else {
foreach ($lines as $line) {
if (strpos($line, '`'.$field.'`') !== false) {
if (preg_match('/(.*NOT NULL.*)/Ui', $line)) {
$s .= "'',";
} else {
$s .= 'NULL,';
}
break;
}
}
}
}
if (!isset($list_lang[$id_language])) {
continue;
}
if (!isset($data_language[$schema[0]['Table']][Tools::strtolower($list_lang[$id_language])])) {
$data_language[$schema[0]['Table']][Tools::strtolower($list_lang[$id_language])] = 'INSERT INTO `'.$table_name."` VALUES\n";
}
$s = rtrim($s, ',');
if ($i % 200 == 0 && $i < $sizeof) {
$s .= ");\nINSERT INTO `".$table_name."` VALUES\n";
} else {
$s .= "),\n";
}
$data_language[$schema[0]['Table']][Tools::strtolower($list_lang[$id_language])] .= $s;
}
} else {
//normal table
$create_table .= $this->createInsert($data, $table_name, $lines, $sizeof);
}
}
}
$create_table = str_replace('$', '\$', $create_table);
$create_table = '$query = "'.$create_table;
//foreach by table
$tpl = array();
fwrite($fp, $create_table."\";\n");
if ($data_language) {
foreach ($data_language as $key => $value) {
foreach ($value as $key1 => $value1) {
if (!isset($tpl[$key1])) {
$tpl[$key1] = Tools::substr($value1, 0, -2).";\n";
} else {
$tpl[$key1] .= Tools::substr($value1, 0, -2).";\n";
}
}
}
foreach ($tpl as $key => $value) {
if ($data_with_lang) {
$data_with_lang .= ',"'.$key.'"=>'.'"'.$value.'"';
} else {
$data_with_lang .= '"'.$key.'"=>'.'"'.$value.'"';
}
}
//delete base uri when export
$data_with_lang = str_replace('$', '\$', $data_with_lang);
$data_with_lang = '$dataLang = Array('.$data_with_lang;
fwrite($fp, $data_with_lang.');');
}
fclose($fp);
}
/**
* sub function of back-up database
*/
public function createInsert($data, $table_name, $lines, $sizeof)
{
$data_no_lang = 'INSERT INTO `'.$table_name."` VALUES\n";
$i = 1;
while ($row = DB::getInstance()->nextRow($data)) {
$s = '(';
foreach ($row as $field => $value) {
if ($field == 'ID_SHOP') {
$tmp = "'".pSQL('ID_SHOP', true)."',";
} else {
$tmp = "'".pSQL($value, true)."',";
}
if ($tmp != "'',") {
$s .= $tmp;
} else {
foreach ($lines as $line) {
if (strpos($line, '`'.$field.'`') !== false) {
if (preg_match('/(.*NOT NULL.*)/Ui', $line)) {
$s .= "'',";
} else {
$s .= 'NULL,';
}
break;
}
}
}
}
$s = rtrim($s, ',');
if ($i % 200 == 0 && $i < $sizeof) {
$s .= ");\nINSERT INTO `".$table_name."` VALUES\n";
} elseif ($i < $sizeof) {
$s .= "),\n";
} else {
$s .= ");\n";
}
$data_no_lang .= $s;
++$i;
}
return $data_no_lang;
}
public function renderForm()
{
$list_all_hooks = $this->renderListAllHook(ApPageSetting::getHook('all'));
$list_header_hooks = (Configuration::get('APPAGEBUILDER_HEADER_HOOK')) ?
Configuration::get('APPAGEBUILDER_HEADER_HOOK') : implode(',', ApPageSetting::getHook('header'));
$list_content_hooks = (Configuration::get('APPAGEBUILDER_CONTENT_HOOK')) ?
Configuration::get('APPAGEBUILDER_CONTENT_HOOK') : implode(',', ApPageSetting::getHook('content'));
$list_footer_hooks = (Configuration::get('APPAGEBUILDER_FOOTER_HOOK')) ?
Configuration::get('APPAGEBUILDER_FOOTER_HOOK') : implode(',', ApPageSetting::getHook('footer'));
$list_product_hooks = (Configuration::get('APPAGEBUILDER_PRODUCT_HOOK')) ?
Configuration::get('APPAGEBUILDER_PRODUCT_HOOK') : implode(',', ApPageSetting::getHook('product'));
$module_link = $this->context->link->getAdminLink('AdminModules', false)
.'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules');
$form_general = array(
'legend' => array(
'title' => $this->l('General Settings'),
'icon' => 'icon-cogs'
),
'input' => array(
array(
'type' => 'html',
'name' => 'default_html',
'name' => 'dump_name',
'html_content' => '<div class="alert alert-info ap-html-full">'
.$this->l('Loading JS and CSS library').'</div>',
),
array(
'type' => 'switch',
'label' => $this->l('Load Jquery Stellar Library'),
'name' => 'APPAGEBUILDER_LOAD_STELLAR',
'desc' => $this->l('This script is use for parallax. If you load it in other plugin please turn it off'),
'is_bool' => true,
'values' => ApPageSetting::returnYesNo(),
'default' => '0',
),
array(
'type' => 'switch',
'label' => $this->l('Load Owl Carousel Library'),
'name' => 'APPAGEBUILDER_LOAD_OWL',
'desc' => $this->l('This script is use for Carousel. If you load it in other plugin please turn it off'),
'is_bool' => true,
'values' => ApPageSetting::returnYesNo(),
'default' => '0',
),
array(
'type' => 'switch',
'label' => $this->l('Load Swiper Carousel Library'),
'name' => 'APPAGEBUILDER_LOAD_SWIPER',
'desc' => $this->l('This script is use for Carousel. If you load it in other plugin please turn it off'),
'is_bool' => true,
'values' => ApPageSetting::returnYesNo(),
'default' => '0',
),
array(
'type' => 'switch',
'label' => $this->l('Load Waypoints Library'),
'name' => 'APPAGEBUILDER_LOAD_WAYPOINTS',
'desc' => $this->l('This script is use for Animated. If you load it in other plugin please turn it off'),
'is_bool' => true,
'values' => ApPageSetting::returnYesNo(),
'default' => '0',
),
array(
'type' => 'switch',
'label' => $this->l('Load Instafeed Library'),
'name' => 'APPAGEBUILDER_LOAD_INSTAFEED',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'switch',
'label' => $this->l('Load Video HTML5 Library'),
'name' => 'APPAGEBUILDER_LOAD_HTML5VIDEO',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'switch',
'label' => $this->l('Load Full Page Library'),
'name' => 'APPAGEBUILDER_LOAD_FULLPAGEJS',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'switch',
'label' => $this->l('Load Magic360 Library'),
'name' => 'APPAGEBUILDER_LOAD_IMAGE360',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'switch',
'label' => $this->l('Load Image Hotpot Library'),
'name' => 'APPAGEBUILDER_LOAD_IMAGEHOTPOT',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'switch',
'label' => $this->l('Load Cookie Library'),
'name' => 'APPAGEBUILDER_LOAD_COOKIE',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
'desc' => $this->l('Yes : Load library JS jquery.cooki-plugin.js'),
),
array(
'type' => 'switch',
'label' => $this->l('Load Lazy load'),
'name' => 'APPAGEBUILDER_LOAD_LAZY',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
'desc' => $this->l('Use lazy load add class="lazy" to <img and change src to data-src'),
),
array(
'type' => 'switch',
'label' => $this->l('Load numscroller-1.0 for Counter'),
'name' => 'APPAGEBUILDER_LOAD_NUMSCROLLER',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
'desc' => $this->l('This script will show counter.'),
),
array(
'type' => 'html',
'name' => 'replace_src',
'label' => $this->l('Add class and change src'),
'html_content' => '<a class="btn btn-default" onclick="javascript:return confirm(\'Please confirm you back-up folder '._THEME_DIR_.'\')" href="'.$module_link.'&autochangelazy=1">
<i class="icon-AdminParentPreferences"></i> Auto change lazy in theme tpl</a><a class="btn btn-default" onclick="javascript:return confirm(\'Please confirm you back-up database of leomegamenu, appagebuilder\')" href="'.$module_link.'&autodatabaselazy=1">
<i class="icon-AdminParentPreferences"></i> Auto change lazy Leo Module database</a>',
'desc' => $this->l('back-up folder theme before click'),
),
array(
'type' => 'html',
'name' => 'rolback_src',
'label' => $this->l('Remove class lazy and data-src'),
'html_content' => '
<a class="btn btn-default" onclick="javascript:return confirm(\'Please confirm you back-up folder '._THEME_DIR_.'\')" href="'.$module_link.'&autorolbacklazy=1">
<i class="icon-AdminParentPreferences"></i> Auto rollback in theme tpl</a>
<a class="btn btn-default" onclick="javascript:return confirm(\'Please confirm you back-up database of leomegamenu, appagebuilder\')" href="'.$module_link.'&autorolbackdatabaselazy=1">
<i class="icon-AdminParentPreferences"></i> Auto rolback lazy Leo Module database</a>',
'desc' => $this->l('back-up folder theme before click'),
),
array(
'type' => 'switch',
'label' => $this->l('Load Product Zoom Library'),
'name' => 'APPAGEBUILDER_LOAD_PRODUCTZOOM',
'default' => 1,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'switch',
'label' => $this->l('Load Library convert tab to accordion in mobile'),
'name' => 'APPAGEBUILDER_LOAD_TABCOLLAPSE',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'html',
'name' => 'default_html',
'name' => 'dump_name',
'html_content' => '<div class="alert alert-info ap-html-full">'
.$this->l('Functions').'</div>',
),
array(
'type' => 'switch',
'label' => $this->l('Save Profile Multithrearing'),
'name' => 'APPAGEBUILDER_SAVE_MULTITHREARING',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
'desc' => $this->l('Yes - use AJAX SUBMIT, not load page again, keep your data safe'),
),
array(
'type' => 'switch',
'label' => $this->l('Save Profile Submit'),
'name' => 'APPAGEBUILDER_SAVE_SUBMIT',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
'desc' => $this->l('Yes - use Normal SUBMIT and load page again. No - use AJAX SUBMIT, not load page again.'),
),
array(
'type' => 'switch',
'label' => $this->l('Save profile and postion id to cookie'),
'name' => 'APPAGEBUILDER_COOKIE_PROFILE',
'default' => 0,
'desc' => $this->l('That is only for demo, please turn off it in live site'),
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'text',
'label' => $this->l('Random Product'),
'desc' => $this->l('Number of time create random product when using Prestashop_CACHED and showing product carousel has order by RANDOM'),
'name' => 'APPAGEBUILDER_PRODUCT_MAX_RANDOM',
'class' => '',
'default' => 2,
),
array(
'type' => 'html',
'name' => 'default_html',
'name' => 'dump_name',
'html_content' => '<div class="alert alert-info ap-html-full">'
.$this->l('AJAX SETTINGS').
'<input type="hidden" id="position-hook-select"/></div>',
),
// array(
// 'type' => 'switch',
// 'label' => $this->l('Use Ajax Feature'),
// 'name' => 'APPAGEBUILDER_LOAD_AJAX',
// 'default' => 1,
// 'values' => ApPageSetting::returnYesNo(),
// ),
array(
'type' => 'switch',
'label' => $this->l('AJAX Show Category Qty - Enable'),
'name' => 'APPAGEBUILDER_LOAD_PN',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'textarea',
'label' => $this->l('AJAX Show Category Qty - Code'),
'name' => 'APPAGEBUILDER_LOAD_TPN',
'cols' => 100,
'hint' => $this->l('Add this CODE to THEME_NAME/modules/ps_categorytree/views/templates/hook/ ps_categorytree.tpl file'),
),
array(
'type' => 'switch',
'label' => $this->l('AJAX Show More Product Image - Enable'),
'name' => 'APPAGEBUILDER_LOAD_TRAN',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'textarea',
'label' => $this->l('AJAX Show More Product Image - Code'),
'name' => 'APPAGEBUILDER_LOAD_TTRAN',
'cols' => 100,
'hint' => $this->l('Add this CODE to THEME_NAME/templates/catalog/_partials/miniatures/product.tpl file'),
),
array(
'type' => 'switch',
'label' => $this->l('AJAX Show Multiple Product Images - Enable'),
'name' => 'APPAGEBUILDER_LOAD_IMG',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'textarea',
// 'label' => $this->l('You can add this code in tpl file of module you want to show Multiple Product Image'),
'label' => $this->l('AJAX Show Multiple Product Images - Code'),
'name' => 'APPAGEBUILDER_LOAD_TIMG',
'cols' => 100,
'hint' => $this->l('Add this CODE to THEME_NAME/templates/catalog/_partials/miniatures/product.tpl file'),
),
array(
'type' => 'switch',
'label' => $this->l('AJAX Show Count Down Product - Enable'),
'name' => 'APPAGEBUILDER_LOAD_COUNT',
'default' => 0,
'values' => ApPageSetting::returnYesNo(),
),
array(
'type' => 'textarea',
'label' => $this->l('AJAX Show Count Down Product - Code'),
'name' => 'APPAGEBUILDER_LOAD_TCOUNT',
'cols' => 100,
'hint' => $this->l('Add this CODE to THEME_NAME/templates/catalog/_partials/miniatures/product.tpl file'),
),
// array(
// 'type' => 'switch',
// 'label' => $this->l('Show Discount Color'),
// 'name' => 'APPAGEBUILDER_LOAD_ACOLOR',
// 'default' => 1,
// 'values' => ApPageSetting::returnYesNo(),
// ),
// array(
// 'type' => 'textarea',
// 'label' => $this->l('You can add this code in tpl file of module you want to show color discount'),
// 'name' => 'APPAGEBUILDER_LOAD_TCOLOR',
// 'cols' => 100,
// ),
// array(
// 'type' => 'textarea',
// 'label' => $this->l('For color (Ex: 10:#ff0000,20:#152ddb,40:#ffee001) '),
// 'name' => 'APPAGEBUILDER_LOAD_COLOR',
// 'cols' => 100
// ),
// array(
// 'type' => 'textarea',
// 'label' => $this->l('If you want my script run fine with Layered navigation block.
// Please copy to override file modules/blocklayered/blocklayered.js to folder
// themes/TEMPLATE_NAME/js/modules/blocklayered/blocklayered.js.
// Then find function reloadContent(params_plus).'),
// 'name' => 'APPAGEBUILDER_LOAD_RTN',
// 'cols' => 100
// ),
// array(
// 'type' => 'textarea',
// 'label' => $this->l('For color (Ex: 10:#ff0000,20:#152ddb,40:#ffee001)'),
// 'name' => 'APPAGEBUILDER_COLOR',
// 'default' => '',
// 'cols' => 100
// ),
array(
'type' => 'html',
'name' => 'default_html',
'name' => 'dump_name',
'html_content' => '<br/><div class="alert alert-info ap-html-full">'
.$this->l('Setting hook in positions (This setting will apply for all profiles).')
.'<div class="list-all-hooks">'.$this->l('Default all hooks: [').$list_all_hooks.' ]</div>'
.'</div>',
),
array(
'type' => 'text',
'label' => $this->l('Hooks in header'),
'name' => 'APPAGEBUILDER_HEADER_HOOK',
'class' => '',
'default' => $list_header_hooks
),
array(
'type' => 'text',
'label' => $this->l('Hooks in content'),
'name' => 'APPAGEBUILDER_CONTENT_HOOK',
'class' => '',
'default' => $list_content_hooks
),
array(
'type' => 'text',
'label' => $this->l('Hooks in footer'),
'name' => 'APPAGEBUILDER_FOOTER_HOOK',
'class' => '',
'default' => $list_footer_hooks
),
array(
'type' => 'text',
'label' => $this->l('Hooks in product-footer'),
'name' => 'APPAGEBUILDER_PRODUCT_HOOK',
'class' => '',
'default' => $list_product_hooks
),
array(
'type' => 'html',
'name' => 'default_html',
'name' => 'html_content_de',
'html_content' => '<input type="hidden" name="hook_header_old" id="hook_header_old"/>
<input type="hidden" name="hook_content_old" id="hook_content_old"/>
<input type="hidden" name="hook_footer_old" id="hook_footer_old"/>
<input type="hidden" name="hook_product_old" id="hook_product_old"/>
<input type="hidden" name="is_change" id="is_change" value=""/>
<input type="hidden" id="message_confirm" value="'
.$this->l('The hook is changing. Click OK will save new config hooks and will
REMOVE ALL current data widget. Are you sure?').'"/>',
),
),
'submit' => array(
'id' => 'btn-save-appagebuilder',
'title' => $this->l('Save'),
)
);
$form_extrafield = array(
'legend' => array(
'title' => $this->l('Extrafield Settings'),
'icon' => 'icon-cogs'
),
'input' => array(
array(
'type' => 'html',
'name' => 'default_html',
'name' => 'dump_name',
'html_content' => '<br/><div class="alert alert-info ap-html-full">'
.$this->l('This config is only apply for advance user.')
.'<div class="list-all-hooks">We will create new fileds for category and product, then you can use it to show in layout</div>'
.'<div class="list-all-hooks">Have 2 type of database: 1. text and 2. editor</div>'
.'<div class="list-all-hooks">When you change data of this field, all data of extrafied will lost</div>'
.'</div>',
),
array(
'type' => 'text',
'label' => $this->l('Product Extra Text Field'),
'name' => 'APPAGEBUILDER_PRODUCT_TEXTEXTRA',
'class' => '',
'desc' => $this->l('Do not contain space and special charactor. Example: sub-name, sub-title'),
'default' => ''
),
array(
'type' => 'text',
'label' => $this->l('Product Extra Editor Field'),
'name' => 'APPAGEBUILDER_PRODUCT_EDITOREXTRA',
'class' => '',
'desc' => $this->l('Do not contain space and special charactor. Example: sub-name, sub-title'),
'default' => ''
),
array(
'type' => 'text',
'label' => $this->l('Category Extra Editor Field'),
'name' => 'APPAGEBUILDER_CATEGORY_TEXTEXTRA',
'class' => '',
'desc' => $this->l('Do not contain space and special charactor. Example: sub-name, sub-title'),
'default' => ''
),
array(
'type' => 'text',
'label' => $this->l('Category Extra Editor Field'),
'name' => 'APPAGEBUILDER_CATEGORY_EDITOREXTRA',
'class' => '',
'desc' => $this->l('Do not contain space and special charactor. Example: sub-name, sub-title'),
'default' => ''
)
),
'submit' => array(
'id' => 'btn-save-extrafield',
'title' => $this->l('Save'),
)
);
$fields_form = array(
'form' => $form_general
);
$fields_form1 = array(
'form' => $form_extrafield
);
$data = $this->getConfigFieldsValues($form_general, $form_extrafield);
// Check existed the folder root store resources of module
$path_img = apPageHelper::getImgThemeDir();
if (!file_exists($path_img)) {
mkdir($path_img, 0755, true);
}
$helper = new HelperForm();
$helper->show_toolbar = false;
$helper->table = $this->table;
$lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
$helper->default_form_language = $lang->id;
$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ?
Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
$helper->identifier = $this->identifier;
$helper->submit_action = 'submitApPageBuilder';
$helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)
.'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->tpl_vars = array(
'fields_value' => $data,
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id
);
return $helper->generateForm(array($fields_form, $fields_form1));
}
private function renderListAllHook($arr)
{
$html = '';
if ($arr) {
foreach ($arr as $item) {
$html .= "<a href='javascript:;'>$item</a>";
}
}
return $html;
}
public function hookPagebuilderConfig($param)
{
$cf = $param['configName'];
if ($cf == 'profile' || $cf == 'header' || $cf == 'footer' || $cf == 'content' || $cf == 'product' || $cf == 'product_builder') {
#GET DETAIL PROFILE
$cache_name = 'pagebuilderConfig'.'|'.$param['configName'];
$cache_id = $this->getCacheId($cache_name);
if (!$this->isCached('module:appagebuilder/views/templates/hook/config.tpl', $cache_id)) {
$ap_type = $cf;
if ($cf == 'profile') {
$ap_type = 'id_appagebuilder_profiles';
} else if ($cf == 'product_builder') {
$ap_type = 'plist_key';
}
$this->smarty->assign(
array(
'ap_cfdata' => $this->getConfigData($cf),
'ap_cf' => $cf,
'ap_type' => $ap_type,
'ap_controller' => apPageHelper::getPageName(),
'ap_current_url' => Context::getContext()->link->getPageLink('index', true),
)
);
}
return $this->display(__FILE__, 'config.tpl', $cache_id);
}
if ($cf == 'productClass') {
// validate module
return $this->product_active['class'];
}
if ($cf == 'productKey') {
$tpl_file = apPageHelper::getConfigDir('theme_profiles') . $this->product_active['plist_key'].'.tpl';
if (is_file($tpl_file)) {
return $this->product_active['plist_key'];
}
return;
}
//nghiatd
if ($cf == 'productLayout') {
$id_product = Tools::getValue('id_product');
if ($id_product) {
$id_shop = Context::getContext()->shop->id;
$sql = 'SELECT page from `'._DB_PREFIX_.'appagebuilder_page` where id_product = \''.(int)$id_product.'\' AND id_shop = \''.(int)$id_shop.'\'';
$layout = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
return $layout;
} else {
return '';
}
}
if ($cf == 'categoryLayout') {
$id_category = Tools::getValue('id_category');
if ($id_category) {
$id_shop = Context::getContext()->shop->id;
$sql = 'SELECT page from `'._DB_PREFIX_.'appagebuilder_page` where id_category = \''.(int)$id_category.'\' AND id_shop = \''.(int)$id_shop.'\'';
$layout = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
return $layout;
} else {
return '';
}
}
//DONGND:: get class of category layout
if ($cf == 'classCategoryLayout') {
$id_category = Tools::getValue('id_category');
if ($id_category) {
$id_shop = Context::getContext()->shop->id;
$sql = 'SELECT pr.`class` from `'._DB_PREFIX_.'appagebuilder_page` pa INNER JOIN `'._DB_PREFIX_.'appagebuilder_products` pr ON (pa.`page` = pr.`plist_key`) where pa.id_category = \''.(int)$id_category.'\' AND pa.id_shop = \''.(int)$id_shop.'\'';
$class_category_layout = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
return $class_category_layout;
} else {
return '';
}
}
if ($cf == 'leobrbg') {
$bg = '';
if ($this->getConfig('USE_BACKGROUND_BREADCRUMB')) {
$bg = $this->getConfig('BGBREADCRUMB');
if ($this->getConfig('BGBREADCRUMB')) {
if (Tools::getValue('controller') == 'category') {
if ($this->getConfig('CATEGORY_BREADCRUMB') == "catimg") {
$category = new Category(Tools::getValue('id_category'));
$link = new Link();
$id_lang = Context::getContext()->language->id;
if (!$category->id_image) {
$bg = $this->getConfig('BGBREADCRUMB');
} else {
$bg = 'catimg';
}
} else if ($this->getConfig('CATEGORY_BREADCRUMB') == "breadcrumbimg" && file_exists(_PS_IMG_DIR_.'breadcrumb/category/'.Tools::getValue('id_category').'.jpg')) {
$bg = 'img/breadcrumb/category/'.Tools::getValue('id_category').'.jpg';
} else if ($this->getConfig('CATEGORY_BREADCRUMB') == "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').'.png';
} else {
if (file_exists(_PS_IMG_DIR_.'breadcrumb/'.Tools::getValue('controller').'.png')) {
$bg = 'img/breadcrumb/'.Tools::getValue('controller').'.jpg';
}
}
if ($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;
}
if ($cf == 'leobrcolor') {
if ($this->getConfig('USE_BACKGROUND_BREADCRUMB')) {
return $this->getConfig('bgcolorbreadcrumb');
} else {
return 0;
}
}
if ($cf == 'leobgheight') {
if ($this->getConfig('USE_BACKGROUND_BREADCRUMB')) {
return $this->getConfig('breadcrumbheight');
} else {
return 0;
}
}
if ($cf == 'leobgfull') {
if ($this->getConfig('USE_BACKGROUND_BREADCRUMB')) {
return $this->getConfig('breadcrumb_full');
} else {
return 0;
}
}
if ($cf == 'leobrtext') {
if ($this->getConfig('USE_BACKGROUND_BREADCRUMB')) {
return $this->getConfig('brtextposition')?$this->getConfig('brtextposition'):'brcenter';
} else {
return 0;
}
}
}
public function getConfigData($cf)
{
if ($cf == 'profile') {
$id_lang = (int)Context::getContext()->language->id;
$sql = 'SELECT p.`id_appagebuilder_profiles` AS `id`, p.`name`, ps.`active`, pl.friendly_url FROM `'._DB_PREFIX_.'appagebuilder_profiles` p '
.' INNER JOIN `'._DB_PREFIX_.'appagebuilder_profiles_shop` ps ON (ps.`id_appagebuilder_profiles` = p.`id_appagebuilder_profiles`)'
.' INNER JOIN `'._DB_PREFIX_.'appagebuilder_profiles_lang` pl ON (pl.`id_appagebuilder_profiles` = p.`id_appagebuilder_profiles`) AND pl.id_lang='.(int)$id_lang
.' WHERE ps.id_shop='.(int)Context::getContext()->shop->id;
} else if ($cf == 'product_builder') {
$sql = 'SELECT p.`plist_key` AS `id`, p.`name`, ps.`active`'
.' FROM `'._DB_PREFIX_.'appagebuilder_products` p '
.' INNER JOIN `'._DB_PREFIX_.'appagebuilder_products_shop` ps '
.' ON (ps.`id_appagebuilder_products` = p.`id_appagebuilder_products`)'
.' WHERE ps.id_shop='.(int)Context::getContext()->shop->id;
} else {
$sql = 'SELECT p.`id_appagebuilder_positions` AS `id`, p.`name`'
.' FROM `'._DB_PREFIX_.'appagebuilder_positions` p '
.' INNER JOIN `'._DB_PREFIX_.'appagebuilder_positions_shop` ps '
.' ON (ps.`id_appagebuilder_positions` = p.`id_appagebuilder_positions`)'
.' WHERE p.`position` = \''.PSQL($cf).'\' AND ps.id_shop='.(int)Context::getContext()->shop->id;
}
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
foreach ($result as &$val) {
if ($cf == 'profile') {
$val['active'] = 0;
if ($val['id'] == $this->profile_data['id_appagebuilder_profiles']) {
$val['active'] = 1;
}
} else if ($cf == 'product_builder') {
if (Tools::getIsset('plist_key')) {
$val['active'] = 0;
if ($val['id'] == Tools::getValue('plist_key')) {
$val['active'] = 1;
}
}
} else {
$val['active'] = 0;
if (Tools::getIsset($cf)) {
if ($val['id'] == Tools::getValue($cf)) {
$val['active'] = 1;
}
} else {
if ($val['id'] == $this->profile_data[$cf]) {
$val['active'] = 1;
}
}
}
}
return $result;
}
public function getConfigFieldsValues($form_general, $form_extrafield)
{
$this->context->controller->addCss(apPageHelper::getCssDir().'style.css');
$result = array();
foreach ($form_general['input'] as $form) {
//$form['name'] = isset($form['name']) ? $form['name'] : '';
if (Configuration::hasKey($form['name'])) {
$result[$form['name']] = Tools::getValue($form['name'], Configuration::get($form['name']));
} else {
$result[$form['name']] = Tools::getValue($form['name'], isset($form['default']) ? $form['default'] : '');
}
}
foreach ($form_extrafield['input'] as $form) {
//$form['name'] = isset($form['name']) ? $form['name'] : '';
if (Configuration::hasKey($form['name'])) {
$result[$form['name']] = Configuration::get($form['name']);
} else {
$result[$form['name']] = Tools::getValue($form['name'], isset($form['default']) ? $form['default'] : '');
}
}
$result['APPAGEBUILDER_LOAD_TCOUNT'] = '<div class="leo-more-cdown" data-idproduct="{$product.id_product}"></div>';
$result['APPAGEBUILDER_LOAD_TTRAN'] = ' <!-- case 1 get second image of product except image_cover -->'."\n";
$result['APPAGEBUILDER_LOAD_TTRAN'] .= '<span class="second-image-style product-additional" data-idproduct="{$product.id_product}"></span>';
$result['APPAGEBUILDER_LOAD_TTRAN'] .= "\n\n". ' <!-- case 2 get second image of product_attribute ( if product not attribute get second image of product ). -->'."\n";
$result['APPAGEBUILDER_LOAD_TTRAN'] .= '<span class="second-image-style product-attribute-additional" data-id-product="{$product.id_product}" data-id-product-attribute="{$product.id_product_attribute}" data-id-image="{$product.cover.id_image}"></span>';
$result['APPAGEBUILDER_LOAD_TTRAN'] .= "\n\n". ' <!-- case 3 get second image of product except image_showed. -->'."\n";
$result['APPAGEBUILDER_LOAD_TTRAN'] .= '<span class="second-image-style product-all-additional" data-id-product="{$product.id_product}" data-id-product-attribute="{$product.id_product_attribute}" data-id-image="{$product.cover.id_image}"></span>';
$result['APPAGEBUILDER_LOAD_TIMG'] = '<div class="leo-more-info" data-idproduct="{$product.id_product}"></div>';
$result['APPAGEBUILDER_LOAD_TPN'] = '<span id="leo-cat-{$node.id}" style="display:none" class="leo-qty leo-cat-{$node.id} badge pull-right" data-str="{l s=\' item(s)\' d=\'Shop.Theme.Catalog\'}"></span>';
return $result;
}
/**
* Widget ApTab
*/
public function fontContent($assign, $tpl_name)
{
// Setting live edit mode
$assign['apLiveEdit'] = '';
$assign['apLiveEditEnd'] = '';
if ($assign) {
foreach ($assign as $key => $ass) {
$this->smarty->assign(array($key => $ass));
}
}
$override_folder = '';
if (isset($assign['formAtts']['override_folder']) && $assign['formAtts']['override_folder'] != '') {
$override_folder = $assign['formAtts']['override_folder'];
}
$tpl_file = apPageHelper::getTemplate($tpl_name, $override_folder);
$content = $this->display(__FILE__, $tpl_file);
return $content;
}
public function checkLiveEditAccess($live_token)
{
$cookie = new Cookie('ap_token');
return $live_token === $cookie->variable_name;
}
/**
* $page_number = 0, $nb_products = 10, $count = false, $order_by = null, $order_way = null
*/
public function getProductsFont($params)
{
$id_lang = $this->context->language->id;
$context = Context::getContext();
//assign value from params
$p = isset($params['page_number']) ? $params['page_number'] : 1;
if ($p < 0) {
$p = 1;
}
$n = isset($params['nb_products']) ? $params['nb_products'] : 10;
if ($n < 1) {
$n = 10;
}
$order_by = isset($params['order_by']) ? Tools::strtolower($params['order_by']) : 'position';
$order_way = isset($params['order_way']) ? $params['order_way'] : 'ASC';
$random = false;
if ($order_way == 'random') {
$random = true;
}
$get_total = isset($params['get_total']) ? $params['get_total'] : false;
$order_by_prefix = false;
if ($order_by == 'id_product' || $order_by == 'date_add' || $order_by == 'date_upd') {
$order_by_prefix = 'product_shop';
} else if ($order_by == 'reference') {
$order_by_prefix = 'p';
} else if ($order_by == 'name') {
$order_by_prefix = 'pl';
} elseif ($order_by == 'manufacturer') {
$order_by_prefix = 'm';
$order_by = 'name';
} elseif ($order_by == 'position') {
$order_by = 'date_add';
$order_by_prefix = 'product_shop';
// $order_by_prefix = 'cp';
} elseif ($order_by == 'quantity') {
$order_by_prefix = 'ps';
}
if ($order_by == 'price') {
$order_by = 'orderprice';
}
$active = 1;
if (!Validate::isBool($active) || !Validate::isOrderBy($order_by)) {
die(Tools::displayError());
}
//build where
$where = '';
$sql_join = '';
$sql_group = '';
if (Tools::getIsset('ajaxtabcate') && Tools::getValue('ajaxtabcate')) {
$sql_join .= ' INNER JOIN '._DB_PREFIX_.'category_product cp ON (cp.id_product= p.`id_product` )';
$where .= ' AND cp.`id_category` = '.(int)(Tools::getValue('ajaxtabcate')).'';
$sql_group = ' GROUP BY p.id_product';
} else {
$value_by_categories = isset($params['value_by_categories']) ? $params['value_by_categories'] : 0;
if ($value_by_categories) {
$id_categories = isset($params['categorybox']) ? $params['categorybox'] : '';
# We validate id_categories in apPageHelper::addonValidInt function . This function is used at any where
$id_categories = apPageHelper::addonValidInt($id_categories);
if (isset($params['category_type']) && $params['category_type'] == 'default') {
$where .= ' AND product_shop.`id_category_default` IN ('.pSQL($id_categories).')';
} else {
$sql_join .= ' INNER JOIN '._DB_PREFIX_.'category_product cp ON (cp.id_product= p.`id_product` )';
$where .= ' AND cp.`id_category` IN ('.pSQL($id_categories).')';
$sql_group = ' GROUP BY p.id_product';
}
}
}
$value_by_supplier = isset($params['value_by_supplier']) ? $params['value_by_supplier'] : 0;
if ($value_by_supplier && isset($params['supplier'])) {
# We validate id_categories in apPageHelper::addonValidInt function. This function is used at any where
$id_suppliers = apPageHelper::addonValidInt($params['supplier']);
$where .= ' AND p.id_supplier IN ('.pSQL($id_suppliers).')';
}
$value_by_product_id = isset($params['value_by_product_id']) ? $params['value_by_product_id'] : 0;
if ($value_by_product_id && isset($params['product_id'])) {
$temp = explode(',', $params['product_id']);
foreach ($temp as $key => $value) {
// validate module
$temp[$key] = (int)$value;
}
$product_id = implode(',', array_map('intval', $temp));
$where .= ' AND p.id_product '.(strpos($product_id, ',') === false ? '= '.(int)$product_id : 'IN ('.pSQL($product_id).')');
}
$value_by_manufacture = isset($params['value_by_manufacture']) ? $params['value_by_manufacture'] : 0;
if ($value_by_manufacture && isset($params['manufacture'])) {
# We validate id_categories in apPageHelper::addonValidInt function. This function is used at any where
$id_manufactures = apPageHelper::addonValidInt($params['manufacture']);
$where .= ' AND p.id_manufacturer IN ('.pSQL($id_manufactures).')';
}
$product_type = isset($params['product_type']) ? $params['product_type'] : '';
$value_by_product_type = isset($params['value_by_product_type']) ? $params['value_by_product_type'] : 0;
if ($value_by_product_type && $product_type == 'new_product') {
$where .= ' AND product_shop.`date_add` > "'.date('Y-m-d', strtotime('-'.(Configuration::get('PS_NB_DAYS_NEW_PRODUCT') ?
(int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY')).'"';
}
//home feature
if ($value_by_product_type && $product_type == 'home_featured') {
$ids = array();
$category = new Category(Context::getContext()->shop->getCategory(), (int)Context::getContext()->language->id);
// Load more product $n*$p, hidden
$result = $category->getProducts((int)Context::getContext()->language->id, 1, $n*($p+1), 'position');
foreach ($result as $product) {
$ids[$product['id_product']] = 1;
}
$ids = array_keys($ids);
sort($ids);
$ids = count($ids) > 0 ? implode(',', $ids) : 'NULL';
$where .= ' AND p.`id_product` IN ('.$ids.')';
}
//special or price drop
if ($value_by_product_type && $product_type == 'price_drop') {
$current_date = date('Y-m-d H:i:s');
$id_address = $context->cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')};
$ids = Address::getCountryAndState($id_address);
$id_country = $ids['id_country'] ? $ids['id_country'] : Configuration::get('PS_COUNTRY_DEFAULT');
$id_country = (int)$id_country;
$ids_product = SpecificPrice::getProductIdByDate($context->shop->id, $context->currency->id, $id_country, $context->customer->id_default_group, $current_date, $current_date, 0, false);
$tab_id_product = array();
foreach ($ids_product as $product) {
if (is_array($product)) {
$tab_id_product[] = (int)$product['id_product'];
} else {
$tab_id_product[] = (int)$product;
}
}
$where .= ' AND p.`id_product` IN ('.((is_array($tab_id_product) && count($tab_id_product)) ? implode(', ', $tab_id_product) : 0).')';
}
$sql = 'SELECT p.*, product_shop.*, p.`reference`, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity,
product_attribute_shop.id_product_attribute,
product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity,
pl.`description`, pl.`description_short`, pl.`available_now`,
pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`,
image_shop.`id_image`,
il.`legend`, m.`name` AS manufacturer_name, cl.`name` AS category_default,
DATEDIFF(product_shop.`date_add`, DATE_SUB(NOW(),
INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? (int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).'
DAY)) > 0 AS new, product_shop.price AS orderprice';
if ($value_by_product_type && $product_type == 'best_sellers') {
$sql .= ' FROM `'._DB_PREFIX_.'product_sale` ps';
$sql .= ' LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product`';
} else {
$sql .= ' FROM `'._DB_PREFIX_.'product` p';
}
$sql .= ' INNER JOIN '._DB_PREFIX_.'product_shop product_shop ON (product_shop.id_product = p.id_product AND product_shop.id_shop = '.(int)$context->shop->id.')
LEFT JOIN '._DB_PREFIX_.'product_attribute_shop product_attribute_shop ON p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.'
'.ProductCore::sqlStock('p', 'product_attribute_shop', false, $context->shop).'
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (product_shop.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
LEFT JOIN '._DB_PREFIX_.'image_shop image_shop ON (image_shop.id_product = p.id_product AND image_shop.id_shop = '.(int)$context->shop->id.' AND image_shop.cover=1)
LEFT JOIN '._DB_PREFIX_.'image_lang il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN '._DB_PREFIX_.'manufacturer m ON m.`id_manufacturer` = p.`id_manufacturer`';
$sql .= $sql_join;
$sql .= ' WHERE product_shop.`id_shop` = '.(int)$context->shop->id.'
AND product_shop.`active` = 1
AND product_shop.`visibility` IN ("both", "catalog")'
.$where;
$sql .= $sql_group;
if ($random === true) {
// $sql .= ' ORDER BY product_shop.date_add '.(!$get_total ? ' LIMIT '.(int)$n : '');
$sql .= ' ORDER BY RAND() '.(!$get_total ? ' LIMIT '.(int)$n : '');
} else {
$order_way = Validate::isOrderWay($order_way) ? Tools::strtoupper($order_way) : 'ASC';
$sql .= ' ORDER BY '.(!empty($order_by_prefix) ? '`'.pSQL($order_by_prefix).'`.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way)
.(!$get_total ? ' LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n : '');
}
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
if ($order_by == 'orderprice') {
Tools::orderbyPrice($result, $order_way);
}
if (!$result) {
return array();
}
// Add attributes product
$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']];
}
}
}
/* Modify SQL result */
// $this->context->controller->addColorsToProductList($result);
return Product::getProductsProperties($id_lang, $result);
}
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, 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') .
($check_stock ? 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;
}
// print_r($res);die;
$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 (Tools::isEmpty($row['color']) && !@filemtime(_PS_COL_IMG_DIR_ . $row['id_attribute'] . '.jpg')) {
continue;
} elseif (Tools::isEmpty($row['color']) && @filemtime(_PS_COL_IMG_DIR_ . $row['id_attribute'] . '.jpg')) {
$row['texture'] = _THEME_COL_DIR_ . $row['id_attribute'] . '.jpg';
}
$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']);
// print_r($attribute);die;
return $attribute;
}
//DONGND:: register hook back-end
public function hookActionAdminControllerSetMedia()
{
Media::addJsDef(
array(
'appagebuilder_module_dir' => $this->_path,
'appagebuilder_listshortcode_url' => $this->context->link->getAdminLink('AdminApPageBuilderShortcode').'&get_listshortcode=1',
)
);
$this->context->controller->addJS(apPageHelper::getJsAdminDir().'admin/function.js');
if ('AdminLegacyLayoutControllerCore' != get_class($this->context->controller)) {
$this->context->controller->addJS(apPageHelper::getJsAdminDir().'admin/setting.js');
}
Configuration::updateValue('shortcode_url_add', $this->context->link->getAdminLink('AdminApPageBuilderShortcode'));
$this->autoRestoreSampleData();
if (Tools::getValue('configure') == 'appagebuilder') {
Media::addJsDef(array('autoload_func_name' => 'SetButonSaveToHeader'));
$this->context->controller->addJs(apPageHelper::getJsAdminDir().'admin/autoload.js');
Media::addJsDef(array('TopSaveAndStay_Name' => 'submitApPageBuilder'));
$this->context->controller->addJs(apPageHelper::getJsAdminDir().'admin/function.js');
}
}
public function hookdisplayHeader()
{
if (!$this->all_active_profile) {
$model = new ApPageBuilderProfilesModel();
$this->all_active_profile = $model->getAllProfileByShop();
}
$use_profiles = ApPageBuilderProfilesModel::getActiveProfile('index', $this->all_active_profile);
if (Tools::getValue('controller') == 'index' || Tools::getValue('controller') == 'appagebuilderhome') {
if (!empty($use_profiles) && isset($use_profiles['profile_key'])) {
$this->context->smarty->assign(array(
'leo_class' => $use_profiles['profile_key'],
'leo_class_home' => (isset($use_profiles['active']) && $use_profiles['active'] == 1) ? 'leo-active' : '',
));
}
}
if (Tools::getIsset('controller') && Tools::getValue('controller') == 'sitemap') {
if ($this->getConfig('link_home_site_map') == 1) {
$leo_profiles = $this->all_active_profile;
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoFriendlyUrl.php');
if (!empty($leo_profiles)) {
foreach ($leo_profiles as $key_pf => $val_pf) {
$leo_friendly_url = LeoFriendlyUrl::getInstance();
$link = Context::getContext()->link;
$idLang = Context::getContext()->language->id;
$idShop = null;
$relativeProtocol = false;
$url = $link->getBaseLink($idShop, null, $relativeProtocol).$leo_friendly_url->getLangLink($idLang, null, $idShop).$val_pf['friendly_url'].'.html';
$leo_profiles[$key_pf]['url'] = $url;
}
}
$this->context->smarty->assign(array(
'leo_profiles' => $leo_profiles,
));
Media::addJsDef(array(
'leo_site_map' => $this->fetch('module:appagebuilder/views/templates/hook/link_sitemap.tpl'),
));
} else {
Media::addJsDef(array(
'leo_site_map' => '',
));
}
}
//apPageHelper::autoUpdateModule();
if (isset(Context::getContext()->controller->controller_type) && in_array(Context::getContext()->controller->controller_type, array('front', 'modulefront'))) {
# WORK AT FRONTEND
$this->profile_data = ApPageBuilderProfilesModel::getActiveProfile('index', $this->all_active_profile, $this->getConfig('USE_MOBILE_THEME'));
if (!isset($this->profile_data['params'])) {
return '';
}
$this->profile_param = Tools::jsonDecode($this->profile_data['params'], true);
$this->setFullwidthHook();
apPageHelper::loadShortCode(apPageHelper::getConfigDir('_PS_THEME_DIR_'), $this->profile_param);
$ap_live_edit = Tools::getValue('ap_live_edit');
$id_appagebuilder_profiles = Tools::getValue('id_appagebuilder_profiles');
//convert id_profile to home-1
if (!$ap_live_edit && Configuration::get('PS_REWRITING_SETTINGS') && Tools::getIsset('id_appagebuilder_profiles') && $id_appagebuilder_profiles) {
if (isset($this->profile_data['friendly_url']) && !empty($this->profile_data['friendly_url'])) {
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoFriendlyUrl.php');
$leo_friendly_url = LeoFriendlyUrl::getInstance();
$link = Context::getContext()->link;
$idLang = Context::getContext()->language->id;
$idShop = null;
$relativeProtocol = false;
$url = $link->getBaseLink($idShop, null, $relativeProtocol).$leo_friendly_url->getLangLink($idLang, null, $idShop).$this->profile_data['friendly_url'].'.html';
$leo_friendly_url->canonicalRedirection($url);
}
}
# FIX 1.7
apPageHelper::setGlobalVariable($this->context);
}
if (Configuration::get('APPAGEBUILDER_LOAD_WAYPOINTS')) {
$uri = apPageHelper::getCssDir().'animate.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'waypoints.min.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
if (Configuration::get('APPAGEBUILDER_LOAD_INSTAFEED')) {
$uri = apPageHelper::getJsDir().'instafeed.min.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
if (Configuration::get('APPAGEBUILDER_LOAD_STELLAR')) {
$uri = apPageHelper::getJsDir().'jquery.stellar.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
if (Configuration::get('APPAGEBUILDER_LOAD_OWL')) {
$uri = apPageHelper::getCssDir().'owl.carousel.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getCssDir().'owl.theme.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'owl.carousel.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
if (Configuration::get('APPAGEBUILDER_LOAD_SWIPER')) {
$uri = apPageHelper::getCssDir().'swiper.min.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'swiper.min.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
//DONGND:: add jquery plugin images loaded
$uri = apPageHelper::getJsDir().'imagesloaded.pkgd.min.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
//slick
$uri = apPageHelper::getJsDir().'slick.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
$uri = apPageHelper::getCssDir().'slick-theme.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getCssDir().'slick.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
// zoom
if (Configuration::get('APPAGEBUILDER_LOAD_PRODUCTZOOM')) {
$uri = apPageHelper::getJsDir().'jquery.elevateZoom-3.0.8.min.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
// lazy load
if (Configuration::get('APPAGEBUILDER_LOAD_LAZY')) {
$uri = apPageHelper::getJsDir().'lazyload.min.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
// counter
if (Configuration::get('APPAGEBUILDER_LOAD_NUMSCROLLER')) {
$uri = apPageHelper::getJsDir().'numscroller-min-1.0.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
if (Configuration::get('APPAGEBUILDER_LOAD_TABCOLLAPSE')) {
$uri = apPageHelper::getJsDir().'tabaccordion.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
$uri = apPageHelper::getCssDir().'tabaccordion.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
}
$product_list_image = Configuration::get('APPAGEBUILDER_LOAD_IMG');
$product_one_img = Configuration::get('APPAGEBUILDER_LOAD_TRAN');
$category_qty = Configuration::get('APPAGEBUILDER_LOAD_PN');
$productCdown = Configuration::get('APPAGEBUILDER_LOAD_COUNT');
// $productColor = Configuration::get('APPAGEBUILDER_LOAD_ACOLOR');
$productColor = false;
$ajax_enable = $product_list_image || $product_one_img || $category_qty || $productCdown || $productColor;
$this->smarty->assign(array(
'ajax_enable' => $ajax_enable,
'product_list_image' => $product_list_image,
'product_one_img' => $product_one_img,
'category_qty' => $category_qty,
'productCdown' => $productCdown,
'productColor' => $productColor
));
$this->context->controller->addJqueryPlugin('fancybox');
if ($productCdown) {
$uri = apPageHelper::getJsDir().'countdown.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 80));
}
if ($product_list_image) {
$this->context->controller->addJqueryPlugin(array('scrollTo', 'serialScroll'));
}
// add js for html5 youtube video
if (Configuration::get('APPAGEBUILDER_LOAD_HTML5VIDEO')) {
$uri = apPageHelper::getCssDir().'mediaelementplayer.min.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'mediaelement-and-player.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
//add js,css for full page js
if (Configuration::get('APPAGEBUILDER_LOAD_FULLPAGEJS')) {
$uri = apPageHelper::getCssDir().'jquery.fullPage.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'jquery.fullPage.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
// add js, css for Magic360
if (Configuration::get('APPAGEBUILDER_LOAD_IMAGE360')) {
$uri = apPageHelper::getCssDir().'magic360.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getCssDir().'magic360.module.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'magic360.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
// add js, css for ImageHotPot
if (Configuration::get('APPAGEBUILDER_LOAD_IMAGEHOTPOT')) {
$uri = apPageHelper::getCssDir().'ApImageHotspot.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'ApImageHotspot.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
// add js Cookie : jquery.cooki-plugin.js
if (Configuration::get('APPAGEBUILDER_LOAD_COOKIE')) {
$this->context->controller->addJqueryPlugin('cooki-plugin');
}
// $uri = apPageHelper::getCssDir().'styles.css';
// $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
//add unique css file, css of module for all theme, no need override
$uri = apPageHelper::getCssDir().'unique.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'script.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
if (!$this->product_active) {
$this->product_active = ApPageBuilderProductsModel::getActive($this->getConfig('USE_MOBILE_THEME'));
}
$this->smarty->smarty->assign(array('productClassWidget' => $this->product_active['class']));
$tpl_file = apPageHelper::getConfigDir('theme_profiles') . $this->product_active['plist_key'].'.tpl';
if (is_file($tpl_file)) {
$this->smarty->smarty->assign(array('productProfileDefault' => $this->product_active['plist_key']));
}
// In the case not exist: create new cache file for template
if (!$this->isCached('module:appagebuilder/views/templates/hook/header.tpl', $this->getCacheId('displayHeader'))) {
if (!$this->hook_index_data) {
$model = new ApPageBuilderModel();
$this->hook_index_data = $model->getAllItems($this->profile_data, 1, $this->default_language['id_lang']);
}
$this->smarty->assign(array(
'homeSize' => Image::getSize(ImageType::getFormattedName('home')),
'mediumSize' => Image::getSize(ImageType::getFormattedName('medium'))
));
}
# LEOTEMCP
$isRTL = $this->context->language->is_rtl;
$leoRTL = $this->context->language->is_rtl;
if ($leoRTL && version_compare(Configuration::get('PS_VERSION_DB'), '1.7.3.0', '>=')) {
$directory = _PS_ALL_THEMES_DIR_.apPageHelper::getThemeName();
$allFiles = Tools::scandir($directory, 'css', '', true);
$rtl_file = false;
foreach ($allFiles as $key => $file) {
if (Tools::substr(rtrim($file, '.css'), -4) == '_rtl') {
$rtl_file = true;
break;
}
}
if ($rtl_file) {
$leoRTL = false; // to remove class RTL
// $this->context->controller->unregisterStylesheet('theme-rtl');
@unlink(_PS_ALL_THEMES_DIR_.apPageHelper::getThemeName().'/assets/css/rtl_rtl.css'); // Remove file rtl_rtl.css
$this->context->controller->registerStylesheet('theme-rtl', '/assets/css/rtl.css', array('media' => 'all', 'priority' => 900));
}
}
// $id_shop = $this->context->shop->id;
// $helper = LeoFrameworkHelper::getInstance();
$this->themeCookieName = $this->getConfigName('PANEL_CONFIG');
$panelTool = $this->getConfig('PANELTOOL');
$backGroundValue = '';
//DONGND:: get product detail layout
$list_productdetail_layout = array();
if ($panelTool) {
# ENABLE PANEL TOOL
$uri = apPageHelper::getCssDir().'colorpicker/css/colorpicker.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getCssDir().'paneltool.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'colorpicker/js/colorpicker.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
$uri = apPageHelper::getJsDir().'paneltool.js';
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
$this->context->controller->addJqueryPlugin('cooki-plugin');
$skin = $this->getPanelConfig('default_skin');
$layout_mode = $this->getPanelConfig('layout_mode');
$enable_fheader = (int)$this->getPanelConfig('enable_fheader');
$backGroundValue = array(
'attachment' => array('scroll', 'fixed', 'local', 'initial', 'inherit'),
'repeat' => array('repeat', 'repeat-x', 'repeat-y', 'no-repeat', 'initial', 'inherit'),
'position' => array('left top', 'left center', 'left bottom', 'right top', 'right center', 'right bottom', 'center top', 'center center', 'center bottom')
);
//DONGND:: check table exist
$check_table = Db::getInstance()->executeS('SELECT table_name FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME = "'._DB_PREFIX_.'appagebuilder_details"');
if (count($check_table) > 0) {
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 = $first_product['id_product'];
}
$sql = 'SELECT a.*
FROM `'._DB_PREFIX_.'appagebuilder_details` as a
INNER JOIN `'._DB_PREFIX_.'appagebuilder_details_shop` ps ON (ps.`id_appagebuilder_details` = a.`id_appagebuilder_details`) WHERE ps.id_shop='.(int)$this->context->shop->id;
$list_productdetail = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
if ($id_product && count($list_productdetail) > 1) {
foreach ($list_productdetail as $key => $list_productdetail_item) {
$product_layout_link = '';
$product_layout_link = $this->context->link->getProductLink($id_product, null, null, null, null, null, (int)Product::getDefaultAttribute((int)$id_product));
$product_layout_link = str_replace('.html', '.html?layout='.$list_productdetail_item['plist_key'], $product_layout_link);
$list_productdetail[$key]['product_layout_link'] = $product_layout_link;
}
$list_productdetail_layout = $list_productdetail;
}
}
} else {
$skin = $this->getConfig('default_skin');
$layout_mode = $this->getConfig('layout_mode');
$enable_fheader = $this->getConfig('enable_fheader');
if (apPageHelper::getPageName() == 'category') {
$this->context->controller->addJqueryPlugin('cooki-plugin');
}
}
// if ($this->getConfig('ENABLE_CUSTOMFONT')) {
// # CUSTOM FONT
// $uri = apPageHelper::getCssDir().'fonts-cuttom.css';
// $this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
// }
if ($this->getConfig('ENABLE_LOADFONT')) {
# CUSTOM FONT
$uri = apPageHelper::getCssDir().'fonts-cuttom2.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
}
$layout_width_val = '';
$layout_width = $this->getConfig('layout_width');
if (trim($layout_width) != 'auto' && trim($layout_width) != '') {
$layout_width = (int)$layout_width;
$layout_width_val = '<style type="text/css">.container{max-width:'.$layout_width.'px}</style>';
if (is_numeric($layout_width)) {
# validate module
$layout_width_val .= '<script type="text/javascript">layout_width = '.$layout_width.';</script>';
}
}
$load_css_type = $this->getConfig('load_css_type');
$css_skin = array();
$css_custom = array();
if ($load_css_type) {
# Load Css With Prestashop Standard - YES
if (!$this->getConfig('enable_responsive')) {
$uri = apPageHelper::getCssDir().'non-responsive.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
}
# LOAD SKIN CSS IN MODULE
$uri = apPageHelper::getCssDir().'skins/'.$skin.'/skin.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
$uri = apPageHelper::getCssDir().'skins/'.$skin.'/custom-rtl.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
# LOAD CUSTOM CSS
if ($this->context->getMobileDevice() != false && !$this->getConfig('enable_responsive')) {
$uri = apPageHelper::getCssDir().'mobile.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
}
# LOAD POSITIONS AND PROFILES
$this->loadResouceForProfile();
# LOAD PATTERN
if ($profile = $this->getConfig('c_profile')) {
$uri = apPageHelper::getCssDir().'patterns/'.$profile.'.css';
$this->context->controller->registerStylesheet(sha1($uri), $uri, array('media' => 'all', 'priority' => 8000));
}
} else {
# Load Css With Prestashop Standard - NO
if (!$this->getConfig('enable_responsive')) {
$uri = apPageHelper::getCssDir().'non-responsive.css';
$skinFileUrl = apPageHelper::getFullPathCss($uri);
if ($skinFileUrl !== false) {
$css_skin[] = '<link rel="stylesheet" href="'.apPageHelper::getUriFromPath($skinFileUrl).'" type="text/css" media="all" />';
}
}
# LOAD SKIN CSS IN TPL
$uri = apPageHelper::getCssDir().'skins/'.$skin.'/skin.css';
$skinFileUrl = apPageHelper::getFullPathCss($uri);
if ($skinFileUrl !== false) {
$css_skin[] = '<link rel="stylesheet" id="leo-dynamic-skin-css" href="'.apPageHelper::getUriFromPath($skinFileUrl).'" type="text/css" media="all" />';
}
$uri = apPageHelper::getCssDir().'skins/'.$skin.'/custom-rtl.css';
$skinFileUrl = apPageHelper::getFullPathCss($uri);
if ($leoRTL && $skinFileUrl !== false) {
$css_skin[] = '<link rel="stylesheet" id="leo-dynamic-skin-css-rtl" href="'.apPageHelper::getUriFromPath($skinFileUrl).'" type="text/css" media="all" />';
}
# LOAD CUSTOM CSS
if ($this->context->getMobileDevice() != false && !$this->getConfig('enable_responsive')) {
$uri = apPageHelper::getCssDir().'mobile.css';
$skinFileUrl = apPageHelper::getFullPathCss($uri);
if ($skinFileUrl !== false) {
$css_skin[] = '<link rel="stylesheet" href="'.apPageHelper::getUriFromPath($skinFileUrl).'" type="text/css" media="all" />';
}
}
# LOAD POSITIONS AND PROFILES
$this->loadResouceForProfile();
# LOAD PATTERN
if ($profile = $this->getConfig('c_profile')) {
$uri = apPageHelper::getCssDir().'patterns/'.$profile.'.css';
$skinFileUrl = apPageHelper::getFullPathCss($uri);
if ($skinFileUrl !== false) {
$css_skin[] = '<link rel="stylesheet" href="'.apPageHelper::getUriFromPath($skinFileUrl).'" type="text/css" media="all" />';
}
}
}
if ($this->context->language->is_rtl) {
# OVERRIDE CORE, LOAD RTL.CSS FILE AT BOTTOM
$this->context->controller->registerStylesheet('theme-rtl', '/assets/css/rtl.css', ['media' => 'all', 'priority' => 9000]);
}
$ps = array(
'LEO_THEMENAME' => apPageHelper::getThemeName(),
'LEO_PANELTOOL' => $panelTool,
'LEO_SUBCATEGORY' => $this->getConfig('subcategory'),
'LEO_DEFAULT_SKIN' => $skin,
'LEO_LAYOUT_MODE' => $layout_mode,
'BACKGROUNDVALUE' => $backGroundValue,
'LAYOUT_WIDTH' => $layout_width_val,
'LOAD_CSS_TYPE' => $load_css_type,
'LEO_CSS' => $css_custom,
'LEO_SKIN_CSS' => $css_skin,
'IS_RTL' => $isRTL,
'LEO_RTL' => $leoRTL,
'USE_PTABS' => $this->getConfig('ENABLE_PTAB'),
'USE_FHEADER' => $enable_fheader,
'LEO_COOKIE_THEME' => $this->themeCookieName,
'LEO_BACKTOP' => $this->getConfig('backtop'),
'apPageHelper' => apPageHelper::getInstance(),
'leoConfiguration' => new Configuration(),
'list_productdetail_layout' => $list_productdetail_layout,
'aplazyload' => Configuration::get('APPAGEBUILDER_LOAD_LAZY')
);
Media::addJsDefL('LEO_COOKIE_THEME', $this->themeCookieName);
$this->context->smarty->assign($ps);
$page_name = apPageHelper::getPageName();
$page = $this->smarty->smarty->getVariable('page')->value;
if (isset($this->profile_data['meta_title']) && $this->profile_data['meta_title'] && $page_name == 'index') {
$page['meta']['title'] = $this->profile_data['meta_title'];
}
if (isset($this->profile_data['meta_description']) && $this->profile_data['meta_description'] && $page_name == 'index') {
$page['meta']['description'] = $this->profile_data['meta_description'];
}
if (isset($this->profile_data['meta_keywords']) && $this->profile_data['meta_keywords'] && $page_name == 'index') {
$page['meta']['keywords'] = $this->profile_data['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' => ApPageBuilderProfilesModel::getAllProfileRewrite($this->profile_data['id_appagebuilder_profiles'])));
}
if ($controller == 'sitemap') {
$profiles = $this->all_active_profile;
foreach ($this->all_active_profile as $key => $profile) {
if (!isset($profile['friendly_url']) || !$profile['friendly_url']) {
unset($profiles[$key]);
}
}
$this->smarty->smarty->assign('simap_ap_profiles', $profiles);
}
$this->header_content = $this->display(__FILE__, 'header.tpl');
return $this->header_content;
}
//DONGND:: build shortcode by hook
public function hookDisplayApSC($params)
{
if (isset($params['sc_key']) && $params['sc_key'] != '') {
return $this->processShortCode($params['sc_key']);
}
}
//DONGND:: build shortcode by embedded in content
public function buildShortCode($content)
{
//DONGND:: validate module
$result = preg_replace_callback(
'~\[ApSC(.*?)\[\/ApSC\]~',
function ($matches_tmp) {
preg_match_all("~sc_key=(.*?)\]~", $matches_tmp[1], $tmp);
return self::processShortCode($tmp[1][0]);
},
$content
);
return $result;
}
//DONGN:: get list short code for tinymce
public function getListShortCodeForEditor()
{
$this->smarty->smarty->assign(array(
'js_dir' => _PS_JS_DIR_,
'appagebuilder_module_dir' => $this->_path,
'shortcode_url_add' => Configuration::get('shortcode_url_add').'&addappagebuilder_shortcode',
'shortcode_url' => Configuration::get('shortcode_url_add'),
'list_shortcode' => ApPageBuilderShortcodeModel::getListShortCode(),
));
return $this->display(__FILE__, 'list_shortcode.tpl');
}
private function processShortCode($shortcode_key)
{
$disable_cache = false;
if (!Configuration::get('PS_SMARTY_CACHE')) {
$disable_cache = true;
}
$cache_id = $this->getCacheId('apshortcode', $shortcode_key);
if ($disable_cache || !$this->isCached($this->templateFile, $cache_id)) {
$shortcode_html = '';
$shortcode_obj = ApPageBuilderShortcodeModel::getShortCode($shortcode_key);
if (isset($shortcode_obj['id_appagebuilder']) && $shortcode_obj['id_appagebuilder'] != '' && $shortcode_obj['id_appagebuilder'] != 0) {
$shortcode_code = ApPageBuilderShortcodeModel::getAllItems($shortcode_obj['id_appagebuilder'], 1);
if (!empty($shortcode_code)) {
if (empty(ApShortCodesBuilder::$shortcode_tags)) {
apPageHelper::loadShortCode(apPageHelper::getConfigDir('_PS_THEME_DIR_'));
}
apPageHelper::setGlobalVariable($this->context);
// ApShortCodesBuilder::$is_front_office = 1;
// ApShortCodesBuilder::$is_gen_html = 1;
// ApShortCodesBuilder::$profile_param = array();
$ap_helper = new ApShortCodesBuilder();
// ApShortCodesBuilder::$hook_name = 'apshortcode';
$shortcode_html = $ap_helper->parse($shortcode_code['apshortcode']);
}
}
$this->smarty->assign(array('apContent' => $shortcode_html));
}
return $this->display(__FILE__, 'appagebuilder.tpl', $cache_id);
}
protected function getCacheId($hookName = null, $shortcode_key = null)
{
$cache_array = array();
//if call function from shortcode return cache of shortcode
if ($shortcode_key) {
$cache_array[] = 'shortcodekey_'.$shortcode_key;
} else {
//process nomal cache for each hook
//create folder cache for each home by id or buy home name
$cache_array[] = $this->profile_data['id_appagebuilder_profiles'];
//set cache for each hook in profile
$cache_array[] = $hookName;
//kiem tra xem module confg
if ($this->profile_param && isset($this->profile_param[$hookName]) && $this->profile_param[$hookName]) {
$current_page = apPageHelper::getPageName();
$iscached = 0;
//check cache in sub page
if (($current_page == "category" || $current_page == 'product')) {
if (isset($this->profile_param[$hookName]['nocategory'])) {
if (in_array(Tools::getValue('id_category'), $this->profile_param[$hookName]['nocategory'])) {
$cache_array[] = Tools::getValue('id_category');
$iscached = 1;
}
}
if (isset($this->profile_param[$hookName]['nocategoryproduct'])) {
if (in_array(Tools::getValue('id_category'), $this->profile_param[$hookName]['nocategoryproduct'])) {
$cache_array[] = Tools::getValue('id_category');
$iscached = 1;
}
}
if (!$iscached && $current_page == "category" && isset($this->profile_param[$hookName]['categoryproduct'])) {
if (in_array(Tools::getValue('id_category'), $this->profile_param[$hookName]['categoryproduct'])) {
$cache_array[] = Tools::getValue('id_category');
$iscached = 1;
}
}
if (!$iscached && $current_page == "category" && isset($this->profile_param[$hookName]['categoryproductmain'])) {
if (in_array(Tools::getValue('id_category'), $this->profile_param[$hookName]['categoryproductmain'])) {
$cache_array[] = Tools::getValue('id_category');
$iscached = 1;
}
}
//product in no category
if (!$iscached && $current_page == "product" && isset($this->profile_param[$hookName]['nocategoryproduct'])) {
$procate = Product::getProductCategoriesFull(Tools::getValue('id_product'));
$procheck = 0;
foreach ($procate as $proc) {
if (in_array($proc['id_category'], $this->profile_param[$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->profile_param[$hookName]['categoryproduct'])) {
$procate = Product::getProductCategoriesFull(Tools::getValue('id_product'));
$procheck = 0;
foreach ($procate as $proc) {
if (in_array($proc['id_category'], $this->profile_param[$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->profile_param[$hookName]['categoryproduct'])) {
$procate = new Product(Tools::getValue('id_product'));
if (in_array($procate['id_category_default'], $this->profile_param[$hookName]['categoryproduct'])) {
$cache_array[] = 'product_'.Tools::getValue('id_product');
$iscached = 1;
}
}
}
//cache big page
if (!$iscached && isset($this->profile_param[$hookName][$current_page])) {
$cache_array[] = $current_page;
$iscached = 1;
}
//cache big page not show
if (!$iscached && isset($this->profile_param[$hookName]['exception']) && in_array($cache_array, $this->profile_param[$hookName]['exception'])) {
//show but not in controller
$cache_array[] = $current_page;
$iscached = 1;
}
//random in product carousel
if (isset($this->profile_param[$hookName]['productCarousel'])) {
$random = round(rand(1, max(Configuration::get('APPAGEBUILDER_PRODUCT_MAX_RANDOM'), 1)));
$cache_array[] = "p_carousel_$random";
}
if (isset($this->profile_param[$hookName][$current_page])) {
$cache_array[] = $current_page;
if ($current_page != 'index' && $cache_id = ApPageSetting::getControllerId($current_page, $this->profile_param[$hookName][$current_page])) {
$cache_array[] = $cache_id;
}
} else if (isset($this->profile_param[$hookName]['nocategory']) || isset($this->profile_param[$hookName]['categoryproduct'])) {
if (in_array(Tools::getValue('id_category'), $this->profile_param[$hookName]['nocategory'])) {
$cache_array[] = Tools::getValue('id_category');
}
} else if (isset($this->profile_param[$hookName]['categoryproduct']) && ($current_page == "category" || $current_page == 'product')) {
if ($current_page == 'category') {
if (!ApPageSetting::getControllerId($current_page, $this->profile_param[$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->profile_param[$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, ApPageSetting::getHook('header')) || $hookName == 'pagebuilderConfig|header')) {
$cache_array[] = 'header_'.Tools::getValue('header');
}
if (Tools::getValue('content')&& Tools::getIsset('leopanelchange') && (in_array($hookName, ApPageSetting::getHook('content')) || $hookName == 'pagebuilderConfig|content')) {
$cache_array[] = 'content_'.Tools::getValue('content');
}
if (Tools::getValue('product')&& Tools::getIsset('leopanelchange') && (in_array($hookName, ApPageSetting::getHook('product')) || $hookName == 'pagebuilderConfig|product')) {
$cache_array[] = 'product_'.Tools::getValue('product');
}
if (Tools::getValue('footer') && Tools::getIsset('leopanelchange') && (in_array($hookName, ApPageSetting::getHook('footer')) || $hookName == 'pagebuilderConfig|footer')) {
$cache_array[] = 'footer_'.Tools::getValue('footer');
}
}
if (Context::getContext()->isTablet()) {
$cache_array[] = "tablet";
} elseif (Context::getContext()->isMobile()) {
$cache_array[] = "mobile";
}
return parent::getCacheId().'|'.implode('|', $cache_array);
}
public function renderWidget($hookName = null, array $configuration = [])
{
if (!isset($this->profile_data['params'])) {
return '';
}
$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'] : ApPageSetting::getCacheHook(3);
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;
}
//run without cache no create cache
if ($disable_cache) {
$ap_content = $this->getWidgetVariables($hookName, $configuration);
$this->smarty->assign(array('apContent' => $ap_content));
return $this->fetch($this->templateFile);
} else {
$cache_id = $this->getCacheId($hookName);
if (!$this->isCached($this->templateFile, $cache_id)) {
$this->smarty->assign(array('apContent' => $this->getWidgetVariables($hookName, $configuration)));
}
return $this->fetch($this->templateFile, $cache_id);
}
}
public function getWidgetVariables($hookName = null, array $configuration = [])
{
// validate module
unset($configuration);
$model = new ApPageBuilderModel();
//get all data from all hook
if (!$this->hook_index_data) {
$this->hook_index_data = $model->getAllItems($this->profile_data, 1, $this->default_language['id_lang']);
}
if (!isset($this->hook_index_data[$hookName]) || trim($this->hook_index_data[$hookName]) == '') {
return '';
}
//convert short code to html
return $model->parseData($hookName, $this->hook_index_data[$hookName], $this->profile_param);
}
public function hookDisplayLeoProfileProduct($params)
{
apPageHelper::setGlobalVariable($this->context);
$html = '';
$tpl_file = '';
if (isset($params['ony_global_variable'])) {
# {hook h='displayLeoProfileProduct' ony_global_variable=true}
return $html;
}
if (!isset($params['product'])) {
return 'Not exist product to load template';
} else if (isset($params['profile'])) {
# {hook h='displayLeoProfileProduct' product=$product profile=$productProfileDefault}
$tpl_file = apPageHelper::getConfigDir('theme_profiles') . $params['profile'].'.tpl';
} else if (isset($params['load_file'])) {
# {hook h='displayLeoProfileProduct' product=$product load_file='templates/catalog/_partials/miniatures/product.tpl'}
$tpl_file = apPageHelper::getConfigDir('_PS_THEME_DIR_') . $params['load_file'];
} else if (isset($params['typeProduct'])) {
//DONGND:: load default product tpl when do not have product profile
if ($params['product']['productLayout'] != '') {
$tpl_file = apPageHelper::getConfigDir('theme_details') . $params['product']['productLayout'].'.tpl';
} else {
$tpl_file = _PS_ALL_THEMES_DIR_.apPageHelper::getThemeName().'/templates/catalog/product.tpl';
}
}
if (empty($tpl_file)) {
return 'Not exist profile to load template';
}
Context::getContext()->smarty->assign(array(
'product' => $params['product'],
));
$html .= Context::getContext()->smarty->fetch($tpl_file);
return $html;
}
public function hookActionShopDataDuplication()
{
$this->clearHookCache();
}
/**
* Register hook again to after install/change any theme
*/
public function hookActionObjectShopUpdateAfter()
{
// Retrieve hooks used by the module
// $sql = 'SELECT `id_hook` FROM `'._DB_PREFIX_.'hook_module` WHERE `id_module` = '.(int)$this->id;
// $result = Db::getInstance()->executeS($sql);
// foreach ($result as $row) {
// $this->unregisterHook((int)$row['id_hook']);
// $this->unregisterExceptions((int)$row['id_hook']);
// }
}
/**
* FIX BUG 1.7.3.3 : install theme lose hook displayHome, displayLeoProfileProduct
* because ajax not run hookActionAdminBefore();
*/
public function autoRestoreSampleData()
{
if (Hook::isModuleRegisteredOnHook($this, 'actionAdminBefore', (int)Context::getContext()->shop->id)) {
$theme_manager = new stdclass();
$theme_manager->theme_manager = 'theme_manager';
$this->hookActionAdminBefore(array(
'controller' => $theme_manager,
));
}
}
/**
* Run only one when install/change Theme_of_Leo
*/
public function hookActionAdminBefore($params)
{
if (isset($params) && isset($params['controller']) && isset($params['controller']->theme_manager)) {
// Validate : call hook from theme_manager
} 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/appagebuilder';
$to = _PS_ALL_THEMES_DIR_.apPageHelper::getInstallationThemeName().'/modules/appagebuilder';
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_.'appagebuilder/libs/LeoDataSample.php')) {
require_once(_PS_MODULE_DIR_.'appagebuilder/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_APPAGEBUILDER', 0);
if ($install_module) {
Configuration::updateValue('AP_INSTALLED_APPAGEBUILDER', '0');
return;
}
# INSERT DATABASE FROM THEME_DATASAMPLE
if (file_exists(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php')) {
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php');
$sample = new Datasample();
$sample->processImport($this->name);
}
# REMOVE FILE INDEX.PHP FOR TRANSLATE
if (file_exists(_PS_MODULE_DIR_.'appagebuilder/libs/setup.php')) {
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/setup.php');
ApPageSetup::processTranslateTheme();
}
}
/**
* Overide function display of Module.php
* @param type $file
* @param type $template
* @param null $cache_id
* @param type $compile_id
* @return type
*/
public function display($file, $template, $cache_id = null, $compile_id = null)
{
if (($overloaded = Module::_isTemplateOverloadedStatic(basename($file, '.php'), $template)) === null) {
return sprintf($this->l('No template found "%s"'), $template);
} else {
if (Tools::getIsset('live_edit')) {
$cache_id = null;
}
$this->smarty->assign(array(
'module_dir' => __PS_BASE_URI__.'modules/'.basename($file, '.php').'/',
'module_template_dir' => ($overloaded ? _THEME_DIR_ : __PS_BASE_URI__).'modules/'.basename($file, '.php').'/',
'allow_push' => $this->allow_push
));
if ($cache_id !== null) {
Tools::enableCache();
}
$result = $this->getCurrentSubTemplate($template, $cache_id, $compile_id)->fetch();
if ($cache_id !== null) {
Tools::restoreCacheSettings();
}
$this->resetCurrentSubTemplate($template, $cache_id, $compile_id);
return $result;
}
}
public function clearHookCache()
{
// $this->_clearCache('appagebuilder.tpl', $this->name);
$this->_clearCache($this->templateFile);
}
//DONGND:: add clear cache for shortcode
public function clearShortCodeCache($shortcode_key)
{
$cache_id = $this->getCacheId('apshortcode', $shortcode_key);
$this->_clearCache('appagebuilder.tpl', $cache_id);
}
public function hookCategoryAddition()
{
$this->clearHookCache();
}
public function hookCategoryUpdate()
{
$this->clearHookCache();
}
public function hookCategoryDeletion()
{
$this->clearHookCache();
}
public function hookActionProductUpdate()
{
$this->clearHookCache();
}
public function hookActionProductDelete()
{
$this->clearHookCache();
}
public function hookActionProductAdd()
{
$this->clearHookCache();
}
public function hookAddProduct()
{
$this->clearHookCache();
}
public function hookUpdateProduct()
{
$this->clearHookCache();
}
public function hookDeleteProduct()
{
$this->clearHookCache();
}
public function hookDisplayBackOfficeHeader()
{
apPageHelper::autoUpdateModule();
if (method_exists($this->context->controller, 'addJquery')) {
// validate module
$this->context->controller->addJquery();
}
//DONGND:: fix home page config with theme of leotheme, redirect to profile page
if (get_class($this->context->controller) == 'AdminPsThemeCustoConfigurationController' && apPageHelper::getThemeName() != 'default') {
Media::addJsDef(
array(
'ap_profile_url' => $this->context->link->getAdminLink('AdminApPageBuilderProfiles'),
'ap_profile_txt_redirect' => $this->l('You are using a theme from Leotheme. Please access this link to use this feature easily'),
'ap_check_theme_name' => apPageHelper::getThemeName()
)
);
}
$this->context->controller->addCss(apPageHelper::getCssAdminDir().'admin/style.css');
if (!apPageHelper::isRelease()) {
Media::addJsDef(array('js_ap_dev' => 1));
}
}
public function loadResouceForProfile()
{
$profile = $this->profile_data;
$arr = array();
if ($profile['header']) {
$arr[] = $profile['header'];
}
if ($profile['content']) {
$arr[] = $profile['content'];
}
if ($profile['footer']) {
$arr[] = $profile['footer'];
}
if ($profile['product']) {
$arr[] = $profile['product'];
}
if (count($arr) > 0) {
$model = new ApPageBuilderProfilesModel();
$list_positions = $model->getPositionsForProfile($arr);
if ($list_positions) {
foreach ($list_positions as $item) {
$name = $item['position'].$item['position_key'];
$uri = apPageHelper::getCssDir().'positions/'.$name.'.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' => 8000));
}
$uri = apPageHelper::getJsDir().'positions/'.$name.'.js';
if (file_exists(_PS_THEME_DIR_.$uri) && filesize(_PS_THEME_DIR_.$uri)) {
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
}
}
}
$uri = apPageHelper::getCssDir().'profiles/'.$profile['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' => 8000));
}
$uri = apPageHelper::getJsDir().'profiles/'.$profile['profile_key'].'.js';
if (file_exists(_PS_THEME_DIR_.$uri) && filesize(_PS_THEME_DIR_.$uri)) {
$this->context->controller->registerJavascript(sha1($uri), $uri, array('position' => 'bottom', 'priority' => 8000));
}
}
public function getProfileData()
{
return $this->profile_data;
}
public function setFullwidthHook()
{
if (isset(Context::getContext()->controller->controller_type) && in_array(Context::getContext()->controller->controller_type, array('front', 'modulefront'))) {
# frontend
$page_name = apPageHelper::getPageName();
if ($page_name == 'index' || $page_name == 'appagebuilderhome') {
$this->context->smarty->assign(array(
'fullwidth_hook' => isset($this->profile_param['fullwidth_index_hook']) ? $this->profile_param['fullwidth_index_hook'] : ApPageSetting::getIndexHook(3),
));
} else {
$this->context->smarty->assign(array(
'fullwidth_hook' => isset($this->profile_param['fullwidth_other_hook']) ? $this->profile_param['fullwidth_other_hook'] : ApPageSetting::getOtherHook(3),
));
}
}
}
/**
* Get Grade By product
*
* @return array Grades
*/
public static function getGradeByProducts($list_product)
{
# We validate id_categories in apPageHelper::addonValidInt function . This function is used at any where
$list_product = apPageHelper::addonValidInt($list_product);
$validate = Configuration::get('PRODUCT_COMMENTS_MODERATE');
$id_lang = (int)Context::getContext()->language->id;
return (Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT pc.`id_product_comment`, pcg.`grade`, pccl.`name`, pcc.`id_product_comment_criterion`, pc.`id_product`
FROM `'._DB_PREFIX_.'product_comment` pc
LEFT JOIN `'._DB_PREFIX_.'product_comment_grade` pcg ON (pcg.`id_product_comment` = pc.`id_product_comment`)
LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion` pcc ON (pcc.`id_product_comment_criterion` = pcg.`id_product_comment_criterion`)
LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_lang` pccl ON (pccl.`id_product_comment_criterion` = pcg.`id_product_comment_criterion`)
WHERE pc.`id_product` in ('.pSQL($list_product).')
AND pccl.`id_lang` = '.(int)$id_lang.
($validate == '1' ? ' AND pc.`validate` = 1' : '')));
}
/**
* Return number of comments and average grade by products
*
* @return array Info
*/
public static function getGradedCommentNumber($list_product)
{
# We validate id_categories in apPageHelper::addonValidInt function . This function is used at any where
$list_product = apPageHelper::addonValidInt($list_product);
$validate = (int)Configuration::get('PRODUCT_COMMENTS_MODERATE');
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT COUNT(pc.`id_product`) AS nbr, pc.`id_product`
FROM `'._DB_PREFIX_.'product_comment` pc
WHERE `id_product` in ('.pSQL($list_product).')'.($validate == '1' ? ' AND `validate` = 1' : '').'
AND `grade` > 0 GROUP BY pc.`id_product`');
return $result;
}
public static function getByProduct($id_product)
{
$id_lang = (int)Context::getContext()->language->id;
if (!Validate::isUnsignedId($id_product) || !Validate::isUnsignedId($id_lang)) {
die(Tools::displayError());
}
$alias = 'p';
$table = '';
// check if version > 1.5 to add shop association
if (version_compare(_PS_VERSION_, '1.5', '>')) {
$table = '_shop';
$alias = 'ps';
}
return Db::getInstance()->executeS('
SELECT pcc.`id_product_comment_criterion`, pccl.`name`
FROM `'._DB_PREFIX_.'product_comment_criterion` pcc
LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_lang` pccl
ON (pcc.id_product_comment_criterion = pccl.id_product_comment_criterion)
LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_product` pccp
ON (pcc.`id_product_comment_criterion` = pccp.`id_product_comment_criterion` AND pccp.`id_product` = '.(int)$id_product.')
LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_category` pccc
ON (pcc.`id_product_comment_criterion` = pccc.`id_product_comment_criterion`)
LEFT JOIN `'._DB_PREFIX_.'product'.bqSQL($table).'` '.bqSQL($alias).'
ON ('.bqSQL($alias).'.id_category_default = pccc.id_category AND '.bqSQL($alias).'.id_product = '.(int)$id_product.')
WHERE pccl.`id_lang` = '.(int)$id_lang.'
AND (
pccp.id_product IS NOT NULL
OR ps.id_product IS NOT NULL
OR pcc.id_product_comment_criterion_type = 1
)
AND pcc.active = 1
GROUP BY pcc.id_product_comment_criterion
');
}
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:appagebuilder/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:appagebuilder/views/templates/front/products/product_size.tpl');
}
}
return $list_pro;
}
public function hookGetProductManufacture($manuid)
{
$where = '';
if (strpos($manuid, ',') !== false) {
$where = ' WHERE `id_manufacturer` IN(' . pSQL($manuid) . ')';
} else {
$where = ' WHERE `id_manufacturer` = ' . (int) $manuid;
}
$manufactures = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT `id_manufacturer`,`name` AS `manufacturer_name` FROM `' . _DB_PREFIX_ . 'manufacturer`'.$where);
$list_manu = array();
if ($manufactures) {
foreach ($manufactures as $value) {
$this->context->smarty->assign(array(
'product' => $value,
'leoajax' => 1,
));
$list_manu[$value['id_manufacturer']] = $this->fetch('module:appagebuilder/views/templates/front/products/product_manufacture.tpl');
}
}
return $list_manu;
}
public function hookProductMoreImg($list_pro)
{
$id_lang = Context::getContext()->language->id;
//get product info
$product_list = $this->getProducts($list_pro, $id_lang);
$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 ('.$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->getProducts($leo_pro_cdown, $id_lang);
$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__, 'cdown.tpl')));
}
return $obj;
}
public function hookProductColor($leo_pro_color)
{
$id_lang = Context::getContext()->language->id;
$colors = array();
$leo_customajax_color = Configuration::get('APPAGEBUILDER_COLOR');
if ($leo_customajax_color) {
$arrs = explode(',', $leo_customajax_color);
foreach ($arrs as $arr) {
$items = explode(':', $arr);
$colors[$items[0]] = $items[1];
}
}
$this->smarty->assign(array(
'colors' => $colors,
));
$product_list = $this->getProducts($leo_pro_color, $id_lang);
$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__, 'color.tpl')));
}
return $obj;
}
public function hookModuleRoutes($params)
{
$routes = array();
$model = new ApPageBuilderProfilesModel();
$this->all_active_profile = $model->getAllProfileByShop();
foreach ($this->all_active_profile as $allProfileItem) {
if (isset($allProfileItem['friendly_url']) && $allProfileItem['friendly_url']) {
$routes['module-appagebuilder-'.$allProfileItem['friendly_url']] = array(
'controller' => 'appagebuilderhome',
'rule' => $allProfileItem['friendly_url'].'.html',
'keywords' => array(
),
'params' => array(
'fc' => 'module',
'module' => 'appagebuilder'
)
);
}
}
return $routes;
}
public function getCategories($category_list)
{
$idLang = Context::getContext()->language->id;
$active = 1;
$sqlFilter = 'AND c.`id_category` IN('.pSQL($category_list).')';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
'
SELECT *
FROM `' . _DB_PREFIX_ . 'category` c
' . Shop::addSqlAssociation('category', 'c') . '
LEFT JOIN `' . _DB_PREFIX_ . 'category_lang` cl ON c.`id_category` = cl.`id_category`' . Shop::addSqlRestrictionOnLang('cl') . '
WHERE 1 ' . $sqlFilter . ' ' . ($idLang ? 'AND `id_lang` = ' . (int) $idLang : '') . '
' . ($active ? 'AND `active` = 1' : '') . '
' . (!$idLang ? 'GROUP BY c.id_category' : '') . '
' . 'ORDER BY c.`level_depth` ASC, category_shop.`position` ASC'
);
return $result;
}
public function getProducts($product_list, $id_lang, $colors = array())
{
# We validate id_categories in apPageHelper::addonValidInt function . This function is used at any where
$product_list = apPageHelper::addonValidInt($product_list);
$context = Context::getContext();
$id_address = $context->cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')};
$ids = Address::getCountryAndState($id_address);
$id_country = ($ids['id_country'] ? $ids['id_country'] : Configuration::get('PS_COUNTRY_DEFAULT'));
$sql = 'SELECT p.*, product_shop.*, pl.* , m.`name` AS manufacturer_name, s.`name` AS supplier_name,sp.`id_specific_price`
FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` '.Shop::addSqlRestrictionOnLang('pl').')
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
LEFT JOIN `'._DB_PREFIX_.'supplier` s ON (s.`id_supplier` = p.`id_supplier`)
LEFT JOIN `'._DB_PREFIX_.'specific_price` sp ON (sp.`id_product` = p.`id_product`
AND sp.`id_shop` IN(0, '.(int)$context->shop->id.')
AND sp.`id_currency` IN(0, '.(int)$context->currency->id.')
AND sp.`id_country` IN(0, '.(int)$id_country.')
AND sp.`id_group` IN(0, '.(int)$context->customer->id_default_group.')
AND sp.`id_customer` IN(0, '.(int)$context->customer->id.')
AND sp.`reduction` > 0
)
WHERE pl.`id_lang` = '.(int)$id_lang.
' AND p.`id_product` in ('.pSQL($product_list).')';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
if ($product_list) {
$tmp_img = array();
$cover_img = array();
$where = ' WHERE i.`id_product` IN ('.pSQL($product_list).') AND ish.`id_shop` = '.Context::getContext()->shop->id;
$order = ' ORDER BY i.`id_product`,`position`';
switch (Configuration::get('LEO_MINFO_SORT')) {
case 'position2':
break;
case 'random':
$order = ' ORDER BY RAND()';
break;
default:
$order = ' ORDER BY i.`id_product`,`position` DESC';
}
$list_img = $this->getAllImages($id_lang, $where, $order);
foreach ($list_img as $val) {
$tmp_img[$val['id_product']][$val['id_image']] = $val;
if ($val['cover'] == 1) {
$cover_img[$val['id_product']] = $val['id_image'];
}
}
}
$now = date('Y-m-d H:i:s');
$finish = $this->l('Expired');
foreach ($result as &$val) {
$time = false;
if (isset($tmp_img[$val['id_product']])) {
$val['images'] = $tmp_img[$val['id_product']];
$val['id_image'] = $cover_img[$val['id_product']];
} else {
$val['images'] = array();
}
$val['specific_prices'] = self::getSpecificPriceById($val['id_specific_price']);
if (isset($val['specific_prices']['from']) && $val['specific_prices']['from'] > $now) {
$time = strtotime($val['specific_prices']['from']);
$val['finish'] = $finish;
$val['check_status'] = 0;
$val['lofdate'] = Tools::displayDate($val['specific_prices']['from']);
} elseif (isset($val['specific_prices']['to']) && $val['specific_prices']['to'] > $now) {
$time = strtotime($val['specific_prices']['to']);
$val['finish'] = $finish;
$val['check_status'] = 1;
$val['lofdate'] = Tools::displayDate($val['specific_prices']['to']);
} elseif (isset($val['specific_prices']['to']) && $val['specific_prices']['to'] == '0000-00-00 00:00:00') {
$val['js'] = 'unlimited';
$val['finish'] = $this->l('Unlimited');
$val['check_status'] = 1;
$val['lofdate'] = $this->l('Unlimited');
} else if (isset($val['specific_prices']['to'])) {
$time = strtotime($val['specific_prices']['to']);
$val['finish'] = $finish;
$val['check_status'] = 2;
$val['lofdate'] = Tools::displayDate($val['specific_prices']['from']);
}
if ($time) {
$val['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)
);
}
}
unset($colors);
return Product::getProductsProperties($id_lang, $result);
}
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);
}
// show category and tags of product
public function hookdisplayProductInformation($params)
{
$return = '';
$product_id = $params['product']->id;
$category_id = $params['product']->id_category_default;
$cat = new Category($category_id, $this->context->language->id);
$product_tags = Tag::getProductTags($product_id);
$product_tags = $product_tags[(int)$this->context->cookie->id_lang];
$return .= '<div class =category>Category: <a href="'.$this->context->link->getCategoryLink($category_id, $cat->link_rewrite).'">'.$cat->name.'</a>.</div>';
$return .= '<div class="producttags clearfix">';
$return .= 'Tag: ';
if ($product_tags && count($product_tags) > 1) {
$count = 0;
foreach ($product_tags as $tag) {
$return .= '<a href="'.$this->context->link->getPageLink('search', true, null, "tag=$tag").'">'.$tag.'</a>';
if ($count < count($product_tags) - 1) {
$return .= ',';
} else {
$return .= '.';
}
$count++;
}
}
$return .= '</div>';
return $return;
}
/**
* alias from apPageHelper::getConfig()
*/
public function getConfigName($name)
{
return apPageHelper::getConfigName($name);
}
/**
* alias from apPageHelper::getConfig()
*/
public function getConfig($name)
{
return apPageHelper::getConfig($name);
}
/**
* get Value of configuration based on actived theme
*/
public function getPanelConfig($key, $default = '', $id_lang = null)
{
if (Tools::getIsset($key)) {
# validate module
return Tools::getValue($key);
}
$cookie = LeoFrameworkHelper::getCookie();
if (isset($cookie[$this->themeCookieName.'_'.$key])) {
return $cookie[$this->themeCookieName.'_'.$key];
}
unset($default);
return Configuration::get($this->getConfigName($key), $id_lang);
}
public function generateLeoHtmlMessage()
{
$html = '';
if (count($this->_confirmations)) {
foreach ($this->_confirmations as $string) {
$html .= $this->displayConfirmation($string);
}
}
if (count($this->_errors)) {
$html .= $this->displayError($this->_errors);
}
if (count($this->_warnings)) {
$html .= $this->displayWarning($this->_warnings);
}
return $html;
}
/**
* Common method
* Resgister all hook for module
*/
public function registerLeoHook()
{
$res = true;
$res &= $this->registerHook('header');
$res &= $this->registerHook('actionShopDataDuplication');
$res &= $this->registerHook('displayBackOfficeHeader');
$res &= $this->registerHook('moduleroutes');
foreach (ApPageSetting::getHook('all') as $value) {
$res &= $this->registerHook($value);
}
# register hook to show when paging
$this->registerHook('pagebuilderConfig');
# register hook to show category and tags of product
$this->registerHook('displayProductInformation');
# register hook again to after install/change theme
$this->registerHook('actionObjectShopUpdateAfter');
# Multishop create new shop
$this->registerHook('actionAdminShopControllerSaveAfter');
$this->registerHook('displayProductButtons');
$this->registerHook('displayReassurance');
$this->registerHook('displayLeoProfileProduct');
# MoveEndHeader
$this->registerHook('actionModuleRegisterHookAfter');
#select product layout
$this->registerHook('actionObjectProductUpdateAfter');
$this->registerHook('displayAdminProductsExtra');
#select category layout
$this->registerHook('actionObjectCategoryUpdateAfter');
$this->registerHook('displayBackOfficeCategory');
# register hook for apshortcode
$this->registerHook('displayApSC');
$this->registerHook('actionAdminControllerSetMedia');
// ApShortCode for maintain page
$this->registerHook('displayMaintenance');
// ApShortCode for maintain page
$this->registerHook('actionOutputHTMLBefore');
$this->registerHook('displayApCustom');
$this->registerHook('filterCmsContent');
$this->registerHook('filterHtmlContent');
$this->registerHook('displayApCustom');
$this->registerHook('displayLeoProductAtribute');
# register hook to clear cache when add/update/delete product
$this->registerHook('actionProductUpdate');
$this->registerHook('actionProductAdd');
$this->registerHook('actionProductDelete');
return $res;
}
/**
* @Action Create new shop, choose theme then auto restore datasample.
*/
public function hookActionAdminShopControllerSaveAfter($param)
{
if (Tools::getIsset('controller') !== false && Tools::getValue('controller') == 'AdminShop'
&& Tools::getIsset('submitAddshop') !== false && Tools::getValue('submitAddshop')
&& Tools::getIsset('theme_name') !== false && Tools::getValue('theme_name')) {
$shop = $param['return'];
if (file_exists(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php')) {
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoDataSample.php');
$sample = new Datasample();
apPageHelper::$id_shop = $shop->id;
$sample->_id_shop = $shop->id;
$sample->processImport('appagebuilder');
}
}
}
public function hookDisplayAdminEndContent($params)
{
$id_category = Tools::getValue('id_category');
if ($id_category == false && preg_match('#/sell/catalog/categories/(?P<id_category>[a-zA-Z0-9_.-]+)/edit#sD', $_SERVER['REQUEST_URI'], $matches)) {
if (isset($matches['id_category']) && $matches['id_category']) {
$id_category = $matches['id_category'];
}
}
if (Validate::isLoadedObject($category = new Category($id_category))) {
// validate module
unset($category);
$id_shop = Context::getContext()->shop->id;
$category_layouts = array();
// $id_category = Tools::getValue('id_category');
if (is_dir(apPageHelper::getConfigDir('theme_profiles'))) {
//DONGND:: fix get list product list via database
$sql = 'SELECT * FROM '._DB_PREFIX_.'appagebuilder_products p
INNER JOIN '._DB_PREFIX_.'appagebuilder_products_shop ps on(p.id_appagebuilder_products = ps.id_appagebuilder_products) WHERE ps.id_shop='.(int)$id_shop;
$category_layouts = Db::getInstance()->executeS($sql);
}
$extrafied = array();
$data_fields = array();
if (Configuration::get('APPAGEBUILDER_CATEGORY_TEXTEXTRA') || Configuration::get('APPAGEBUILDER_CATEGORY_EDITOREXTRA')) {
$sql = 'SHOW FIELDS FROM `'._DB_PREFIX_.'appagebuilder_extracat' .'`';
$result = Db::getInstance()->executeS($sql);
$rows = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'appagebuilder_extracat' .'` WHERE id_category="'.(int)$id_category.'" AND id_shop="'.(int)$id_shop.'"');
foreach ($result as $value) {
if ($value['Field'] != 'id_category' && $value['Field'] != 'id_shop' && $value['Field'] != 'id_lang') {
$extrafied[$value['Field']] = $value['Type'];
foreach ($rows as $row) {
$data_fields[$value['Field']][$row['id_lang']] = $row[$value['Field']];
}
}
}
}
$this->context->smarty->assign(array(
'category_layouts' => $category_layouts,
'apextras' => $extrafied,
'id_lang_default' => $this->default_language['id_lang'],
'languages' => $this->languages,
'data_fields' => $data_fields,
'current_layout' => Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT page from `'._DB_PREFIX_.'appagebuilder_page` where id_category = \''.(int)$id_category.'\' AND id_shop = \''.(int)$id_shop.'\'')
));
return $this->display(__FILE__, 'categoryExtra.tpl');
}
}
public function hookActionObjectCategoryUpdateAfter($params)
{
$id_category = Tools::getValue('id_category');
# FIX 1760 dont have params id_category
if ($id_category == false && preg_match('#/sell/catalog/categories/(?P<id_category>[a-zA-Z0-9_.-]+)/edit#sD', $_SERVER['REQUEST_URI'], $matches)) {
if (isset($matches['id_category']) && $matches['id_category']) {
$id_category = $matches['id_category'];
}
}
//DONGND:: fix when change status category at category list (BO)
if (isset($id_category) && $id_category) {
$aplayout = Tools::getValue('aplayout');
$id_shop = Context::getContext()->shop->id;
$sql = 'SELECT page from `'._DB_PREFIX_.'appagebuilder_page` where id_category = \''.(int)$id_category.'\' AND id_shop = \''.(int)$id_shop.'\'';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
if ($result) {
if ($aplayout == 'default') {
Db::getInstance()->execute('DELETE from `'._DB_PREFIX_.'appagebuilder_page` where id_category = \''.(int)$id_category.'\' and id_shop=\''.(int)$id_shop.'\'');
} else {
Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'appagebuilder_page` set page = \''.pSQL($aplayout).'\' where id_category = \''.(int)$id_category.'\' and id_shop=\''.(int)$id_shop.'\'');
}
} else {
if ($aplayout != 'default') {
Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'appagebuilder_page` (`id_product`,`id_category`,`page`,`id_shop`) VALUES (0,'.(int)$id_category.',\''.pSQL($aplayout).'\','.(int)$id_shop.')');
}
}
if (Configuration::get('APPAGEBUILDER_CATEGORY_TEXTEXTRA') || Configuration::get('APPAGEBUILDER_CATEGORY_EDITOREXTRA')) {
//save for extrafield
$sql = 'SHOW FIELDS FROM `'._DB_PREFIX_.'appagebuilder_extracat' .'`';
$result = Db::getInstance()->executeS($sql);
$extrafied = array();
foreach ($result as $value) {
if ($value['Field'] != 'id_category' && $value['Field'] != 'id_shop' && $value['Field'] != 'id_lang') {
$extrafied[] = $value['Field'];
}
}
if ($extrafied) {
foreach ($this->languages as $lang) {
$checkExist = Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'appagebuilder_extracat' .'` WHERE id_shop="'.(int)$id_shop.'" AND id_category = "'.(int)$id_category.'" AND id_lang="'.(int)$lang['id_lang'].'"');
if ($checkExist) {
$sql = '';
foreach ($extrafied as $value) {
$sql .= (($sql=='')?'':','). '`'.bqSQL($value).'`="'.pSQL(Tools::getValue($value.'_'.$lang['id_lang'])).'"';
}
$sql = 'UPDATE `'._DB_PREFIX_.'appagebuilder_extracat' .'` SET '.$sql.' WHERE id_shop="'.(int)$id_shop.'" AND id_category = "'.(int)$id_category.'" AND id_lang="'.(int)$lang['id_lang'].'"';
} else {
$sql = 'INSERT INTO `'._DB_PREFIX_.'appagebuilder_extracat' .'` (`id_category`, `id_shop`, `id_lang`';
$sql1 = ' VALUES ("'.(int)$id_category.'","'.(int)$id_shop.'","'.(int)$lang['id_lang'].'"';
foreach ($extrafied as $value) {
$sql .= ',`'.bqSQL($value).'`';
$sql1 .= ',"'.((Tools::getValue($value.'_'.$lang['id_lang'])=='')? pSQL(Tools::getValue($value.'_'.$this->default_language['id_lang'])) : pSQL(Tools::getValue($value.'_'.$lang['id_lang']))).'"';
}
$sql = $sql.')'.$sql1.')';
}
//echo $sql.'<br/>';
Db::getInstance()->execute($sql);
}
}
}
}
//die;
}
public function hookfilterCategoryContent($params)
{
$params['object']['description'] = $this->buildShortCode($params['object']['description']);
$id_category = Tools::getValue('id_category');
$id_shop = Context::getContext()->shop->id;
if (Configuration::get('APPAGEBUILDER_CATEGORY_TEXTEXTRA') || Configuration::get('APPAGEBUILDER_CATEGORY_EDITOREXTRA')) {
$rows = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'appagebuilder_extracat' .'` WHERE id_category="'.(int)$id_category.'" AND id_shop="'.(int)$id_shop.'" AND id_lang="'.(int)$this->default_language['id_lang'].'"');
foreach ($rows as $value) {
foreach ($value as $k => $v) {
if ($k != 'id_category' && $k != 'id_shop' && $k != 'id_lang') {
$params['object'][$k] = $v;
}
}
}
}
//layout
$sql = 'SELECT page from `'._DB_PREFIX_.'appagebuilder_page` where id_category = \''.(int)$id_category.'\' AND id_shop = \''.(int)$id_shop.'\'';
$layout = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
$params['object']['categoryLayout'] = $layout;
return $params;
}
public function hookActionObjectProductUpdateAfter($params)
{
$id_product = Tools::getValue('id_product');
//DONGND:: fix when change status product at product list (BO)
if (isset($id_product) && $id_product) {
$aplayout = Tools::getValue('aplayout');
$id_shop = Context::getContext()->shop->id;
$sql = 'SELECT * from `'._DB_PREFIX_.'appagebuilder_page` WHERE id_product = '.(int)$id_product.' AND id_shop = '.(int)$id_shop;
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
if ($result) {
if ($aplayout == 'default') {
Db::getInstance()->execute('DELETE from `'._DB_PREFIX_.'appagebuilder_page` WHERE id_product = '.(int)$id_product.' and id_shop='.(int)$id_shop);
} else {
Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'appagebuilder_page` SET page = "'.pSQL($aplayout).'" WHERE id_product = '.(int)$id_product.' and id_shop='.(int)$id_shop);
}
} else {
if ($aplayout != 'default') {
Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'appagebuilder_page` (`id_product`,`id_category`,`page`,`id_shop`) VALUES ('.(int)$id_product.',0,\''.pSQL($aplayout).'\','.(int)$id_shop.')');
}
}
if (Configuration::get('APPAGEBUILDER_PRODUCT_TEXTEXTRA') || Configuration::get('APPAGEBUILDER_PRODUCT_EDITOREXTRA')) {
//save for extrafield
$sql = 'SHOW FIELDS FROM `'._DB_PREFIX_.'appagebuilder_extrapro' .'`';
$result = Db::getInstance()->executeS($sql);
$extrafied = array();
foreach ($result as $value) {
if ($value['Field'] != 'id_product' && $value['Field'] != 'id_shop' && $value['Field'] != 'id_lang') {
$extrafied[] = $value['Field'];
}
}
if ($extrafied) {
$form = Tools::getValue('form');
$tab_hooks = $form['tab_hooks'];
foreach ($this->languages as $lang) {
$checkExist = Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'appagebuilder_extrapro' .'` WHERE id_shop="'.(int)$id_shop.'" AND id_product = "'.(int)$id_product.'" AND id_lang="'.(int)$lang['id_lang'].'"');
if ($checkExist) {
$sql = '';
foreach ($extrafied as $value) {
$sql .= (($sql=='')?'':',').'`'.bqSQL($value).'`="'.pSQL($tab_hooks[$value][$lang['id_lang']]).'"';
}
$sql = 'UPDATE `'._DB_PREFIX_.'appagebuilder_extrapro' .'` SET '.$sql.' WHERE id_shop="'.(int)$id_shop.'" AND id_product = "'.(int)$id_product.'" AND id_lang="'.(int)$lang['id_lang'].'"';
} else {
$sql = 'INSERT INTO `'._DB_PREFIX_.'appagebuilder_extrapro' .'` (`id_product`, `id_shop`, `id_lang`';
$sql1 = ' VALUES ("'.(int)$id_product.'","'.(int)$id_shop.'","'.(int)$lang['id_lang'].'"';
foreach ($extrafied as $value) {
$sql .= ',`'.bqSQL($value).'`';
$sql1 .= ',"'.pSQL(($tab_hooks[$value][$lang['id_lang']]=='')?pSQL($tab_hooks[$value][$this->default_language['id_lang']]) : pSQL($tab_hooks[$value][$lang['id_lang']])).'"';
}
$sql = $sql.')'.$sql1.')';
}
//echo $sql;
Db::getInstance()->execute($sql);
}
}
}
}
}
public function hookDisplayAdminProductsExtra($params)
{
if (Validate::isLoadedObject($product = new Product((int)$params['id_product']))) {
// validate module
unset($product);
$id_shop = Context::getContext()->shop->id;
$extrafied = array();
$data_fields = array();
if (Configuration::get('APPAGEBUILDER_PRODUCT_TEXTEXTRA') || Configuration::get('APPAGEBUILDER_PRODUCT_EDITOREXTRA')) {
$sql = 'SHOW FIELDS FROM `'._DB_PREFIX_.'appagebuilder_extrapro' .'`';
$result = Db::getInstance()->executeS($sql);
$rows = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'appagebuilder_extrapro' .'` WHERE id_product="'.(int)$params['id_product'].'" AND id_shop="'.(int)$id_shop.'"');
foreach ($result as $value) {
if ($value['Field'] != 'id_product' && $value['Field'] != 'id_shop' && $value['Field'] != 'id_lang') {
$extrafied[$value['Field']] = $value['Type'];
foreach ($rows as $row) {
$data_fields[$value['Field']][$row['id_lang']] = $row[$value['Field']];
}
}
}
}
// $product_layouts = array();
$sql = 'SELECT a.`plist_key`, a.`name` FROM `'._DB_PREFIX_.'appagebuilder_details` AS a INNER JOIN `'._DB_PREFIX_.'appagebuilder_details_shop` AS b ON a.`id_appagebuilder_details` = b.`id_appagebuilder_details' .'` WHERE b.id_shop= "'.(int)$id_shop.'"';
$list = Db::getInstance()->executeS($sql);
$this->context->smarty->assign(array(
'product_layouts' => $list,
// 'default_plist' => $default_plist,
'id_product' => (int)Tools::getValue('id_product'),
'apextras' => $extrafied,
'languages' => $this->languages,
'data_fields' => $data_fields,
'default_language' => $this->default_language,
'current_layout' => Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT page from `'._DB_PREFIX_.'appagebuilder_page` where id_product = \''.(int)$params['id_product'].'\' AND id_shop = \''.(int)$id_shop.'\'')
));
return $this->display(__FILE__, 'productExtra.tpl');
}
}
public function hookfilterProductContent($params)
{
$params['object']['description'] = $this->buildShortCode($params['object']['description']);
$params['object']['description_short'] = $this->buildShortCode($params['object']['description_short']);
$id_product = Tools::getValue('id_product');
$id_shop = Context::getContext()->shop->id;
//extra fields
if (Configuration::get('APPAGEBUILDER_PRODUCT_TEXTEXTRA') || Configuration::get('APPAGEBUILDER_PRODUCT_EDITOREXTRA')) {
$rows = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'appagebuilder_extrapro' .'` WHERE id_product="'.(int)$id_product.'" AND id_shop="'.(int)$id_shop.'" AND id_lang="'.(int)$this->default_language['id_lang'].'"');
foreach ($rows as $value) {
foreach ($value as $k => $v) {
if ($k != 'id_product' && $k != 'id_shop' && $k != 'id_lang') {
$params['object'][$k] = $v;
}
}
}
}
//DONGND:: get layout of product detail by parameter in URL
if (Tools::getValue('layout')) {
$sql = 'SELECT a.`plist_key` FROM `'._DB_PREFIX_.'appagebuilder_details` AS a INNER JOIN `'._DB_PREFIX_.'appagebuilder_details_shop` AS b ON a.`id_appagebuilder_details` = b.`id_appagebuilder_details' .'` WHERE b.`id_shop` = "'.(int)$id_shop.'" AND a.`plist_key` = "'.pSQL(Tools::getValue('layout')).'"';
$layout = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
if ($layout) {
$params['object']['productLayout'] = $layout;
return $params;
}
}
//layout
$sql = 'SELECT page from `'._DB_PREFIX_.'appagebuilder_page` where id_product = \''.(int)$id_product.'\' AND id_shop = \''.(int)$id_shop.'\'';
$layout = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
//get default
if (!$layout) {
if ($this->getConfig('USE_MOBILE_THEME')) {
if (Context::getContext()->isMobile()) {
$layout = $this->getProductDetailDefaul($id_shop, 'active_mobile');
}
if (Context::getContext()->isTablet()) {
$layout = $this->getProductDetailDefaul($id_shop, 'active_tablet');
}
if (!$layout) {
$layout = $this->getProductDetailDefaul($id_shop, 'active');
}
} else {
$layout = $this->getProductDetailDefaul($id_shop, 'active');
}
}
$params['object']['productLayout'] = $layout;
return $params;
}
public function getProductDetailDefaul($id_shop, $field)
{
$sql = 'SELECT a.`plist_key` FROM `'._DB_PREFIX_.'appagebuilder_details` AS a INNER JOIN `'._DB_PREFIX_.'appagebuilder_details_shop` AS b ON a.`id_appagebuilder_details` = b.`id_appagebuilder_details' .'` WHERE b.`id_shop` = "'.(int)$id_shop.'" AND b.`'.$field.'` = 1';
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
}
public function hookfilterCmsContent($params)
{
$params['object']['content'] = $this->buildShortCode($params['object']['content']);
return $params;
}
public function hookfilterHtmlContent($params)
{
if ($params['type'] == 'manufacturer') {
$params['object']['description'] = $this->buildShortCode($params['object']['description']);
$params['object']['short_description'] = $this->buildShortCode($params['object']['short_description']);
return $params;
}
if ($params['type'] == 'supplier') {
$params['object']['description'] = $this->buildShortCode($params['object']['description']);
return $params;
}
}
public $is_maintain = false;
public function hookDisplayMaintenance()
{
$this->is_maintain = true;
}
public function hookActionOutputHTMLBefore(&$params)
{
if ($this->is_maintain) {
$params['html'] = $this->buildShortCode($params['html']);
}
if (class_exists('LeoOptimization')) {
LeoOptimization::getInstance()->processOptimization($params);
}
}
/**
* PERMISSION ACCOUNT demo@demo.com
*/
public function getPermission($variable, $employee = null)
{
if ($variable == 'configure') {
// Allow see form if permission is : configure, view
$configure = Module::getPermissionStatic($this->id, 'configure', $employee);
$view = Module::getPermissionStatic($this->id, 'view', $employee);
return ($configure || $view);
}
return Module::getPermissionStatic($this->id, $variable, $employee);
}
/**
* PERMISSION ACCOUNT demo@demo.com
*/
public function access($action)
{
$employee = null;
return Module::getPermissionStatic($this->id, $action, $employee);
}
public function installHostDemo($parrams = array())
{
unset($parrams);
$demo_host = array(
'demo1.leotheme.com',
'demo2.leotheme.com',
'demothemes.info',
'demo4leotheme.com',
'apollotran.com',
'pagebuilder.apollotheme.com',
);
if (in_array($_SERVER['SERVER_NAME'], $demo_host)) {
apPageHelper::setConfig('support_cdn', '1');
apPageHelper::setConfig('defer_javascript', '1');
}
}
/**
* Thanh_Phuong need show product_attribute at product_list
* insert this code in tpl : {hook h='displayLeoProductAtribute' leoproduct=$product}
* https://www.screencast.com/t/qxmmeaKk
*/
public function hookDisplayLeoProductAtribute($params)
{
$cfg_show_color = 0;
if (!Combination::isFeatureActive()) {
return array();
}
$id_lang = Context::getContext()->language->id;
$id_product = $params['leoproduct']['id'];
$sql = 'SELECT ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, agl.`public_name` AS public_group_name,
a.`id_attribute`, al.`name` AS attribute_name, a.`color` AS attribute_color, product_attribute_shop.`id_product_attribute`,
IFNULL(stock.quantity, 0) as quantity, product_attribute_shop.`price`, product_attribute_shop.`ecotax`, product_attribute_shop.`weight`,
product_attribute_shop.`default_on`, pa.`reference`, product_attribute_shop.`unit_price_impact`,
product_attribute_shop.`minimal_quantity`, product_attribute_shop.`available_date`, ag.`group_type`
FROM `' . _DB_PREFIX_ . 'product_attribute` pa
' . Shop::addSqlAssociation('product_attribute', 'pa') . '
' . Product::sqlStock('pa', 'pa') . '
LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_combination` pac ON (pac.`id_product_attribute` = pa.`id_product_attribute`)
LEFT JOIN `' . _DB_PREFIX_ . 'attribute` a ON (a.`id_attribute` = pac.`id_attribute`)
LEFT JOIN `' . _DB_PREFIX_ . 'attribute_group` ag ON (ag.`id_attribute_group` = a.`id_attribute_group`)
LEFT JOIN `' . _DB_PREFIX_ . 'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute`)
LEFT JOIN `' . _DB_PREFIX_ . 'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group`)
' . Shop::addSqlAssociation('attribute', 'a') . '
WHERE pa.`id_product` = ' . (int) $id_product . '
AND al.`id_lang` = ' . (int) $id_lang . '
AND agl.`id_lang` = ' . (int) $id_lang . '
GROUP BY id_attribute_group, id_product_attribute
ORDER BY ag.`position` ASC, a.`position` ASC, agl.`name` ASC';
$attributes_groups = Db::getInstance()->executeS($sql);
if (is_array($attributes_groups) && $attributes_groups) {
$groups = array();
foreach ($attributes_groups as $row) {
if ($cfg_show_color == 0 && $row['group_type']=='color') {
# Not show color
continue;
}
if (!isset($groups[$row['id_attribute_group']])) {
$groups[$row['id_attribute_group']] = array(
'name' => $row['public_group_name'],
'group_type' => $row['group_type'],
'default' => -1,
);
}
$groups[$row['id_attribute_group']]['attributes'][$row['id_attribute']] = $row['attribute_name'];
if (!isset($groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']])) {
$groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] = 0;
}
$groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] += (int)$row['quantity'];
if ($row['group_type']=='color') {
$texture = '';
if (Tools::isEmpty($row['attribute_color']) && @filemtime(_PS_COL_IMG_DIR_.$row['id_attribute'].'.jpg')) {
$texture = $this->context->link->getMediaLink(_THEME_COL_DIR_.$row['id_attribute'].'.jpg');
}
$groups[$row['id_attribute_group']]['colors'][$row['id_attribute']] = array(
'type' => $texture ? 1 : 0,
'value' => $texture?:$row['attribute_color'],
);
}
}
$this->context->smarty->assign(array(
'st_att_list_groups' => $groups,
'st_att_list_show' => 1,
'st_att_list_color' => 0, // show color = text or corlor
'st_att_list_center' => 0,
));
return $this->fetch('module:appagebuilder/views/templates/hook/displayLeoProductAtribute.tpl');
}
}
}