467 lines
14 KiB
PHP
467 lines
14 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This Software is the property of Data Development and is protected
|
|
* by copyright law - it is NOT Freeware.
|
|
*
|
|
* Any unauthorized use of this software without a valid license
|
|
* is a violation of the license agreement and will be prosecuted by
|
|
* civil and criminal law.
|
|
*
|
|
* https://www.d3data.de
|
|
*
|
|
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
|
|
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
|
|
* @link http://www.oxidmodule.com
|
|
*/
|
|
|
|
namespace D3\ModCfg\setup;
|
|
|
|
use D3\ModCfg\Application\Model\d3filesystem;
|
|
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
|
|
use D3\ModCfg\Application\Model\Install\d3install_updatebase;
|
|
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
|
|
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
|
|
use OxidEsales\Eshop\Core\DatabaseProvider;
|
|
use OxidEsales\Eshop\Core\Exception\StandardException;
|
|
use OxidEsales\Eshop\Core\Registry;
|
|
use OxidEsales\Eshop\Core\Module\ModuleList;
|
|
use OxidEsales\Eshop\Core\Config;
|
|
use OxidEsales\Eshop\Application\Model\Shop;
|
|
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
|
|
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
|
|
use OxidEsales\Eshop\Core\Exception\ConnectionException;
|
|
use Doctrine\DBAL\DBALException;
|
|
|
|
class d3_cfg_mod_cleaning
|
|
{
|
|
protected $_aSQLInstructions;
|
|
protected $_aInstructions;
|
|
protected $_iMaxLanguages;
|
|
protected $_blExecute = false;
|
|
public $oUpdateBase;
|
|
|
|
/**
|
|
* @param d3install_updatebase $oUpdateBase
|
|
*/
|
|
public function __construct(d3install_updatebase $oUpdateBase)
|
|
{
|
|
$this->oUpdateBase = $oUpdateBase;
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function getOldLibIds()
|
|
{
|
|
return array('d3install_lib', 'd3log_lib', 'd3clrtmp_lib');
|
|
}
|
|
|
|
/**
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
*/
|
|
public function cleanOldModuleFiles()
|
|
{
|
|
$this->_cleanOldModuleItem('aModuleFiles');
|
|
}
|
|
|
|
/**
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
*/
|
|
public function cleanOldModuleTemplates()
|
|
{
|
|
$this->_cleanOldModuleItem('aModuleTemplates');
|
|
}
|
|
|
|
/**
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
*/
|
|
public function cleanOldModulePaths()
|
|
{
|
|
$this->_cleanOldModuleItem('aModulePaths');
|
|
}
|
|
|
|
/**
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
*/
|
|
public function cleanOldModuleVersions()
|
|
{
|
|
$this->_cleanOldModuleItem('aModuleVersions');
|
|
}
|
|
|
|
/**
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
*/
|
|
public function cleanOldModuleEvents()
|
|
{
|
|
$this->_cleanOldModuleItem('aModuleEvents');
|
|
}
|
|
|
|
/**
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
* @throws DatabaseErrorException
|
|
* @throws StandardException
|
|
* @throws d3ShopCompatibilityAdapterException
|
|
* @throws d3_cfg_mod_exception
|
|
*/
|
|
public function deleteOldLibs()
|
|
{
|
|
/** @var d3filesystem $oFS */
|
|
$oFS = oxNew(d3filesystem::class);
|
|
|
|
$sModulePath = $oFS->trailingslashit(
|
|
$oFS->trailingslashit(Registry::getConfig()->getConfigParam('sShopDir')) . 'modules'
|
|
);
|
|
$aModulePaths = Registry::getConfig()->getConfigParam('aModulePaths');
|
|
|
|
foreach ($this->getOldLibIds() as $sOldLibId) {
|
|
$sLibPath = $sModulePath.$aModulePaths[$sOldLibId];
|
|
if ($aModulePaths[$sOldLibId] && preg_match("@".str_replace('_lib', '', $sOldLibId)."$@", $sLibPath)) {
|
|
if ($this->_blExecute) {
|
|
$oFS->del_dir($sLibPath, null, true, true);
|
|
} else {
|
|
$this->_aInstructions[] = sprintf(
|
|
Registry::getLang()->translateString('D3_UPDATE_DELETE_DIR'),
|
|
$sLibPath
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
Registry::getSession()->deleteVariable('d3RemoteLibList');
|
|
Registry::getSession()->deleteVariable('d3RemoteLibs');
|
|
}
|
|
|
|
/**
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
*/
|
|
public function cleanOldEnabledModules()
|
|
{
|
|
$oConfig = Registry::getConfig();
|
|
$sCurrentShopId = Registry::getConfig()->getActiveShop()->getId();
|
|
|
|
/** @var Shop $oShop */
|
|
foreach ($this->oUpdateBase->getShopList() as $oShop) {
|
|
$this->_changeToShop($oShop->getId());
|
|
$aEnabledModules = $oConfig->getModulesWithExtendedClass();
|
|
$aModulePaths = Registry::getConfig()->getConfigParam('aModulePaths');
|
|
foreach ($this->getOldLibIds() as $sOldLibId) {
|
|
if (false == isset($aModulePaths[$sOldLibId])) {
|
|
continue;
|
|
}
|
|
|
|
$sModulePath = $aModulePaths[$sOldLibId];
|
|
|
|
foreach ($aEnabledModules as $sBaseClass => $aExtensionList) {
|
|
foreach ($aExtensionList as $sExtId => $sExtensionPath) {
|
|
if (preg_match("@^{$sModulePath}@", $sExtensionPath)) {
|
|
unset($aEnabledModules[$sBaseClass][$sExtId]);
|
|
if (empty($aEnabledModules[$sBaseClass])) {
|
|
unset($aEnabledModules[$sBaseClass]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/** @var ModuleList $oModuleList */
|
|
$oModuleList = oxNew(ModuleList::class);
|
|
$aModuleList = $oModuleList->buildModuleChains($aEnabledModules);
|
|
|
|
$this->oUpdateBase->fixOxconfigVariable(
|
|
'aModules',
|
|
$oShop->getId(),
|
|
'',
|
|
$aModuleList,
|
|
'aarr'
|
|
);
|
|
|
|
if ($this->_blExecute) {
|
|
$oConfig->setConfigParam('aModules', $aModuleList);
|
|
}
|
|
}
|
|
|
|
$this->_changeToShop($sCurrentShopId);
|
|
}
|
|
|
|
/**
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
*/
|
|
public function cleanOldDisabledModules()
|
|
{
|
|
$this->_cleanOldModuleItem('aDisabledModules');
|
|
}
|
|
|
|
/**
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
* @throws DatabaseErrorException
|
|
* @throws StandardException
|
|
* @throws d3ShopCompatibilityAdapterException
|
|
* @throws d3_cfg_mod_exception
|
|
*/
|
|
public function transferSettings()
|
|
{
|
|
if (false == d3_cfg_mod::isAvailable('d3modcfg_lib')) {
|
|
return;
|
|
}
|
|
|
|
$sCurrentShopId = Registry::getConfig()->getActiveShop()->getId();
|
|
|
|
/** @var Shop $oShop */
|
|
foreach ($this->oUpdateBase->getShopList() as $oShop) {
|
|
$this->_changeToShop($oShop->getId());
|
|
for ($iLang = 0; $iLang < $this->oUpdateBase->getMaxLanguages(); $iLang++) {
|
|
$this->_transferLangSettings($iLang);
|
|
}
|
|
}
|
|
|
|
$this->_changeToShop($sCurrentShopId);
|
|
}
|
|
|
|
/**
|
|
* @param $sNewShopId
|
|
* @throws ConnectionException
|
|
*/
|
|
protected function _changeToShop($sNewShopId)
|
|
{
|
|
if (Registry::getConfig()->isMall()
|
|
&& $sNewShopId != Registry::getConfig()->getActiveShop()->getId()
|
|
) {
|
|
$oActiveView = Registry::getConfig()->getActiveView();
|
|
|
|
/** @var Config $oNewConf */
|
|
$oNewConf = new Config();
|
|
$oNewConf->setShopId($sNewShopId);
|
|
$oNewConf->init();
|
|
$oNewConf->setActiveView($oActiveView);
|
|
|
|
// only available in mall installations
|
|
Registry::getConfig()->onShopChange();
|
|
Registry::getSession()->setVariable('actshop', $sNewShopId);
|
|
Registry::getSession()->setVariable('currentadminshop', $sNewShopId);
|
|
Registry::getConfig()->setShopId($sNewShopId);
|
|
$this->oUpdateBase->setConfig($oNewConf);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $iLang
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
* @throws DatabaseErrorException
|
|
* @throws StandardException
|
|
* @throws d3ShopCompatibilityAdapterException
|
|
* @throws d3_cfg_mod_exception
|
|
*/
|
|
protected function _transferLangSettings($iLang)
|
|
{
|
|
$blWrite = false;
|
|
|
|
$oModCfg = d3_cfg_mod::get('d3modcfg_lib');
|
|
$oModCfg->setLanguage($iLang);
|
|
|
|
foreach ($this->getOldLibIds() as $sLibId) {
|
|
if (d3_cfg_mod::isAvailable($sLibId)) {
|
|
$oLib = d3_cfg_mod::get($sLibId);
|
|
$oLib->setLanguage($iLang);
|
|
if ($oLib->getAllValues()) {
|
|
foreach ($oLib->getAllValues() as $sKey => $mValue) {
|
|
$oModCfg->setValue($sKey, $mValue);
|
|
$blWrite = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($blWrite) {
|
|
if ($this->_blExecute) {
|
|
$oModCfg->saveNoLicenseRefresh();
|
|
} else {
|
|
$sFieldName = $iLang ? 'oxvalue_'.$iLang : 'oxvalue';
|
|
$sSql = "UPDATE {$oModCfg->getViewName()} SET {$sFieldName} = ".
|
|
DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->quote($oModCfg->getFieldData('oxvalue')).
|
|
" WHERE oxmodid = ".DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->quote('d3modcfg_lib')." AND".
|
|
" oxshopid = ".DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->quote(
|
|
Registry::getConfig()->getActiveShop()->getId()
|
|
)."; ";
|
|
$this->_aSQLInstructions[] = $sSql;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws DatabaseConnectionException
|
|
* @throws DatabaseErrorException
|
|
* @throws ConnectionException
|
|
*/
|
|
public function deleteSettings()
|
|
{
|
|
/** @var d3_cfg_mod $oModCfg */
|
|
$oModCfg = oxNew(d3_cfg_mod::class);
|
|
$sCurrentShopId = Registry::getConfig()->getActiveShop()->getId();
|
|
|
|
/** @var Shop $oShop */
|
|
foreach ($this->oUpdateBase->getShopList() as $oShop) {
|
|
$this->_changeToShop($oShop->getId());
|
|
|
|
foreach ($this->getOldLibIds() as $sLibId) {
|
|
$sSearchSelect = "SELECT 1 FROM {$oModCfg->getViewName()} WHERE oxmodid = ".
|
|
DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->quote($sLibId)." AND oxshopid = ".
|
|
DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->quote(Registry::getConfig()->getActiveShop()->getId()).
|
|
" LIMIT 1";
|
|
|
|
if (DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->getOne($sSearchSelect)) {
|
|
$sQuery = "DELETE FROM {$oModCfg->getViewName()} WHERE oxmodid = ".
|
|
DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->quote($sLibId)." AND oxshopid = ".
|
|
DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->quote(
|
|
Registry::getConfig()->getActiveShop()->getId()
|
|
).";";
|
|
|
|
if ($this->_blExecute) {
|
|
DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC)->Execute($sQuery);
|
|
} else {
|
|
$this->_aSQLInstructions[] = $sQuery;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->_changeToShop($sCurrentShopId);
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function getSql()
|
|
{
|
|
return $this->_aSQLInstructions;
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function getInstructions()
|
|
{
|
|
return $this->_aInstructions;
|
|
}
|
|
|
|
/**
|
|
* @param $blExecute
|
|
*/
|
|
public function setExecute($blExecute)
|
|
{
|
|
$this->_blExecute = $blExecute;
|
|
}
|
|
|
|
/**
|
|
* @param $sItemId
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
*/
|
|
protected function _cleanOldModuleItem($sItemId)
|
|
{
|
|
$oConfig = Registry::getConfig();
|
|
$sCurrentShopId = Registry::getConfig()->getActiveShop()->getId();
|
|
|
|
/** @var Shop $oShop */
|
|
foreach ($this->oUpdateBase->getShopList() as $oShop) {
|
|
$this->_changeToShop($oShop->getId());
|
|
|
|
$aModuleInfos = (array) $oConfig->getConfigParam($sItemId);
|
|
|
|
foreach ($this->getOldLibIds() as $sOldLibId) {
|
|
unset($aModuleInfos[$sOldLibId]);
|
|
}
|
|
|
|
$this->oUpdateBase->fixOxconfigVariable(
|
|
$sItemId,
|
|
$oShop->getId(),
|
|
'',
|
|
$aModuleInfos,
|
|
'aarr'
|
|
);
|
|
|
|
if ($this->_blExecute) {
|
|
$oConfig->setConfigParam($sItemId, $aModuleInfos);
|
|
}
|
|
}
|
|
|
|
$this->_changeToShop($sCurrentShopId);
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function hasDisabledD3VendorItem()
|
|
{
|
|
$aModuleInfos = (array) Registry::getConfig()->getConfigParam('aDisabledModules');
|
|
|
|
$iIndex = array_search('d3', $aModuleInfos);
|
|
|
|
if (false !== $iIndex) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @throws ConnectionException
|
|
* @throws DBALException
|
|
* @throws DatabaseConnectionException
|
|
*/
|
|
public function cleanD3VendorItem()
|
|
{
|
|
$sItemId = 'aDisabledModules';
|
|
$oConfig = Registry::getConfig();
|
|
$sCurrentShopId = Registry::getConfig()->getActiveShop()->getId();
|
|
|
|
if ($this->hasDisabledD3VendorItem()) {
|
|
/** @var Shop $oShop */
|
|
foreach ($this->oUpdateBase->getShopList() as $oShop) {
|
|
$this->_changeToShop($oShop->getId());
|
|
|
|
$aModuleInfos = (array) $oConfig->getConfigParam($sItemId);
|
|
|
|
$iIndex = array_search('d3', $aModuleInfos);
|
|
|
|
if (false !== $iIndex) {
|
|
unset($aModuleInfos[$iIndex]);
|
|
}
|
|
|
|
$this->oUpdateBase->fixOxconfigVariable(
|
|
$sItemId,
|
|
$oShop->getId(),
|
|
'',
|
|
$aModuleInfos,
|
|
'aarr'
|
|
);
|
|
|
|
if ($this->_blExecute) {
|
|
$oConfig->setConfigParam($sItemId, $aModuleInfos);
|
|
}
|
|
}
|
|
|
|
$this->_changeToShop($sCurrentShopId);
|
|
}
|
|
}
|
|
}
|