createTables()) { error_log('[ws_customhtml] createTables() failed — DB error: ' . Db::getInstance()->getMsgError()); return false; } if (!$this->registerTabs(Config::TABS)) { error_log('[ws_customhtml] registerTabs() failed'); return false; } if (!$this->registerHooks()) { error_log('[ws_customhtml] registerHooks() failed'); return false; } if (!$this->registerGroupHooks()) { error_log('[ws_customhtml] registerGroupHooks() failed'); return false; } return true; } private function createTables(): bool { $sqlToExec = []; $sqlToExec[] = ' CREATE TABLE IF NOT EXISTS ' . _DB_PREFIX_ . 'ws_customhtml_group ( `id_ws_customhtml_group` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `hook_name` VARCHAR(64) NOT NULL, `custom_class` VARCHAR(128) NOT NULL DEFAULT \'\', `default_block_class` VARCHAR(128) NOT NULL DEFAULT \'\', `active` TINYINT(1) NOT NULL DEFAULT 1, `ordering` INT(11) NOT NULL DEFAULT 0, `date_add` DATETIME NOT NULL, `date_upd` DATETIME NOT NULL ); '; $sqlToExec[] = ' CREATE TABLE IF NOT EXISTS ' . _DB_PREFIX_ . 'ws_customhtml_group_lang ( `id_ws_customhtml_group` INT(11) NOT NULL, `id_lang` INT(11) NOT NULL, `title` VARCHAR(256) NOT NULL DEFAULT \'\', PRIMARY KEY (`id_ws_customhtml_group`, `id_lang`) ); '; $sqlToExec[] = ' CREATE TABLE IF NOT EXISTS ' . _DB_PREFIX_ . 'ws_customhtml ( `id_ws_customhtml` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `id_ws_customhtml_group` INT(11) NOT NULL, `type` VARCHAR(32) NOT NULL DEFAULT \'html\', `custom_class` VARCHAR(128) NOT NULL DEFAULT \'\', `image` VARCHAR(255) NOT NULL DEFAULT \'\', `alert_type` VARCHAR(16) NOT NULL DEFAULT \'info\', `timeout` INT(11) NOT NULL DEFAULT 0, `slider_mode` VARCHAR(16) NOT NULL DEFAULT \'always\', `slides_per_view_mobile` DECIMAL(4,2) NOT NULL DEFAULT 1, `slides_per_view_tablet` DECIMAL(4,2) NOT NULL DEFAULT 2, `slides_per_view_desktop` DECIMAL(4,2) NOT NULL DEFAULT 3, `autoplay_delay` INT(11) NOT NULL DEFAULT 0, `active` TINYINT(1) NOT NULL DEFAULT 1, `show_title` TINYINT(1) NOT NULL DEFAULT 0, `ordering` INT(11) NOT NULL DEFAULT 0, `date_add` DATETIME NOT NULL, `date_upd` DATETIME NOT NULL, KEY `id_ws_customhtml_group` (`id_ws_customhtml_group`) ); '; $sqlToExec[] = ' CREATE TABLE IF NOT EXISTS ' . _DB_PREFIX_ . 'ws_customhtml_lang ( `id_ws_customhtml` INT(11) NOT NULL, `id_lang` INT(11) NOT NULL, `title` VARCHAR(256) NOT NULL DEFAULT \'\', `content` LONGTEXT, `description` TEXT, `extra_description` TEXT, `link` VARCHAR(512) NOT NULL DEFAULT \'\', `link_text` VARCHAR(128) NOT NULL DEFAULT \'\', PRIMARY KEY (`id_ws_customhtml`, `id_lang`) ); '; $sqlToExec[] = ' CREATE TABLE IF NOT EXISTS ' . _DB_PREFIX_ . 'ws_customhtml_faq ( `id_ws_customhtml_faq` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `id_ws_customhtml` INT(11) NOT NULL, `ordering` INT(11) NOT NULL DEFAULT 0, `date_add` DATETIME NOT NULL, `date_upd` DATETIME NOT NULL, KEY `id_ws_customhtml` (`id_ws_customhtml`) ); '; $sqlToExec[] = ' CREATE TABLE IF NOT EXISTS ' . _DB_PREFIX_ . 'ws_customhtml_faq_lang ( `id_ws_customhtml_faq` INT(11) NOT NULL, `id_lang` INT(11) NOT NULL, `question` VARCHAR(512) NOT NULL DEFAULT \'\', `answer` TEXT, PRIMARY KEY (`id_ws_customhtml_faq`, `id_lang`) ); '; $sqlToExec[] = ' CREATE TABLE IF NOT EXISTS ' . _DB_PREFIX_ . 'ws_customhtml_slide ( `id_ws_customhtml_slide` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `id_ws_customhtml` INT(11) NOT NULL, `image` VARCHAR(255) NOT NULL DEFAULT \'\', `ordering` INT(11) NOT NULL DEFAULT 0, `date_add` DATETIME NOT NULL, `date_upd` DATETIME NOT NULL, KEY `id_ws_customhtml` (`id_ws_customhtml`) ); '; $sqlToExec[] = ' CREATE TABLE IF NOT EXISTS ' . _DB_PREFIX_ . 'ws_customhtml_slide_lang ( `id_ws_customhtml_slide` INT(11) NOT NULL, `id_lang` INT(11) NOT NULL, `title` VARCHAR(256) NOT NULL DEFAULT \'\', `description` TEXT, `extra_description` TEXT, `link` VARCHAR(512) NOT NULL DEFAULT \'\', `link_text` VARCHAR(128) NOT NULL DEFAULT \'\', PRIMARY KEY (`id_ws_customhtml_slide`, `id_lang`) ); '; foreach ($sqlToExec as $sqlBlock) { Db::getInstance()->execute(trim($sqlBlock)); } return true; } private function registerHooks(): bool { foreach (Config::HOOKS as $hook) { if (!$this->registerHook($hook)) { return false; } } return true; } private function registerGroupHooks(): bool { $hookNames = Db::getInstance()->executeS( 'SELECT DISTINCT `hook_name` FROM `' . _DB_PREFIX_ . 'ws_customhtml_group`' ); $idShop = (int) Context::getContext()->shop->id; foreach ($hookNames as $row) { $hookName = $row['hook_name']; if (Hook::isModuleRegisteredOnHook($this, $hookName, $idShop)) { continue; } if (!$this->registerHook($hookName)) { return false; } } return true; } private function registerTabs(array $moduleTabs): bool { $languages = Language::getLanguages(false); foreach ($moduleTabs as $moduleTab) { if (Tab::getIdFromClassName($moduleTab['class_name'])) { continue; } $tab = new Tab(); $tab->class_name = $moduleTab['class_name']; $tab->module = $moduleTab['module']; $tab->active = 1; $tab->route_name = $moduleTab['route_name']; if (isset($moduleTab['icon'])) { $tab->icon = $moduleTab['icon']; } foreach ($languages as $language) { if (is_array($moduleTab['name'])) { $tab->name[$language['id_lang']] = $moduleTab['name'][$language['iso_code']] ?? $moduleTab['name']['en']; } else { $tab->name[$language['id_lang']] = $moduleTab['name']; } } if (isset($moduleTab['parent_class_name'])) { $tab->id_parent = (int) Tab::getIdFromClassName($moduleTab['parent_class_name']); } elseif (isset($moduleTab['id_parent'])) { $tab->id_parent = (int) $moduleTab['id_parent']; } else { $tab->id_parent = -1; } $tab->add(); if (!$tab->id) { return false; } } return true; } }