Files
interblue.pl/modules/pshowimporter/controllers/admin/PShowImporterConfigController.php
2024-10-25 14:16:28 +02:00

966 lines
32 KiB
PHP

<?php
/*
* File from http://PrestaShow.pl
*
* DISCLAIMER
* Do not edit or add to this file if you wish to upgrade this module to newer
* versions in the future.
*
* @authors PrestaShow.pl <kontakt@prestashow.pl>
* @copyright 2015 PrestaShow.pl
* @license http://PrestaShow.pl/license
*/
require_once dirname(__FILE__) . "/../../config.php";
class PShowImporterConfigController extends PShowAdminController
{
/**
* *Only for ajax requests
*
* Get saved import condition
*/
public function getsavedconditionsAction()
{
$data = array();
$config = PShow_Config::getFileConfig(Tools::getValue('file'));
if (array_key_exists('additional', $config) && array_key_exists('conditions', $config['additional'])) {
$data = $config['additional']['conditions'];
}
unset($data['import_require_all']);
unset($data['skip_require_all']);
if (!is_array($data)) {
$data = array();
}
die(Tools::jsonEncode($data));
}
/**
* *Only for ajax requests
*
* Get configuration fields form
*/
public function getfieldsettingsformAction()
{
$field = Tools::getValue('field');
$fieldNamePrefix = Tools::getValue('fieldNamePrefix');
$config = PShow_Config::getAvailableFieldConfig($field);
$config['y'] = array(
'type' => 'nothing',
'label' => '',
'desc' => '<hr>',
);
$config['onlyForNew'] = array(
'type' => 'switch',
'label' => $this->l('Only for new objects'),
'desc' => $this->l('If active, this value will be imported only for new objects (not existing in the store)'),
);
$config['importIfMatchRegex'] = array(
'type' => 'switch',
'label' => sprintf($this->l('Import if value %smatches%s regular expression'), '<u>', '</u>'),
'desc' => $this->l('Eg. import if value is not empty: /\\S+/'),
);
$config['importIfMatchRegexValue'] = array(
'type' => 'text',
'label' => $this->l('Enter regular expression'),
);
foreach ($config as $k => $v) {
$config[$k]['name'] = $fieldNamePrefix . '[options][' . $k . ']';
if ($config[$k]['type'] == 'switch') {
$config[$k]['is_bool'] = true;
$config[$k]['values'] = array(
'on' => array(
'value' => 1,
),
'off' => array(
'value' => 0,
),
);
}
}
PShowSettingsAbstract::modyfiFormPS15($config);
$fields_form = array(
'form' => array(
'input' => $config,
)
);
$this->prepareFileData();
// form values
$values = array();
$currConfig = PShow_Config::getFileConfig($this->filename);
$temp = explode('[', str_replace(']', '', $fieldNamePrefix));
foreach ($config as $k => $v) {
$options = $currConfig['matched'][$temp[1]][$temp[2]]['options'];
if (isset($options[$k])) {
$values[$v['name']] = $options[$k];
} elseif (isset($v['value'])) {
$values[$v['name']] = $v['value'];
}
}
// create form
$helper = new HelperForm();
$helper->show_toolbar = false;
$lang = new Language(
(int) Configuration::get('PS_LANG_DEFAULT')
);
$helper->default_form_language = $lang->id;
$helper->submit_action = 'btnSubmit';
$helper->currentIndex = null;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->tpl_vars = array(
'fields_value' => $values,
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id
);
die($helper->generateForm(array($fields_form)));
}
public $filename;
public $filepath;
public $fileinfo;
public $config_dir;
public $default_action = 'index';
public $select_menu_tab = 'subtab-PShowImporterMain';
public function __construct()
{
parent::__construct();
$this->controller_displayName = $this->l('Sample Controller');
$this->context->smarty->assign('lang_iso', $this->context->language->iso_code);
$this->addCSS(__PS_BASE_URI__ . 'modules/pshowimporter/views/css/full-screen-loader.css');
$maxInputVarsMsg = $this->l('You have set too low limit of form input fields (' . ini_get('max_input_vars') . ').') . '<br>' .
$this->l('Configuration have a lot of form fields with import options.') . '<br><br>' .
$this->l('If your configuration is not saving, change the limit to 3000 or more (max_input_vars=3000).') . '<br>' .
$this->l('The above limit can be changed in PHP configuration.');
ini_set('max_input_vars', '5000');
if ((int) ini_get('max_input_vars') < 1000) {
$this->alerts[] = array('danger', $maxInputVarsMsg);
}
$this->context->smarty->assign('max_input_vars', (int) ini_get('max_input_vars'));
$this->context->smarty->assign('max_input_vars_msg', $maxInputVarsMsg);
if (!Tools::getValue('file'))
Tools::redirectAdmin($this->context->link->getAdminLink('PShowImporterMain'));
}
private function prepareFileData()
{
global $smarty;
$this->context->smarty->assign('is_multishop', class_exists('PShow_Import_Object_Multistore'));
$this->filename = Tools::getValue('file');
if (!$this->filename) {
return false;
}
$this->filepath = glob(_MODULE_UPLOAD_PATH_ . $this->filename . '.xml');
if (count($this->filepath) <= 0) {
return false;
}
foreach ($this->filepath as $f) {
if (!in_array(pathinfo($f, PATHINFO_EXTENSION), explode(',', _IMPORT_FILE_EXTENSIONS_))) {
continue;
}
$this->filepath = $f;
break;
}
$this->fileinfo = pathinfo($this->filepath);
$this->config_dir = _IMPORT_CONFIG_PATH_ . $this->filename . '/';
$smarty->assign('file', $this->filename);
$smarty->assign('fileType', Tools::strtolower($this->fileinfo['extension']));
$smarty->assign('fromURL', file_exists(str_replace($this->fileinfo['extension'], "txt", $this->filepath)));
if (!is_dir($this->config_dir)) {
mkdir($this->config_dir);
}
$this->config = PShow_Config::getFileConfig($this->filename);
$smarty->assign('config', $this->config);
}
/**
* indexAction()
*
* Control configuration steps:
* 1 get delimiter(CSV only) and first line
* 2 match fields
*/
public function indexAction()
{
$this->action_displayName = $this->l('Informations');
$smarty = $this->context->smarty;
$this->prepareFileData();
$config = PShow_Config::getFileConfig($this->fileinfo['filename']);
$this->config['primary'] = array_key_exists('primary', $config) ? $config['primary'] : array();
$smarty->assign('has_matching', true);
$smarty->assign('has_config', true);
$this->addCSS(__PS_BASE_URI__ . 'modules/pshowimporter/views/css/config.css');
$this->addJS(__PS_BASE_URI__ . 'modules/pshowimporter/views/js/vkbeautify.0.99.00.beta.js');
if (version_compare(_PS_VERSION_, '1.6.0', '<')) {
$this->addCSS(__PS_BASE_URI__ . 'modules/pshowimporter/views/css/font-awesome.min.css');
$this->addCSS(__PS_BASE_URI__ . 'modules/pshowimporter/views/css/import_ps15.css');
$this->addJS(__PS_BASE_URI__ . 'modules/pshowimporter/views/js/import_ps15.js');
}
$smarty->assign('category_matching', true);
$return = false;
//step 1
if (!Tools::getValue('step') || Tools::getValue('step') == 1) {
$smarty->assign('configStep', $this->l('Primary configuration'));
$return = $this->primaryConfig();
}
if ($return === true || Tools::getValue('step') == 2) {
$config = PShow_Config::getFileConfig($this->fileinfo['filename']);
$this->config['primary'] = array_key_exists('primary', $config) ? $config['primary'] : array();
//step 2
$smarty->assign('configStep', $this->l('Matching data'));
$return = $this->matchFields();
}
if ($return === true || Tools::getValue('step') == 3) {
$this->action_displayName = $this->l('Final configuration');
$config = PShow_Config::getFileConfig($this->fileinfo['filename']);
$this->config['primary'] = $config['primary'];
//step 3
$smarty->assign('configStep', $this->l('Matching categories'));
$return = $this->matchCategories();
}
if ($return === true) {
Tools::redirectAdmin($this->context->link->getAdminLink('PShowImporterMain'));
}
return $return;
}
/**
* primaryConfig()
*
* configuration step: 1
*/
public function primaryConfig()
{
$smarty = $this->context->smarty;
$this->addJS('https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.js');
$this->addJS(__PS_BASE_URI__ . 'modules/pshowimporter/views/js/primary_config.js');
$smarty->assign('primary_config', $this->config['primary']);
if (Tools::isSubmit('submit_primaryconfig')) {
$values = array_map('strval', $_POST);
foreach ($values as &$v) {
$v = preg_replace('~\? string\:([^\ ]+) \?~', '$1', $v);
}
PShow_Config::saveFileConfig($this->filename, array('primary' => $values));
$smarty->assign("alert", array('success', $this->l('Primary config saved successfully.')));
return true;
}
$handle = fopen($this->filepath, "r");
$i = 0;
while (!feof($handle) && $i < 20) {
$rows[++$i] = htmlspecialchars(fgets($handle));
}
fclose($handle);
$shops = Shop::getShops();
asort($shops);
$smarty->assign('shops', $shops);
$smarty->assign('shop_groups', ShopGroup::getShopGroups());
$smarty->assign('multistore_addon', (int) PShow_Addon::exists('Multistore'));
$smarty->assign('rows', $rows);
$smarty->assign('languages', Language::getLanguages(true));
}
public function saveSkippedManufacturers()
{
$data = array();
if (!array_key_exists('manufacturersLoaded', $_POST)) {
return;
}
foreach ($_POST as $key => $val) {
if (stripos($key, 'manufacturer_') === false) {
continue;
}
$data[str_replace('manufacturer_', '', $key)] = (int) $val;
}
PShow_Config::saveFileConfig($this->filename, array('skipped_manufacturers' => $data));
return true;
}
public function genFormForExchangeRates()
{
$currencies = Currency::getCurrencies();
$config = array(
'active' => array(
'label' => $this->l('Define custom exchange rates'),
'name' => 'exchange_rates[active]',
'type' => 'switch',
'is_bool' => true,
'desc' => $this->l('Enable this option to calculate the price from the file according to the exchange rate during import, exchange rates you can set below'),
'values' => array(
'on' => array(
'value' => 1,
),
'off' => array(
'value' => 0,
),
),
'value' => 0,
),
'currency' => array(
'label' => $this->l('Default currency of the prices from file'),
'name' => 'exchange_rates[id_currency]',
'type' => 'select',
'default_value' => (int) $this->context->currency->id,
'options' => array(
'query' => $currencies,
'id' => 'id_currency',
'name' => 'name'
)
),
);
foreach ($currencies as $currency) {
$config['currency_' . $currency['id_currency']] = array(
'label' => $this->l('Exchange rate for ') . $currency['name'],
'name' => 'exchange_rates[currency_' . $currency['id_currency'] . ']',
'type' => 'text',
'desc' => $this->l('set 1 to do not change price from file') . '<br>'
. $this->l('(net price from file + (net price from file * overhead)) * exchange rate = net price in the shop'),
'value' => 1,
);
}
PShowSettingsAbstract::modyfiFormPS15($config);
$fields_form = array(
'form' => array(
'input' => $config,
)
);
$values = array();
foreach ($config as $k => $v) {
$options = $this->config['additional']['exchange_rates'];
if (isset($options[$k])) {
$values[$v['name']] = $options[$k];
} elseif (isset($v['value'])) {
$values[$v['name']] = $v['value'];
}
if ($v['type'] == 'switch') {
$values[$v['name']] = (int) $values[$v['name']];
}
}
PShowSettingsAbstract::modyfiFormPS15($config);
// create form
$helper = new HelperForm();
$helper->show_toolbar = false;
$lang = new Language(
(int) Configuration::get('PS_LANG_DEFAULT')
);
$helper->default_form_language = $lang->id;
$helper->submit_action = 'btnSubmit';
$helper->currentIndex = null;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->tpl_vars = array(
'fields_value' => $values,
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id
);
return $helper->generateForm(array($fields_form));
}
public function saveConditions()
{
if (!array_key_exists('conditions', $_POST)) {
return false;
}
PShow_Config::saveFileConfig(
$this->filename, array('additional' => array('conditions' => $_POST['conditions']))
);
return true;
}
public function saveReplacement()
{
if (!array_key_exists('replacement', $_POST)) {
return false;
}
PShow_Config::saveFileConfig(
$this->filename, array('additional' => array('replacement' => $_POST['replacement']))
);
return true;
}
public function saveExchangeRates()
{
if (!array_key_exists('exchange_rates', $_POST)) {
return false;
}
PShow_Config::saveFileConfig(
$this->filename, array('additional' => array('exchange_rates' => $_POST['exchange_rates']))
);
return true;
}
public function saveMatchedCategories()
{
$data = array();
if (!array_key_exists('categoriesLoaded', $_POST)) {
return;
}
foreach ($_POST as $key => $val) {
if (in_array($val, array('skip', 'leave', 'disableNotExistingInFile'))) {
$data[$key] = $val;
}
if (in_array($val, array('match'))) {
$data[$key] = str_replace("\\\"", "\"", $_POST['categoryFromStore_' . $key]);
}
}
PShow_Config::saveFileConfig($this->filename, array('matched_categories' => $data));
return true;
}
public function loadCategoriesAction()
{
$this->action_displayName = $this->l('Sample Controller');
$this->prepareFileData();
$offset = (int) Tools::getValue('offset', 0);
$limit = (int) Tools::getValue('limit', 10);
$fileCategories = Tools::jsonDecode(Tools::file_get_contents($this->config_dir . 'categories_in_file'));
if ($offset > 0) {
--$offset;
}
if ($limit === 0) {
$_results = array_slice($fileCategories, $offset, count($fileCategories) - $offset + 1);
} else {
$_results = array_slice($fileCategories, (($offset == 0) ? 0 : ($offset + 1)), $limit);
}
$results = array();
$k = (($offset == 0) ? 0 : ($offset + 1));
foreach ($_results as $c) {
$results[++$k] = $c;
}
global $smarty;
$smarty->assign('matched_categories', $this->config['matched_categories']);
$smarty->assign('fileCategories', $results);
die($smarty->display(__DIR__ . "/../../views/templates/admin/config_loadCategories.tpl"));
}
public function loadManufacturersAction()
{
$this->action_displayName = $this->l('Sample Controller');
$this->prepareFileData();
$fileManufacturers = Tools::jsonDecode(Tools::file_get_contents($this->config_dir . 'manufacturers_in_file'));
$fileManufacturers = array_merge(array("Without value in the file"), $fileManufacturers);
global $smarty;
$smarty->assign('fileManufacturers', $fileManufacturers);
$smarty->assign('skipped_manufacturers', $this->config['skipped_manufacturers']);
$smarty->display(__DIR__ . "/../../views/templates/admin/config_loadManufacturers.tpl");
die();
}
public function matchCategories()
{
global $smarty;
if (Tools::getValue('regenerate_categories_list')) {
@unlink($this->config_dir . 'categories_in_file');
$actual_link = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$actual_link = str_replace('regenerate_categories_list', '', $actual_link);
Tools::redirect($actual_link);
}
if (Tools::getValue('regenerate_manufacturer_list')) {
@unlink($this->config_dir . 'manufacturers_in_file');
$actual_link = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$actual_link = str_replace('regenerate_manufacturer_list', '', $actual_link);
Tools::redirect($actual_link);
}
if (Tools::isSubmit('submitNstay_categories')) {
$this->saveSkippedManufacturers();
$this->saveMatchedCategories();
$this->saveExchangeRates();
$this->saveReplacement();
$this->saveConditions();
$this->config = PShow_Config::getFileConfig($this->filename);
}
if (Tools::isSubmit('submitNimport_categories')) {
$this->saveSkippedManufacturers();
$this->saveMatchedCategories();
$this->saveExchangeRates();
$this->saveReplacement();
$this->saveConditions();
Tools::redirectAdmin($this->context->link->getAdminLink('PShowImporterImport', true) . "&file=" . $this->filename);
}
if (Tools::isSubmit('submit_categories')) {
$this->saveSkippedManufacturers();
$this->saveMatchedCategories();
$this->saveExchangeRates();
$this->saveReplacement();
$this->saveConditions();
Tools::redirectAdmin($this->context->link->getAdminLink('PShowImporterMain', true));
}
$this->addJS(__PS_BASE_URI__ . 'modules/pshowimporter/views/js/config_categories.js');
$this->action = 'additional';
$smarty->assign('config', $this->config);
$smarty->assign('form_exchange_rates', $this->genFormForExchangeRates());
// get all matched fields to import conditions
$matched = array();
$db_tables_ = PShow_Prestashop_Fields::getFields($this->config['primary']);
$db_tables = reset($db_tables_);
foreach ($this->config['matched'] as $matches) {
foreach ($matches as $m) {
if ($m['value'] == 'none') {
continue; // skip not matched
}
$expl = explode('.', $m['value']);
$matched[$m['value']] = $db_tables[$expl[1]];
}
}
$smarty->assign('matchedFromFile', $matched);
if ($this->config['primary']['file_contains'] == 'data_product') {
$smarty->assign('category_matching', true);
$smarty->assign('manufacturer_matching', true);
// check if we have category matched in the configuration from step 3
$prestafields = array('product.category', 'product.category_id', 'product.category_ids', 'product.category_path');
$temp = count(PShow_Config::getFileConfigByMatchedPrestaFields($this->filename, $prestafields));
$smarty->assign('category_matching_hasCategory', (bool) $temp);
// check if we have manufacturer matched in the configuration from step 3
$prestafields = array('product.manufacturer', 'product.id_manufacturer');
$temp = count(PShow_Config::getFileConfigByMatchedPrestaFields($this->filename, $prestafields));
$smarty->assign('manufacturer_matching_hasManufacturer', (bool) $temp);
} else {
$smarty->assign('category_matching', false);
$smarty->assign('manufacturer_matching', false);
}
// find categories
$fileCategories = false;
if (Tools::getValue('load') != 'categories') {
$fileCategories = array();
}
$smarty->assign('find_categories', false);
if (!file_exists($this->config_dir . 'categories_in_file')) {
$smarty->assign('find_categories', true);
}
if (Tools::getValue('load') == 'categories' && !file_exists($this->config_dir . 'categories_in_file')) {
$fileCategories = array();
ini_set('max_execution_time', 3600);
$matched_data_ = array();
$getCategoryField = function($match) use (&$matched_data_) {
$matches = array();
preg_match('~product([0-9]+)?\.category([\_a-z]+)?~', $match['value'], $matches);
if (count($matches) > 0) {
$matched_data_[$match['key']] = $match['value'];
}
};
foreach ($this->config['matched']['matches'] as $match) {
$getCategoryField($match);
}
foreach ($this->config['matched']['custommatches'] as $match) {
$getCategoryField($match);
}
$results = array();
$objectTag = $this->config['matched']['objectTag'];
foreach ($matched_data_ as $path => $type) {
$path = substr($path, (stripos($path, '/') + 1));
$cats = PShow_Xml_Parser::getInstance($this->filepath)
->getElementsByPath($objectTag);
$path = str_replace('*DOT*', '.', $path);
foreach ($cats as $cat) {
$vals = $cat->xpath($path);
if (!is_array($vals)) {
continue;
}
$vals = array_map(function($x) {
return (string) $x;
}, $vals);
foreach ($vals as $val) {
if (!in_array(((string) $val), $results)) {
$results[] = (string) $val;
}
}
}
}
file_put_contents($this->config_dir . 'categories_in_file', Tools::jsonEncode($results));
die('100');
}
if (file_exists($this->config_dir . 'categories_in_file')) {
$storeCategories_ = Category::getCategories(false, false);
$storeCategories = array();
$getChildren = function($id_parent, $getChildren) use (&$storeCategories, $storeCategories_) {
foreach ($storeCategories_ as $category) {
foreach ($category as $cat) {
$infos = $cat['infos'];
if ($infos['id_parent'] != $id_parent) {
continue;
}
$depth = str_repeat('&nbsp;', 20 - strlen($infos['id_category']));
$depth .= str_repeat(
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', ($infos['level_depth'] > 0) ? $infos['level_depth'] - 1 : 0
);
if ($infos['level_depth'] > 0)
$depth .= '|--';
$infos['name'] = str_replace("\\", "\\\\", $infos['name']);
$infos['name'] = str_replace('"', '\"', $infos['name']);
$infos['name'] = str_replace("'", "\\\"", $infos['name']);
$storeCategories[] = '[' . $infos['id_category'] . '] ' . $depth . ' ' . $infos['name'];
$getChildren($infos['id_category'], $getChildren);
}
}
};
$getChildren(1, $getChildren);
$smarty->assign('storeCategories', Tools::jsonEncode($storeCategories));
$smarty->assign('matched_categories', $this->config['matched_categories']);
$fileCategories = Tools::jsonDecode(Tools::file_get_contents($this->config_dir . 'categories_in_file'));
$smarty->assign('fileCategories', $fileCategories);
}
// / find categories
// find manufacturers
$fileManufacturers = false;
if (Tools::getValue('load') != 'manufacturers') {
$fileManufacturers = array();
}
$smarty->assign('find_manufacturers', false);
if (!file_exists($this->config_dir . 'manufacturers_in_file') || file_exists($this->config_dir . 'counter_manufacturers_in_file')) {
$smarty->assign('find_manufacturers', true);
}
if (Tools::getValue('load') == 'manufacturers' && (!file_exists($this->config_dir . 'manufacturers_in_file') || file_exists($this->config_dir . 'counter_manufacturers_in_file'))) {
$fileManufacturers = array();
ini_set('max_execution_time', 3600);
$matched_data_ = array();
$getManufacturerField = function($match) use (&$matched_data_) {
$matches = array();
preg_match('~product([0-9]+)?\.manufacturer([\_a-z]+)?~', $match['value'], $matches);
if (count($matches) > 0) {
$matched_data_[$match['key']] = $match['value'];
}
};
foreach ($this->config['matched']['matches'] as $match) {
$getManufacturerField($match);
}
foreach ($this->config['matched']['custommatches'] as $match) {
$getManufacturerField($match);
}
file_put_contents($this->config_dir . 'manufacturers_in_file', "");
if (count($matched_data_) > 0) {
$objectTag = $this->config['matched']['objectTag'];
$fileManufacturers = array();
foreach ($matched_data_ as $path => $type) {
$path = substr($path, (stripos($path, '/') + 1));
$cats = PShow_Xml_Parser::getInstance($this->filepath)
->getElementsByPath($objectTag);
foreach ($cats as $cat) {
$tmp = $cat->xpath($path);
if (!is_array($tmp))
continue;
$tmp = reset($tmp);
if (!in_array(((string) $tmp), $fileManufacturers)) {
$fileManufacturers[] = (string) $tmp;
}
}
}
file_put_contents($this->config_dir . 'manufacturers_in_file', Tools::jsonEncode($fileManufacturers));
die("100");
}
}
if (file_exists($this->config_dir . 'manufacturers_in_file')) {
$fileManufacturers = Tools::jsonDecode(Tools::file_get_contents($this->config_dir . 'manufacturers_in_file'));
$smarty->assign('skipped_manufacturers', $this->config['skipped_manufacturers']);
$smarty->assign('fileManufacturers', $fileManufacturers);
}
// / find manufacturers
}
public function ajaxgetfilecontentsAction()
{
$this->prepareFileData();
$contents = PShow_Xml::removeCDATA(PShow_Xml::getFileRowsToMatchData($this->filepath, 50000));
if (Tools::getValue('bytag')) {
$tag = Tools::getValue('bytag');
$matches = array();
preg_match_all('#<' . $tag . '>(.*?)</' . $tag . '>#s', $contents, $matches);
$result = reset($matches);
$result = reset($result);
if (empty($result)) {
$matches = array();
preg_match_all('#<' . $tag . ' (.*)>#is', $contents, $matches);
$result = reset($matches);
$result = reset($result);
}
die(substr($result, 0, (strlen($result) > 1500 ? 1500 : strlen($result))));
}
die($contents);
}
/**
*
* @param type $data
*/
public function removeDuplicatedPathes(&$data)
{
function readIt(&$SimpleXMLElement, $max_depth_lvl = 1, &$allPathes = array(), $prefix = '/')
{
if (--$max_depth_lvl < 0) {
return;
}
foreach ($SimpleXMLElement as $k => $v) {
$attributes = $v->attributes();
$children = $v->children();
if ($children->count() == 0 && $attributes->count() == 0) {
if (in_array($prefix . $k, $allPathes)) {
//unset($SimpleXMLElement->xpath($k)[0][0]);
continue;
}
$allPathes[] = $prefix . $k;
continue;
}
if ($attributes->count() > 0) {
readIt($attributes, $max_depth_lvl, $allPathes, $prefix . $k . '/@');
}
if ($children->count() > 0) {
readIt($children, $max_depth_lvl, $allPathes, $prefix . $k . '/');
}
}
}
readIt($data);
}
/**
* matchFields()
*
* configuration step: 3
* match fields from file to database columns
*/
public function matchFields()
{
$smarty = $this->context->smarty;
$ext = Tools::strtoupper($this->fileinfo['extension']);
$this->addCSS(__PS_BASE_URI__ . 'modules/pshowimporter/views/css/icon-info.css');
$this->addCSS(__PS_BASE_URI__ . 'modules/pshowimporter/views/css/config_matchxmlfields.css');
$db_tables = PShow_Prestashop_Fields::getFields($this->config['primary']);
$smarty->assign('db_tables', $db_tables);
if (Tools::isSubmit('submitNstay_matchfields') || Tools::isSubmit('submit_matchfields')) {
foreach ($_POST['matched']['custommatches'] as &$data) {
$data['key'] = str_replace('"', "'", $data['key']);
}
PShow_Config::saveFileConfig($this->fileinfo['filename'], $_POST);
$smarty->assign('config', PShow_Config::getFileConfig($this->fileinfo['filename']));
if (Tools::isSubmit('submit_matchfields')) {
Tools::redirectAdmin($this->context->link->getAdminLink('PShowImporterConfig', true) . "&file=" . $this->filename . "&step=3");
return;
}
}
$parser = PShow_Xml_Parser::getInstance($this->filepath);
$tags = $parser->getAllTags();
if (Tools::getValue('ajaxgetbytag')) {
$data = $parser->getElementByPath(explode(',', Tools::getValue('ajaxgetbytag')));
if ($data !== null) {
$this->removeDuplicatedPathes($data);
$smarty->assign('data', $data);
}
$smarty->assign('objectTag', Tools::getValue('ajaxgetbytag'));
$values = $parser->getAllValuesFromObject($data, true);
$smarty->assign('allValues', $values);
die($smarty->display(__DIR__ . "/../../views/templates/admin/config_matchxmlfields_matches.tpl"));
}
$smarty->assign('tags', $tags);
$this->action = 'match' . Tools::strtolower($ext) . 'fields';
}
}