* @copyright 2007-2019 Apollotheme
* @license http://apollotheme.com - prestashop template provider
*/
if (!defined('_PS_VERSION_')) {
# module validation
exit;
}
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/LeoFrameworkHelper.php');
require_once(_PS_MODULE_DIR_.'appagebuilder/libs/Helper.php');
class Datasample
{
private $_content = '';
private $_createTable = '';
public $_id_shop = 0;
public $_id_lang = 0;
private $_languages = array();
private $_languagesKey = array();
public $_html = array(
"error" => array(),
"confirm" => array()
);
private $_theme_dir = '';
private $_paramsMenu = '';
private $_currentBackupFile = '';
private $_langField = array('widget_title', 'text_link', 'htmlcontent', 'header', 'content', 'information');
private $_imageField = array('htmlcontent', 'content', 'information', 'raw_html');
private $_parentField = 'id_parent';
public $backup_dir = '';
public $tmp_db = array();
public function __construct()
{
$this->context = Context::getContext();
$context = Context::getContext();
$this->_id_shop = apPageHelper::getIDShop();
$this->_id_lang = $this->context->language->id;
$languages = Language::getLanguages(false);
foreach ($languages as $lang) {
$this->_languages[$lang["iso_code"]] = $lang["id_lang"];
$this->_languagesKey[$lang["id_lang"]] = $lang["iso_code"];
}
$this->_theme_dir = apPageHelper::getThemeName().'/';
$this->backup_dir = str_replace('\\', '/', _PS_CACHE_DIR_.'backup/themes/');
}
/**
* Restore Sample Data
*/
public function processImport($moduleName = '')
{
$theme_name = apPageHelper::getInstallationThemeName() . '/';
$data = false;
if (file_exists(_PS_ALL_THEMES_DIR_.$theme_name.'config.xml')) {
$data = simplexml_load_file(_PS_ALL_THEMES_DIR_.$theme_name.'config.xml');
}
if (!$data || !isset($data->modules)) {
return false;
}
if (!$moduleName) {
$moduleList = Tools::getValue("moduleList");
} else {
$moduleList[] = $moduleName;
}
$error = 0;
foreach ($moduleList as $module) {
if (file_exists(_PS_ALL_THEMES_DIR_.$theme_name.'samples/'.$module.'.xml')) {
$content = simplexml_load_file(_PS_ALL_THEMES_DIR_.$theme_name.'samples/'.$module.'.xml');
if (!$content) {
$this->_html["error"][] = "Content of sample data of module: ".$module.' is null';
continue;
}
# INSERT SQL FIRST
if (isset($content->sql) && $content->sql) {
$metaData = array(
'PREFIX_' => _DB_PREFIX_,
'ENGINE_TYPE' => _MYSQL_ENGINE_,
);
$cSql = str_replace(array_keys($metaData), array_values($metaData), Module::configXmlStringFormat($content->sql));
$queries = preg_split('#;\s*[\r\n]+#', $cSql);
$queries = preg_replace("/AUTO_INCREMENT=\d+ /","AUTO_INCREMENT=1 ", $queries);
foreach ($queries as $query) {
$query = trim($query);
if (!$query) {
continue;
}
Db::getInstance()->execute(($query));
}
if ($moduleName == 'appagebuilder') {
LeoFrameworkHelper::leoCreateColumn('appagebuilder', 'id_appagebuilder_shortcode', 'int(11) NOT NULL');
}
}
# INSERT CONFIG
if (isset($content->configurations) && $content->configurations)
foreach ($content->configurations->children() as $contentConfig) {
Configuration::updateValue(Module::configXmlStringFormat(Tools::strtoupper($contentConfig->name)), Module::configXmlStringFormat($contentConfig->value));
}
# INSERT HOOK
if (isset($content->hooks) && $content->hooks) {
$moduleObj = Module::getInstanceByName($module);
if ($moduleObj && $moduleObj->id) {
$module_hook = array();
foreach ($content->hooks->children() as $row) {
$exceptions = array_filter(isset($row->attributes()->exceptions) ? explode(',', strval($row->attributes()->exceptions)) : array());
if (Hook::getIdByName(strval($row->attributes()->hook))) {
$module_hook[] = array(
'hook' => strval($row->attributes()->hook),
'position' => strval($row->attributes()->position),
'exceptions' => $exceptions
);
}
}
if ((int)$moduleObj->id > 0) {
$this->hookModule($moduleObj->id, $module_hook, $this->_id_shop);
}
}
}
foreach ($content->fields as $fields) {
if (isset($fields->attributes()->table_name) && $fields->attributes()->table_name) {
$this->deleteDataByTableName((string)$fields->attributes()->table_name, $fields->attributes()->searchField, $this->_id_shop);
$this->importDataByTable($fields, (string)$fields->attributes()->table_name, (string)$fields->attributes()->struct);
continue;
}
if (isset($fields->attributes()->objectName) && $fields->attributes()->objectName) {
if (!$this->includeObjModel($module, (string)$fields->attributes()->objectFile))
continue;
# DELETE DATA FOLLOW ID_SHOP
$this->deleteDataOfModByShop((string)$fields->attributes()->objectName, $fields->attributes()->searchField, $this->_id_shop, $module);
# INSERT DATA
$this->importData($fields, (string)$fields->attributes()->objectName, (string)$fields->attributes()->searchField, $this->_id_shop, $module);
}
}
if ($module == "leobootstrapmenu") {
Configuration::updateValue('LEO_MEGAMENU_PARAMS', '');
Configuration::updateValue('LEO_MEGAMENU_PARAMS', Tools::jsonEncode($this->_paramsMenu), true);
}
if ($module == "leomenusidebar") {
Configuration::updateValue('LEO_MENUSIDEBAR_PARAMS', '');
Configuration::updateValue('LEO_MENUSIDEBAR_PARAMS', Tools::jsonEncode($this->_paramsMenu), true);
}
if ($module == "leoblog") {
// $leoblog_image = _PS_ALL_THEMES_DIR_.apPageHelper::getThemeName().'/assets/img/modules/leoblog/';
$leoblog_sample_image = _PS_ALL_THEMES_DIR_.$theme_name.'assets/img/modules/leoblog/sample';
$leoblog_shop_image = _PS_ALL_THEMES_DIR_.$theme_name.'assets/img/modules/leoblog/'.$this->_id_shop;
if (is_dir($leoblog_sample_image)) {
if (!is_dir($leoblog_shop_image)) {
mkdir($leoblog_shop_image, 0755, true);
apPageHelper::fullCopy($leoblog_sample_image, $leoblog_shop_image);
}
}
}
} else {
$this->_html["error"][] = "Can not find sample file of module: ".$module;
$error = 1;
}
if (!$error) {
$this->_html["confirm"][] .= 'Restore DataSample success for : '.$module;
}
# RESET DATA IMPORT
$this->_paramsMenu = '';
}
return !$error;
}
private function hookModule($id_module, $module_hooks, $shop)
{
Db::getInstance()->execute('INSERT IGNORE INTO '._DB_PREFIX_.'module_shop (id_module, id_shop) VALUES('.(int)$id_module.', '.(int)$shop.')');
Db::getInstance()->execute($sql = 'DELETE FROM `'._DB_PREFIX_.'hook_module` WHERE `id_module` = '.pSQL($id_module).' AND id_shop = '.(int)$shop);
foreach ($module_hooks as $hook) {
$sql_hook_module = 'INSERT INTO `'._DB_PREFIX_.'hook_module` (`id_module`, `id_shop`, `id_hook`, `position`)
VALUES ('.(int)$id_module.', '.(int)$shop.', '.(int)Hook::getIdByName($hook['hook']).', '.(int)$hook['position'].')';
if (count($hook['exceptions']) > 0) {
foreach ($hook['exceptions'] as $exception) {
$sql_hook_module_except = 'INSERT INTO `'._DB_PREFIX_.'hook_module_exceptions` (`id_module`, `id_hook`, `file_name`) VALUES ('.(int)$id_module.', '.(int)Hook::getIdByName($hook['hook']).', "'.pSQL($exception).'")';
Db::getInstance()->execute($sql_hook_module_except);
}
}
Db::getInstance()->execute($sql_hook_module);
}
}
public function importData($content, $objectMName, $searchField, $searchValue, $moduleName, $parentID = 0)
{
$need_correct_megamenu = false;
$need_correct__megamenu_title_fo = false;
//DONGND:: correct megamenu with data sample of old version
if ($moduleName == 'leobootstrapmenu')
{
//DONGND:: correct group title, change to multilang
$correct_group_title = Db::getInstance()->executeS('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME="'._DB_PREFIX_.'btmegamenu_group" AND column_name="title"');
$correct_group_lang_table = Db::getInstance()->executeS('SELECT table_name FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME = "'._DB_PREFIX_.'btmegamenu_group_lang"');
if (count($correct_group_title) >= 1 && count($correct_group_lang_table) < 1) {
Db::getInstance()->execute('
CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'btmegamenu_group_lang` (
`id_btmegamenu_group` int(11) NOT NULL,
`id_lang` int(11) NOT NULL,
`title` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id_btmegamenu_group`,`id_lang`)
) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;
');
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'btmegamenu_group` DROP COLUMN `title`');
$need_correct_megamenu = true;
}
//DONGND:: correct title_fo
$correct_title_fo = Db::getInstance()->executeS('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME="'._DB_PREFIX_.'btmegamenu_group_lang" AND column_name="title_fo"');
if (count($correct_title_fo) < 1) {
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'btmegamenu_group_lang` ADD `title_fo` varchar(255) DEFAULT NULL');
$need_correct__megamenu_title_fo = true;
}
}
if (($objectMName == 'Btmegamenu')) {
// UPDATE VERSION : Install theme -> add column
LeoFrameworkHelper::leoCreateColumn('btmegamenu', 'groupBox', 'varchar(255) DEFAULT "all"');
} elseif (($objectMName == 'Sbmegamenu')) {
// UPDATE VERSION : Install theme -> add column
LeoFrameworkHelper::leoCreateColumn('sbmegamenu', 'groupBox', 'varchar(255) DEFAULT "all"');
} elseif (($objectMName == 'LeoBlogBlog')) {
// UPDATE VERSION : Install theme -> add column
LeoFrameworkHelper::leoCreateColumn('leoblog_blog', 'thumb', 'varchar(255) DEFAULT NULL');
}
$obj = new $objectMName();
$defined = $obj->getDefinition($obj);
if ($objectMName == 'ApPageBuilderProfilesModel') {
# SET ACTIVE PROFILE
$defined["fields"]['active'] = array('type' => 1, 'validate' => 'isUnsignedId');
//nghiatd - add theme mobile and table
$correct_mobile = Db::getInstance()->executeS('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME="'._DB_PREFIX_.'appagebuilder_profiles_shop" AND column_name="active_mobile"');
if (count($correct_mobile) < 1) {
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_profiles_shop` ADD `active_mobile` int(11) NOT NULL');
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_profiles_shop` ADD `active_tablet` int(11) NOT NULL');
}
//nghiatd - add theme mobile and table
$correct_mobile = Db::getInstance()->executeS('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME="'._DB_PREFIX_.'appagebuilder_profiles" AND column_name="active_mobile"');
if (count($correct_mobile) < 1) {
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_profiles` ADD `active_mobile` int(11) NOT NULL');
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_profiles` ADD `active_tablet` int(11) NOT NULL');
}
//nghiatd - add theme mobile and table
$correct_mobile = Db::getInstance()->executeS('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME="'._DB_PREFIX_.'appagebuilder_details_shop" AND column_name="active_mobile"');
if (count($correct_mobile) < 1) {
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_details_shop` ADD `active_mobile` int(11) NOT NULL');
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_details_shop` ADD `active_tablet` int(11) NOT NULL');
}
//nghiatd - add theme mobile and table
$correct_mobile = Db::getInstance()->executeS('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME="'._DB_PREFIX_.'appagebuilder_details" AND column_name="active_mobile"');
if (count($correct_mobile) < 1) {
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_details` ADD `active_mobile` int(11) NOT NULL');
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_details` ADD `active_tablet` int(11) NOT NULL');
}
//nghiatd - add theme mobile and table
$correct_mobile = Db::getInstance()->executeS('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME="'._DB_PREFIX_.'appagebuilder_products_shop" AND column_name="active_mobile"');
if (count($correct_mobile) < 1) {
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_products_shop` ADD `active_mobile` int(11) NOT NULL');
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_products_shop` ADD `active_tablet` int(11) NOT NULL');
}
//nghiatd - add theme mobile and table
$correct_mobile = Db::getInstance()->executeS('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "'._DB_NAME_.'" AND TABLE_NAME="'._DB_PREFIX_.'appagebuilder_products" AND column_name="active_mobile"');
if (count($correct_mobile) < 1) {
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_products` ADD `active_mobile` int(11) NOT NULL');
Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'appagebuilder_products` ADD `active_tablet` int(11) NOT NULL');
}
} else if ($objectMName == 'ApPageBuilderProductsModel') {
# SET ACTIVE PRODUCT LIST
$defined["fields"]['active'] = array('type' => 1, 'validate' => 'isUnsignedId');
}
//top field to include file + define Object
if ($parentID) {
$realContent = $content->field;
} else {
$realContent = $content->children();
}
foreach ($realContent as $parrentField) {
$parrentObj = new $objectMName();
foreach ($defined["fields"] as $ke => $val) {
//DONGND:: correct megamenu with data sample of old version
if ($objectMName == 'BtmegamenuGroup' && $ke == 'title' && ($need_correct_megamenu || Module::configXmlStringFormat($parrentField->{$ke}) != '')) {
$title_correct_megamenu = Module::configXmlStringFormat($parrentField->{$ke});
$list_lang = Language::getLanguages(false);
foreach ($list_lang as $list_lang_item) {
$parrentObj->{$ke}[$list_lang_item['id_lang']] = $title_correct_megamenu;
}
continue;
}
if ($objectMName == 'BtmegamenuGroup' && $ke == 'title_fo' && ($need_correct__megamenu_title_fo || !isset($parrentField->{$ke}))) {
$list_lang = Language::getLanguages(false);
$group_title_fo = '';
foreach ($list_lang as $list_lang_item) {
if ($list_lang_item['iso_code'] == 'en') {
$group_title_fo = 'Categories';
}
if ($list_lang_item['iso_code'] == 'es') {
$group_title_fo = 'Categorías';
}
if ($list_lang_item['iso_code'] == 'fr') {
$group_title_fo = 'Catégories';
}
if ($list_lang_item['iso_code'] == 'de') {
$group_title_fo = 'Kategorien';
}
if ($list_lang_item['iso_code'] == 'it') {
$group_title_fo = 'Categorie';
}
if ($list_lang_item['iso_code'] == 'ar') {
$group_title_fo = 'الفئات';
}
$parrentObj->{$ke}[$list_lang_item['id_lang']] = $group_title_fo;
}
continue;
}
if ($ke == "id") {
continue;
}
if ($ke == $searchField) {
$parrentObj->{$searchField} = $searchValue;
continue;
}
if (isset($val["lang"]) && $val["lang"]) {
$defaultData = array();
$parrentObj->{$ke} = array();
foreach ($this->_languages as $langC => $langID) {
if (isset($parrentField->{$ke}->$langC) && $parrentField->{$ke}->$langC) {
//echo "--lang".$ke.'--valule:'.Module::configXmlStringFormat($parrentField->{$ke}->$langC).'
';
$parrentObj->{$ke}[$langID] = Module::configXmlStringFormat($parrentField->{$ke}->$langC);
} else {
$parrentObj->{$ke}[$langID] = Module::configXmlStringFormat($parrentField->{$ke}->en);
}
}
} else if (isset($parrentField->{$ke})) {
if ($val["type"] == 3 || $val["type"] == 5 || $val["type"] == 6) {
//echo "--nolang-but cdata".$ke.'--valule:'.Module::configXmlStringFormat($parrentField->{$ke}).'
';
$parrentObj->{$ke} = Module::configXmlStringFormat($parrentField->{$ke});
} else {
//echo "--nolang-".$ke.'--valule:'.$parrentField->{$ke}.'
';
$parrentObj->{$ke} = (string)$parrentField->{$ke};
}
}
}
if (($objectMName == 'Btmegamenu' || $objectMName == 'Sbmegamenu') && isset($obj->content_text)) {
//change image link
foreach ($obj->content_text as &$submenu_text) {
$submenu_text = str_replace('"modules/'.$moduleName, '"'.__PS_BASE_URI__.'modules/'.$moduleName, $submenu_text);
$submenu_text = str_replace('"themes/', '"'.__PS_BASE_URI__.'themes/', $submenu_text);
}
}
if ($objectMName == 'LeoWidget') {
$widgetParam = Tools::jsonDecode(call_user_func('base64'.'_decode', $parrentField->params), true);
$tmpWidParam = array();
$defaultData = array();
foreach ($widgetParam as $widKey => $widValue) {
# CHANGE HOST URL AT IMAGE
foreach ($this->_imageField as $fVal) {
if (strpos($widKey, $fVal) !== false && strpos($widValue, 'img') !== false) {
$widValue = str_replace('src="modules/', 'src="'.__PS_BASE_URI__.'modules/', $widValue);
$widValue = str_replace('src="themes/', 'src="'.__PS_BASE_URI__.'themes/', $widValue);
$widValue = str_replace('src="img/', 'src="'.__PS_BASE_URI__.'img/', $widValue);
break;
}
}
# CHANGE LANGUAGE
$removeLangKey = preg_replace("/_en$/", "_", $widKey, -1, $count);
if ($count) {
$defaultData[$removeLangKey] = $widValue;
}
if (isset($widgetParam['list_field_lang']) && !empty($widgetParam['list_field_lang'])) {
$_langField = array_merge($this->_langField, explode(',', $widgetParam['list_field_lang']));
//removes null values but leaves "0"
$_langField = array_filter($_langField, 'strlen');
//removes all null values
$_langField = array_filter($_langField);
} else {
$_langField = $this->_langField;
}
foreach ($_langField as $fVal) {
if (strpos($widKey, $fVal) !== false) {
foreach ($this->_languages as $lKey => $lValue) {
$widKey = preg_replace("/_".$lKey."$/", "_".$lValue, $widKey, -1, $count);
if ($count) {
break;
}
}
break;
}
}
$tmpWidParam[$widKey] = $widValue;
}
//set data for other language if data sample is not support
foreach ($this->_languages as $lKey => $lValue) {
foreach ($defaultData as $dKey => $dValue) {
if (!isset($tmpWidParam[$dKey.$lValue])) {
$tmpWidParam[$dKey.$lValue] = $dValue;
}
}
}
$parrentObj->params = call_user_func('base64'.'_encode', Tools::jsonEncode($tmpWidParam));
}
if ($parentID) {
$parrentObj->{$this->_parentField} = $parentID;
}
//root category of blog
if ($moduleName == "leoblog" && (int)$parrentField->id == 1) {
//update shop for root category
$resultCheck = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT `id_leoblogcat` as id FROM `'._DB_PREFIX_.'leoblogcat_shop` WHERE `id_leoblogcat` = 1 AND `id_shop`='.(int)($this->_id_shop));
if ($resultCheck["id"] != 1) {
Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'leoblogcat_shop`(`id_leoblogcat`,`id_shop`) VALUES( 1, '.(int)($this->_id_shop).' )');
}
$resultCheck = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT `id_leoblogcat` as id FROM `'._DB_PREFIX_.'leoblogcat` WHERE `id_leoblogcat` = 1');
if ($resultCheck["id"] != 1) {
Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'leoblogcat`(`id_leoblogcat`,`id_parent`) VALUES( 1,0)');
}
foreach ($this->_languages as $langVal) {
Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'leoblogcat_lang`(`id_leoblogcat`,`id_lang`,`title`) VALUES(1, '.(int)$langVal.', \'Root\')');
}
// } else if ($moduleName == "leobootstrapmenu" && (int)$parrentField->id == 1) {
// $resultCheck = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT `id_btmegamenu` as id FROM `'._DB_PREFIX_.'btmegamenu_shop` WHERE `id_btmegamenu` = 1 AND `id_shop`='.(int)($this->_id_shop));
// if ($resultCheck["id"] != 1) {
// foreach ($this->_languages as $langVal) {
// Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'btmegamenu_lang`(`id_btmegamenu`,`id_lang`,`title`) VALUES(1, '.(int)$langVal.', \'Root\')');
// }
// Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'btmegamenu_shop`(`id_btmegamenu`,`id_shop`) VALUES( 1, '.(int)($this->_id_shop).' )');
// }
} else if ($moduleName == "leomenusidebar" && (int)$parrentField->id == 1) {
$resultCheck = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT `id_sbmegamenu` as id FROM `'._DB_PREFIX_.'sbmegamenu_shop` WHERE `id_sbmegamenu` = 1 AND `id_shop`='.(int)($this->_id_shop));
if ($resultCheck["id"] != 1) {
foreach ($this->_languages as $langVal) {
Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'sbmegamenu_lang`(`id_sbmegamenu`,`id_lang`,`title`) VALUES(1, '.(int)$langVal.', \'Root\')');
}
Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'sbmegamenu_shop`(`id_sbmegamenu`,`id_shop`) VALUES( 1, '.(int)($this->_id_shop).' )');
}
} else if ($objectMName == "SliderLayer" && $this->isEmptyArray($parrentObj->title)) {
} else if ($objectMName == "ApPageBuilderProfilesModel") {
foreach ($parrentField->fields as $posField) {
# IMPORT HEADER, CONTENT, FOOTER, PRODUCT
$parrentObj->{(string)$posField->attributes()->position} = $this->importData($posField, (string)$posField->attributes()->objectName, (string)$posField->attributes()->searchField, (int)$parrentObj->id, $moduleName);
}
$parrentObj->import_datasample = true;
$parrentObj->add();
} else {
$old_id = (int)$parrentField->id;
if ($this->isDataSuccess($objectMName, $old_id) == false) {
# not exist in db
$parrentObj->import_datasample = true;
$temp = $content->attributes();
if (isset($content->attributes()->parrentModelClass ) && isset($content->attributes()->parrentPrimaryKey )) {
$parrentModelClass = explode(',', $content->attributes()->parrentModelClass ) ;
$parrentModelClass = array_map('trim', $parrentModelClass);
$parrentPrimaryKey = explode(',', $content->attributes()->parrentPrimaryKey);
$parrentPrimaryKey = array_map('trim', $parrentPrimaryKey);
foreach ($parrentModelClass as $key => $val) {
$model_name = $parrentModelClass[$key];
$id_name = $parrentPrimaryKey[$key];
$id_value = $parrentObj->$id_name;
if (isset($this->tmp_db[$model_name][$id_value])) {
$id_new_value = $this->tmp_db[$model_name][$id_value]['new_id'];
$parrentObj->$id_name = $id_new_value;
}
}
}
if ($parrentObj->add() == true) {
$new_id = $parrentObj->id;
$this->saveDataSuccess($objectMName, $old_id, $new_id);
}
} else {
# exist in db
$parrentObj->id = $this->getDataSuccess($objectMName, $old_id);
}
}
//update params widget for menu
if (($objectMName == 'Btmegamenu' || $objectMName == 'Sbmegamenu') && isset($parrentField->params) && $parrentField->params && $parrentObj->id) {
$configMenu = Module::configXmlStringFormat($parrentField->params);
$configMenu = Tools::jsonDecode($configMenu);
if (isset($configMenu->id)) {
$configMenu->id = $parrentObj->id;
}
$this->_paramsMenu[] = $configMenu;
}
//import database of sub menu
if (isset($parrentField->child_field)) {
if (isset($parrentField->child_field->attributes()->field)) {
$this->_parentField = (string)$parrentField->child_field->attributes()->field;
}
$this->importData($parrentField->child_field, $objectMName, $searchField, $searchValue, $moduleName, $parrentObj->id);
}
if (isset($parrentField->fields)) {
if (!$this->includeObjModel($moduleName, $parrentField->fields->attributes()->objectFile)) {
continue;
}
$this->importData($parrentField->fields, (string)$parrentField->fields->attributes()->objectName, (string)$parrentField->fields->attributes()->searchField, (int)$parrentObj->id, $moduleName);
}
//DONGND:: update for data sample of product review
if ($objectMName == 'ProductReviewCriterion' || $objectMName == 'ProductReview') {
$product_review_query = '';
if ($objectMName == 'ProductReviewCriterion') {
$product_review_query = 'UPDATE `'._DB_PREFIX_.'leofeature_product_review_grade` SET `id_product_review_criterion` = '.(int)$parrentObj->id.' WHERE `id_product_review_criterion` = '.(int)$parrentField->id;
}
if ($objectMName == 'ProductReview') {
$product_review_query = 'UPDATE `'._DB_PREFIX_.'leofeature_product_review_grade` SET `id_product_review` = '.(int)$parrentObj->id.' WHERE `id_product_review` = '.(int)$parrentField->id;
}
Db::getInstance()->execute($product_review_query);
}
}
if (isset($parrentObj) && isset($parrentObj->id)) {
return $parrentObj->id;
}
}
public function isEmptyArray($array)
{
foreach ($array as $value) {
if ($value) {
return false;
}
}
return true;
}
public function importDataByTable($content, $tableName)
{
$tableName = _DB_PREFIX_.$tableName;
foreach ($content as $contentFields) {
$isCorrect = 1;
$sql = "INSERT IGNORE INTO `".pSQL($tableName)."`";
$f = "(";
$v = "VALUE (";
$hookId = 0;
$moduleId = 0;
foreach ($contentFields as $kF => $vF) {
if ($kF == "id_shop") {
$vF = $this->_id_shop.",";
} else {
if (isset($vF->attributes()->type)) {
if ($vF->attributes()->type == "module_name") {
$moduleId = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT id_module FROM `'._DB_PREFIX_.'module'.'` WHERE name=\''.pSQL($vF).'\'');
if (!$moduleId) {
$isCorrect = 0;
break;
}
$vF = $moduleId.",";
} elseif ($vF->attributes()->type == "hook_name") {
$hookId = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT id_hook FROM `'._DB_PREFIX_.'hook'.'` WHERE name=\''.pSQL($vF).'\'');
//can not find hook name refunr
if (!$hookId) {
$isCorrect = 0;
break;
}
$vF = $hookId.",";
} else {
$vF = "'".$vF."',";
}
} else {
$vF = $vF.",";
}
}
$f .= "`".$kF."`,";
$v .= $vF;
}
$f = Tools::substr($f, 0, -1).')';
$v = Tools::substr($v, 0, -1).')';
$sql .= " ".pSQL($f)." ".pSQL($v); // validate module : not test
if ($isCorrect) {
Db::getInstance()->execute($sql);
}
//insert module to hook_module table
if ($isCorrect && $hookId && $moduleId) {
$sql = "INSERT IGNORE INTO `"._DB_PREFIX_."hook_module` (`id_module` ,`id_shop` ,`id_hook` ,`position`) VALUES (".(int)$moduleId.",".(int)$this->_id_shop.",".(int)$hookId.",1)";
Db::getInstance()->execute($sql);
}
}
}
public function deleteDataByTableName($tableName, $searchField, $searchValue)
{
$tableName = _DB_PREFIX_.$tableName;
if (count(Db::getInstance()->executeS('SHOW TABLES LIKE \''.pSQL($tableName).'\''))) {
$where = ' WHERE `'.pSQL($searchField).'`='.pSQL($searchValue);
Db::getInstance()->execute("DELETE FROM `".pSQL($tableName)."` ".$where);
}
}
/**
* delete data of module by Shop
*/
public function deleteDataOfModByShop($objectMName, $searchField, $searchValue, $moduleName)
{
$obj = new $objectMName();
$defined = $obj->getDefinition($obj);
$tableName = _DB_PREFIX_.$defined["table"];
if (!count(Db::getInstance()->executeS('SHOW TABLES LIKE \''.pSQL($tableName).'\'')))
return false;
if ($searchField == "id_shop") {
$schema = Db::getInstance()->executeS('SHOW CREATE'.' TABLE `'.pSQL($tableName).'`');
if (strpos($schema[0]['Create Table'], "`id_shop`") == false) {
$tableName = _DB_PREFIX_.$defined["table"].'_shop';
}
}
$where = '';
if ($searchField != "") {
$where = ' WHERE `'.$searchField.'`='.$searchValue;
}
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT * FROM `'.pSQL($tableName).'`'.pSQL($where));
foreach ($result as $value) {
$obj = new $objectMName($value[$defined["primary"]]);
if ($obj->id) {
$obj->delete(array('import_sample' => true));
}
}
}
/**
* create sample for module save in template file
*/
public function processConfigs()
{
$savePath = _PS_ALL_THEMES_DIR_.$this->_theme_dir."samples/";
if (!is_dir($savePath)) {
if (!mkdir($savePath, 0755, true)) {
die("Please create folder samples in "._PS_ALL_THEMES_DIR_.$this->_theme_dir." and set permission 755");
}
}
$id_theme = Context::getContext()->shop->id_theme;
$theme_name = Context::getContext()->shop->theme_name;
$theme = Db::getInstance()->executeS('SELECT `responsive`,`default_left_column`,`default_right_column`,`product_per_page` FROM `'._DB_PREFIX_.'theme` WHERE id_theme='.(int)$id_theme.'');
$theme_meta = Db::getInstance()->executeS('SELECT `id_meta`,`left_column`,`right_column` FROM `'._DB_PREFIX_.'theme_meta` WHERE id_theme='.(int)$id_theme.'');
$this->_content = '
';
$this->_content .= '';
$this->getContentXml($theme);
$this->_content .= _NEWLINE_.''._NEWLINE_;
$this->_content .= '';
$this->getContentXml($theme_meta);
$this->_content .= _NEWLINE_.''._NEWLINE_;
$this->_content .=
'';
$fp = @fopen($savePath."themeconfig.xml", 'w');
fwrite($fp, $this->_content);
$this->_content = '';
fclose($fp);
$this->_html["confirm"][] .= 'Restore configs theme success';
}
public function processApplyConfigs()
{
$id_theme = Context::getContext()->shop->id_theme;
$theme_name = Context::getContext()->shop->theme_name;
$data = simplexml_load_file(_PS_ALL_THEMES_DIR_.$theme_name.'/samples/themeconfig.xml');
if (!$data) {
$this->_html["error"][] = "Can not find field in themes/LEOTHEME/themeconfig.xml";
return false;
}
foreach ($data->fields as $fields) {
if (isset($fields->attributes()->objectName) && $fields->attributes()->objectName && $fields->attributes()->objectName == 'theme') {
$json = Tools::jsonEncode($fields->field);
$theme = Tools::jsonDecode($json, TRUE);
$new_theme = new Theme($id_theme);
foreach ($theme as $k => $field) {
$new_theme->$k = $field;
}
if ($new_theme->update()) {
foreach ($data->fields as $items) {
if (($items->attributes()->objectName == "theme_meta")) {
$jsons = Tools::jsonEncode($items);
$item = Tools::jsonDecode($jsons, TRUE);
$meta = $this->getMetaById($id_theme);
if (count($item) > 0) {
$this->deleteMeta($id_theme);
}
foreach ($item['field'] as $row) {
$this->addMeta($row, $id_theme);
}
}
}
}
}
}
}
public function getMetaById($id_theme)
{
return Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'theme_meta` WHERE id_theme='.(int)$id_theme.'');
}
public function deleteMeta($id_theme)
{
return Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'theme_meta` WHERE id_theme='.(int)$id_theme.'');
}
public function addMeta($row, $id_theme)
{
$sql = "INSERT INTO `"._DB_PREFIX_."theme_meta`";
$f = "(id_theme,id_meta,left_column,right_column)";
$v = "VALUE (".(int)$id_theme.",".(int)$row['id_meta'].",".pSQL($row['left_column']).",".pSQL($row['right_column']).")";
$sql .= " ".$f." ".$v;
return Db::getInstance()->execute($sql);
}
public function getContentXml($items)
{
foreach ($items as $row) {
$this->_content .= _NEWLINE_.' ';
foreach ($row as $key => $value) {
if (in_array($key, $strList)) {
$this->_content .= '
<'.$key.' type="string">'.$key.'>';
} else {
$this->_content .= '
<'.$key.'>'.$value.''.$key.'>';
}
}
$this->_content .= '
';
}
}
/**
* Export Sample Data
*/
public function processSample()
{
$savePath = _PS_ALL_THEMES_DIR_.$this->_theme_dir."samples/";
if (!is_dir($savePath)) {
if (!mkdir($savePath, 0755, true)) {
die("Please create folder samples in "._PS_ALL_THEMES_DIR_.$this->_theme_dir." and set permission 755");
}
}
if (!defined('_NEWLINE_')) {
define('_NEWLINE_', "\n");
}
$data = simplexml_load_file(_PS_ALL_THEMES_DIR_.$this->_theme_dir.'config.xml');
if (!$data || !isset($data->modules)) {
$this->_html["error"][] = "Can not find modules field in themes/LEOTHEME/config.xml";
return false;
}
$moduleList = Tools::getValue("moduleList");
if ($moduleList) {
foreach ($data->modules->children() as $moduleXml) {
//only create sample for module if select
if (in_array((string)$moduleXml->name, $moduleList)) {
$this->_createTable = '';
$this->_content = ''._NEWLINE_.''._NEWLINE_;
//export config of module first
if ($moduleXml->config_prefix) {
$configs = array();
if (strpos((string)$moduleXml->config_prefix, ',') !== false) {
$listPrefix = explode(",", (string)$moduleXml->config_prefix);
foreach ($listPrefix as $configPre) {
$listTmp = $this->getConfigByName($configPre);
if ($configs) {
$configs = array_merge($configs, $listTmp);
} else {
$configs = $listTmp;
}
}
} else {
$configs = $this->getConfigByName((string)$moduleXml->config_prefix);
}
# CONFIG OF THEME
if ($moduleXml->name == 'appagebuilder') {
$cfg_theme_key = (string)$data->theme_key;
if (!empty($cfg_theme_key)) {
$configs_theme = $this->getConfigByName($cfg_theme_key);
$configs = array_merge($configs, $configs_theme);
}
}
if ($configs) {
$this->_content .= ' '._NEWLINE_;
foreach ($configs as $config) {
if ($config["name"] != "LEO_MEGAMENU_PARAMS") {
$this->_content .= ' ';
$this->_content .= '';
$this->_content .= '';
$this->_content .= ''._NEWLINE_;
}
}
$this->_content .= ''._NEWLINE_._NEWLINE_;
}
}
//DONGND:: update with module has only config
if (isset($moduleXml->fields)) {
foreach ($moduleXml->fields->children() as $field) {
if (!isset($field->table_name)) {
if (!$this->includeObjModel($moduleXml->name, $field->objectMFile)) {
continue;
}
}
if (isset($field->table_name)) {
$this->_content .= '';
} else {
$parrentModelClass = '';
$parrentPrimaryKey = '';
if (isset($field->parrentModelClass)) {
$parrentModelClass = " parrentModelClass=\"$field->parrentModelClass\" ";
}
if (isset($field->parrentPrimaryKey)) {
$parrentPrimaryKey = " parrentPrimaryKey=\"$field->parrentPrimaryKey\" ";
}
$this->_content .= '';
}
if (isset($field->table_name)) {
$this->buildStructNoneObject($field, $field->searchField, $this->_id_shop, $field->string_column);
} else {
$this->buildStruct($field, $field->searchField, $this->_id_shop, $moduleXml->name);
}
$this->_content .= _NEWLINE_.''._NEWLINE_;
}
}
//export create table
if (isset($moduleXml->table_prefix)) {
$prefixList = explode(",", (string)$moduleXml->table_prefix);
foreach ($prefixList as $pfl) {
$listTable = Db::getInstance()->executeS("SHOW TABLES LIKE '%".pSQL($pfl)."%'");
foreach ($listTable as $table) {
//don't export back-up table
if (strpos(current($table), "leomanagewidget_backup") == false) {
$this->showcreateTable(current($table));
}
}
}
}
$this->_createTable = preg_replace("/AUTO_INCREMENT=\d+ /","AUTO_INCREMENT=1 ", $this->_createTable);
$this->_content .= ''._NEWLINE_.'_createTable.']]>'._NEWLINE_._NEWLINE_;
//export hook
$this->_content .= ' '._NEWLINE_;
$hook_list = Db::getInstance()->executeS('
SELECT h.`id_hook`, h.`name` as name_hook, hm.`position`, hm.`id_module`, m.`name` as name_module, GROUP_CONCAT(hme.`file_name`, ",") as exceptions
FROM `'._DB_PREFIX_.'hook` h
LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON hm.`id_hook` = h.`id_hook`
LEFT JOIN `'._DB_PREFIX_.'module` m ON hm.`id_module` = m.`id_module`
LEFT OUTER JOIN `'._DB_PREFIX_.'hook_module_exceptions` hme ON (hme.`id_module` = hm.`id_module` AND hme.`id_hook` = h.`id_hook`)
WHERE hm.`id_shop` = '.(int)$this->_id_shop.' AND m.`name`= \''.pSQL((string)$moduleXml->name).'\'
GROUP BY `id_module`, `id_hook`
ORDER BY `name_module`');
foreach ($hook_list as $hook) {
$exception = '';
if (trim($hook["exceptions"]) != '' && $hook["exceptions"] != null) {
$exceptions = array_filter(isset($hook['exceptions']) ? explode(',', strval($hook['exceptions'])) : array());
$exceptions = implode(",", $exceptions);
}
$this->_content .= ' '._NEWLINE_;
}
$this->_content .= ' '._NEWLINE_;
$this->_content .= ''._NEWLINE_;
//save data
$fp = @fopen($savePath.$moduleXml->name.".xml", 'w');
fwrite($fp, $this->_content);
$this->_content = '';
fclose($fp);
$this->_html["confirm"][] .= 'Export success for : '.$moduleXml->name;
//reset data when done - in export
$this->_paramsMenu = null;
}
}
}
}
public function showcreateTable($table)
{
$schema = Db::getInstance()->executeS('SHOW CREATE'.' TABLE `'.pSQL($table).'`');
$data = $schema[0]['Create Table'].";\n\n";
$data = str_replace('CREATE'.' TABLE `'._DB_PREFIX_, 'CREATE'.' TABLE IF NOT EXISTS `PREFIX_', $data);
$data = str_replace('='._MYSQL_ENGINE_, '=ENGINE_TYPE', $data);
$this->_createTable .= $data;
}
public function buildStructNoneObject($field, $searchField, $searchValue, $stringField)
{
$strList = explode(",", $stringField);
$where = ' WHERE `'.pSQL($searchField).'`='.pSQL($searchValue);
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT * FROM `'._DB_PREFIX_.pSQL($field->table_name).'`'.$where);
foreach ($result as $row) {
$this->_content .= _NEWLINE_.' ';
foreach ($row as $key => $value) {
if (in_array($key, $strList)) {
$this->_content .= '<'.$key.' type="string">'.$key.'>';
} else {
if ($field->table_name == "leohook" && $key == "id_module") {
$resultModule = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT name FROM `'._DB_PREFIX_.'module'.'` WHERE id_module='.(int)$value);
$this->_content .= '<'.$key.' type="module_name">'.$resultModule.''.$key.'>';
} elseif ($field->table_name == "leohook" && $key == "id_hook") {
$resultHook = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT name FROM `'._DB_PREFIX_.'hook'.'` WHERE id_hook='.(int)$value);
$this->_content .= '<'.$key.' type="hook_name">'.$resultHook.''.$key.'>';
} else {
$this->_content .= '<'.$key.'>'.$value.''.$key.'>';
}
}
}
$this->_content .= '';
}
}
public function buildStruct($field, $searchField, $searchValue, $moduleName, $isChild = 0, $result = array())
{
$className = (string)$field->objectMName;
$obj = new $className();
$defined = $obj->getDefinition($obj);
$tableName = _DB_PREFIX_.$defined["table"];
# level 0
if (!$isChild) {
$tableShop = '';
if ($searchField == "id_shop") {
$schema = Db::getInstance()->executeS('SHOW CREATE'.' TABLE `'.pSQL($tableName).'`');
if (strpos($schema[0]['Create Table'], "`id_shop`") == false) {
$tableShop = $tableName.'_shop';
}
}
$where = ' WHERE 1=1 ';
if ($searchField != "")
$where .= ' AND `'.$searchField.'`='.$searchValue;
# Btmegamenu + Blog : get child_menu
if (isset($field->treeField) && $field->treeField) {
if (isset($field->useShop) && $field->useShop) {
$tableShop = $tableName.'_shop';
}
$treeField = (string)$field->treeField;
if ($tableShop != '') {
$getIDs = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT `'.pSQL($defined['primary']).'` FROM '.pSQL($tableShop));
$arrayExport = array();
foreach ($getIDs as $getID) {
$arrayExport[] = $getID[$defined['primary']];
}
$result = array();
if ($arrayExport) {
$where = ' WHERE '.$defined['primary'].' IN('.implode(',', $arrayExport).')';
if (isset($field->useShop) && $field->useShop) {
$where .= ' AND '.$searchField.'='.$searchValue;
}
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT m.`'.pSQL($defined['primary']).'`, m.`'.pSQL($treeField).'` FROM `'.pSQL($tableName).'` as m'.pSQL($where));
}
} else {
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT DISTINCT m.`'.pSQL($defined['primary']).'`, m.`'.pSQL($treeField).'` FROM `'.pSQL($tableName).'` '.pSQL($tableShop).pSQL($where));
}
$children = array();
foreach ($result as $v) {
$pt = $v[$treeField];
$list = @$children[$pt] ? $children[$pt] : array();
array_push($list, $v);
$children[$pt] = $list;
}
if (isset($children[0])) {
$idRoot = 0;
} else {
$idRoot = 1;
}
$result = $this->treeCategory($idRoot, $children, $defined['primary']);
} else {
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT * FROM `'.(pSQL($tableShop) != '' ? pSQL($tableShop) : pSQL($tableName)).'`'.pSQL($where));
}
}
foreach ($result as $value) {
$obj = new $className($value[$defined["primary"]]);
if (!$obj->id) {
continue;
}
if ($className == 'ApPageBuilderProfilesModel') {
# SET ACTIVE PROFILE
if (!isset($this->ap_profile_status) || !$this->ap_profile_status) {
$this->ap_profile_status = $this->getProfileStatus();
}
if (isset($this->ap_profile_status[$value[$defined["primary"]]])) {
$obj->active = $this->ap_profile_status[$value[$defined["primary"]]];
$defined["fields"]['active'] = array('type' => 1,'validate' => 'isUnsignedId');
}
}
if ($className == 'ApPageBuilderProductsModel') {
# SET ACTIVE PRODUCT LIST
if (!isset($this->ap_products_status) || !$this->ap_products_status) {
$this->ap_products_status = $this->getProfileProductStatus();
}
if (isset($this->ap_products_status[$value[$defined["primary"]]])) {
$obj->active = $this->ap_products_status[$value[$defined["primary"]]];
$defined["fields"]['active'] = array('type' => 1, 'validate' => 'isUnsignedId');
}
}
if ($className == 'LeoWidget') {
$widgetParam = Tools::jsonDecode(base64_decode($obj->params), true);
if (isset($widgetParam['list_field_lang']) && !empty($widgetParam['list_field_lang'])) {
$_langField = array_merge($this->_langField, explode(',', $widgetParam['list_field_lang']));
//removes null values but leaves "0"
$_langField = array_filter($_langField, 'strlen');
//removes all null values
$_langField = array_filter($_langField);
} else {
$_langField = $this->_langField;
}
# CHANGE LANGUAGE
foreach ($widgetParam as $widKey => $widValue) {
foreach ($_langField as $fVal) {
if (strpos($widKey, $fVal) !== false) {
foreach ($this->_languages as $lKey => $lValue) {
$widKey_new = preg_replace("/_".$lValue."$/", "_".$lKey, $widKey);
$widgetParam[$widKey_new] = $widValue;
unset($widgetParam[$widKey]);
}
}
}
}
# CHANGE HOST URL AT IMAGE
foreach ($widgetParam as $widKey => $widValue) {
foreach ($this->_imageField as $fVal) {
if (strpos($widKey, $fVal) !== false && strpos($widValue, 'img') !== false) {
$widValue = str_replace('src="/', 'src="', $widValue);
$widValue = str_replace('"'.ltrim(__PS_BASE_URI__,'/').'modules/', '"modules/', $widValue);
$widValue = str_replace('"'.ltrim(__PS_BASE_URI__,'/').'themes/', '"themes/', $widValue);
$widValue = str_replace('"'.ltrim(__PS_BASE_URI__,'/').'img/', '"img/', $widValue);
$widgetParam[$widKey] = $widValue;
break;
}
}
}
$obj->params = base64_encode(Tools::jsonEncode($widgetParam));
}
$this->_content .= _NEWLINE_.' ';
//add ID
$this->_content .= ''.$obj->id.'';
//add other field
foreach ($defined["fields"] as $ke => $val) {
//don't need id_shop
if ($ke == "id_shop") {
continue;
}
//if that field is language
if (isset($val["lang"]) && $val["lang"]) {
$this->_content .= '<'.$ke.'>';
foreach ($this->_languages as $langISO => $langID) {
if (!isset($obj->{$ke}[$langID])) {
# FIX : sometime install module + data then add more language => other language dont have translate
$obj->{$ke}[$langID] = '';
}
$this->_content .= '<'.$langISO.'>{$ke}[$langID].']]>'.$langISO.'>';
}
$this->_content .= ''.$ke.'>';
}
//normal field
else {
//param field of module leoboostrapmenu
if ($val["type"] == 3 || $val["type"] == 5 || $val["type"] == 6) {
$this->_content .= '<'.$ke.'>{$ke}.']]>'.$ke.'>';
} else {
$this->_content .= '<'.$ke.'>'.$obj->{$ke}.''.$ke.'>';
}
}
}
//add child in same table
if (isset($value['child']) && $value['child']) {
$this->_content .= '';
//foreach ($value['child'] as $child) {
$this->buildStruct($field, $searchField, $searchValue, $moduleName, 1, $value['child']);
//}
$this->_content .= '';
}
//add child field
if (isset($field->field) && $field->field && $obj->id) {
foreach ($field->field as $f) {
if (!$this->includeObjModel($moduleName, $f->objectMFile)) {
return;
}
if ($className == 'ApPageBuilderProfilesModel') {
$this->_content .= _NEWLINE_.' ';
$this->buildStruct($f, $f->searchField, $obj->header, $moduleName);
$this->_content .= _NEWLINE_.' ';
$this->_content .= _NEWLINE_.' ';
$this->buildStruct($f, $f->searchField, $obj->content, $moduleName);
$this->_content .= _NEWLINE_.'';
$this->_content .= _NEWLINE_.' ';
$this->buildStruct($f, $f->searchField, $obj->footer, $moduleName);
$this->_content .= _NEWLINE_.' ';
$this->_content .= _NEWLINE_.' ';
$this->buildStruct($f, $f->searchField, $obj->product, $moduleName);
$this->_content .= _NEWLINE_.' ';
} else {
//build struct of sub table
$this->_content .= _NEWLINE_.' ';
$this->buildStruct($f, $f->searchField, $obj->id, $moduleName);
$this->_content .= _NEWLINE_.' ';
}
}
}
$this->_content .= '';
}
}
public static function getProfileStatus()
{
$id_shop = (int)Context::getContext()->shop->id;
$sql = 'SELECT * FROM `'._DB_PREFIX_.'appagebuilder_profiles_shop` WHERE id_shop='.(int)$id_shop;
$result = Db::getInstance()->executes($sql);
$profiles = array();
foreach ($result as $key => $val) {
$profiles[$val['id_appagebuilder_profiles']] = $val['active'];
}
return $profiles;
}
public static function getProfileProductStatus()
{
$id_shop = (int)Context::getContext()->shop->id;
$sql = 'SELECT * FROM `'._DB_PREFIX_.'appagebuilder_products_shop` WHERE id_shop='.(int)$id_shop;
$result = Db::getInstance()->executes($sql);
$profiles = array();
foreach ($result as $key => $val) {
$profiles[$val['id_appagebuilder_products']] = $val['active'];
}
return $profiles;
}
public function treeCategory($id, $children, $fieldName)
{
$list = array();
if (isset($children[$id])) {
foreach ($children[$id] as $v) {
$sub = $this->treeCategory($v[$fieldName], $children, $fieldName);
if ($sub) {
$v['child'] = $sub;
}
$list[] = $v;
}
}
return $list;
}
public function replaceLangIDToIso($fieldName, $fullName)
{
$find = str_replace($fieldName, "", $fullName);
$list = explode("_", $find);
//count and language
if (substr_count($find, '_') == 2) {
$list[2] = $this->_languagesKey[$list[2]];
} else {
$list[1] = $this->_languagesKey[$list[1]];
}
$find = implode("_", $list);
return $fieldName.$find;
}
public function replaceLangIsoToID($fieldName)
{
foreach ($this->_languages as $key => $value) {
$fieldName = preg_replace("/_".$key."$/", "_".$value, $fieldName, -1, $count);
}
return $fieldName;
}
public function includeObjModel($moduleName, $file)
{
if (file_exists(_PS_MODULE_DIR_.$moduleName."/classes/".$file)) {
include_once _PS_MODULE_DIR_.$moduleName."/classes/".$file;
} else if (file_exists(_PS_MODULE_DIR_.$moduleName."/".$file)) {
include_once _PS_MODULE_DIR_.$moduleName."/".$file;
} else {
$this->_html["error"][] = "Can not load Model Object ".$file." of module: ".$moduleName;
return false;
}
return true;
}
public function changeLangIsoID($textKey, $type = 0)
{
$tmp = explode("_", $textKey);
if ($type == 1) {
if (isset($tmp[2])) {
$tmp[2] = $this->_languages[$tmp[2]];
} else {
$tmp[1] = $this->_languages[$tmp[1]];
}
} else {
foreach ($this->_languages as $key => $value) {
if ((!isset($tmp[2]) && $value == $tmp[1]) || (isset($tmp[2]) && $value == $tmp[2])) {
if (isset($tmp[2])) {
$tmp[2] = $key;
} else {
$tmp[1] = $key;
}
break;
}
}
}
return implode(",", $tmp);
}
public function existThemeConfigFile()
{
if (!file_exists(_PS_ALL_THEMES_DIR_.$this->_theme_dir.'config.xml')) {
return false;
}
return true;
}
public function getModuleList($path = '', $onlyModName = 0)
{
if (!file_exists(_PS_ALL_THEMES_DIR_.$this->_theme_dir.'config.xml')) {
return;
}
$data = simplexml_load_file(_PS_ALL_THEMES_DIR_.$this->_theme_dir.'config.xml');
if (!$data || !isset($data->modules)) {
return null;
}
$moduleList = array();
$path = $this->backup_dir;
//module name
foreach ($data->modules as $modules) {
foreach ($modules as $module) {
if ((Module::isInstalled((string)$module->name) || $onlyModName) && file_exists(_PS_MODULE_DIR_.(string)$module->name)) {
if ($onlyModName == 1) {
$moduleList[] = (string)$module->name;
continue;
}
$moduleList[(string)$module->name]["name"] = (string)$module->name;
if (is_dir($path.(string)$module->name)) {
$fileList = @Tools::scandir($path.(string)$module->name);
if ($fileList) {
arsort($fileList);
$moduleList[(string)$module->name]["files"] = $fileList;
}
}
}
}
}
return $moduleList;
}
public function getConfigByName($name)
{
$where = ' WHERE `name` LIKE "%'.pSQL($name).'%"';
$configAllShop = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT DISTINCT name FROM `'._DB_PREFIX_.'configuration`'.$where);
$result = array();
foreach ($configAllShop as &$config) {
$config['value'] = Configuration::get($config['name']);
}
return $configAllShop;
}
/**
* QuickStart
* export db struct to download file
*/
public function exportDBStruct()
{
$ignore_insert_table = array(
_DB_PREFIX_.'favorite_product',
);
//copy + export to
$installFolder = _PS_MODULE_DIR_."appagebuilder/install";
if (!is_dir($installFolder)) {
mkdir($installFolder, 0755, true);
}
$backupfile = $installFolder."/db_structure.sql";
$fp = @fopen($backupfile, 'w');
if ($fp === false) {
$this->_html["error"] = "Error when export DbStruct! Can not write file in appagebuilder/install";
return false;
}
fwrite($fp, 'SET NAMES \'utf8\';'."\n\n");
// Find all tables
$tables = Db::getInstance()->executeS('SHOW TABLES');
//$found = 0;
$data = "";
// FIX 1.7 Database check FOREIGN KEY -> create PARENT_TABLE first
$temp_table = array();
foreach ($tables as $table) {
$temp_table[] = current($table);
}
foreach ($temp_table as $key => $table) {
if ($table == _DB_PREFIX_.'attribute_group') {
// have to before table ps_attribute
unset($temp_table[$key]);
array_unshift($temp_table, _DB_PREFIX_.'attribute_group');
} else if ($table == _DB_PREFIX_.'lang') {
// have to before table attribute_group_lang
unset($temp_table[$key]);
array_unshift($temp_table, _DB_PREFIX_.'lang');
} else if ($table == _DB_PREFIX_.'shop_group') {
// have to before table shop
unset($temp_table[$key]);
array_unshift($temp_table, _DB_PREFIX_.'shop_group');
} else if ($table == _DB_PREFIX_.'shop') {
// have to before table attribute_group_shop
unset($temp_table[$key]);
array_unshift($temp_table, _DB_PREFIX_.'shop');
}
}
$tables = $temp_table;
foreach ($tables as $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;
}
// Export the table schema
$schema = Db::getInstance()->executeS('SHOW CREATE'.' TABLE `'.pSQL($table).'`');
if (in_array($schema[0]['Table'], $ignore_insert_table)) {
continue;
}
$data .= $schema[0]['Create Table'].";\n\n";
if (count($schema) != 1 || !isset($schema[0]['Table']) || !isset($schema[0]['Create Table'])) {
fclose($fp);
$this->_html["error"] = "An error occurred while backing up. Unable to obtain the schema of ".$table;
return false;
}
}
$data = str_replace('CREATE'.' TABLE `'._DB_PREFIX_, 'CREATE'.' TABLE `PREFIX_', $data);
$data = str_replace('REFERENCES `'._DB_PREFIX_, 'REFERENCES `PREFIX_', $data);
$data = str_replace(') ENGINE=InnoDB ', ') ENGINE=ENGINE_TYPE ', $data);
// $data = str_replace('NOT NULL AUTO_INCREMENT,', 'NOT NULL auto_increment,', $data);
$data = str_replace(' CHARSET=utf8;', ' CHARSET=utf8 COLLATION;', $data);
$data = preg_replace("/AUTO_INCREMENT=\d+ /","", $data);
// $db_data_settings = preg_replace("/\n/","", $db_data_settings);
//$tableName = str_replace(_DB_PREFIX_, "_DB_PREFIX_", $table);
fwrite($fp, $data);
fclose($fp);
$this->_html["confirm"][] .= 'Create datastruct was successful';
}
/**
* QuickStart
* export db data to download file
*/
public function exportThemeSql()
{
$ignore_insert_table = array(
_DB_PREFIX_.'connections',
_DB_PREFIX_.'connections_page',
_DB_PREFIX_.'connections_source',
_DB_PREFIX_.'guest',
_DB_PREFIX_.'statssearch',
_DB_PREFIX_.'sekeyword',
_DB_PREFIX_.'favorite_product',
_DB_PREFIX_.'pagenotfound',
_DB_PREFIX_.'shop_url',
_DB_PREFIX_.'employee',
_DB_PREFIX_.'employee_shop',
// _DB_PREFIX_.'contact', _DB_PREFIX_.'contact_lang',
// _DB_PREFIX_.'contact', _DB_PREFIX_.'contact_shop'
);
$installFolder = _PS_MODULE_DIR_."appagebuilder/install";
if (!is_dir($installFolder)) {
mkdir($installFolder, 0755, true);
}
$backupfile = $installFolder."/db_data.sql";
$fp = @fopen($backupfile, 'w');
if ($fp === false) {
$this->_html["error"] = "Error when export DbStruct! Can not write file in appagebuilder/install";
return false;
}
fwrite($fp, 'SET NAMES \'utf8\';'."\n");
fwrite($fp, 'SET FOREIGN_KEY_CHECKS = 0;'."\n\n");
// Find all tables
$tables = Db::getInstance()->executeS('SHOW TABLES');
$found = 0;
$sql = '';
foreach ($tables as $table) {
$table = current($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;
}
// Export the table schema
$schema = Db::getInstance()->executeS('SHOW CREATE'.' TABLE `'.pSQL($table).'`');
if (count($schema) != 1 || !isset($schema[0]['Table']) || !isset($schema[0]['Create Table'])) {
fclose($fp);
$this->_html["error"] = "An error occurred while backing up. Unable to obtain the schema of ".$table;
return false;
}
if (!in_array($schema[0]['Table'], $ignore_insert_table)) {
$sql .= "\n".'TRUNCATE TABLE '.str_replace("`"._DB_PREFIX_, "`PREFIX_", "`".$schema[0]['Table']).'`;'."\n";
$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) {
// Export the table data
$sql .= 'INSERT INTO '.str_replace('`'._DB_PREFIX_, '`PREFIX_', '`'.$schema[0]['Table'])."` VALUES\n";
//fwrite($fp, 'INSERT INTO `'.$schema[0]['Table']."` VALUES\n");
$i = 1;
while ($row = DB::getInstance()->nextRow($data)) {
$s = '(';
foreach ($row as $field => $value) {
//special table
if ($schema[0]['Table'] == _DB_PREFIX_."btmegamenu_widgets" && $field == "params") {
$flag_change = false;
$widgetParam = Tools::jsonDecode(call_user_func('base64'.'_decode', $value), true);
foreach ($widgetParam as $widKey => $widValue) {
//replace image url
foreach ($this->_imageField as $fVal) {
if (strpos($widKey, $fVal) !== false && strpos($widValue, 'img') !== false) {
$widValue = str_replace('src="/', 'src="', $widValue);
$widValue = str_replace('"'.ltrim(__PS_BASE_URI__,'/').'modules/', '"modules/', $widValue);
$widValue = str_replace('"'.ltrim(__PS_BASE_URI__,'/').'themes/', '"themes/', $widValue);
$widValue = str_replace('"'.ltrim(__PS_BASE_URI__,'/').'img/', '"img/', $widValue);
$widgetParam[$widKey] = $widValue;
$flag_change = true;
break;
}
}
}
if ($flag_change) {
$value = call_user_func('base64'.'_encode', Tools::jsonEncode($widgetParam));
}
}
$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 (($schema[0]['Table'] == _DB_PREFIX_."appagebuilder_lang" && $i % 10 == 0) && $i < $sizeof) {
# Insert 1 time have 10 records, only appagebuilder_lang table
$s .= ");\nINSERT INTO ".str_replace('`'._DB_PREFIX_, '`PREFIX_', '`'.$schema[0]['Table'])."` VALUES\n";
} elseif (($schema[0]['Table'] == _DB_PREFIX_."cms_lang" && $i % 100 == 0) && $i < $sizeof) {
# Insert 1 time have 100 records
$s .= ");\nINSERT INTO ".str_replace('`'._DB_PREFIX_, '`PREFIX_', '`'.$schema[0]['Table'])."` VALUES\n";
} elseif (($i % 200 == 0 || ($schema[0]['Table'] == _DB_PREFIX_."btmegamenu_widgets" && $i % 20 == 0)) && $i < $sizeof) {
# Insert 1 time have 200 records
$s .= ");\nINSERT INTO ".str_replace('`'._DB_PREFIX_, '`PREFIX_', '`'.$schema[0]['Table'])."` VALUES\n";
} elseif ($i < $sizeof) {
$s .= "),\n";
} else {
$s .= ");\n";
}
$sql .= $s;
//fwrite($fp, $s);
++$i;
}
}
}
$found++;
}
//table PREFIX_condition
$sql = str_replace(" "._DB_PREFIX_, " PREFIX_", $sql);
//img link
//$sql = str_replace('src=\"' . __PS_BASE_URI__ . 'modules/', 'src=\"modules/', $sql);
fwrite($fp, $sql);
fwrite($fp, "\n\n".'SET FOREIGN_KEY_CHECKS = 1;');
fclose($fp);
if ($found == 0) {
$this->_html["error"] = "No valid tables were found to backup.";
return false;
}
$this->_html["confirm"][] .= 'Create theme.sql was successful';
}
public function getMessager()
{
return $this->_html;
}
/**
* Restore from PHP file
*/
function restoreBackUpFile()
{
$moduleList = Tools::getValue("moduleList");
foreach ($moduleList as $module) {
$installFolder = $this->backup_dir.$module.'/';
$file = Tools::getValue("file_".$module);
if (file_exists($installFolder.$file)) {
if ($this->installSampleModule($installFolder.$file, $module)) {
$this->_html["confirm"][] .= 'Restore data and config was done for '.$module;
}
}
}
}
/**
* Back-up to PHP file
*/
function processBackUp()
{
$data = simplexml_load_file(_PS_ALL_THEMES_DIR_.$this->_theme_dir.'config.xml');
if (!$data || !isset($data->modules)) {
$this->_html["error"][] = "Can not find modules field in themes/".$this->_theme_dir."config.xml";
return false;
}
$moduleList = Tools::getValue("moduleList");
if ($moduleList) {
foreach ($data->modules->children() as $moduleXml) {
//only create sample for module if select
if (in_array((string)$moduleXml->name, $moduleList)) {
$installFolder = $this->backup_dir.(string)$moduleXml->name.'/';
if (!is_dir($installFolder)) {
mkdir($installFolder, 0755, true);
}
# EXPORT TABLE
if ($moduleXml->table_prefix) {
if ($this->createTableSample((string)$moduleXml->name, (string)$moduleXml->table_prefix, $installFolder)) {
$this->_html["confirm"][] = 'Back-up database was done for module '.(string)$moduleXml->name;
}
}
# EXPORT CONFIG
if ($moduleXml->config_prefix) {
if ($this->createConfigSample((string)$moduleXml->name, $moduleXml->config_prefix)) {
$this->_html["confirm"][] = 'Back-up Configuration was done for module '.(string)$moduleXml->name;
}
$this->_currentBackupFile = '';
}
}
}
}
}
/**
* back-up config to php file
*/
public function createConfigSample($module, $configPrefix)
{
if (strpos((string)$configPrefix, ',') !== false) {
$listPrefix = explode(",", (string)$configPrefix);
$where = '';
foreach ($listPrefix as $configPre) {
if ($where == '') {
$where .= ' name LIKE (\'%'.pSQL($configPre).'%\')';
} else {
$where .= ' AND name LIKE (\'%'.pSQL($configPre).'%\')';
}
}
$sql = 'SELECT * FROM '._DB_PREFIX_.'configuration WHERE '.$where;
} else {
$sql = 'SELECT * FROM '._DB_PREFIX_.'configuration WHERE name LIKE (\'%'.pSQL($configPrefix).'%\')';
}
$data = Db::getInstance()->executeS($sql);
if (!$data || empty($data)) {
$this->_html["error"][] = 'Do not find configuration of '.$module;
return false;
}
$backupfile = $this->_currentBackupFile;
$oldData = Tools::file_get_contents($backupfile);
//if this module have query create table
$fp = @fopen($backupfile, 'w');
if ($fp === false) {
$this->_html["error"][] = 'Unable to back-up config for '.$module;
return false;
}
$configData = "\n\$dataConfig = Array(";
foreach ($data as $key => $val) {
if ($configData != "\n\$dataConfig = Array(") {
$configData .= ",\"";
} else {
$configData .= "\"";
}
$configData .= $val["name"]."\"=>array(\"value\"=>\"".pSQL($val["value"])."\",\"id_shop_group\"=>\"".$val["id_shop_group"]."\",\"id_shop\"=>\"".$val["id_shop"]."\")";
}
$configData .= ")";
fwrite($fp, $oldData);
fwrite($fp, $configData.";");
fclose($fp);
return true;
}
/**
* back-up database to php file
*/
public function createTableSample($module, $tablePrefix, $installFolder = "")
{
//get create table from Prefix
$listPrefix = explode(",", $tablePrefix);
$list = array();
$preList = array();
foreach ($listPrefix as $tablePrefix) {
$listTmp = Db::getInstance()->executeS("SHOW TABLES LIKE '%".pSQL($tablePrefix)."%'");
if ($preList) {
$list = array_merge($list, $listTmp);
} else {
$list = $listTmp;
}
$preList = $list;
}
//$date = time();
$createTable = "\$query = \"";
$dataWithLang = "\$dataLang = Array(";
if (count($list)) {
$backupfile = $installFolder.$module.date('_Y_m_d_H_i_s').".php";
$this->_currentBackupFile = $backupfile;
$fp = @fopen($backupfile, 'w');
if ($fp === false) {
$this->_html["error"][] = 'Unable to create backup file '.addslashes($backupfile);
return false;
}
fwrite($fp, "shop->id);
foreach ($languages as $lang) {
$listLang[$lang["id_lang"]] = $lang["iso_code"];
}
foreach ($list as $table) {
$table = current($table);
$tableName = 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);
return "ERROR_BACKING_UP";
}
$createTable .= "DROP TABLE IF EXISTS `".$tableName."`;\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) {
$dataLanguage[$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("LEO_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($listLang[$id_language])) {
continue;
}
if (!isset($dataLanguage[$schema[0]['Table']][Tools::strtolower($listLang[$id_language])])) {
$dataLanguage[$schema[0]['Table']][Tools::strtolower($listLang[$id_language])] = 'INSERT INTO `'.$tableName."` VALUES\n";
}
$s = rtrim($s, ',');
if ($i % 200 == 0 && $i < $sizeof) {
$s .= ");\nINSERT INTO `".$tableName."` VALUES\n";
} else {
$s .= "),\n";
}
/* elseif ($i < $sizeof)
$s .= "),\n";
else
$s .= ");\n"; */
$dataLanguage[$schema[0]['Table']][Tools::strtolower($listLang[$id_language])] .= $s;
//++$i;
}
} else if (strpos($schema[0]['Table'], "ps_leowidgets") !== false) {
$createTable .= $this->createInsert($data, $tableName, $lines, $sizeof, $listLang, 1);
}
//normal table
else {
$createTable .= $this->createInsert($data, $tableName, $lines, $sizeof, $listLang);
}
}
}
//foreach by table
$tpl = array();
fwrite($fp, $createTable."\";\n");
if ($dataLanguage) {
foreach ($dataLanguage as $key => $value) {
foreach ($value as $key1 => $value1) {
$value1 = str_replace("$", '_APDOLAR_', $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 ($dataWithLang != "\$dataLang = Array(") {
$dataWithLang .= ",\"".$key."\"=>"."\"".$value."\"";
} else {
$dataWithLang .= "\"".$key."\"=>"."\"".$value."\"";
}
}
//delete base uri when export
fwrite($fp, $dataWithLang.");");
}
fclose($fp);
}
return true;
}
/**
* sub function of back-up database
*/
public function createInsert($data, $tableName, $lines, $sizeof, $listLang, $specialTable = 0)
{
$dataNoLang = 'INSERT INTO `'.$tableName."` VALUES\n";
$i = 1;
while ($row = DB::getInstance()->nextRow($data)) {
if ($specialTable) {
$configs = Tools::jsonDecode(call_user_func('base64'.'_decode', $row['params']), true);
$tmp = array();
foreach ($configs as $key => $value) {
$value = str_replace('"'.__PS_BASE_URI__.'modules/', '"modules/', $value);
$value = str_replace('"'.__PS_BASE_URI__.'themes/', '"themes/', $value);
$tmp[$key] = $value;
}
$row['params'] = call_user_func('base64'.'_encode', Tools::jsonEncode($tmp));
}
$s = '(';
foreach ($row as $field => $value) {
if ($field == "id_shop") {
$tmp = "'".pSQL("LEO_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 `".$tableName."` VALUES\n";
} elseif ($i < $sizeof) {
$s .= "),\n";
} else {
$s .= ");\n";
}
$dataNoLang .= $s;
++$i;
}
return $dataNoLang;
}
public function installSampleModule($file, $module = '')
{
require_once($file);
//install with no language
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("_MYSQL_ENGINE_", _MYSQL_ENGINE_, $query);
$query = str_replace("\\'", "\'", $query);
if ($module) {
$query = str_replace('"modules/'.$module.'/', '"'.__PS_BASE_URI__.'modules/'.$module.'/', $query);
$query = str_replace('"themes/', '"'.__PS_BASE_URI__.'themes/', $query);
}
$db_data_settings = preg_split("/;\s*[\r\n]+/", $query);
$db_data_settings = preg_replace("/\n/","", $db_data_settings);
foreach ($db_data_settings as $query) {
$query = trim($query);
if (!empty($query)) {
if (!Db::getInstance()->Execute($query)) {
//echo "---error--" . $query . "---error--";
$this->_html["error"][] = "Can not restore for ".$module;
return false;
}
}
}
}
//install with with language
if (isset($dataLang) && !empty($dataLang)) {
$languages = Language::getLanguages(true, Context::getContext()->shop->id);
//print_r($languages);die;
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"])]);
} else {
//if not exist language in list, get en
if (isset($dataLang["en"])) {
$query = str_replace("_DB_PREFIX_", _DB_PREFIX_, $dataLang["en"]);
} else {
//firt item in array
foreach ($dataLang as $key => $value) {
$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("_APDOLAR_", '$', $query);
$query = str_replace("\\\'", "\'", $query);
if ($module) {
$query = str_replace('"modules/'.$module.'/', '"'.__PS_BASE_URI__.'modules/'.$module.'/', $query);
$query = str_replace('"themes/', '"'.__PS_BASE_URI__.'themes/', $query);
}
$db_data_settings = preg_split("/;\s*[\r\n]+/", $query);
foreach ($db_data_settings as $query) {
$query = trim($query);
if (!empty($query)) {
//echo "---".$query."
";
if (!Db::getInstance()->Execute($query)) {
$this->_html["error"][] = "Can not restore for data lang".$module;
return false;
}
}
}
}
}
//install config
if (isset($dataConfig) && !empty($dataConfig)) {
foreach ($dataConfig as $key => $value) {
//print_r($value);die;
Configuration::updateValue($key, $value["value"], false, $value["id_shop_group"], $value["id_shop"]);
}
}
return true;
}
public function correctImgLink()
{
if (LeoFrameworkHelper::leoExitsDb('table', 'btmegamenu_widgets')) {
$data = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS("SELECT * FROM `"._DB_PREFIX_."btmegamenu_widgets`");
foreach ($data as $row) {
$flag_change = false;
$widgetParam = Tools::jsonDecode(call_user_func('base64'.'_decode', $row["params"]), true);
foreach ($widgetParam as $widKey => $widValue) {
//replace image url
foreach ($this->_imageField as $fVal) {
if (strpos($widKey, $fVal) !== false && strpos($widValue, 'img') !== false) {
$widValue = str_replace('src="modules/', 'src="'.__PS_BASE_URI__.'modules/', $widValue);
$widValue = str_replace('src="img/', 'src="'.__PS_BASE_URI__.'img/', $widValue);
$widValue = str_replace('src="themes/', 'src="'.__PS_BASE_URI__.'themes/', $widValue);
$widgetParam[$widKey] = $widValue;
$flag_change = true;
break;
}
}
}
$sql = 'UPDATE `'._DB_PREFIX_.'btmegamenu_widgets` SET `params` = \''.call_user_func('base64'.'_encode', Tools::jsonEncode($widgetParam)).'\' WHERE `id_btmegamenu_widgets` = '.(int)$row["id_btmegamenu_widgets"];
Db::getInstance()->execute($sql);
}
}
}
/**
* save id to memory if insert db successfully
* step 1
*/
public function saveDataSuccess($module_name, $old_id, $new_id)
{
$data = isset($this->$module_name) ? $this->$module_name : array();
$data[$old_id] = $new_id;
$this->$module_name = $data;
$arr = array();
$arr['name'] = $module_name;
$arr['id'] = $old_id;
$arr['new_id'] = $new_id;
$this->tmp_db[$module_name][$old_id] = $arr;
}
/**
* check this id exist in memory if inserted db successfully
* step 2
*/
public function isDataSuccess($module_name, $old_id)
{
$data = isset($this->$module_name) ? $this->$module_name : array();
if (isset($data[$old_id]) && $data[$old_id]) {
return true;
}
return false;
}
/**
* get id if inserted db successfully
* step 3
*/
public function getDataSuccess($module_name, $old_id)
{
$data = isset($this->$module_name) ? $this->$module_name : array();
if (isset($data[$old_id]) && $data[$old_id]) {
return $data[$old_id];
}
return false;
}
public function processHook($moduleName)
{
$theme_name = apPageHelper::getInstallationThemeName() . '/';
$data = false;
if (file_exists(_PS_ALL_THEMES_DIR_.$theme_name.'config.xml')) {
$data = simplexml_load_file(_PS_ALL_THEMES_DIR_.$theme_name.'config.xml');
}
if (!$data || !isset($data->modules)) {
return false;
}
if (!$moduleName) {
$moduleList = Tools::getValue("moduleList");
} else {
$moduleList[] = $moduleName;
}
$error = 0;
$flag = 0;
foreach ($moduleList as $module) {
if (file_exists(_PS_ALL_THEMES_DIR_.$theme_name.'samples/'.$module.'.xml')) {
$content = simplexml_load_file(_PS_ALL_THEMES_DIR_.$theme_name.'samples/'.$module.'.xml');
if (!$content) {
$this->_html["error"][] = "Content of sample data of module: ".$module.' is null';
$error = 1;
continue;
}
$flag++;
//insert hook
if (isset($content->hooks) && $content->hooks) {
$moduleObj = Module::getInstanceByName($module);
if ($moduleObj && $moduleObj->id) {
$module_hook = array();
foreach ($content->hooks->children() as $row) {
$exceptions = array_filter(isset($row->attributes()->exceptions) ? explode(',', strval($row->attributes()->exceptions)) : array());
if (Hook::getIdByName(strval($row->attributes()->hook))) {
$module_hook[] = array(
'hook' => strval($row->attributes()->hook),
'position' => strval($row->attributes()->position),
'exceptions' => $exceptions
);
}
}
if ((int)$moduleObj->id > 0) {
$this->hookModule($moduleObj->id, $module_hook, $this->_id_shop);
}
}
}
}
}
if ($error) {
return false;
}
# IMPORT HOOK 0 time
if ($flag === 0) {
return false;
}
return true;
}
}