414 lines
17 KiB
PHP
414 lines
17 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 2007-2019 Apollotheme
|
|
* @license http://apollotheme.com - prestashop template provider
|
|
*/
|
|
|
|
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/Helper.php');
|
|
|
|
if (!defined('_PS_VERSION_')) {
|
|
# module validation
|
|
exit;
|
|
}
|
|
|
|
class AdminApPageBuilderHookController extends ModuleAdminControllerCore
|
|
{
|
|
/**
|
|
* @var Boolean $display_key
|
|
*
|
|
* @access protected
|
|
*/
|
|
public $display_key = 0;
|
|
/**
|
|
* @var Array $hookspos
|
|
*
|
|
* @access protected
|
|
*/
|
|
public $hookspos = array();
|
|
/**
|
|
* @var Array $ownPositions
|
|
*
|
|
* @access protected
|
|
*/
|
|
// public $ownPositions = array();
|
|
/**
|
|
* @var String $theme_name
|
|
*
|
|
* @access protected
|
|
*/
|
|
public $theme_name;
|
|
/**
|
|
* @var String $theme_name
|
|
*
|
|
* @access protected
|
|
*/
|
|
public $themeKey;
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->bootstrap = true;
|
|
$this->table = 'leohook';
|
|
$this->className = 'AdminApPageBuilderHook';
|
|
$this->lang = true;
|
|
$this->context = Context::getContext();
|
|
parent::__construct();
|
|
$this->display_key = (int)Tools::getValue('show_modules');
|
|
|
|
// $this->ownPositions = array(
|
|
// 'displayHeaderRight',
|
|
// 'displaySlideshow',
|
|
// 'topNavigation',
|
|
// 'displayPromoteTop',
|
|
// 'displayBottom',
|
|
// 'displayMassBottom'
|
|
// );
|
|
$this->hookspos = ApPageSetting::getHook();
|
|
$this->theme_name = apPageHelper::getThemeName();
|
|
}
|
|
|
|
/**
|
|
* Build List linked Icons Toolbar
|
|
*/
|
|
public function initPageHeaderToolbar()
|
|
{
|
|
if (empty($this->display)) {
|
|
$this->page_header_toolbar_btn['save'] = array(
|
|
'href' => 'index.php?tab=AdminApPageBuilderHook&token='.Tools::getAdminTokenLite('AdminApPageBuilderHook').'&action=savepos',
|
|
'id' => 'savepos',
|
|
'desc' => $this->l('Save Positions')
|
|
);
|
|
}
|
|
parent::initPageHeaderToolbar();
|
|
}
|
|
|
|
/**
|
|
* get live Edit URL
|
|
*/
|
|
public function getLiveEditUrl($live_edit_params)
|
|
{
|
|
$url = $this->context->shop->getBaseURL().Dispatcher::getInstance()->createUrl('index', (int)$this->context->language->id, $live_edit_params);
|
|
if (Configuration::get('PS_REWRITING_SETTINGS')) {
|
|
$url = str_replace('index.php', '', $url);
|
|
}
|
|
return $url;
|
|
}
|
|
|
|
/**
|
|
* add toolbar icons
|
|
*/
|
|
public function initToolbar()
|
|
{
|
|
$this->context->smarty->assign('toolbar_scroll', 1);
|
|
$this->context->smarty->assign('show_toolbar', 1);
|
|
$this->context->smarty->assign('toolbar_btn', $this->toolbar_btn);
|
|
$this->context->smarty->assign('title', $this->toolbar_title);
|
|
}
|
|
|
|
/**
|
|
* render list of modules following positions in the layout editor.
|
|
*/
|
|
public function renderList()
|
|
{
|
|
$filePath = _PS_ALL_THEMES_DIR_.$this->theme_name.'';
|
|
$showed = true;
|
|
$xml = simplexml_load_file($filePath.'/config.xml');
|
|
|
|
if (isset($xml->theme_key)) {
|
|
$this->themeKey = trim((string)$xml->theme_key);
|
|
}
|
|
$this->themeKey = '1111';
|
|
if ($this->themeKey) {
|
|
$this->initToolbarTitle();
|
|
$this->initToolbar();
|
|
$hookspos = $this->hookspos;
|
|
|
|
foreach ($hookspos as $hook) {
|
|
if (Hook::getIdByName($hook)) {
|
|
// validate module
|
|
} else {
|
|
$new_hook = new Hook();
|
|
$new_hook->name = pSQL($hook);
|
|
$new_hook->title = pSQL($hook);
|
|
$new_hook->add();
|
|
// $id_hook = $new_hook->id;
|
|
}
|
|
}
|
|
|
|
// $sql = 'UPDATE `'._DB_PREFIX_.'hook` SET position=1, live_edit=1
|
|
// WHERE name in ("'.implode('","', $hookspos).'") ';
|
|
// Db::getInstance(_PS_USE_SQL_SLAVE_)->execute($sql);
|
|
|
|
$modules = Module::getModulesInstalled(0);
|
|
$assoc_modules_id = array();
|
|
|
|
$assoc_modules_id = $module_instances = array();
|
|
foreach ($modules as $module) {
|
|
if ($tmp_instance = Module::getInstanceById((int)$module['id_module'])) {
|
|
// We want to be able to sort modules by display name
|
|
$module_instances[$tmp_instance->displayName] = $tmp_instance;
|
|
// But we also want to associate hooks to modules using the modules IDs
|
|
$assoc_modules_id[(int)$module['id_module']] = $tmp_instance->displayName;
|
|
}
|
|
}
|
|
$hooks = Hook::getHooks(!(int)Tools::getValue('hook_position'));
|
|
|
|
$hookModules = array();
|
|
|
|
$hookedModules = array();
|
|
foreach ($hooks as $key => $hook) {
|
|
// validate module
|
|
unset($key);
|
|
|
|
$k = $hook['name'];
|
|
$k = (Tools::strtolower(Tools::substr($k, 0, 1)).Tools::substr($k, 1));
|
|
if (in_array($k, $hookspos)) {
|
|
// Get all modules for this hook or only the filtered module
|
|
$hookModules[$k]['modules'] = Hook::getModulesFromHook($hook['id_hook'], $this->display_key);
|
|
$hookModules[$k]['module_count'] = count($hookModules[$k]['modules']);
|
|
|
|
if (is_array($hookModules[$k]['modules']) && !empty($hookModules[$k]['modules'])) {
|
|
foreach ($hookModules[$k]['modules'] as $module_key => $module) {
|
|
if (isset($assoc_modules_id[$module['id_module']])) {
|
|
$hookedModules[] = $module['id_module'];
|
|
$hookModules[$k]['modules'][$module_key]['instance'] = $module_instances[$assoc_modules_id[$module['id_module']]];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$instances = array();
|
|
foreach ($modules as $module) {
|
|
if ($tmp_instance = Module::getInstanceById($module['id_module'])) {
|
|
foreach ($hookspos as $hk) {
|
|
$retro_hook_name = Hook::getRetroHookName($hk);
|
|
$hook_callable = is_callable(array($tmp_instance, 'hook'.$hk));
|
|
$hook_retro_callable = is_callable(array($tmp_instance, 'hook'.$retro_hook_name));
|
|
if ($hook_retro_callable || $hook_callable) {
|
|
$instances[$tmp_instance->displayName] = $tmp_instance;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ksort($instances);
|
|
|
|
$tpl = $this->createTemplate('panel.tpl');
|
|
|
|
// $this->context->controller->addJqueryUI('ui.sortable');
|
|
// $this->context->controller->addJqueryUI('ui.draggable');
|
|
$this->context->controller->addCss(apPageHelper::getCssAdminDir().'admin/style_hook_cpanel.css');
|
|
$this->context->controller->addJs(apPageHelper::getJsAdminDir().'/jquery-ui-1.10.3.custom.min.js', 'all');
|
|
$tpl->assign(array(
|
|
'showed' => $showed,
|
|
'toolbar' => $this->context->smarty->fetch('toolbar.tpl'),
|
|
'modules' => $instances,
|
|
'hookspos' => $hookspos,
|
|
'URI' => __PS_BASE_URI__.'modules/',
|
|
'hookModules' => $hookModules,
|
|
'noModuleConfig' => $this->l('No Configuration For This Module'),
|
|
'currentURL' => 'index.php?tab=AdminApPageBuilderHook&token='.Tools::getAdminTokenLite('AdminApPageBuilderHook').'',
|
|
// 'moduleEditURL' => 'index.php?tab=AdminApPageBuilderHook&token='.Tools::getAdminTokenLite('AdminApPageBuilderHook').'',
|
|
'moduleEditURL' => 'index.php?controller=adminmodules&token='.Tools::getAdminTokenLite('AdminModules').'&tab_module=Home',
|
|
));
|
|
|
|
return $tpl->fetch();
|
|
} else {
|
|
$tpl = $this->createTemplate('error.tpl');
|
|
$tpl->assign(array(
|
|
'showed' => false,
|
|
'themeURL' => 'index.php?controller=AdminThemes&token='.Tools::getAdminTokenLite('AdminThemes')
|
|
));
|
|
return $tpl->fetch();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Process posting data
|
|
*/
|
|
public function postProcess()
|
|
{
|
|
if (count($this->errors) > 0) {
|
|
if ($this->ajax) {
|
|
$array = array('hasError' => true, 'errors' => $this->errors[0]);
|
|
die(Tools::jsonEncode($array));
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (Tools::getValue('action') && Tools::getValue('action') == 'modulehook') {
|
|
// AJAX EDIT HOOK - READ
|
|
$id = (int)Tools::getValue('id');
|
|
|
|
$tmp_instance = Module::getInstanceById($id);
|
|
$hooks = array();
|
|
|
|
foreach ($this->hookspos as $hk) {
|
|
$retro_hook_name = Hook::getRetroHookName($hk);
|
|
$hook_callable = is_callable(array($tmp_instance, 'hook'.$hk));
|
|
$hook_retro_callable = is_callable(array($tmp_instance, 'hook'.$retro_hook_name));
|
|
|
|
if ($hook_retro_callable || $hook_callable) {
|
|
$hooks[] = $hk;
|
|
}
|
|
}
|
|
$hooks = implode('|', $hooks);
|
|
$sql = 'SELECT * FROM `'._DB_PREFIX_.'leohook` WHERE id_module='.(int)$id.' AND theme="'.pSQL($this->theme_name).'" AND id_shop='.(int)($this->context->shop->id);
|
|
|
|
if ($row = Db::getInstance()->getRow($sql)) {
|
|
die('{"hasError" : false, "hook" : "'.$row['name_hook'].'","hooks":"'.$hooks.'"}');
|
|
} else {
|
|
die('{"hasError" : true, "errors" : "Can not update module position","hooks":"'.$hooks.'"}');
|
|
}
|
|
}
|
|
if (Tools::getValue('action') && Tools::getValue('action') == 'overridehook') {
|
|
// AJAX EDIT HOOK - SAVE
|
|
$id_module = (int)Tools::getValue('hdidmodule');
|
|
$name_hook = Tools::getValue('name_hook');
|
|
if (is_numeric($name_hook)) {
|
|
$sql = 'DELETE FROM`'._DB_PREFIX_.'leohook` WHERE id_module='.(int)$id_module.' AND theme="'.pSQL($this->theme_name).'" AND id_shop='.(int)($this->context->shop->id);
|
|
|
|
Db::getInstance(_PS_USE_SQL_SLAVE_)->execute($sql);
|
|
die('{"hasError" : false, "errors" : "done!delete module position"}');
|
|
} elseif ($name_hook) {
|
|
$desHook = Tools::getValue('deshook');
|
|
$desHookId = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT id_hook FROM `'._DB_PREFIX_."hook` WHERE name='".pSQL($desHook)."'");
|
|
$sql = 'SELECT *
|
|
FROM `'._DB_PREFIX_.'leohook` WHERE id_hook= '.(int)$desHookId.' AND id_module='.(int)$id_module.' AND theme="'.pSQL($this->theme_name).'" AND id_shop='.(int)($this->context->shop->id);
|
|
|
|
if ($row = Db::getInstance()->getRow($sql)) {
|
|
$sql = ' UPDATE `'._DB_PREFIX_.'leohook` SET `id_hook`='.(int)$desHookId.', name_hook="'.pSQL($name_hook).'"
|
|
WHERE id_module='.(int)$id_module.' AND theme="'.pSQL($this->theme_name).'" AND id_shop='.(int)($this->context->shop->id);
|
|
Db::getInstance(_PS_USE_SQL_SLAVE_)->execute($sql);
|
|
} else {
|
|
$sql = ' INSERT INTO `'._DB_PREFIX_.'leohook` (id_hook, id_module, id_shop, theme, name_hook)
|
|
VALUES('.(int)$desHookId.','.(int)$id_module.','.(int)($this->context->shop->id).',"'.pSQL($this->theme_name).'","'.pSQL($name_hook).'")';
|
|
Db::getInstance(_PS_USE_SQL_SLAVE_)->execute($sql);
|
|
}
|
|
die('{"hasError" : false, "errors" : "done!update module position"}');
|
|
}
|
|
die('{"hasError" : true, "errors" : "Can not update module position"}');
|
|
}
|
|
if (Tools::getValue('action') && Tools::getValue('action') == 'savepos') {
|
|
// SUBMIT - SAVE HOOK
|
|
$positions = Tools::getValue('position');
|
|
$way = (int)(Tools::getValue('way'));
|
|
$unhook = Tools::getValue('unhook');
|
|
$id_shop = Context::getContext()->shop->id;
|
|
|
|
if (is_array($unhook)) {
|
|
foreach ($unhook as $id_module => $str_hookId) {
|
|
$hookIds = explode(',', $str_hookId);
|
|
foreach ($hookIds as $hookId) {
|
|
$module = Module::getInstanceById($id_module);
|
|
if (Validate::isLoadedObject($module)) {
|
|
!$module->unregisterHook((int)$hookId, array($id_shop));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (is_array($positions) && !empty($positions)) {
|
|
foreach ($positions as $pos) {
|
|
$tmp = explode('|', $pos);
|
|
if (count($tmp) == 2 && $tmp[0] && $tmp[1]) {
|
|
$position = $tmp[0];
|
|
$hookId = Hook::getIdByName($position);
|
|
$oldhooks = explode(',', Tools::getValue($position));
|
|
|
|
$ids = explode(',', $tmp[1]);
|
|
if ($hookId && count($oldhooks)) {
|
|
foreach ($ids as $index => $id_module) {
|
|
$module = Module::getInstanceById($id_module);
|
|
|
|
if (Validate::isLoadedObject($module) && isset($oldhooks[$index]) && is_numeric($oldhooks[$index]) && $oldhooks[$index] != $hookId) {
|
|
// MOVE MODULE TO OTHER HOOK
|
|
$sql = 'UPDATE `'._DB_PREFIX_.'hook_module` SET id_hook='.(int)$hookId.'
|
|
WHERE id_module='.(int)$id_module.' AND id_hook='.(int)$oldhooks[$index].' AND id_shop='.(int)($id_shop);
|
|
try {
|
|
// FIX: Drag a module to one hook in 2 times. Save 500 error
|
|
Db::getInstance(_PS_USE_SQL_SLAVE_)->execute($sql);
|
|
} catch (Exception $ex) {
|
|
}
|
|
} elseif (Validate::isLoadedObject($module) && (!isset($oldhooks[$index]) || !(int)$oldhooks[$index])) {
|
|
$this->registerHook($id_module, $hookId, array($id_shop));
|
|
//echo 'new:'.$id_module;
|
|
}
|
|
$module->updatePosition($hookId, $way, $index + 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
die('{"hasError" : false, "errors" : "update module position"}');
|
|
}
|
|
}
|
|
|
|
public function registerHook($id_module, $id_hook, $shop_list = null)
|
|
{
|
|
// If shop lists is null, we fill it with all shops
|
|
if (is_null($shop_list)) {
|
|
$shop_list = Shop::getShops(true, null, true);
|
|
}
|
|
|
|
$return = true;
|
|
foreach ($shop_list as $shop_id) {
|
|
// Check if already register
|
|
$sql = 'SELECT hm.`id_module`
|
|
FROM `'._DB_PREFIX_.'hook_module` hm, `'._DB_PREFIX_.'hook` h
|
|
WHERE hm.`id_module` = '.(int)($id_module).' AND h.`id_hook` = '.(int)$id_hook.'
|
|
AND h.`id_hook` = hm.`id_hook` AND `id_shop` = '.(int)$shop_id;
|
|
|
|
|
|
if (Db::getInstance()->getRow($sql)) {
|
|
continue;
|
|
}
|
|
|
|
// 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)$shop_id;
|
|
if (!$position = Db::getInstance()->getValue($sql)) {
|
|
$position = 0;
|
|
}
|
|
|
|
// Register module in hook
|
|
$return &= Db::getInstance()->insert('hook_module', array(
|
|
'id_module' => (int)$id_module,
|
|
'id_hook' => (int)$id_hook,
|
|
'id_shop' => (int)$shop_id,
|
|
'position' => (int)($position + 1),
|
|
));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* PERMISSION ACCOUNT demo@demo.com
|
|
* OVERRIDE CORE
|
|
*/
|
|
public function initProcess()
|
|
{
|
|
parent::initProcess();
|
|
|
|
if (count($this->errors) <= 0) {
|
|
if (Tools::getIsset('updateleohook') && Tools::getValue('updateleohook')) {
|
|
if (!$this->access('edit')) {
|
|
$this->errors[] = $this->trans('You do not have permission to edit this.', array(), 'Admin.Notifications.Error');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|