[ 'sTableName' => 'd3picdirdump', 'sFieldName' => 'OXID', 'sType' => 'CHAR(32)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'PICDIRDUMP_OXFILE' => [ 'sTableName' => 'd3picdirdump', 'sFieldName' => 'OXFILE', 'sType' => 'VARCHAR(128)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'PICDIRDUMP_OXFILESIZE' => [ 'sTableName' => 'd3picdirdump', 'sFieldName' => 'OXFILESIZE', 'sType' => 'INT(32)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'PICDIRDUMP_OXISFINISHED' => [ 'sTableName' => 'd3picdirdump', 'sFieldName' => 'OXISFINISHED', 'sType' => 'TINYINT(1)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'PICDIRDUMP_OXISIMPORTED' => [ 'sTableName' => 'd3picdirdump', 'sFieldName' => 'OXISIMPORTED', 'sType' => 'TINYINT(1)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], // d3picextdump 'PICEXTDUMP_OXARTID' => [ 'sTableName' => 'd3picextdump', 'sFieldName' => 'OXARTID', 'sType' => 'CHAR(32)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'PICEXTDUMP_D3EXTPICCOUNT' => [ 'sTableName' => 'd3picextdump', 'sFieldName' => 'D3EXTPICCOUNT', 'sType' => 'INT(11)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'PICEXTDUMP_D3ISIMPORTED' => [ 'sTableName' => 'd3picextdump', 'sFieldName' => 'D3ISIMPORTED', 'sType' => 'TINYINT(1)', 'blNull' => true, 'sDefault' => 0, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], // d3importconfig 'IMPORTCONFIG_OXID' => [ 'sTableName' => 'd3importconfig', 'sFieldName' => 'OXID', 'sType' => 'VARCHAR(32)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'IMPORTCONFIG_OXSHOPID' => [ 'sTableName' => 'd3importconfig', 'sFieldName' => 'OXSHOPID', 'sType' => 'int(11) ', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'IMPORTCONFIG_OXTITLE' => [ 'sTableName' => 'd3importconfig', 'sFieldName' => 'OXTITLE', 'sType' => 'VARCHAR(100)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'IMPORTCONFIG_OXVALUE' => [ 'sTableName' => 'd3importconfig', 'sFieldName' => 'OXVALUE', 'sType' => 'text', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], // d3importerdesc 'IMPORTERDESC_OXID' => [ 'sTableName' => 'd3importerdesc', 'sFieldName' => 'OXID', 'sType' => 'VARCHAR(32)', 'blNull' => false, 'sDefault' => '', 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'IMPORTERDESC_OXFIELD' => [ 'sTableName' => 'd3importerdesc', 'sFieldName' => 'OXFIELD', 'sType' => 'VARCHAR(50)', 'blNull' => false, 'sDefault' => '', 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'IMPORTERDESC_OXDESC' => [ 'sTableName' => 'd3importerdesc', 'sFieldName' => 'OXDESC', 'sType' => 'VARCHAR(100)', 'blNull' => false, 'sDefault' => '', 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'IMPORTERDESC_OXDESC_1' => [ 'sTableName' => 'd3importerdesc', 'sFieldName' => 'OXDESC_1', 'sType' => 'VARCHAR(100)', 'blNull' => false, 'sDefault' => '', 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'IMPORTERDESC_OXORDER' => [ 'sTableName' => 'd3importerdesc', 'sFieldName' => 'OXORDER', 'sType' => 'INT(5)', 'blNull' => false, 'sDefault' => '0', 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'IMPORTERDESC_OXISPIC' => [ 'sTableName' => 'd3importerdesc', 'sFieldName' => 'OXISPIC', 'sType' => 'TINYINT(1)', 'blNull' => false, 'sDefault' => '0', 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], 'IMPORTERDESC_OXISDISABLED' => [ 'sTableName' => 'd3importerdesc', 'sFieldName' => 'OXISDISABLED', 'sType' => 'TINYINT(1)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => false, ], // oxarticles 'OXARTICLES_D3IMPORTFLAG' => [ 'sTableName' => 'oxarticles', 'sFieldName' => 'D3IMPORTFLAG', 'sType' => "VARCHAR(32)", 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => true, ], 'OXARTICLES_D3IMPORTPROFILEID' => [ 'sTableName' => 'oxarticles', 'sFieldName' => 'D3IMPORTPROFILEID', 'sType' => 'VARCHAR(32)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => true, ], ]; /*******************************************************************************************/ /***** Jobliste ****************************************************************************/ /*******************************************************************************************/ // auszuführende Check- und Updateanweisungen in auszuführender Reihenfolge /** * Standardwerte für checkIndizes() und fixIndizes() * @var array */ public $aIndizes = [ // d3pidirdump 'PICDIRDUMP_OXID' => [ 'sTableName' => 'd3picdirdump', 'sType' => 'PRIMARY', 'sName' => 'OXID', 'aFields' => [ 'OXID' => 'OXID', ], 'blMultilang' => false, 'blAddBreak' => false, ], 'PICDIRDUMP_OXISFINISHED' => [ 'sTableName' => 'd3picdirdump', 'sType' => '', 'sName' => 'OXISFINISHED', 'aFields' => [ 'OXISFINISHED' => 'OXISFINISHED', ], 'blMultilang' => false, 'blAddBreak' => false, ], 'PICDIRDUMP_OXISIMPORTED' => [ 'sTableName' => 'd3picdirdump', 'sType' => '', 'sName' => 'OXISIMPORTED', 'aFields' => [ 'OXISIMPORTED' => 'OXISIMPORTED', ], 'blMultilang' => false, 'blAddBreak' => false, ], // d3picextdump 'PICEXTDUMP_OXARTID' => [ 'sTableName' => 'd3picextdump', 'sType' => 'PRIMARY', 'sName' => 'OXARTID', 'aFields' => [ 'OXARTID' => 'OXARTID', ], 'blMultilang' => false, 'blAddBreak' => false, ], 'PICEXTDUMP_D3ISIMPORTED' => [ 'sTableName' => 'd3picextdump', 'sType' => '', 'sName' => 'D3ISIMPORTED', 'aFields' => [ 'D3ISIMPORTED' => 'D3ISIMPORTED', ], 'blMultilang' => false, 'blAddBreak' => false, ], // d3importconfig 'IMPORTCONFIG_OXID' => [ 'sTableName' => 'd3importconfig', 'sType' => 'PRIMARY', 'sName' => 'OXID', 'aFields' => [ 'OXID' => 'OXID', ], 'blMultilang' => false, 'blAddBreak' => false, ], // d3importerdesc 'IMPORTERDESC_OXID' => [ 'sTableName' => 'd3importerdesc', 'sType' => 'PRIMARY', 'sName' => 'OXID', 'aFields' => [ 'OXID' => 'OXID', ], 'blMultilang' => false, 'blAddBreak' => true, ], // oxarticles 'OXARTICLES_D3IMPORTFLAG' => [ 'sTableName' => 'oxarticles', 'sType' => '', 'sName' => 'D3IMPORTFLAG', 'aFields' => [ 'D3IMPORTFLAG' => 'D3IMPORTFLAG', ], 'blMultilang' => false, 'blAddBreak' => true, ], 'OXARTICLES_D3IMPORTPROFILEID' => [ 'sTableName' => 'oxarticles', 'sType' => '', 'sName' => 'D3IMPORTPROFILEID', 'aFields' => [ 'D3IMPORTPROFILEID' => 'D3IMPORTPROFILEID', ], 'blMultilang' => false, 'blAddBreak' => true, ], ]; // Standardwerte für checkFields(), _addTable() und fixFields() /** * @var array */ public $aDropIndizes = [ [ 'sTableName' => 'd3picextdump', 'sType' => 'INDEX', 'sName' => 'OXARTID', 'aFields' => [ 'OXARTID' => 'OXARTID', ], 'blMultilang' => false, ], ]; // Standardwerte für checkIndizes() und fixIndizes() /** * @var string */ protected $_sLib = 'd3importer'; // in Update from 4.2.0 auf 4.2.1 DROP it cause new Indize of it is PRIMARY /** * @var array */ protected $_aUpdateMethods = [ [ 'check' => 'checkModCfgItemExist', // prüft auf DB-Eintrag (hier ModCfg) und fügt diese ggf. ein bzw. führt Update aus 'do' => 'updateModCfgItemExist', ], [ 'check' => 'checkPicdirdumpTableExist', // prüft Tabelle d3picdirdump und legt sie ggf. an 'do' => 'updatePicdirdumpTableExist', ], [ 'check' => 'checkPicextdumpTableExist', // prüft Tabelle d3picextdump und legt sie ggf. an 'do' => 'updatePicextdumpTableExist', ], [ 'check' => 'checkImportconfigTableExist', // prüft Tabelle d3importconfig und legt sie ggf. an 'do' => 'updateImportconfigTableExist', ], [ 'check' => 'checkImporterdescTableExist', // prüft Tabelle d3importerdesc und legt sie ggf. an 'do' => 'updateImporterdescTableExist', ], [ 'check' => 'checkFields', 'do' => 'fixFields', ], [ 'check' => 'checkIndizes', 'do' => 'fixIndizes', ], [ 'check' => 'checkImportDirectoryIsMissing', 'do' => 'addImportDirectory', ], [ 'check' => 'checkImportPicturesDirectoryIsMissing', 'do' => 'addImportPicturesDirectory', ], [ 'check' => 'checkImporterdescItems', // die vielen kleinen sql befehle für Tabelle d3importerdesc 'do' => 'updateImporterdescItems', ], [ 'check' => 'checkImporterconfigItem', // Anlegen des Demoprofils, wenn Demodata Dateien installiert wurden 'do' => 'updateImporterconfigItem', ], [ 'check' => 'hasToConvertXmlToJson', 'do' => 'convertXmlConfigurations', ], [ 'check' => 'hasStringArticleSettings', 'do' => 'convertStringArticleSettings', ], [ 'check' => 'hasUpdateToAttibuteNoticeShown', 'do' => 'showUpdateToAttibuteNotice', ], [ 'check' => 'checkImporterdescUpdate', 'do' => 'updateImporterdescUpdate', ], [ 'check' => 'checkModCfgSameRevision', // prüft auf nachgezogene Revisionsnummer und überträgt diese ggf. 'do' => 'updateModCfgSameRevision', ], ]; /** * d3_importer_Setup_InstallRoutine constructor. * * @throws ConnectionException * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function __construct() { parent::__construct(); $this->addPictureDatabaseFieldDefinitions(); $this->setOxconfigEntriesOnFirstInstallation(); } /** * @return void * @throws ConnectionException */ public function addPictureDatabaseFieldDefinitions(): void { /** @var Shop $shop */ $shop = Registry::getConfig()->getActiveShop(); $sCurrentShopId = $shop->getId(); /** @var ShopList $oShopList */ $oShopList = $this->getShopList(); $iMaxPicCount = 0; /** @var Shop $oShop */ foreach ($oShopList as $oShop) { $this->_changeToShop($oShop->getId()); $iPicCount = Registry::getConfig()->getConfigParam('iPicCount'); $iMaxPicCount = max( $iPicCount, $iMaxPicCount ); } $this->_changeToShop($sCurrentShopId); for ($i = 1; $i <= $iMaxPicCount; $i++) { $this->aFields['OXARTICLES_D3IMPORTPIC'.$i] = [ 'sTableName' => 'oxarticles', 'sFieldName' => 'D3IMPORTPIC'.$i, 'sType' => 'VARCHAR(255)', 'blNull' => false, 'sDefault' => false, 'sComment' => false, 'sExtra' => '', 'blMultilang' => false, 'blAddBreak' => true, ]; $this->aIndizes['OXARTICLES_D3IMPORTPIC'.$i] = [ 'sTableName' => 'oxarticles', 'sType' => '', 'sName' => 'D3IMPORTPIC'.$i, 'aFields' => [ 'D3IMPORTPIC'.$i => 'D3IMPORTPIC'.$i, ], 'blMultilang' => false, 'blAddBreak' => true, ]; } } /** * @throws ConnectionException * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ protected function setOxconfigEntriesOnFirstInstallation(): void { $oConfig = Registry::getConfig(); $sCurrentShopid = $oConfig->getShopId(); /** @var Shop $oShop */ foreach ($this->getShopListByActiveModule($this->sModKey) as $oShop) { $oConfig->setShopId($oShop->getId()); $qb = ContainerFactory::getInstance()->getContainer()->get(QueryBuilderFactoryInterface::class)->create(); $qb->select(1) ->from('d3_cfg_mod') ->where( $qb->expr()->and( $qb->expr()->in('oxmodid', [ $qb->createNamedParameter('d3importer'), $qb->createNamedParameter('d3_importer') ]), $qb->expr()->eq('oxshopid', $qb->createNamedParameter($oShop->getId())) ) ) ->setMaxResults(1); if ( ! $qb->execute()->fetchOne() ) { Registry::getConfig()->saveShopConfVar( 'bool', 'd3_importer_update_old_attibutes_removed', true, $oShop->getId() ); } } $oConfig->setShopId($sCurrentShopid); } /** * @return bool * @throws DBALException * @throws ConnectionException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function updatePicdirdumpTableExist() { if ($this->checkPicdirdumpTableExist()) { return $this->_addTable2('d3picdirdump', $this->aFields, $this->aIndizes, 'D3 Importer Items', 'MyISAM'); } return true; } /** * Nachfolgend die Prüfung * ob Importereigene Tabellen * vorhanden sind. * Wenn nicht werden diese angelegt. */ /** * @return bool TRUE, if table is missing * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function checkPicdirdumpTableExist() { return $this->_checkTableNotExist('d3picdirdump'); } /** * @return bool * @throws DBALException * @throws ConnectionException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function updatePicextdumpTableExist() { if ($this->checkPicextdumpTableExist()) { return $this->_addTable2('d3picextdump', $this->aFields, $this->aIndizes, 'D3 Importer Items', 'MyISAM'); } return true; } /** * @return bool TRUE, if table is missing * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function checkPicextdumpTableExist() { return $this->_checkTableNotExist('d3picextdump'); } /** * @return bool * @throws DBALException * @throws ConnectionException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function updateImportconfigTableExist(): bool { $blRet = $this->checkImportconfigTableExist(); if ($blRet) { return $this->_addTable2( 'd3importconfig', $this->aFields, $this->aIndizes, 'D3 Importer Items', 'MyISAM' ); } return $blRet; } /** * @return bool TRUE, if table is missing * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function checkImportconfigTableExist(): bool { return $this->_checkTableNotExist('d3importconfig'); } /** * @return bool * @throws DBALException * @throws ConnectionException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function updateImporterdescTableExist(): bool { if ($this->checkImporterdescTableExist()) { return $this->_addTable2( 'd3importerdesc', $this->aFields, $this->aIndizes, 'D3 Importer Items', 'MyISAM' ); } return true; } /** * @return bool TRUE, if table is missing * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function checkImporterdescTableExist(): bool { return $this->_checkTableNotExist('d3importerdesc'); } /** * @return bool */ public function checkImportDirectoryIsMissing(): bool { $dir = Registry::getConfig()->getConfigParam('sShopDir').'/import'; return !file_exists($dir) && !is_dir($dir); } public function addImportDirectory(): void { if ($this->checkImportDirectoryIsMissing()) { $dir = rtrim(Registry::getConfig()->getConfigParam('sShopDir'), '/').'/import'; $this->createImportDirectory($dir); } } /** * @return bool */ public function checkImportPicturesDirectoryIsMissing(): bool { $dir = Registry::getConfig()->getConfigParam('sShopDir').'/import/pictures'; return !file_exists($dir) && !is_dir($dir); } public function addImportPicturesDirectory(): void { if ($this->checkImportPicturesDirectoryIsMissing()) { $dir = rtrim(Registry::getConfig()->getConfigParam('sShopDir'), '/').'/import/pictures'; $this->createImportDirectory($dir); } } protected function createImportDirectory($dir): bool { try { $this->setUpdateBreak(false); $this->setActionLog('MSG', sprintf(Registry::getLang()->translateString('D3_IMPORTER_SETUP_CREATEDIRECTORY'), $dir), $this->getInitialExecMethod(__METHOD__)); if ($this->hasExecute()) { $filesystem = new Filesystem(); $filesystem->mkdir($dir); } $htaContent = <<< 'HTA' Require all denied Order allow,deny Deny from all HTA; $this->setActionLog('MSG', sprintf(Registry::getLang()->translateString('D3_CFG_MOD_UPDATE_JOB_FILECONTENT'), $dir . '/.htaccess') . PHP_EOL . PHP_EOL . $htaContent, $this->getInitialExecMethod(__METHOD__)); $this->setActionLog('MSG', sprintf(Registry::getLang()->translateString('D3_CFG_MOD_UPDATE_JOB_FILECONTENT'), $dir . '/index.html'), $this->getInitialExecMethod(__METHOD__)); if ($this->hasExecute()) { $filesystem = new Filesystem(); $filesystem->touch($dir . '/.htaccess'); $filesystem->dumpFile($dir . '/.htaccess', $htaContent); $filesystem->touch($dir . '/index.html'); } } catch (IOException $exception) { $this->setErrorStatus(true); $this->setErrorMessage($exception->getMessage()); } return true; } /** * @return bool * @throws DatabaseConnectionException */ public function checkImporterdescItems(): bool { return $this->_checkUpdateFile('d3/importer/Setup/d3importer_importerdescQuerys.php'); } /** * @return bool * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function updateImporterdescItems(): bool { return $this->_doUpdateFile('d3/importer/Setup/d3importer_importerdescQuerys.php'); } /** * Installiere ein Testimportprofil. * * @return bool * @throws DBALException * @throws ConnectionException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function updateImporterconfigItem(): bool { $blHasNoExample = false; if ($this->checkImporterconfigItem()) { /** @var Shop $oShop */ foreach ($this->getShopListByActiveModule($this->sModKey) as $oShop) { $aImportconfigWhere = [ 'oxid' => md5('d3importconfig_ex_' . $oShop->getId()), 'oxshopid' => $oShop->getId(), ]; $blHasNoExample = $this->_checkTableItemNotExist('d3importconfig', $aImportconfigWhere); $aWhere = [ 'oxvarname' => 'd3importconfig_ex_' . $oShop->getId(), 'oxshopid' => $oShop->getId(), 'oxvartype' => 'bool', ]; $blHasAlreadyExampleUsed = $this->_checkTableItemNotExist('oxconfig', $aWhere); if ($blHasNoExample && $blHasAlreadyExampleUsed) { $aInsertFields = [ 'OXID' => [ 'content' => md5('d3importconfig_ex_' . $oShop->getId()), 'force_update' => true, 'use_quote' => true, ], 'OXSHOPID' => [ 'content' => $oShop->getId(), 'force_update' => true, 'use_quote' => true, ], 'OXTITLE' => [ 'content' => 'Beispielprofil mit Beispielliste.csv', 'force_update' => false, 'use_quote' => true, ], 'OXVALUE' => [ 'content' => '{"d3_importer_category":{"IMPORTTYPE":"import","ASSIGNIDENT":"oxtitle","IMPORTCOLUM":{"1":"24"},"COLUMSEPARATOR":{"1":"|"}},"d3_importer_cross":{"IMPORTTYPE_CROSS":"import","IMPORTCOLUM_CROSS":"25","COLUMSEPARATOR_CROSS":"|","IMPORTTYPE_ACC":"import","IMPORTCOLUM_ACC":"26","COLUMSEPARATOR_ACC":"|"},"d3_importer_price2art":{"IMPORTTYPE":"import","IMPORTCOLUM":{"1":{"PRICE":"11","FROM":"12","TO":"13"},"2":{"PRICE":"14","FROM":"15","TO":"16"},"3":{"PRICE":"17","FROM":"18","TO":"19"}}},"d3_importer_afterimport":{"AFTERIMPORTTICKER":"100"},"d3_picture_main":{"aXMLPictureParams":[{"IMPORTFIELD":"d3importpic1","IMAGEFIELDS":{"oxpic1":"1"}},{"IMPORTFIELD":"d3importpic2","IMAGEFIELDS":{"oxpic2":"1"}},{"IMPORTFIELD":"d3importpic3","IMAGEFIELDS":{"oxpic3":"1"}}],"aPictureSettings":{"iMaxPictureCount":"50","iMaxImportCount":"5","iOverrideExternPictures":"0"}},"d3_importer_fields":{"fields":{"0":"oxartnum","1":"oxean","2":"oxtitle","3":"oxtitle_1","4":"oxshortdesc","5":"oxshortdesc_1","6":"oxlongdesc","7":"oxlongdesc_1","8":"oxsearchkeys","9":"oxsearchkeys_1","10":"oxprice","20":"oxstock","21":"d3importpic1","22":"d3importpic2","23":"d3importpic3"},"update":{"1":"1","2":"1","3":"1","4":"1","5":"1","6":"1","7":"1","8":"1","9":"1","10":"1","20":"1","21":"1","22":"1","23":"1"}},"d3_importer_attrib":{"IMPORTTYPE":"import","IMPORTCOLUM":{"1":{"NAME":{"de":"38","en":"39"},"VALUE":{"de":"40","en":"41"}},"2":{"NAME":{"de":"42","en":"43"},"VALUE":{"de":"44","en":"45"}}}},"d3_importer_selectlist":{"IMPORTTYPE":"clearbefore","IMPORTCOLUM":{"1":{"NAME":"27","ALTNAME":"Auswahl","VALUE":"28","SEPARATOR":"|","SEPARATOR_PRICE":"@"},"2":{"NAME":"29","ALTNAME":"Auswahl","VALUE":"30","SEPARATOR":"|","SEPARATOR_PRICE":"@"}}},"d3_importer_variants":{"IMPORTTYPE":"import","IMPORTCOLUM":"31","FIELD":{"oxvarname":"32","oxvarname_1":"34","oxvarselect":"33","oxvarselect_1":"35"}},"d3_importer_vendors":{"VENDOR":{"IMPORTTYPE":"import","IMPORTCOLUM":"36"},"MANUFACTURER":{"IMPORTTYPE":"import","IMPORTCOLUM":"37"}},"d3_importer_config":{"IMPORTTYPE":"standard","IMPORTTICKER":"100","OMITLINES":"1","ASSIGNIDENT":"oxartnum","aArticleSettings":["oxstock => 10"],"aDefaultBooleanSettings":{"aTrueSettings":["true","TRUE","Ja","ja"],"aFalseSettings":["false","FALSE","Nein","nein"]},"PRICEPLUSPERCENT":"0","PRICEDECIMALROUND":"0","ARTNUM2OXID":"0","MD54OXID":"0"},"d3_importer_mall":{"IMPORTCOLUM_MALL":"46","COLUMSEPARATOR_MALL":","},"d3_importer_main":{"FILE":"demo_artikel_test.csv","FILESEPARATOR":";","TEXTSEPARATOR":"\"","FILELENGTH":"844","FILEROWS":"11","FILECOLUMS":"47"}}', 'force_update' => false, 'use_quote' => true, ], ]; $blHasNoExample = $this->_updateTableItem2('d3importconfig', $aInsertFields, $aImportconfigWhere); if ($blHasNoExample) { $aInsertFields = [ 'OXID' => [ 'content' => md5('d3importconfig_ex_' . $oShop->getId()), 'force_update' => true, 'use_quote' => true, ], 'OXSHOPID' => [ 'content' => $oShop->getId(), 'force_update' => true, 'use_quote' => true, ], 'OXVARNAME' => [ 'content' => 'd3importconfig_ex_' . $oShop->getId(), 'force_update' => false, 'use_quote' => true, ], 'OXVARTYPE' => [ 'content' => 'bool', 'force_update' => false, 'use_quote' => true, ], ]; $this->_updateTableItem2('oxconfig', $aInsertFields, $aWhere); } } } } return $blHasNoExample; } /** * Anlegen der Felder, wenn nicht vorhanden... * für: oxarticles * d3picdirdump * d3picextdump * d3importconfig */ /** * Hat der Shop ein Testimportprofil? * * @return bool * @throws DBALException * @throws DatabaseConnectionException * @throws ConnectionException */ public function checkImporterconfigItem(): bool { if (!file_exists(rtrim(Registry::getConfig()->getConfigParam('sShopDir'), '/').'/import/demo_artikel_test.csv') && !file_exists(rtrim(Registry::getConfig()->getConfigParam('sShopDir'), '/').'/import/demo_artikel_komplett.csv') ) { return false; } $blHasNoExample = false; /** @var Shop $oShop */ foreach ($this->getShopListByActiveModule($this->sModKey) as $oShop) { $aWhere = [ 'oxid' => md5('d3importconfig_ex_' . $oShop->getId()), 'oxshopid' => $oShop->getId(), ]; $blHasNoExample = $this->_checkTableItemNotExist('d3importconfig', $aWhere); $aWhere = [ 'oxvarname' => 'd3importconfig_ex_' . $oShop->getId(), 'oxshopid' => $oShop->getId(), ]; $blExampleNotUsed = $this->_checkTableItemNotExist('oxconfig', $aWhere); $blHasNoExample = $blHasNoExample && $blExampleNotUsed; if ($blHasNoExample) { return $blHasNoExample; } } return $blHasNoExample; } /** * @return bool * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function updateModCfgSameRevision(): bool { if ($this->checkModCfgSameRevision()) { return $this->_updateModCfgSameRevision($this->sModKey); } return false; } /** * @return bool * FALSE if Revisionnumber is the same * TRUE if Update Revisionnumber needed * @throws DBALException * @throws DatabaseConnectionException */ public function checkModCfgSameRevision(): bool { return $this->_checkModCfgSameRevision($this->sModKey); } /** * @return bool * @throws ConnectionException * @throws ContainerExceptionInterface * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws NotFoundExceptionInterface * @throws JsonException */ public function convertXmlConfigurations(): bool { if ($this->hasToConvertXmlToJson()) { /** @var Shop $oShop */ foreach ($this->getShopListByActiveModule($this->sModKey) as $oShop) { $qb = ContainerFactory::getInstance()->getContainer()->get(QueryBuilderFactoryInterface::class)->create(); $qb->select('oxvalue', 'oxid') ->from('d3importconfig') ->where( $qb->expr()->eq('oxshopid', $qb->createNamedParameter($oShop->getId())) ); $aConfigurations = $qb->execute()->fetchAllAssociative(); if (empty($aConfigurations)) { continue; } foreach ($aConfigurations as $aValue) { $blIsJsonConfiguration = (bool)json_decode($aValue['oxvalue'], true, 512, JSON_THROW_ON_ERROR); if ($blIsJsonConfiguration) { continue; } $sXmlConfiguration = unserialize(base64_decode($aValue['oxvalue'])); $migrator = oxNew(xmlToJsonMigrator::class); $aNewConfiguration = $migrator->migrate($sXmlConfiguration); $sJsonConfiguration = json_encode($aNewConfiguration, JSON_THROW_ON_ERROR); $aInsertFields = [ 'OXVALUE' => [ 'content' => $sJsonConfiguration, 'force_update' => true, 'use_quote' => true, ], ]; $blReturn = $this->_updateTableItem2( 'd3importconfig', $aInsertFields, ['oxid' => $aValue['oxid']] ); if ( ! $blReturn ) { return false; } } } } return true; } /** * Returns true if xml * * @return bool * @throws ConnectionException * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface * @throws JsonException */ public function hasToConvertXmlToJson(): bool { /** @var Shop $oShop */ foreach ($this->getShopListByActiveModule($this->sModKey) as $oShop) { $qb = ContainerFactory::getInstance()->getContainer()->get(QueryBuilderFactoryInterface::class)->create(); $qb->select('oxvalue', 'oxid') ->from('d3importconfig') ->where( $qb->expr()->eq('oxshopid', $qb->createNamedParameter($oShop->getId())) ); $aConfigurations = $qb->execute()->fetchAllAssociative(); if (empty($aConfigurations)) { continue; } foreach ($aConfigurations as $aValue) { $blIsJsonConfiguration = (bool)json_decode($aValue['oxvalue'], true, 512, JSON_THROW_ON_ERROR); $blIsBase64Configuration = (bool)base64_decode($aValue['oxvalue']); if ( $blIsJsonConfiguration ) { continue; } if (!$blIsBase64Configuration) { continue; } return true; } } return false; } /** * @return bool * @throws ConnectionException * @throws ContainerExceptionInterface * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws JsonException * @throws NotFoundExceptionInterface * @throws StandardException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception */ public function convertStringArticleSettings(): bool { if ($this->hasStringArticleSettings()) { $oConfig = Registry::getConfig(); $sCurrentShopid = $oConfig->getShopId(); /** @var Shop $oShop */ foreach ($this->getShopListByActiveModule($this->sModKey) as $oShop) { $oConfig->setShopId($oShop->getId()); $oModuleConfiguration = d3_cfg_mod::getNoCache('d3importer'); $mArticleSettings = $oModuleConfiguration->getValue('aArticleSettings'); if (is_string($mArticleSettings)) { $oModuleConfiguration->setValue('aArticleSettings', explode("\n", $mArticleSettings)); $oModuleConfiguration->save(); } $qb = ContainerFactory::getInstance()->getContainer()->get(QueryBuilderFactoryInterface::class)->create(); $qb->select('oxvalue', 'oxid') ->from('d3importconfig') ->where( $qb->expr()->eq('oxshopid', $qb->createNamedParameter($oShop->getId())) ); $aConfigurations = $qb->execute()->fetchAllAssociative(); if (empty($aConfigurations)) { continue; } foreach ($aConfigurations as $aValue) { $aIsJsonConfiguration = json_decode($aValue['oxvalue'], true, 512, JSON_THROW_ON_ERROR); if ( ! (bool) $aIsJsonConfiguration ) { continue; } if ( ! isset( $aIsJsonConfiguration['d3_importer_config']['aArticleSettings'] ) ) { continue; } if (is_string($aIsJsonConfiguration['d3_importer_config']['aArticleSettings'])) { $mArticleSettings = $aIsJsonConfiguration['d3_importer_config']['aArticleSettings']; $aIsJsonConfiguration['d3_importer_config']['aArticleSettings'] = explode( "\n", $mArticleSettings ); $sJsonConfiguration = json_encode($aIsJsonConfiguration, JSON_THROW_ON_ERROR); $aInsertFields = [ 'OXVALUE' => [ 'content' => $sJsonConfiguration, 'force_update' => true, 'use_quote' => true, ], ]; $blReturn = $this->_updateTableItem2( 'd3importconfig', $aInsertFields, ['oxid' => $aValue['oxid']] ); if (false == $blReturn) { return $blReturn; } } } } $oConfig->setShopId($sCurrentShopid); } return true; } /** * @return bool * @throws ConnectionException * @throws ContainerExceptionInterface * @throws DBALException * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws JsonException * @throws NotFoundExceptionInterface */ public function hasStringArticleSettings(): bool { $oConfig = Registry::getConfig(); $sCurrentShopid = $oConfig->getShopId(); /** @var Shop $oShop */ foreach ($this->getShopListByActiveModule($this->sModKey) as $oShop) { $oConfig->setShopId($oShop->getId()); $oModuleConfiguration = d3_cfg_mod::getNoCache('d3importer'); $mArticleSettings = $oModuleConfiguration->getValue('aArticleSettings'); if (is_string($mArticleSettings)) { $oConfig->setShopId($sCurrentShopid); return true; } $qb = ContainerFactory::getInstance()->getContainer()->get(QueryBuilderFactoryInterface::class)->create(); $qb->select('oxvalue', 'oxid') ->from('d3importconfig') ->where( $qb->expr()->eq('oxshopid', $qb->createNamedParameter($oShop->getId())) ); $aConfigurations = $qb->execute()->fetchAllAssociative(); if (empty($aConfigurations)) { continue; } foreach ($aConfigurations as $aValue) { $aIsJsonConfiguration = json_decode($aValue['oxvalue'], true, 512, JSON_THROW_ON_ERROR); if (false == (bool)$aIsJsonConfiguration) { continue; } if (false == isset($aIsJsonConfiguration['d3_importer_config']['aArticleSettings'])) { continue; } if (is_string($aIsJsonConfiguration['d3_importer_config']['aArticleSettings'])) { return true; } } } $oConfig->setShopId($sCurrentShopid); return false; } /** * * @return bool */ public function showUpdateToAttibuteNotice(): bool { return $this->showConfigConfirmMessage( 'd3_importer_update_old_attibutes_removed', 'D3_IMPORTER_UPDATE_OLD_ATTIBUTES_REMOVED' ); } /** * * @return bool */ public function hasUpdateToAttibuteNoticeShown(): bool { return $this->hasNoConfirmMessageConfigConfirmation('d3_importer_update_old_attibutes_removed'); } /** * @return bool * @throws DatabaseConnectionException */ public function checkImporterdescUpdate(): bool { return $this->_checkUpdateFile('d3/importer/Setup/importerdescUpdates.php'); } /** * @return bool * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function updateImporterdescUpdate(): bool { return $this->_doUpdateFile('d3/importer/Setup/importerdescUpdates.php'); } }