implement action runner

This commit is contained in:
Daniel Seifert 2021-06-22 13:26:51 +02:00
parent 216c5a8dd5
commit af9cc1759d
Signed by: DanielS
GPG Key ID: 8A7C4C6ED1915C6F
8 changed files with 154 additions and 111 deletions

View File

@ -44,7 +44,7 @@ class d3ActionWizard extends AdminDetailsController
public function getGroups() public function getGroups()
{ {
return $this->configuration->getGroups(); return $this->configuration->getActionGroups();
} }
public function getGroupActions($group) public function getGroupActions($group)

View File

@ -44,7 +44,7 @@ class d3ExportWizard extends AdminDetailsController
public function getGroups() public function getGroups()
{ {
return $this->configuration->getGroups(); return $this->configuration->getExportGroups();
} }
public function getGroupExports($group) public function getGroupExports($group)

View File

@ -15,15 +15,9 @@ declare(strict_types=1);
namespace D3\DataWizard\Application\Model; namespace D3\DataWizard\Application\Model;
use D3\DataWizard\Application\Model\ExportRenderer\RendererBridge;
use D3\ModCfg\Application\Model\d3filesystem;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\DBALException;
use OxidEsales\Eshop\Core\DatabaseProvider; use OxidEsales\Eshop\Core\DatabaseProvider;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException; use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry; use OxidEsales\Eshop\Core\Registry;
abstract class ActionBase implements QueryBase abstract class ActionBase implements QueryBase
@ -35,85 +29,14 @@ abstract class ActionBase implements QueryBase
{ {
return ''; return '';
} }
/** /**
* @param string $format
*
* @throws DBALException
* @throws DatabaseConnectionException * @throws DatabaseConnectionException
* @throws DatabaseErrorException * @throws DatabaseErrorException
* @throws Exceptions\NoSuitableRendererException
* @throws Exceptions\TaskException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/ */
public function run() public function run()
{ {
$rowCount = $this->getExportData( $this->getQuery() ); $this->executeAction( $this->getQuery() );
}
/**
* @return string
*/
public function getButtonText() : string
{
return "D3_DATAWIZARD_EXPORT_SUBMIT";
}
/**
* @param $format
*
* @return ExportRenderer\RendererInterface
* @throws Exceptions\NoSuitableRendererException
*/
public function getRenderer($format): ExportRenderer\RendererInterface
{
return oxNew(RendererBridge::class)->getRenderer($format);
}
/**
* @param $format
*
* @return string
* @throws Exceptions\NoSuitableRendererException
*/
public function getFileExtension($format): string
{
return $this->getRenderer($format)->getFileExtension();
}
/**
* @param $rows
* @param $fieldnames
* @param $format
*
* @return string
* @throws Exceptions\NoSuitableRendererException
*/
public function renderContent($rows, $fieldnames, $format): string
{
$renderer = $this->getRenderer($format);
return $renderer->getContent($rows, $fieldnames);
}
/**
* @return string
*/
public function getExportFilenameBase() : string
{
return $this->getTitle();
}
/**
* @param $format
*
* @return string
* @throws Exceptions\NoSuitableRendererException
*/
public function getExportFileName($format) : string
{
return $this->getExportFilenameBase().'_'.date('Y-m-d_H-i-s').'.'.$this->getFileExtension($format);
} }
/** /**
@ -123,7 +46,7 @@ abstract class ActionBase implements QueryBase
* @throws DatabaseConnectionException * @throws DatabaseConnectionException
* @throws DatabaseErrorException * @throws DatabaseErrorException
*/ */
public function getExportData( array $query ): array public function executeAction( array $query ): int
{ {
[ $queryString, $parameters ] = $query; [ $queryString, $parameters ] = $query;
@ -137,6 +60,25 @@ abstract class ActionBase implements QueryBase
); );
} }
return DatabaseProvider::getDb( DatabaseProvider::FETCH_MODE_ASSOC )->execute( $queryString, $parameters ); $affected = DatabaseProvider::getDb( DatabaseProvider::FETCH_MODE_ASSOC )->execute( $queryString, $parameters );
throw oxNew(
Exceptions\TaskException::class,
$this,
sprintf(
Registry::getLang()->translateString(
$affected === 1 ? 'D3_DATAWIZARD_ERR_ACTIONRESULT' : 'D3_DATAWIZARD_ERR_ACTIONRESULTS'
),
$affected
)
);
}
/**
* @return string
*/
public function getButtonText() : string
{
return "D3_DATAWIZARD_ACTION_SUBMIT";
} }
} }

View File

@ -0,0 +1,89 @@
<?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.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
declare(strict_types=1);
namespace D3\DataWizard\Application\Model\Actions;
use D3\DataWizard\Application\Model\ActionBase;
use OxidEsales\Eshop\Core\Model\BaseModel;
use OxidEsales\Eshop\Core\Model\MultiLanguageModel;
use OxidEsales\Eshop\Core\Registry;
class FixArtextendsItems extends ActionBase
{
/**
* fehlende oxartextends-Einträge nachtragen
*/
/**
* @return string
*/
public function getTitle() : string
{
return Registry::getLang()->translateString('D3_DATAWIZARD_ACTIONS_FIXARTEXTENDSITEMS');
}
/**
* @return array
*/
public function getQuery() : array
{
$aDefaultValueFields = array(
'oxtimestamp' => "''",
);
$aNonArtExtendsFields = array(
'oxid' => 'oxarticles.oxid',
);
$aArtExtendsFields = array_fill_keys($this->getArtExtendsFields(), "''");
$aMergedFields = array_merge($aNonArtExtendsFields, $aArtExtendsFields);
$aQueryFields = array_diff_key($aMergedFields, $aDefaultValueFields);
$sArtExtendsFields = implode(', ', array_keys($aQueryFields));
$select = "SELECT ".implode(', ', $aQueryFields).
" FROM oxarticles".
" LEFT JOIN oxartextends AS arx ON oxarticles.oxid = arx.oxid".
" WHERE arx.oxid IS NULL";
$query = "INSERT INTO oxartextends ($sArtExtendsFields) ".
$select;
return [$query, []];
}
/**
* @return array
*/
public function getArtExtendsFields(): array
{
/** @var $oArtExtends MultiLanguageModel */
$oArtExtends = oxNew(BaseModel::class);
$oArtExtends->init('oxartextends', false);
$aFieldNames = $oArtExtends->getFieldNames();
if (false == $aFieldNames) {
$oArtExtends->disableLazyLoading();
$aFieldNames = $oArtExtends->getFieldNames();
}
unset($aFieldNames[array_search('oxid', $aFieldNames)]);
return $aFieldNames;
}
}

View File

@ -15,6 +15,7 @@ declare(strict_types=1);
namespace D3\DataWizard\Application\Model; namespace D3\DataWizard\Application\Model;
use D3\DataWizard\Application\Model\Actions\FixArtextendsItems;
use D3\DataWizard\Application\Model\Exports\InactiveCategories; use D3\DataWizard\Application\Model\Exports\InactiveCategories;
use D3\DataWizard\Application\Model\Exports\KeyFigures; use D3\DataWizard\Application\Model\Exports\KeyFigures;
use OxidEsales\Eshop\Core\Registry; use OxidEsales\Eshop\Core\Registry;
@ -39,6 +40,8 @@ class Configuration
public function configure() public function configure()
{ {
if (false === Registry::getConfig()->getConfigParam('d3datawizard_hideexamples', false)) { if (false === Registry::getConfig()->getConfigParam('d3datawizard_hideexamples', false)) {
$this->registerAction(self::GROUP_ARTICLES, oxNew(FixArtextendsItems::class));
$this->registerExport(self::GROUP_CATEGORY, oxNew(InactiveCategories::class)); $this->registerExport(self::GROUP_CATEGORY, oxNew(InactiveCategories::class));
$this->registerExport(self::GROUP_SHOP, oxNew(KeyFigures::class)); $this->registerExport(self::GROUP_SHOP, oxNew(KeyFigures::class));
} }
@ -81,16 +84,34 @@ class Configuration
/** /**
* @return array * @return array
*/ */
public function getGroups(): array public function getActionGroups(): array
{
return array_keys($this->actions);
}
/**
* @return array
*/
public function getExportGroups(): array
{ {
return array_keys($this->exports); return array_keys($this->exports);
} }
/**
* @param $group
*
* @return mixed
*/
public function getActionsByGroup($group) public function getActionsByGroup($group)
{ {
return $this->actions[$group]; return $this->actions[$group];
} }
/**
* @param $group
*
* @return mixed
*/
public function getExportsByGroup($group) public function getExportsByGroup($group)
{ {
return $this->exports[$group]; return $this->exports[$group];
@ -103,7 +124,7 @@ class Configuration
{ {
$all = []; $all = [];
foreach ($this->getGroups() as $group) { foreach ($this->getActionGroups() as $group) {
$all = array_merge($all, $this->getActionsByGroup($group)); $all = array_merge($all, $this->getActionsByGroup($group));
} }
@ -117,7 +138,7 @@ class Configuration
{ {
$all = []; $all = [];
foreach ($this->getGroups() as $group) { foreach ($this->getExportGroups() as $group) {
$all = array_merge($all, $this->getExportsByGroup($group)); $all = array_merge($all, $this->getExportsByGroup($group));
} }
@ -131,7 +152,7 @@ class Configuration
*/ */
public function getActionById($id) : ActionBase public function getActionById($id) : ActionBase
{ {
return $this->getAllExports()[$id]; return $this->getAllActions()[$id];
} }
/** /**

View File

@ -19,11 +19,6 @@ interface QueryBase
{ {
public function run(); public function run();
/**
* @return string
*/
public function getExportFilenameBase() : string;
/** /**
* @return string * @return string
*/ */

View File

@ -40,6 +40,8 @@ $aLang = array(
'D3_DATAWIZARD_EXPORT_FORMAT_CSV' => 'CSV-Format', 'D3_DATAWIZARD_EXPORT_FORMAT_CSV' => 'CSV-Format',
'D3_DATAWIZARD_EXPORT_FORMAT_PRETTY' => 'Pretty-Format', 'D3_DATAWIZARD_EXPORT_FORMAT_PRETTY' => 'Pretty-Format',
'D3_DATAWIZARD_ACTION_SUBMIT' => 'Aktion starten',
'D3_DATAWIZARD_DEBUG' => 'Debug: %1$s', 'D3_DATAWIZARD_DEBUG' => 'Debug: %1$s',
'D3_DATAWIZARD_ERR_NOEXPORTSELECT' => 'Export kann nicht ausgeführt werden. Exporte erfordern SELECT Query.', 'D3_DATAWIZARD_ERR_NOEXPORTSELECT' => 'Export kann nicht ausgeführt werden. Exporte erfordern SELECT Query.',
@ -57,7 +59,9 @@ $aLang = array(
'D3_DATAWIZARD_EXPORTS_KEYFIGURES_BASKETSIZE' => 'Warenkorbhöhe', 'D3_DATAWIZARD_EXPORTS_KEYFIGURES_BASKETSIZE' => 'Warenkorbhöhe',
'D3_DATAWIZARD_EXPORTS_KEYFIGURES_MONTH' => 'Monat', 'D3_DATAWIZARD_EXPORTS_KEYFIGURES_MONTH' => 'Monat',
// Abracadata 'D3_DATAWIZARD_ERR_ACTIONSELECT' => 'Aktion kann nicht ausgeführt werden. Aktionen können keine SELECTs exportieren.',
// Harry Potter 'D3_DATAWIZARD_ERR_NOACTION_INSTALLED' => 'Es sind keine Aktionen installiert oder aktiviert.',
// Magic 'D3_DATAWIZARD_ERR_ACTIONRESULT' => '%1$s Eintrag verändert',
'D3_DATAWIZARD_ERR_ACTIONRESULTS' => '%1$s Einträge verändert',
'D3_DATAWIZARD_ACTIONS_FIXARTEXTENDSITEMS' => 'fehlende oxartextends-Einträge nachtragen',
); );

View File

@ -26,7 +26,7 @@
</style> </style>
[{capture name="d3script"}][{strip}] [{capture name="d3script"}][{strip}]
function startExport(id, format) { function startAction(id) {
let elements = document.getElementsByClassName('errorbox'); let elements = document.getElementsByClassName('errorbox');
for (var i = 0; i < elements.length; i++){ for (var i = 0; i < elements.length; i++){
elements[i].style.display = 'none'; elements[i].style.display = 'none';
@ -37,8 +37,7 @@
}, 3000); }, 3000);
document.getElementById('mask').className='on'; document.getElementById('mask').className='on';
document.getElementById('popup2').className='d3loader-2 on'; document.getElementById('popup2').className='d3loader-2 on';
document.getElementById('exportid').value = id; document.getElementById('actionid').value = id;
document.getElementById('exportformat').value = format;
document.getElementById('myedit').submit(); document.getElementById('myedit').submit();
} }
[{/strip}][{/capture}] [{/strip}][{/capture}]
@ -47,9 +46,8 @@
<form name="myedit" id="myedit" action="[{$oViewConf->getSelfLink()}]" method="post" style="padding: 0;margin: 0;height:0;"> <form name="myedit" id="myedit" action="[{$oViewConf->getSelfLink()}]" method="post" style="padding: 0;margin: 0;height:0;">
[{$oViewConf->getHiddenSid()}] [{$oViewConf->getHiddenSid()}]
<input type="hidden" name="cl" value="[{$oViewConf->getActiveClassName()}]"> <input type="hidden" name="cl" value="[{$oViewConf->getActiveClassName()}]">
<input type="hidden" name="fnc" value="doExport"> <input type="hidden" name="fnc" value="doAction">
<input type="hidden" name="exportid" id="exportid" value=""> <input type="hidden" name="actionid" id="actionid" value="">
<input type="hidden" name="exportformat" id="exportformat" value="CSV">
[{assign var="groups" value=$oView->getGroups()}] [{assign var="groups" value=$oView->getGroups()}]
[{if $groups|@count}] [{if $groups|@count}]
@ -67,27 +65,21 @@
<div id="collapse[{$group}]" class="collapse" aria-labelledby="heading[{$group}]" data-parent="#accordion"> <div id="collapse[{$group}]" class="collapse" aria-labelledby="heading[{$group}]" data-parent="#accordion">
<div class="card-body pb-0"> <div class="card-body pb-0">
<div class="row"> <div class="row">
[{foreach from=$oView->getGroupActions($group) key="id" item="export"}] [{foreach from=$oView->getGroupActions($group) key="id" item="action"}]
<div class="col-sm-6 col-md-4 col-lg-3 pb-4"> <div class="col-sm-6 col-md-4 col-lg-3 pb-4">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">
[{$export->getTitle()}] [{$action->getTitle()}]
</h5> </h5>
<div class="card-body"> <div class="card-body">
<p class="card-text"> <p class="card-text">
[{$export->getDescription()}] [{$action->getDescription()}]
</p> </p>
<div class="btn-group"> <div class="btn-group">
<button type="button" class="btn btn-primary" onclick="startAction('[{$id}]')"> <button type="button" class="btn btn-primary" onclick="startAction('[{$id}]')">
<i class="fas fa-magic"></i> <i class="fas fa-magic"></i>
[{oxmultilang ident=$export->getButtonText()}] [{oxmultilang ident=$action->getButtonText()}]
</button>
<button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="sr-only">
<i class="fas fa-magic"></i>
[{oxmultilang ident=$export->getButtonText()}]
</span>
</button> </button>
</div> </div>