Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
a1cd84b415
|
|||
af10e80086
|
|||
148f4f8213
|
|||
f2935209ed
|
|||
a7e6c91042
|
|||
9e9a0fdd4c
|
|||
eef594d970
|
|||
759e8a377d
|
|||
f42c42cbe4
|
|||
baf30ef196
|
|||
8b354993ca
|
|||
4c91b0d699
|
|||
34b2b0b061
|
|||
9e9bab88f0
|
|||
466e751a5c
|
|||
5367dfdb5a
|
@ -47,7 +47,7 @@ class d3ActionWizard extends AdminDetailsController
|
||||
return $this->configuration->getActionGroups();
|
||||
}
|
||||
|
||||
public function getGroupActions($group)
|
||||
public function getGroupTasks($group)
|
||||
{
|
||||
return $this->configuration->getActionsByGroup($group);
|
||||
}
|
||||
@ -58,10 +58,10 @@ class d3ActionWizard extends AdminDetailsController
|
||||
* @throws d3ShopCompatibilityAdapterException
|
||||
* @throws d3_cfg_mod_exception
|
||||
*/
|
||||
public function doAction()
|
||||
public function runTask()
|
||||
{
|
||||
try {
|
||||
$id = Registry::getRequest()->getRequestEscapedParameter('actionid');
|
||||
$id = Registry::getRequest()->getRequestEscapedParameter('taskid');
|
||||
$action = $this->configuration->getActionById($id);
|
||||
|
||||
[ $queryString, $parameters ] = $action->getQuery();
|
@ -47,7 +47,7 @@ class d3ExportWizard extends AdminDetailsController
|
||||
return $this->configuration->getExportGroups();
|
||||
}
|
||||
|
||||
public function getGroupExports($group)
|
||||
public function getGroupTasks($group)
|
||||
{
|
||||
return $this->configuration->getExportsByGroup($group);
|
||||
}
|
||||
@ -58,10 +58,10 @@ class d3ExportWizard extends AdminDetailsController
|
||||
* @throws d3ShopCompatibilityAdapterException
|
||||
* @throws d3_cfg_mod_exception
|
||||
*/
|
||||
public function doExport()
|
||||
public function runTask()
|
||||
{
|
||||
try {
|
||||
$id = Registry::getRequest()->getRequestEscapedParameter('exportid');
|
||||
$id = Registry::getRequest()->getRequestEscapedParameter('taskid');
|
||||
$export = $this->configuration->getExportById($id);
|
||||
|
||||
[ $queryString, $parameters ] = $export->getQuery();
|
||||
@ -73,7 +73,7 @@ class d3ExportWizard extends AdminDetailsController
|
||||
);
|
||||
}
|
||||
|
||||
$export->run(Registry::getRequest()->getRequestEscapedParameter('exportformat'));
|
||||
$export->run(Registry::getRequest()->getRequestEscapedParameter('format'));
|
||||
} catch (DataWizardException|DBALException|DatabaseErrorException $e) {
|
||||
Registry::getUtilsView()->addErrorToDisplay($e);
|
||||
}
|
@ -15,6 +15,10 @@ declare(strict_types=1);
|
||||
|
||||
namespace D3\DataWizard\Application\Model;
|
||||
|
||||
use D3\DataWizard\Application\Model\Exceptions\InputUnvalidException;
|
||||
use FormManager\Inputs\Checkbox;
|
||||
use FormManager\Inputs\Input;
|
||||
use FormManager\Inputs\Radio;
|
||||
use OxidEsales\Eshop\Core\DatabaseProvider;
|
||||
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
|
||||
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
|
||||
@ -22,6 +26,8 @@ use OxidEsales\Eshop\Core\Registry;
|
||||
|
||||
abstract class ActionBase implements QueryBase
|
||||
{
|
||||
protected $formElements = [];
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
@ -36,6 +42,15 @@ abstract class ActionBase implements QueryBase
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
if ($this->hasFormElements()) {
|
||||
/** @var Input $element */
|
||||
foreach ($this->getFormElements() as $element) {
|
||||
if (false === $element->isValid()) {
|
||||
throw oxNew(InputUnvalidException::class, $this, $element);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->executeAction( $this->getQuery() );
|
||||
}
|
||||
|
||||
@ -81,4 +96,38 @@ abstract class ActionBase implements QueryBase
|
||||
{
|
||||
return "D3_DATAWIZARD_ACTION_SUBMIT";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Input $input
|
||||
*/
|
||||
public function registerFormElement(Input $input)
|
||||
{
|
||||
switch (get_class($input)) {
|
||||
case Radio::class:
|
||||
case Checkbox::class:
|
||||
$input->setTemplate('<p class="form-check">{{ input }} {{ label }}</p>');
|
||||
$input->setAttribute('class', 'form-check-input');
|
||||
break;
|
||||
default:
|
||||
$input->setTemplate('<p class="formElements">{{ label }} {{ input }}</p>');
|
||||
$input->setAttribute('class', 'form-control');
|
||||
}
|
||||
$this->formElements[] = $input;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasFormElements(): bool
|
||||
{
|
||||
return (bool) count($this->formElements);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getFormElements(): array
|
||||
{
|
||||
return $this->formElements;
|
||||
}
|
||||
}
|
@ -16,6 +16,7 @@ declare(strict_types=1);
|
||||
namespace D3\DataWizard\Application\Model;
|
||||
|
||||
use D3\DataWizard\Application\Model\Actions\FixArtextendsItems;
|
||||
use D3\DataWizard\Application\Model\Exceptions\DataWizardException;
|
||||
use D3\DataWizard\Application\Model\Exports\InactiveCategories;
|
||||
use D3\DataWizard\Application\Model\Exports\KeyFigures;
|
||||
use OxidEsales\Eshop\Core\Registry;
|
||||
@ -28,6 +29,7 @@ class Configuration
|
||||
const GROUP_USERS = 'D3_DATAWIZARD_GROUP_USERS';
|
||||
const GROUP_ORDERS = 'D3_DATAWIZARD_GROUP_ORDERS';
|
||||
const GROUP_REMARKS = 'D3_DATAWIZARD_GROUP_REMARKS';
|
||||
const GROUP_CMS = 'D3_DATAWIZARD_GROUP_CMS';
|
||||
|
||||
protected $actions = [];
|
||||
protected $exports = [];
|
||||
@ -39,12 +41,7 @@ class Configuration
|
||||
|
||||
public function configure()
|
||||
{
|
||||
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_SHOP, oxNew(KeyFigures::class));
|
||||
}
|
||||
// extend to add exports and actions via 'registerAction()' or 'registerExport()' method
|
||||
}
|
||||
|
||||
/**
|
||||
@ -53,7 +50,7 @@ class Configuration
|
||||
*/
|
||||
public function registerAction($group, ActionBase $action)
|
||||
{
|
||||
$this->actions[$group][md5(serialize($action))] = $action;
|
||||
$this->actions[$group][md5(get_class($action))] = $action;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -62,7 +59,7 @@ class Configuration
|
||||
*/
|
||||
public function registerExport($group, ExportBase $export)
|
||||
{
|
||||
$this->exports[$group][md5(serialize($export))] = $export;
|
||||
$this->exports[$group][md5(get_class($export))] = $export;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -162,6 +159,12 @@ class Configuration
|
||||
*/
|
||||
public function getExportById($id) : ExportBase
|
||||
{
|
||||
return $this->getAllExports()[$id];
|
||||
$allExports = $this->getAllExports();
|
||||
|
||||
if (false == $allExports[$id]) {
|
||||
throw oxNew(DataWizardException::class, 'no export with id '.$id);
|
||||
}
|
||||
|
||||
return $allExports[$id];
|
||||
}
|
||||
}
|
@ -17,6 +17,6 @@ namespace D3\DataWizard\Application\Model\Exceptions;
|
||||
|
||||
use OxidEsales\Eshop\Core\Exception\StandardException;
|
||||
|
||||
class RenderException extends StandardException implements DataWizardException
|
||||
class DataWizardException extends StandardException
|
||||
{
|
||||
}
|
@ -16,10 +16,9 @@ declare(strict_types=1);
|
||||
namespace D3\DataWizard\Application\Model\Exceptions;
|
||||
|
||||
use Exception;
|
||||
use OxidEsales\Eshop\Core\Exception\StandardException;
|
||||
use OxidEsales\Eshop\Core\Registry;
|
||||
|
||||
class DebugException extends StandardException implements DataWizardException
|
||||
class DebugException extends DataWizardException
|
||||
{
|
||||
public function __construct($sMessage = "not set", $iCode = 0, Exception $previous = null )
|
||||
{
|
32
Application/Model/Exceptions/ExportFileException.php
Normal file
32
Application/Model/Exceptions/ExportFileException.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* https://www.d3data.de
|
||||
*
|
||||
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
|
||||
* @author D3 Data Development - Daniel Seifert <info@shopmodule.com>
|
||||
* @link https://www.oxidmodule.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace D3\DataWizard\Application\Model\Exceptions;
|
||||
|
||||
use Exception;
|
||||
use OxidEsales\Eshop\Core\Registry;
|
||||
|
||||
class ExportFileException extends DataWizardException
|
||||
{
|
||||
public function __construct($sMessage = "not set", $iCode = 0, Exception $previous = null )
|
||||
{
|
||||
$sMessage = sprintf(
|
||||
Registry::getLang()->translateString('D3_DATAWIZARD_ERR_EXPORTFILEERROR'),
|
||||
$sMessage
|
||||
);
|
||||
|
||||
parent::__construct($sMessage, $iCode, $previous );
|
||||
}
|
||||
}
|
53
Application/Model/Exceptions/InputUnvalidException.php
Normal file
53
Application/Model/Exceptions/InputUnvalidException.php
Normal file
@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* https://www.d3data.de
|
||||
*
|
||||
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
|
||||
* @author D3 Data Development - Daniel Seifert <info@shopmodule.com>
|
||||
* @link https://www.oxidmodule.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace D3\DataWizard\Application\Model\Exceptions;
|
||||
|
||||
use D3\DataWizard\Application\Model\QueryBase;
|
||||
use Exception;
|
||||
use FormManager\Inputs\Input;
|
||||
|
||||
class InputUnvalidException extends DataWizardException
|
||||
{
|
||||
/** @var QueryBase */
|
||||
public $task;
|
||||
|
||||
/**
|
||||
* InputUnvalidException constructor.
|
||||
* @param QueryBase $task
|
||||
* @param Input $inputElement
|
||||
* @param int $iCode
|
||||
* @param Exception|null $previous
|
||||
* @throws Exception
|
||||
*/
|
||||
public function __construct( QueryBase $task, Input $inputElement, $iCode = 0, Exception $previous = null )
|
||||
{
|
||||
$messages = [];
|
||||
foreach ($inputElement->getError()->getIterator() as $item) {
|
||||
$messages[] = $inputElement->label->innerHTML.' -> '.$item->getMessage();
|
||||
}
|
||||
|
||||
$sMessage = implode(
|
||||
' - ',
|
||||
[
|
||||
$task->getTitle(),
|
||||
implode(', ', $messages)
|
||||
]
|
||||
);
|
||||
parent::__construct( $sMessage, $iCode, $previous );
|
||||
|
||||
$this->task = $task;
|
||||
}
|
||||
}
|
@ -16,10 +16,9 @@ declare(strict_types=1);
|
||||
namespace D3\DataWizard\Application\Model\Exceptions;
|
||||
|
||||
use Exception;
|
||||
use OxidEsales\Eshop\Core\Exception\StandardException;
|
||||
use OxidEsales\Eshop\Core\Registry;
|
||||
|
||||
class NoSuitableRendererException extends StandardException implements DataWizardException
|
||||
class NoSuitableRendererException extends DataWizardException
|
||||
{
|
||||
public function __construct($sMessage = "not set", $iCode = 0, Exception $previous = null )
|
||||
{
|
@ -15,6 +15,6 @@ declare(strict_types=1);
|
||||
|
||||
namespace D3\DataWizard\Application\Model\Exceptions;
|
||||
|
||||
interface DataWizardException
|
||||
class RenderException extends DataWizardException
|
||||
{
|
||||
}
|
@ -17,9 +17,8 @@ namespace D3\DataWizard\Application\Model\Exceptions;
|
||||
|
||||
use D3\DataWizard\Application\Model\QueryBase;
|
||||
use Exception;
|
||||
use OxidEsales\Eshop\Core\Exception\StandardException;
|
||||
|
||||
class TaskException extends StandardException implements DataWizardException
|
||||
class TaskException extends DataWizardException
|
||||
{
|
||||
/** @var QueryBase */
|
||||
public $task;
|
@ -15,11 +15,16 @@ declare(strict_types=1);
|
||||
|
||||
namespace D3\DataWizard\Application\Model;
|
||||
|
||||
use D3\DataWizard\Application\Model\Exceptions\ExportFileException;
|
||||
use D3\DataWizard\Application\Model\Exceptions\InputUnvalidException;
|
||||
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 FormManager\Inputs\Checkbox;
|
||||
use FormManager\Inputs\Input;
|
||||
use FormManager\Inputs\Radio;
|
||||
use OxidEsales\Eshop\Core\DatabaseProvider;
|
||||
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
|
||||
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
|
||||
@ -28,6 +33,8 @@ use OxidEsales\Eshop\Core\Registry;
|
||||
|
||||
abstract class ExportBase implements QueryBase
|
||||
{
|
||||
protected $formElements = [];
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
@ -38,6 +45,7 @@ abstract class ExportBase implements QueryBase
|
||||
|
||||
/**
|
||||
* @param string $format
|
||||
* @param $path
|
||||
*
|
||||
* @throws DBALException
|
||||
* @throws DatabaseConnectionException
|
||||
@ -47,19 +55,36 @@ abstract class ExportBase implements QueryBase
|
||||
* @throws StandardException
|
||||
* @throws d3ShopCompatibilityAdapterException
|
||||
* @throws d3_cfg_mod_exception
|
||||
* @return string
|
||||
*/
|
||||
public function run($format = RendererBridge::FORMAT_CSV)
|
||||
public function run( string $format = RendererBridge::FORMAT_CSV, $path = null): string
|
||||
{
|
||||
if ($this->hasFormElements()) {
|
||||
/** @var Input $element */
|
||||
foreach ($this->getFormElements() as $element) {
|
||||
if (false === $element->isValid()) {
|
||||
throw oxNew(InputUnvalidException::class, $this, $element);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[ $rows, $fieldNames ] = $this->getExportData( $this->getQuery() );
|
||||
|
||||
$content = $this->renderContent($rows, $fieldNames, $format);
|
||||
|
||||
/** @var $oFS d3filesystem */
|
||||
$oFS = oxNew(d3filesystem::class);
|
||||
$oFS->startDirectDownload(
|
||||
$oFS->filterFilename($this->getExportFileName($format)),
|
||||
$content
|
||||
);
|
||||
$oFS = oxNew( d3filesystem::class );
|
||||
if (is_null($path)) {
|
||||
$oFS->startDirectDownload( $oFS->filterFilename( $this->getExportFileName( $format ) ), $content );
|
||||
} else {
|
||||
$filePath = $oFS->trailingslashit($path).$oFS->filterFilename( $this->getExportFileName( $format ) );
|
||||
if (false === $oFS->createFile($filePath, $content,true)) {
|
||||
throw oxNew(ExportFileException::class, $filePath);
|
||||
}
|
||||
return $filePath;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
@ -160,4 +185,38 @@ abstract class ExportBase implements QueryBase
|
||||
|
||||
return [ $rows, $fieldNames ];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Input $input
|
||||
*/
|
||||
public function registerFormElement(Input $input)
|
||||
{
|
||||
switch (get_class($input)) {
|
||||
case Radio::class:
|
||||
case Checkbox::class:
|
||||
$input->setTemplate('<p class="form-check">{{ input }} {{ label }}</p>');
|
||||
$input->setAttribute('class', 'form-check-input');
|
||||
break;
|
||||
default:
|
||||
$input->setTemplate('<p class="formElements">{{ label }} {{ input }}</p>');
|
||||
$input->setAttribute('class', 'form-control');
|
||||
}
|
||||
$this->formElements[] = $input;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasFormElements(): bool
|
||||
{
|
||||
return (bool) count($this->formElements);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getFormElements(): array
|
||||
{
|
||||
return $this->formElements;
|
||||
}
|
||||
}
|
@ -22,19 +22,32 @@ class RendererBridge
|
||||
const FORMAT_CSV = 'CSV';
|
||||
const FORMAT_PRETTY = 'Pretty';
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getRendererList(): array
|
||||
{
|
||||
return [
|
||||
self::FORMAT_CSV => oxNew(Csv::class),
|
||||
self::FORMAT_PRETTY => oxNew(Pretty::class)
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $format
|
||||
*
|
||||
* @throws NoSuitableRendererException
|
||||
* @return RendererInterface
|
||||
* @throws NoSuitableRendererException
|
||||
*/
|
||||
public function getRenderer($format = self::FORMAT_CSV): RendererInterface
|
||||
public function getRenderer(string $format = self::FORMAT_CSV): RendererInterface
|
||||
{
|
||||
switch ($format) {
|
||||
case self::FORMAT_CSV:
|
||||
return oxNew(Csv::class);
|
||||
case self::FORMAT_PRETTY:
|
||||
return oxNew(Pretty::class);
|
||||
$format = strtolower($format);
|
||||
|
||||
$rendererList = array_change_key_case($this->getRendererList(), CASE_LOWER);
|
||||
$rendererListTypes = array_keys(array_change_key_case($rendererList, CASE_LOWER));
|
||||
|
||||
if (in_array($format, $rendererListTypes, true)) {
|
||||
return $rendererList[$format];
|
||||
}
|
||||
|
||||
/** @var NoSuitableRendererException $e */
|
@ -15,6 +15,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace D3\DataWizard\Application\Model;
|
||||
|
||||
use FormManager\Inputs\Input;
|
||||
|
||||
interface QueryBase
|
||||
{
|
||||
public function run();
|
||||
@ -38,4 +40,19 @@ interface QueryBase
|
||||
* @return array [string $query, array $parameters]
|
||||
*/
|
||||
public function getQuery() : array;
|
||||
|
||||
/**
|
||||
* @param Input $input
|
||||
*/
|
||||
public function registerFormElement(Input $input);
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasFormElements(): bool;
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getFormElements(): array;
|
||||
}
|
@ -27,13 +27,13 @@ $aLang = array(
|
||||
|
||||
'SHOP_MODULE_GROUP_d3datawizard_general' => 'Grundeinstellungen',
|
||||
'SHOP_MODULE_d3datawizard_debug' => 'zeigt Abfragen anstatt diese auszufĂĽhren',
|
||||
'SHOP_MODULE_d3datawizard_hideexamples' => 'Beispielexporte ausblenden',
|
||||
|
||||
'D3_DATAWIZARD_GROUP_ARTICLES' => 'Artikel',
|
||||
'D3_DATAWIZARD_GROUP_CATEGORIES' => 'Kategorien',
|
||||
'D3_DATAWIZARD_GROUP_ORDERS' => 'Bestellungen',
|
||||
'D3_DATAWIZARD_GROUP_REMARKS' => 'Bewertungen',
|
||||
'D3_DATAWIZARD_GROUP_SHOP' => 'Shop',
|
||||
'D3_DATAWIZARD_GROUP_CMS' => 'CMS-Texte',
|
||||
'D3_DATAWIZARD_GROUP_USERS' => 'Benutzer',
|
||||
|
||||
'D3_DATAWIZARD_EXPORT_SUBMIT' => 'Export starten',
|
||||
@ -48,20 +48,10 @@ $aLang = array(
|
||||
'D3_DATAWIZARD_ERR_NOEXPORT_INSTALLED' => 'Es sind keine Exporte installiert oder aktiviert.',
|
||||
'D3_DATAWIZARD_ERR_NOEXPORTCONTENT' => 'Export ist leer, kein Inhalt zum Download verfĂĽgbar',
|
||||
'D3_DATAWIZARD_ERR_NOSUITABLERENDERER' => 'kein Renderer fĂĽr Format "%1$s" registriert',
|
||||
|
||||
'D3_DATAWIZARD_EXPORTS_INACTIVECATEGORIES' => 'deaktivierte Kategorien, mit aktiven Artikel',
|
||||
'D3_DATAWIZARD_EXPORTS_INACTIVECATEGORIES_TREE' => 'Baum',
|
||||
'D3_DATAWIZARD_EXPORTS_INACTIVECATEGORIES_TITLE' => 'Titel',
|
||||
'D3_DATAWIZARD_EXPORTS_INACTIVECATEGORIES_COUNT' => 'Anzahl',
|
||||
|
||||
'D3_DATAWIZARD_EXPORTS_KEYFIGURES' => 'Bestellungskennzahlen nach Monat',
|
||||
'D3_DATAWIZARD_EXPORTS_KEYFIGURES_ORDERSPERMONTH' => 'Bestellungen pro Monat',
|
||||
'D3_DATAWIZARD_EXPORTS_KEYFIGURES_BASKETSIZE' => 'Warenkorbhöhe',
|
||||
'D3_DATAWIZARD_EXPORTS_KEYFIGURES_MONTH' => 'Monat',
|
||||
'D3_DATAWIZARD_ERR_EXPORTFILEERROR' => 'Exportdatei "%1$s" kann nicht angelegt werden',
|
||||
|
||||
'D3_DATAWIZARD_ERR_ACTIONSELECT' => 'Aktion kann nicht ausgeführt werden. Aktionen können keine SELECTs exportieren.',
|
||||
'D3_DATAWIZARD_ERR_NOACTION_INSTALLED' => 'Es sind keine Aktionen installiert oder aktiviert.',
|
||||
'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',
|
||||
);
|
57
Application/views/admin/en/d3DataWizard_lang.php
Normal file
57
Application/views/admin/en/d3DataWizard_lang.php
Normal file
@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* https://www.d3data.de
|
||||
*
|
||||
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
|
||||
* @author D3 Data Development - Daniel Seifert <info@shopmodule.com>
|
||||
* @link https://www.oxidmodule.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
$sLangName = "English";
|
||||
// -------------------------------
|
||||
// RESOURCE IDENTITFIER = STRING
|
||||
// -------------------------------
|
||||
$aLang = array(
|
||||
|
||||
//Navigation
|
||||
'charset' => 'UTF-8',
|
||||
'd3mxDataWizard' => '<i class="fas fa-fw fa-hat-wizard"></i> Data Wizard',
|
||||
'd3mxDataWizard_Export' => 'exports',
|
||||
'd3mxDataWizard_Action' => 'actions',
|
||||
|
||||
'SHOP_MODULE_GROUP_d3datawizard_general' => 'basic settings',
|
||||
'SHOP_MODULE_d3datawizard_debug' => 'shows queries instead of executing them',
|
||||
|
||||
'D3_DATAWIZARD_GROUP_ARTICLES' => 'articles',
|
||||
'D3_DATAWIZARD_GROUP_CATEGORIES' => 'categories',
|
||||
'D3_DATAWIZARD_GROUP_ORDERS' => 'orders',
|
||||
'D3_DATAWIZARD_GROUP_REMARKS' => 'remarks',
|
||||
'D3_DATAWIZARD_GROUP_SHOP' => 'shop',
|
||||
'D3_DATAWIZARD_GROUP_CMS' => 'CMS items',
|
||||
'D3_DATAWIZARD_GROUP_USERS' => 'users',
|
||||
|
||||
'D3_DATAWIZARD_EXPORT_SUBMIT' => 'generate export',
|
||||
'D3_DATAWIZARD_EXPORT_FORMAT_CSV' => 'CSV format',
|
||||
'D3_DATAWIZARD_EXPORT_FORMAT_PRETTY' => 'Pretty format',
|
||||
|
||||
'D3_DATAWIZARD_ACTION_SUBMIT' => 'run action',
|
||||
|
||||
'D3_DATAWIZARD_DEBUG' => 'Debug: %1$s',
|
||||
|
||||
'D3_DATAWIZARD_ERR_NOEXPORTSELECT' => 'Export cannot be executed. Exports require SELECT Query.',
|
||||
'D3_DATAWIZARD_ERR_NOEXPORT_INSTALLED' => 'No exports are installed or activated.',
|
||||
'D3_DATAWIZARD_ERR_NOEXPORTCONTENT' => 'Export is empty, no content available for download',
|
||||
'D3_DATAWIZARD_ERR_NOSUITABLERENDERER' => 'No renderer registered for format "%1$s"',
|
||||
'D3_DATAWIZARD_ERR_EXPORTFILEERROR' => 'Export file "%1$s" cannot be created',
|
||||
|
||||
'D3_DATAWIZARD_ERR_ACTIONSELECT' => 'Action cannot be executed. Actions cannot export SELECTs.',
|
||||
'D3_DATAWIZARD_ERR_NOACTION_INSTALLED' => 'No actions are installed or activated.',
|
||||
'D3_DATAWIZARD_ERR_ACTIONRESULT' => '%1$s entry changed',
|
||||
'D3_DATAWIZARD_ERR_ACTIONRESULTS' => '%1$s entries changed',
|
||||
);
|
4
Application/views/admin/tpl/d3ActionWizard.tpl
Normal file
4
Application/views/admin/tpl/d3ActionWizard.tpl
Normal file
@ -0,0 +1,4 @@
|
||||
[{capture assign="d3dw_backgroundimage"}]linear-gradient(22.5deg, rgba(66, 66, 66, 0.02) 0%, rgba(66, 66, 66, 0.02) 11%,rgba(135, 135, 135, 0.02) 11%, rgba(135, 135, 135, 0.02) 24%,rgba(29, 29, 29, 0.02) 24%, rgba(29, 29, 29, 0.02) 38%,rgba(15, 15, 15, 0.02) 38%, rgba(15, 15, 15, 0.02) 50%,rgba(180, 180, 180, 0.02) 50%, rgba(180, 180, 180, 0.02) 77%,rgba(205, 205, 205, 0.02) 77%, rgba(205, 205, 205, 0.02) 100%),linear-gradient(67.5deg, rgba(10, 10, 10, 0.02) 0%, rgba(10, 10, 10, 0.02) 22%,rgba(52, 52, 52, 0.02) 22%, rgba(52, 52, 52, 0.02) 29%,rgba(203, 203, 203, 0.02) 29%, rgba(203, 203, 203, 0.02) 30%,rgba(69, 69, 69, 0.02) 30%, rgba(69, 69, 69, 0.02) 75%,rgba(231, 231, 231, 0.02) 75%, rgba(231, 231, 231, 0.02) 95%,rgba(138, 138, 138, 0.02) 95%, rgba(138, 138, 138, 0.02) 100%),linear-gradient(112.5deg, rgba(221, 221, 221, 0.02) 0%, rgba(221, 221, 221, 0.02) 17%,rgba(190, 190, 190, 0.02) 17%, rgba(190, 190, 190, 0.02) 39%,rgba(186, 186, 186, 0.02) 39%, rgba(186, 186, 186, 0.02) 66%,rgba(191, 191, 191, 0.02) 66%, rgba(191, 191, 191, 0.02) 68%,rgba(16, 16, 16, 0.02) 68%, rgba(16, 16, 16, 0.02) 70%,rgba(94, 94, 94, 0.02) 70%, rgba(94, 94, 94, 0.02) 100%),linear-gradient(90deg, #ffffff,#ffffff)[{/capture}]
|
||||
[{capture assign="d3dw_noitemmessageid"}]D3_DATAWIZARD_ERR_NOACTION_INSTALLED[{/capture}]
|
||||
|
||||
[{include file="d3Wizards.tpl" submit="d3ActionSubmit.tpl"}]
|
4
Application/views/admin/tpl/d3ExportWizard.tpl
Normal file
4
Application/views/admin/tpl/d3ExportWizard.tpl
Normal file
@ -0,0 +1,4 @@
|
||||
[{capture assign="d3dw_backgroundimage"}]linear-gradient(339deg, rgba(47, 47, 47,0.02) 0%, rgba(47, 47, 47,0.02) 42%,transparent 42%, transparent 99%,rgba(17, 17, 17,0.02) 99%, rgba(17, 17, 17,0.02) 100%),linear-gradient(257deg, rgba(65, 65, 65,0.02) 0%, rgba(65, 65, 65,0.02) 11%,transparent 11%, transparent 92%,rgba(53, 53, 53,0.02) 92%, rgba(53, 53, 53,0.02) 100%),linear-gradient(191deg, rgba(5, 5, 5,0.02) 0%, rgba(5, 5, 5,0.02) 1%,transparent 1%, transparent 45%,rgba(19, 19, 19,0.02) 45%, rgba(19, 19, 19,0.02) 100%),linear-gradient(29deg, rgba(28, 28, 28,0.02) 0%, rgba(28, 28, 28,0.02) 33%,transparent 33%, transparent 40%,rgba(220, 220, 220,0.02) 40%, rgba(220, 220, 220,0.02) 100%),linear-gradient(90deg, rgb(255,255,255),rgb(255,255,255))[{/capture}]
|
||||
[{capture assign="d3dw_noitemmessageid"}]D3_DATAWIZARD_ERR_NOEXPORT_INSTALLED[{/capture}]
|
||||
|
||||
[{include file="d3Wizards.tpl" submit="d3ExportSubmit.tpl"}]
|
@ -15,7 +15,7 @@
|
||||
}
|
||||
/* Image courtesy of gradientmagic.com */
|
||||
body {
|
||||
background-image: linear-gradient(22.5deg, rgba(66, 66, 66, 0.02) 0%, rgba(66, 66, 66, 0.02) 11%,rgba(135, 135, 135, 0.02) 11%, rgba(135, 135, 135, 0.02) 24%,rgba(29, 29, 29, 0.02) 24%, rgba(29, 29, 29, 0.02) 38%,rgba(15, 15, 15, 0.02) 38%, rgba(15, 15, 15, 0.02) 50%,rgba(180, 180, 180, 0.02) 50%, rgba(180, 180, 180, 0.02) 77%,rgba(205, 205, 205, 0.02) 77%, rgba(205, 205, 205, 0.02) 100%),linear-gradient(67.5deg, rgba(10, 10, 10, 0.02) 0%, rgba(10, 10, 10, 0.02) 22%,rgba(52, 52, 52, 0.02) 22%, rgba(52, 52, 52, 0.02) 29%,rgba(203, 203, 203, 0.02) 29%, rgba(203, 203, 203, 0.02) 30%,rgba(69, 69, 69, 0.02) 30%, rgba(69, 69, 69, 0.02) 75%,rgba(231, 231, 231, 0.02) 75%, rgba(231, 231, 231, 0.02) 95%,rgba(138, 138, 138, 0.02) 95%, rgba(138, 138, 138, 0.02) 100%),linear-gradient(112.5deg, rgba(221, 221, 221, 0.02) 0%, rgba(221, 221, 221, 0.02) 17%,rgba(190, 190, 190, 0.02) 17%, rgba(190, 190, 190, 0.02) 39%,rgba(186, 186, 186, 0.02) 39%, rgba(186, 186, 186, 0.02) 66%,rgba(191, 191, 191, 0.02) 66%, rgba(191, 191, 191, 0.02) 68%,rgba(16, 16, 16, 0.02) 68%, rgba(16, 16, 16, 0.02) 70%,rgba(94, 94, 94, 0.02) 70%, rgba(94, 94, 94, 0.02) 100%),linear-gradient(90deg, #ffffff,#ffffff);
|
||||
background-image: [{$d3dw_backgroundimage}];
|
||||
}
|
||||
h4 .btn {
|
||||
font-size: 1.3rem;
|
||||
@ -23,10 +23,14 @@
|
||||
h5.card-header {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
.formElements label {
|
||||
display: inline-block;
|
||||
margin: .5rem 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
[{capture name="d3script"}][{strip}]
|
||||
function startAction(id) {
|
||||
function startTask(id, format = '') {
|
||||
let elements = document.getElementsByClassName('errorbox');
|
||||
for (var i = 0; i < elements.length; i++){
|
||||
elements[i].style.display = 'none';
|
||||
@ -37,7 +41,8 @@
|
||||
}, 3000);
|
||||
document.getElementById('mask').className='on';
|
||||
document.getElementById('popup2').className='d3loader-2 on';
|
||||
document.getElementById('actionid').value = id;
|
||||
document.getElementById('taskid').value = id;
|
||||
document.getElementById('format').value = format;
|
||||
document.getElementById('myedit').submit();
|
||||
}
|
||||
[{/strip}][{/capture}]
|
||||
@ -46,8 +51,9 @@
|
||||
<form name="myedit" id="myedit" action="[{$oViewConf->getSelfLink()}]" method="post" style="padding: 0;margin: 0;height:0;">
|
||||
[{$oViewConf->getHiddenSid()}]
|
||||
<input type="hidden" name="cl" value="[{$oViewConf->getActiveClassName()}]">
|
||||
<input type="hidden" name="fnc" value="doAction">
|
||||
<input type="hidden" name="actionid" id="actionid" value="">
|
||||
<input type="hidden" name="fnc" value="runTask">
|
||||
<input type="hidden" name="taskid" id="taskid" value="">
|
||||
<input type="hidden" name="format" id="format" value="CSV">
|
||||
|
||||
[{assign var="groups" value=$oView->getGroups()}]
|
||||
[{if $groups|@count}]
|
||||
@ -65,24 +71,37 @@
|
||||
<div id="collapse[{$group}]" class="collapse" aria-labelledby="heading[{$group}]" data-parent="#accordion">
|
||||
<div class="card-body pb-0">
|
||||
<div class="row">
|
||||
[{foreach from=$oView->getGroupActions($group) key="id" item="action"}]
|
||||
[{foreach from=$oView->getGroupTasks($group) key="id" item="item"}]
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 pb-4">
|
||||
<div class="card">
|
||||
<h5 class="card-header">
|
||||
[{$action->getTitle()}]
|
||||
[{$item->getTitle()}]
|
||||
</h5>
|
||||
<div class="card-body">
|
||||
<p class="card-text">
|
||||
[{$action->getDescription()}]
|
||||
</p>
|
||||
[{if $item->getDescription()}]
|
||||
[{assign var="description" value=$item->getDescription()}]
|
||||
[{assign var="sectionlength" value="100"}]
|
||||
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-primary" onclick="startAction('[{$id}]')">
|
||||
<i class="fas fa-magic"></i>
|
||||
[{oxmultilang ident=$action->getButtonText()}]
|
||||
</button>
|
||||
</div>
|
||||
[{if $description|count_characters:true <= $sectionlength}]
|
||||
<p class="card-text">[{$description}]</p>
|
||||
[{else}]
|
||||
[{assign var="shorttext" value=$description|truncate:$sectionlength:''}]
|
||||
<p class="card-text" data-toggle="collapse" data-target="#collapseExample" aria-expanded="false" aria-controls="collapseExample" style="cursor: pointer">
|
||||
[{$shorttext}]...
|
||||
</p>
|
||||
<p class="card-text collapse" id="collapseExample">
|
||||
...[{$description|replace:$shorttext:''}]
|
||||
</p>
|
||||
[{/if}]
|
||||
[{/if}]
|
||||
|
||||
[{if $item->hasFormElements()}]
|
||||
[{foreach from=$item->getFormElements() item="formElement"}]
|
||||
[{$formElement}]
|
||||
[{/foreach}]
|
||||
[{/if}]
|
||||
|
||||
[{include file=$submit}]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -98,7 +117,7 @@
|
||||
</div>
|
||||
[{else}]
|
||||
<div class="alert alert-primary" role="alert">
|
||||
[{oxmultilang ident="D3_DATAWIZARD_ERR_NOACTION_INSTALLED"}]
|
||||
[{oxmultilang ident=$d3dw_noitemmessageid}]
|
||||
</div>
|
||||
[{/if}]
|
||||
</form>
|
6
Application/views/admin/tpl/inc/actionSubmit.tpl
Normal file
6
Application/views/admin/tpl/inc/actionSubmit.tpl
Normal file
@ -0,0 +1,6 @@
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-primary" onclick="startTask('[{$id}]')">
|
||||
<i class="fas fa-magic"></i>
|
||||
[{oxmultilang ident=$item->getButtonText()}]
|
||||
</button>
|
||||
</div>
|
22
Application/views/admin/tpl/inc/exportSubmit.tpl
Normal file
22
Application/views/admin/tpl/inc/exportSubmit.tpl
Normal file
@ -0,0 +1,22 @@
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-primary" onclick="startTask('[{$id}]', 'CSV')">
|
||||
<i class="fas fa-magic"></i>
|
||||
[{oxmultilang ident=$item->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=$item->getButtonText()}]
|
||||
</span>
|
||||
</button>
|
||||
<div class="dropdown-menu">
|
||||
[{block name="dataWizardFormat"}]
|
||||
<button class="dropdown-item" onclick="startTask('[{$id}]', 'CSV')">
|
||||
[{oxmultilang ident="D3_DATAWIZARD_EXPORT_FORMAT_CSV"}]
|
||||
</button>
|
||||
<button class="dropdown-item" onclick="startTask('[{$id}]', 'Pretty')">
|
||||
[{oxmultilang ident="D3_DATAWIZARD_EXPORT_FORMAT_PRETTY"}]
|
||||
</button>
|
||||
[{/block}]
|
||||
</div>
|
||||
</div>
|
21
CHANGELOG.md
21
CHANGELOG.md
@ -1,5 +1,26 @@
|
||||
# Changelog
|
||||
|
||||
## 1.3.0.0 (2021-07-29)
|
||||
|
||||
- can handle long task description text
|
||||
- has more generic admin controller templates
|
||||
|
||||
---
|
||||
|
||||
## 1.2.0.0 (2021-07-27)
|
||||
|
||||
- adjustments for CLI extension
|
||||
- fix OXID 6.1 incompatibilities
|
||||
|
||||
---
|
||||
|
||||
## 1.1.0.0 (2021-06-25)
|
||||
|
||||
- implement form builder
|
||||
- fix key figures export
|
||||
|
||||
---
|
||||
|
||||
## 1.0.0.0 (2021-06-22)
|
||||
|
||||
- initial implementation
|
22
README.en.md
22
README.en.md
@ -10,8 +10,6 @@ All exports are grouped together for better clarity.
|
||||
|
||||
Sample exports are included in the scope of delivery. These are intended to serve as an implementation reference for individual exports. The display of the sample exports can be deactivated in the basic module settings.
|
||||
|
||||
Translated with www.DeepL.com/Translator (free version)
|
||||
|
||||
## Installation
|
||||
|
||||
In the console in the shop root (above source and vendor), execute the following command:
|
||||
@ -20,9 +18,9 @@ In the console in the shop root (above source and vendor), execute the following
|
||||
php composer require d3/datawizard
|
||||
```
|
||||
|
||||
Activate in the admin area of the shop under "Extensions -> Modules".
|
||||
Activate the module in the admin area of the shop in "Extensions -> Modules".
|
||||
|
||||
# Extensibility
|
||||
## Extensibility
|
||||
|
||||
The module represents the technical basic framework of the exports and does not claim to be complete. In order to adapt the scope to individual requirements, the following extensions are prepared:
|
||||
|
||||
@ -32,24 +30,24 @@ The module represents the technical basic framework of the exports and does not
|
||||
|
||||
Independently of this, all extension options are available that the OXID Shop provides for modules.
|
||||
|
||||
## Add exports
|
||||
### Add exports
|
||||
|
||||
### Define export
|
||||
#### Define export
|
||||
|
||||
Each export is defined in a separate class. This export class must extend the class `D3\DataWizard\Application\Model\ExportBase`. All necessary functions are predefined in it. The following methods are available:
|
||||
|
||||
#### mandatory method calls:
|
||||
##### mandatory method calls:
|
||||
- getTitle() - defines the title in the admin area and the base of the later export file name.
|
||||
- getQuery() - contains the query as a prepared statement that defines the data to be exported
|
||||
|
||||
#### optional method calls:
|
||||
##### optional method calls:
|
||||
- getDescription() - contains a short additional description of the export, this will be shown in the admin area
|
||||
- getButtonText() - defines the text of the submit button in the admin area
|
||||
- getExportFilenameBase() - defines the base of the later export filename
|
||||
- executeQuery() - returns the compiled export data
|
||||
- further methods, the adaptation of which, however, can lead to changed module behaviour and should therefore only be changed with caution
|
||||
|
||||
### Register exports
|
||||
#### Register exports
|
||||
|
||||
In order to be able to use the created export in the module, it must be registered. For this purpose there is the class `D3\DataWizard\Application\Model\Configuration`. This is to be overloaded with the possibilities of the OXID shop and the method `configure()` contained therein is to be supplemented. The following call is available for registering an export:
|
||||
|
||||
@ -64,7 +62,7 @@ The first parameter contains the language identifier for the export group. Typic
|
||||
See [CHANGELOG](CHANGELOG.md) for further informations.
|
||||
|
||||
## Licence of this software (d3/datawizard)
|
||||
(status: 06.05.2021)
|
||||
(status: 2021-05-06)
|
||||
|
||||
```
|
||||
Copyright (c) D3 Data Development (Inh. Thomas Dartsch)
|
||||
@ -92,7 +90,7 @@ Gradients available on the site are free to use on personal and commercial proje
|
||||
The following software packages are not part of this module. However, they are required for use. The linked packages are under the following licences:
|
||||
|
||||
### league/csv [MIT]
|
||||
(https://github.com/thephpleague/csv - status: 06.05.2021)
|
||||
(https://github.com/thephpleague/csv - status: 2021-05-06)
|
||||
|
||||
```
|
||||
Copyright (c) 2013-2017 ignace nyamagana butera
|
||||
@ -116,7 +114,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
```
|
||||
|
||||
### mathieuviossat/arraytotexttable [MIT]
|
||||
(https://github.com/viossat/arraytotexttable - status: 06.05.2021)
|
||||
(https://github.com/viossat/arraytotexttable - status: 2021-05-06)
|
||||
|
||||
```
|
||||
Copyright (c) 2015 Mathieu Viossat
|
||||
|
@ -18,6 +18,8 @@ Auf der Konsole im Shoproot (oberhalb von source und vendor) folgenden Befehl au
|
||||
php composer require d3/datawizard
|
||||
```
|
||||
|
||||
Aktivieren Sie das Modul im Shopadmin unter "Erweiterungen -> Module".
|
||||
|
||||
## Erweiterbarkeit
|
||||
|
||||
Das Modul stellt das technische Grundgerüst der Exporte dar und erhebt keinen Anspruch auf Vollständigkeit. Um den Umfang an die individuellen Anforderungen anzupassen, sind folgende Erweiterungen vorbereitet:
|
||||
|
@ -28,14 +28,22 @@
|
||||
"php": ">=7.1",
|
||||
"oxid-esales/oxideshop-ce": "6.3 - 6.8",
|
||||
"league/csv": "^9.0",
|
||||
"mathieuviossat/arraytotexttable": "^1.0"
|
||||
"mathieuviossat/arraytotexttable": "^1.0",
|
||||
"form-manager/form-manager": "^5.1 || ^6.1"
|
||||
},
|
||||
"extra": {
|
||||
"oxideshop": {
|
||||
"source-directory": "/src",
|
||||
"blacklist-filter": [
|
||||
"*.md",
|
||||
"composer.json"
|
||||
],
|
||||
"target-directory": "d3/datawizard"
|
||||
}
|
||||
},
|
||||
"suggest": {
|
||||
"d3/datawizardtasks": "useful example tasks for Data Wizard",
|
||||
"d3/datawizardcli": "command line implementation for fully automated Data Wizard tasks"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"D3\\DataWizard\\": "../../../source/modules/d3/datawizard"
|
||||
|
@ -32,7 +32,7 @@ $aModule = [
|
||||
'en' => '',
|
||||
],
|
||||
'thumbnail' => '',
|
||||
'version' => '0.1',
|
||||
'version' => '1.3.0.0',
|
||||
'author' => 'D³ Data Development (Inh.: Thomas Dartsch)',
|
||||
'email' => 'support@shopmodule.com',
|
||||
'url' => 'https://www.oxidmodule.com/',
|
||||
@ -45,6 +45,9 @@ $aModule = [
|
||||
'templates' => [
|
||||
'd3ExportWizard.tpl' => 'd3/datawizard/Application/views/admin/tpl/d3ExportWizard.tpl',
|
||||
'd3ActionWizard.tpl' => 'd3/datawizard/Application/views/admin/tpl/d3ActionWizard.tpl',
|
||||
'd3Wizards.tpl' => 'd3/datawizard/Application/views/admin/tpl/inc/Wizards.tpl',
|
||||
'd3ExportSubmit.tpl' => 'd3/datawizard/Application/views/admin/tpl/inc/exportSubmit.tpl',
|
||||
'd3ActionSubmit.tpl' => 'd3/datawizard/Application/views/admin/tpl/inc/actionSubmit.tpl',
|
||||
],
|
||||
'settings' => [
|
||||
[
|
||||
@ -52,13 +55,7 @@ $aModule = [
|
||||
'name' => $sModuleId.'_debug',
|
||||
'type' => 'bool',
|
||||
'value' => false
|
||||
],
|
||||
[
|
||||
'group' => $sModuleId.'_general',
|
||||
'name' => $sModuleId.'_hideexamples',
|
||||
'type' => 'bool',
|
||||
'value' => false
|
||||
],
|
||||
]
|
||||
],
|
||||
'blocks' => []
|
||||
];
|
@ -1,89 +0,0 @@
|
||||
<?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<74>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;
|
||||
}
|
||||
}
|
@ -1,77 +0,0 @@
|
||||
<?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
|
||||
*/
|
||||
|
||||
namespace D3\DataWizard\Application\Model\Exports;
|
||||
|
||||
use D3\DataWizard\Application\Model\ExportBase;
|
||||
use OxidEsales\Eshop\Application\Model\Article;
|
||||
use OxidEsales\Eshop\Application\Model\Category;
|
||||
use OxidEsales\Eshop\Application\Model\Object2Category;
|
||||
use OxidEsales\Eshop\Core\Registry;
|
||||
|
||||
class InactiveCategories extends ExportBase
|
||||
{
|
||||
/**
|
||||
* Kategorien -deaktiviert, mit aktiven Artikel
|
||||
*/
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getTitle() : string
|
||||
{
|
||||
return Registry::getLang()->translateString('D3_DATAWIZARD_EXPORTS_INACTIVECATEGORIES');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getQuery() : array
|
||||
{
|
||||
$categoryTableName = oxNew(Category::class)->getCoreTableName();
|
||||
$object2categoryTableName = oxNew(Object2Category::class)->getCoreTableName();
|
||||
$articleTableName = oxNew(Article::class)->getCoreTableName();
|
||||
|
||||
$treeTitle = Registry::getLang()->translateString('D3_DATAWIZARD_EXPORTS_INACTIVECATEGORIES_TREE');
|
||||
$titleTitle = Registry::getLang()->translateString('D3_DATAWIZARD_EXPORTS_INACTIVECATEGORIES_TITLE');
|
||||
$countTitle = Registry::getLang()->translateString('D3_DATAWIZARD_EXPORTS_INACTIVECATEGORIES_COUNT');
|
||||
|
||||
return [
|
||||
"SELECT
|
||||
oc.OXID,
|
||||
oc.OXSHOPID,
|
||||
oc.oxtitle as :titleTitle,
|
||||
(
|
||||
SELECT GROUP_CONCAT(oxtitle ORDER BY oxleft ASC SEPARATOR ' > ')
|
||||
from ".$categoryTableName."
|
||||
WHERE OXLEFT < oc.oxleft AND OXRIGHT > oc.oxright AND OXROOTID = oc.OXROOTID AND OXSHOPID = oc.OXSHOPID
|
||||
) as :treeTitle,
|
||||
COUNT(oa.oxid) as :countTitle
|
||||
FROM ".$categoryTableName." oc
|
||||
LEFT JOIN ".$object2categoryTableName." o2c ON oc.OXID = o2c.OXCATNID
|
||||
LEFT JOIN ".$articleTableName." oa ON o2c.OXOBJECTID = oa.OXID
|
||||
WHERE oc.OXACTIVE = :categoryActive AND oa.OXACTIVE = :articleActive
|
||||
GROUP BY oc.oxid
|
||||
ORDER BY oc.oxleft ASC",
|
||||
[
|
||||
'categoryActive' => 0,
|
||||
'articleActive' => 1,
|
||||
'titleTitle' => $titleTitle,
|
||||
'treeTitle' => $treeTitle,
|
||||
'countTitle' => $countTitle
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
<?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
|
||||
*/
|
||||
|
||||
namespace D3\DataWizard\Application\Model\Exports;
|
||||
|
||||
use D3\DataWizard\Application\Model\ExportBase;
|
||||
use OxidEsales\Eshop\Application\Model\Order;
|
||||
use OxidEsales\Eshop\Core\Registry;
|
||||
|
||||
class KeyFigures extends ExportBase
|
||||
{
|
||||
/**
|
||||
* Shopkennzahlen
|
||||
*/
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getTitle() : string
|
||||
{
|
||||
return Registry::getLang()->translateString('D3_DATAWIZARD_EXPORTS_KEYFIGURES');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getQuery() : array
|
||||
{
|
||||
$orderTable = oxNew(Order::class)->getCoreTableName();
|
||||
$ordersTitle = Registry::getLang()->translateString('D3_DATAWIZARD_EXPORTS_KEYFIGURES_ORDERSPERMONTH');
|
||||
$basketsTitle = Registry::getLang()->translateString('D3_DATAWIZARD_EXPORTS_KEYFIGURES_BASKETSIZE');
|
||||
$monthTitle = Registry::getLang()->translateString('D3_DATAWIZARD_EXPORTS_KEYFIGURES_MONTH');
|
||||
|
||||
return [
|
||||
'SELECT
|
||||
DATE_FORMAT(oo.oxorderdate, "%Y-%m") as :monthTitle,
|
||||
FORMAT(COUNT(oo.oxid), 0) AS :ordersTitle,
|
||||
FORMAT(SUM(oo.OXTOTALBRUTSUM / oo.oxcurrate) / COUNT(oo.oxid), 2) as :basketsTitle
|
||||
FROM '.$orderTable.' AS oo
|
||||
GROUP BY :monthTitle
|
||||
ORDER BY :monthTitle DESC
|
||||
LIMIT 30',
|
||||
[
|
||||
'monthTitle' => $monthTitle,
|
||||
'ordersTitle' => $ordersTitle,
|
||||
'basketsTitle' => $basketsTitle
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
@ -1,133 +0,0 @@
|
||||
[{include file="headitem.tpl" title="GENERAL_ADMIN_TITLE"|oxmultilangassign}]
|
||||
|
||||
[{oxstyle include="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"}]
|
||||
[{oxscript include="https://code.jquery.com/jquery-3.2.1.slim.min.js"}]
|
||||
[{oxscript include="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"}]
|
||||
[{oxscript include="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"}]
|
||||
[{oxstyle include="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/solid.min.css"}]
|
||||
|
||||
<style>
|
||||
button {
|
||||
margin: 1em 1em 1em 5em;
|
||||
}
|
||||
html {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
/* Image courtesy of gradientmagic.com */
|
||||
body {
|
||||
background-image: linear-gradient(339deg, rgba(47, 47, 47,0.02) 0%, rgba(47, 47, 47,0.02) 42%,transparent 42%, transparent 99%,rgba(17, 17, 17,0.02) 99%, rgba(17, 17, 17,0.02) 100%),linear-gradient(257deg, rgba(65, 65, 65,0.02) 0%, rgba(65, 65, 65,0.02) 11%,transparent 11%, transparent 92%,rgba(53, 53, 53,0.02) 92%, rgba(53, 53, 53,0.02) 100%),linear-gradient(191deg, rgba(5, 5, 5,0.02) 0%, rgba(5, 5, 5,0.02) 1%,transparent 1%, transparent 45%,rgba(19, 19, 19,0.02) 45%, rgba(19, 19, 19,0.02) 100%),linear-gradient(29deg, rgba(28, 28, 28,0.02) 0%, rgba(28, 28, 28,0.02) 33%,transparent 33%, transparent 40%,rgba(220, 220, 220,0.02) 40%, rgba(220, 220, 220,0.02) 100%),linear-gradient(90deg, rgb(255,255,255),rgb(255,255,255));
|
||||
}
|
||||
h4 .btn {
|
||||
font-size: 1.3rem;
|
||||
}
|
||||
h5.card-header {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
[{capture name="d3script"}][{strip}]
|
||||
function startExport(id, format) {
|
||||
let elements = document.getElementsByClassName('errorbox');
|
||||
for (var i = 0; i < elements.length; i++){
|
||||
elements[i].style.display = 'none';
|
||||
}
|
||||
setTimeout(function(){
|
||||
document.getElementById('mask').className='';
|
||||
document.getElementById('popup2').className='d3loader-2';
|
||||
}, 3000);
|
||||
document.getElementById('mask').className='on';
|
||||
document.getElementById('popup2').className='d3loader-2 on';
|
||||
document.getElementById('exportid').value = id;
|
||||
document.getElementById('exportformat').value = format;
|
||||
document.getElementById('myedit').submit();
|
||||
}
|
||||
[{/strip}][{/capture}]
|
||||
[{oxscript add=$smarty.capture.d3script}]
|
||||
|
||||
<form name="myedit" id="myedit" action="[{$oViewConf->getSelfLink()}]" method="post" style="padding: 0;margin: 0;height:0;">
|
||||
[{$oViewConf->getHiddenSid()}]
|
||||
<input type="hidden" name="cl" value="[{$oViewConf->getActiveClassName()}]">
|
||||
<input type="hidden" name="fnc" value="doExport">
|
||||
<input type="hidden" name="exportid" id="exportid" value="">
|
||||
<input type="hidden" name="exportformat" id="exportformat" value="CSV">
|
||||
|
||||
[{assign var="groups" value=$oView->getGroups()}]
|
||||
[{if $groups|@count}]
|
||||
<div id="accordion">
|
||||
[{foreach from=$oView->getGroups() item="group"}]
|
||||
<div class="card mb-2">
|
||||
<div class="card-header p-1" id="heading[{$group}]">
|
||||
<h4 class="mb-0">
|
||||
<span class="btn p-1" data-toggle="collapse" data-target="#collapse[{$group}]" aria-expanded="false" aria-controls="collapse[{$group}]">
|
||||
[{oxmultilang ident=$group}]
|
||||
</span>
|
||||
</h4>
|
||||
</div>
|
||||
|
||||
<div id="collapse[{$group}]" class="collapse" aria-labelledby="heading[{$group}]" data-parent="#accordion">
|
||||
<div class="card-body pb-0">
|
||||
<div class="row">
|
||||
[{foreach from=$oView->getGroupExports($group) key="id" item="export"}]
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 pb-4">
|
||||
<div class="card">
|
||||
<h5 class="card-header">
|
||||
[{$export->getTitle()}]
|
||||
</h5>
|
||||
<div class="card-body">
|
||||
<p class="card-text">
|
||||
[{$export->getDescription()}]
|
||||
</p>
|
||||
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-primary" onclick="startExport('[{$id}]', 'CSV')">
|
||||
<i class="fas fa-magic"></i>
|
||||
[{oxmultilang ident=$export->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>
|
||||
<div class="dropdown-menu">
|
||||
[{block name="dataWizardExportFormat"}]
|
||||
<button class="dropdown-item" onclick="startExport('[{$id}]', 'CSV')">
|
||||
[{oxmultilang ident="D3_DATAWIZARD_EXPORT_FORMAT_CSV"}]
|
||||
</button>
|
||||
<button class="dropdown-item" onclick="startExport('[{$id}]', 'Pretty')">
|
||||
[{oxmultilang ident="D3_DATAWIZARD_EXPORT_FORMAT_PRETTY"}]
|
||||
</button>
|
||||
[{/block}]
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
[{/foreach}]
|
||||
</div>
|
||||
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
[{/foreach}]
|
||||
</div>
|
||||
[{else}]
|
||||
<div class="alert alert-primary" role="alert">
|
||||
[{oxmultilang ident="D3_DATAWIZARD_ERR_NOEXPORT_INSTALLED"}]
|
||||
</div>
|
||||
[{/if}]
|
||||
</form>
|
||||
|
||||
<div id="mask" class=""></div>
|
||||
<div id="popup2" class="d3loader-2">
|
||||
<div class="d3loader-spinner">
|
||||
<div class="d3loader-circle-1"></div>
|
||||
<div class="d3loader-circle-2"></div>
|
||||
<div class="d3loader-circle-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
[{include file="d3_cfg_mod_inc.tpl"}]
|
Reference in New Issue
Block a user