Comparer les révisions

..

6 Révisions

69 fichiers modifiés avec 687 ajouts et 1248 suppressions

5
.gitattributes externe
Voir le fichier

@ -1,5 +0,0 @@
* text=auto
/.gitattributes export-ignore
/.gitignore export-ignore
/.php-cs-fixer.php export-ignore

1
.gitignore externe
Voir le fichier

@ -1 +0,0 @@
.php-cs-fixer.cache

Voir le fichier

@ -1,13 +0,0 @@
<?php
$finder = PhpCsFixer\Finder::create()
->in(__DIR__)
;
$config = new PhpCsFixer\Config();
return $config->setRules([
'@PHP73Migration' => true,
'@PSR12' => true
])
->setFinder($finder)
;

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -16,26 +16,25 @@ declare(strict_types=1);
namespace D3\DataWizard\Application\Controller\Admin;
use D3\DataWizard\Application\Model\Configuration;
use D3\DataWizard\Application\Model\Constants;
use D3\DataWizard\Application\Model\Exceptions\DataWizardException;
use D3\DataWizard\Application\Model\Exceptions\DebugException;
use D3\DataWizard\Application\Model\Exceptions\InputUnvalidException;
use D3\DataWizard\Application\Model\Exceptions\TaskException;
use D3\ModCfg\Application\Model\d3database;
use Doctrine\DBAL\Exception as DBALException;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\DBALException;
use OxidEsales\Eshop\Application\Controller\Admin\AdminDetailsController;
use OxidEsales\Eshop\Core\Config;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Facade\ModuleSettingService;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Facade\ModuleSettingServiceInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class d3ActionWizard extends AdminDetailsController
{
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3ActionWizard';
protected $_sThisTemplate = 'd3ActionWizard.tpl';
protected Configuration $configuration;
/** @var Configuration */
protected $configuration;
public function __construct()
{
@ -44,79 +43,68 @@ class d3ActionWizard extends AdminDetailsController
$this->configuration = oxNew(Configuration::class);
}
public function getViewId(): string
{
return 'd3mxDataWizard_Action';
}
public function getGroups(): array
public function getGroups()
{
return $this->configuration->getActionGroups();
}
public function getGroupTasks($group): array
public function getGroupTasks($group)
{
return $this->configuration->getActionsByGroup($group);
}
/**
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws DatabaseConnectionException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function runTask(): void
public function runTask()
{
try {
$this->execute();
} catch (DataWizardException|DBALException $e) {
} catch (DataWizardException|DBALException|DatabaseErrorException $e) {
Registry::getLogger()->error($e->getMessage());
Registry::getUtilsView()->addErrorToDisplay($e);
}
}
/**
* @throws ContainerExceptionInterface
* @throws DBALException
* @throws DebugException
* @throws InputUnvalidException
* @throws NotFoundExceptionInterface
* @throws TaskException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
protected function execute(): void
protected function execute()
{
$id = Registry::getRequest()->getRequestEscapedParameter('taskid');
$action = $this->configuration->getActionById($id);
[ $queryString, $parameters ] = $action->getQuery();
if ($this->getSettingsService()->getBoolean('d3datawizard_debug', Constants::OXID_MODULE_ID)) {
/** @var DebugException $debug */
$debug = oxNew(
if ($this->d3GetConfig()->getConfigParam('d3datawizard_debug')) {
throw oxNew(
DebugException::class,
d3database::getInstance()->getPreparedStatementQuery($queryString, $parameters)
);
throw $debug;
}
$action->run();
}
/**
* @return ModuleSettingService
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @return Config
*/
public function getSettingsService(): ModuleSettingServiceInterface
public function d3GetConfig()
{
return ContainerFactory::getInstance()->getContainer()->get(ModuleSettingServiceInterface::class);
return Registry::getConfig();
}
public function getUserMessages(): ?string
public function getUserMessages()
{
return null;
}
public function getHelpURL(): ?string
public function getHelpURL()
{
return null;
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -16,31 +16,27 @@ declare(strict_types=1);
namespace D3\DataWizard\Application\Controller\Admin;
use D3\DataWizard\Application\Model\Configuration;
use D3\DataWizard\Application\Model\Constants;
use D3\DataWizard\Application\Model\Exceptions\DataWizardException;
use D3\DataWizard\Application\Model\Exceptions\DebugException;
use D3\DataWizard\Application\Model\Exceptions\NoSuitableRendererException;
use D3\DataWizard\Application\Model\Exceptions\TaskException;
use D3\ModCfg\Application\Model\d3database;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Driver\Exception;
use Doctrine\DBAL\Exception as DBALException;
use Doctrine\DBAL\DBALException;
use OxidEsales\Eshop\Application\Controller\Admin\AdminDetailsController;
use OxidEsales\Eshop\Core\Config;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Facade\ModuleSettingService;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Facade\ModuleSettingServiceInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class d3ExportWizard extends AdminDetailsController
{
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3ExportWizard';
protected $_sThisTemplate = 'd3ExportWizard.tpl';
protected Configuration $configuration;
/** @var Configuration */
protected $configuration;
public function __construct()
{
@ -49,31 +45,23 @@ class d3ExportWizard extends AdminDetailsController
$this->configuration = oxNew(Configuration::class);
}
public function getViewId(): string
{
return 'd3mxDataWizard_Export';
}
public function getGroups(): array
public function getGroups()
{
return $this->configuration->getExportGroups();
}
public function getGroupTasks($group): array
public function getGroupTasks($group)
{
return $this->configuration->getExportsByGroup($group);
}
/**
* @throws ContainerExceptionInterface
* @throws DatabaseConnectionException
* @throws Exception
* @throws NotFoundExceptionInterface
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function runTask(): void
public function runTask()
{
try {
$this->execute();
@ -87,22 +75,20 @@ class d3ExportWizard extends AdminDetailsController
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws NoSuitableRendererException
* @throws StandardException
* @throws Exception
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws NoSuitableRendererException
* @throws TaskException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function execute(): void
protected function execute()
{
$id = Registry::getRequest()->getRequestEscapedParameter('taskid');
$export = $this->configuration->getExportById($id);
[ $queryString, $parameters ] = $export->getQuery();
if ($this->getSettingsService()->getBoolean('d3datawizard_debug', Constants::OXID_MODULE_ID)) {
if ($this->d3GetConfig()->getConfigParam('d3datawizard_debug')) {
throw oxNew(
DebugException::class,
d3database::getInstance()->getPreparedStatementQuery($queryString, $parameters)
@ -113,22 +99,20 @@ class d3ExportWizard extends AdminDetailsController
}
/**
* @return ModuleSettingService
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @return Config
*/
public function getSettingsService(): ModuleSettingServiceInterface
public function d3GetConfig()
{
return ContainerFactory::getInstance()->getContainer()->get(ModuleSettingServiceInterface::class);
return Registry::getConfig();
}
public function getUserMessages(): ?string
public function getUserMessages()
{
return null;
}
public function getHelpURL(): ?string
public function getHelpURL()
{
return null;
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -16,84 +16,71 @@ declare(strict_types=1);
namespace D3\DataWizard\Application\Model;
use D3\DataWizard\Application\Model\Exceptions\InputUnvalidException;
use D3\DataWizard\Application\Model\Exceptions\TaskException;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Exception as DBALException;
use FormManager\Inputs\Checkbox;
use FormManager\Inputs\Input;
use FormManager\Inputs\Radio;
use OxidEsales\Eshop\Core\Database\Adapter\DatabaseInterface;
use OxidEsales\Eshop\Core\DatabaseProvider;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Database\ConnectionProviderInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
abstract class ActionBase implements QueryBase
{
protected array $formElements = [];
protected $formElements = [];
/**
* Ensure that the translations are equally available in the frontend and the backend
* @return string
*/
public function getDescription(): string
public function getDescription() : string
{
return '';
}
/**
* @throws ContainerExceptionInterface
* @throws DBALException
* @throws InputUnvalidException
* @throws NotFoundExceptionInterface
* @throws TaskException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function run(): void
public function run()
{
if ($this->hasFormElements()) {
/** @var Input $element */
foreach ($this->getFormElements() as $element) {
if (false === $element->isValid()) {
/** @var InputUnvalidException $exception */
$exception = oxNew(InputUnvalidException::class, $this, $element);
throw $exception;
throw oxNew(InputUnvalidException::class, $this, $element);
}
}
}
$this->executeAction($this->getQuery());
$this->executeAction( $this->getQuery() );
}
/**
* @param array $query
*
* @return void
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws TaskException
* @throws DBALException
* @return int
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function executeAction(array $query): void
public function executeAction( array $query ): int
{
[ $queryString, $parameters ] = $query;
$queryString = trim($queryString);
if (strtolower(substr($queryString, 0, 6)) === 'select') {
/** @var TaskException $exception */
$exception = oxNew(
TaskException::class,
if ( strtolower( substr( $queryString, 0, 6 ) ) === 'select' ) {
throw oxNew(
Exceptions\TaskException::class,
$this,
Registry::getLang()->translateString('D3_DATAWIZARD_ERR_ACTIONSELECT')
Registry::getLang()->translateString( 'D3_DATAWIZARD_ERR_ACTIONSELECT' )
);
throw $exception;
}
$affected = (int) $this->getConnection()->executeStatement($queryString, $parameters);
$affected = $this->d3GetDb()->execute( $queryString, $parameters );
/** @var TaskException $exception */
$exception = oxNew(
TaskException::class,
throw oxNew(
Exceptions\TaskException::class,
$this,
sprintf(
Registry::getLang()->translateString(
@ -102,18 +89,21 @@ abstract class ActionBase implements QueryBase
$affected
)
);
throw $exception;
}
protected function getConnection(): Connection
/**
* @return DatabaseInterface|null
* @throws DatabaseConnectionException
*/
public function d3GetDb()
{
return ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get();
return DatabaseProvider::getDb( DatabaseProvider::FETCH_MODE_ASSOC );
}
/**
* @return string
*/
public function getButtonText(): string
public function getButtonText() : string
{
return "D3_DATAWIZARD_ACTION_SUBMIT";
}
@ -121,7 +111,7 @@ abstract class ActionBase implements QueryBase
/**
* @param Input $input
*/
public function registerFormElement(Input $input): void
public function registerFormElement(Input $input)
{
if ($input instanceof Radio || $input instanceof Checkbox) {
$input->setTemplate('<p class="form-check">{{ input }} {{ label }}</p>');
@ -148,4 +138,4 @@ abstract class ActionBase implements QueryBase
{
return $this->formElements;
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -15,20 +15,24 @@ 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;
class Configuration
{
public const GROUP_SHOP = 'D3_DATAWIZARD_GROUP_SHOP';
public const GROUP_CATEGORY = 'D3_DATAWIZARD_GROUP_CATEGORIES';
public const GROUP_ARTICLES = 'D3_DATAWIZARD_GROUP_ARTICLES';
public const GROUP_USERS = 'D3_DATAWIZARD_GROUP_USERS';
public const GROUP_ORDERS = 'D3_DATAWIZARD_GROUP_ORDERS';
public const GROUP_REMARKS = 'D3_DATAWIZARD_GROUP_REMARKS';
public const GROUP_CMS = 'D3_DATAWIZARD_GROUP_CMS';
const GROUP_SHOP = 'D3_DATAWIZARD_GROUP_SHOP';
const GROUP_CATEGORY = 'D3_DATAWIZARD_GROUP_CATEGORIES';
const GROUP_ARTICLES = 'D3_DATAWIZARD_GROUP_ARTICLES';
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 array $actions = [];
protected array $exports = [];
protected $actions = [];
protected $exports = [];
public function __construct()
{
@ -44,7 +48,7 @@ class Configuration
* @param $group
* @param ActionBase $action
*/
public function registerAction($group, ActionBase $action): void
public function registerAction($group, ActionBase $action)
{
$this->actions[$group][md5(get_class($action))] = $action;
}
@ -53,7 +57,7 @@ class Configuration
* @param $group
* @param ExportBase $export
*/
public function registerExport($group, ExportBase $export): void
public function registerExport($group, ExportBase $export)
{
$this->exports[$group][md5(get_class($export))] = $export;
}
@ -93,9 +97,9 @@ class Configuration
/**
* @param $group
*
* @return array
* @return mixed
*/
public function getActionsByGroup($group): array
public function getActionsByGroup($group)
{
return $this->actions[$group];
}
@ -103,9 +107,9 @@ class Configuration
/**
* @param $group
*
* @return array
* @return mixed
*/
public function getExportsByGroup($group): array
public function getExportsByGroup($group)
{
return $this->exports[$group];
}
@ -113,7 +117,7 @@ class Configuration
/**
* @return array
*/
public function getAllActions(): array
public function getAllActions() : array
{
$all = [];
@ -127,7 +131,7 @@ class Configuration
/**
* @return array
*/
public function getAllExports(): array
public function getAllExports() : array
{
$all = [];
@ -143,11 +147,11 @@ class Configuration
*
* @return ActionBase
*/
public function getActionById($id): ActionBase
public function getActionById($id) : ActionBase
{
$allActions = $this->getAllActions();
if ( ! $allActions[ $id ] ) {
if (false == $allActions[$id]) {
throw oxNew(DataWizardException::class, 'no action with id '.$id);
}
@ -159,11 +163,11 @@ class Configuration
*
* @return ExportBase
*/
public function getExportById($id): ExportBase
public function getExportById($id) : ExportBase
{
$allExports = $this->getAllExports();
if ( ! $allExports[ $id ] ) {
if (false == $allExports[$id]) {
throw oxNew(DataWizardException::class, 'no export with id '.$id);
}

Voir le fichier

@ -1,21 +0,0 @@
<?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 <support@shopmodule.com>
* @link https://www.oxidmodule.com
*/
declare(strict_types=1);
namespace D3\DataWizard\Application\Model;
class Constants
{
public const OXID_MODULE_ID = 'd3datawizard';
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -19,4 +19,4 @@ use OxidEsales\Eshop\Core\Exception\StandardException;
class DataWizardException extends StandardException
{
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -20,13 +20,13 @@ use OxidEsales\Eshop\Core\Registry;
class DebugException extends DataWizardException
{
public function __construct($sMessage = "not set", $iCode = 0, Exception $previous = null)
public function __construct($sMessage = "not set", $iCode = 0, Exception $previous = null )
{
$sMessage = sprintf(
Registry::getLang()->translateString('D3_DATAWIZARD_DEBUG'),
$sMessage
);
parent::__construct($sMessage, $iCode, $previous);
parent::__construct($sMessage, $iCode, $previous );
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -20,13 +20,13 @@ use OxidEsales\Eshop\Core\Registry;
class ExportFileException extends DataWizardException
{
public function __construct($sMessage = "not set", $iCode = 0, Exception $previous = null)
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);
parent::__construct($sMessage, $iCode, $previous );
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -21,7 +21,8 @@ use FormManager\Inputs\Input;
class InputUnvalidException extends DataWizardException
{
public QueryBase $task;
/** @var QueryBase */
public $task;
/**
* InputUnvalidException constructor.
@ -31,7 +32,7 @@ class InputUnvalidException extends DataWizardException
* @param Exception|null $previous
* @throws Exception
*/
public function __construct(QueryBase $task, Input $inputElement, $iCode = 0, Exception $previous = null)
public function __construct( QueryBase $task, Input $inputElement, $iCode = 0, Exception $previous = null )
{
$messages = [];
foreach ($inputElement->getError()->getIterator() as $item) {
@ -42,11 +43,11 @@ class InputUnvalidException extends DataWizardException
' - ',
[
$task->getTitle(),
implode(', ', $messages),
implode(', ', $messages)
]
);
parent::__construct($sMessage, $iCode, $previous);
parent::__construct( $sMessage, $iCode, $previous );
$this->task = $task;
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -20,13 +20,13 @@ use OxidEsales\Eshop\Core\Registry;
class NoSuitableRendererException extends DataWizardException
{
public function __construct($sMessage = "not set", $iCode = 0, Exception $previous = null)
public function __construct($sMessage = "not set", $iCode = 0, Exception $previous = null )
{
$sMessage = sprintf(
Registry::getLang()->translateString('D3_DATAWIZARD_ERR_NOSUITABLERENDERER'),
$sMessage
);
parent::__construct($sMessage, $iCode, $previous);
parent::__construct($sMessage, $iCode, $previous );
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -17,4 +17,4 @@ namespace D3\DataWizard\Application\Model\Exceptions;
class RenderException extends DataWizardException
{
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -20,19 +20,20 @@ use Exception;
class TaskException extends DataWizardException
{
public QueryBase $task;
/** @var QueryBase */
public $task;
public function __construct(QueryBase $task, $sMessage = "not set", $iCode = 0, Exception $previous = null)
public function __construct( QueryBase $task, $sMessage = "not set", $iCode = 0, Exception $previous = null )
{
$sMessage = implode(
' - ',
[
$task->getTitle(),
$sMessage,
$sMessage
]
);
parent::__construct($sMessage, $iCode, $previous);
parent::__construct( $sMessage, $iCode, $previous );
$this->task = $task;
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -15,60 +15,50 @@ declare(strict_types=1);
namespace D3\DataWizard\Application\Model;
use Assert\Assert;
use D3\DataWizard\Application\Model\Exceptions\ExportFileException;
use D3\DataWizard\Application\Model\Exceptions\InputUnvalidException;
use D3\DataWizard\Application\Model\Exceptions\NoSuitableRendererException;
use D3\DataWizard\Application\Model\ExportRenderer\RendererBridge;
use D3\DataWizard\Application\Model\ExportRenderer\RendererInterface;
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\Connection;
use Doctrine\DBAL\Driver\Exception;
use Doctrine\DBAL\Exception as DBALException;
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;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Database\ConnectionProviderInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
abstract class ExportBase implements QueryBase
{
protected array $formElements = [];
protected $formElements = [];
/**
* Ensure that the translations are equally available in the frontend and the backend
* @return string
*/
public function getDescription(): string
public function getDescription() : string
{
return '';
}
/**
* @param string $format
* @param null $path
* @param $path
*
* @return string
* @throws ContainerExceptionInterface
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws Exception
* @throws NoSuitableRendererException
* @throws NotFoundExceptionInterface
* @throws Exceptions\NoSuitableRendererException
* @throws Exceptions\TaskException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @return string
*/
public function run(string $format = RendererBridge::FORMAT_CSV, $path = null): string
public function run( string $format = RendererBridge::FORMAT_CSV, $path = null): string
{
if ($this->hasFormElements()) {
/** @var Input $element */
@ -85,28 +75,37 @@ abstract class ExportBase implements QueryBase
/**
* @return string
*/
public function getButtonText(): string
public function getButtonText() : string
{
return "D3_DATAWIZARD_EXPORT_SUBMIT";
}
/**
* @throws NoSuitableRendererException
* @param $format
*
* @return ExportRenderer\RendererInterface
* @throws Exceptions\NoSuitableRendererException
*/
public function getRenderer(string $format): RendererInterface
public function getRenderer($format): ExportRenderer\RendererInterface
{
return $this->getRendererBridge()->getRenderer($format);
}
public function getRendererBridge(): RendererBridge
/**
* @return RendererBridge
*/
public function getRendererBridge()
{
return oxNew(RendererBridge::class);
}
/**
* @throws NoSuitableRendererException
* @param $format
*
* @return string
* @throws Exceptions\NoSuitableRendererException
*/
public function getFileExtension(string $format): string
public function getFileExtension($format): string
{
return $this->getRenderer($format)->getFileExtension();
}
@ -128,7 +127,7 @@ abstract class ExportBase implements QueryBase
/**
* @return string
*/
public function getExportFilenameBase(): string
public function getExportFilenameBase() : string
{
return $this->getTitle();
}
@ -139,7 +138,7 @@ abstract class ExportBase implements QueryBase
* @return string
* @throws Exceptions\NoSuitableRendererException
*/
public function getExportFileName($format): string
public function getExportFileName($format) : string
{
return $this->getExportFilenameBase().'_'.date('Y-m-d_H-i-s').'.'.$this->getFileExtension($format);
}
@ -148,47 +147,42 @@ abstract class ExportBase implements QueryBase
* @param array $query
*
* @return array
* @throws DBALException
* @throws Exception
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getExportData(array $query): array
public function getExportData( array $query ): array
{
[ $queryString, $parameters ] = $query;
Assert::that($queryString)->string();
Assert::that($parameters)->isArray();
$queryString = trim($queryString);
if (strtolower(substr($queryString, 0, 6)) !== 'select') {
if ( strtolower( substr( $queryString, 0, 6 ) ) !== 'select' ) {
throw oxNew(
Exceptions\TaskException::class,
$this,
Registry::getLang()->translateString('D3_DATAWIZARD_ERR_NOEXPORTSELECT')
Registry::getLang()->translateString( 'D3_DATAWIZARD_ERR_NOEXPORTSELECT' )
);
}
$rows = $this->getConnection()->executeQuery($queryString, $parameters)->fetchAllAssociative();
$rows = $this->d3GetDb()->getAll( $queryString, $parameters );
if (count($rows) <= 0) {
if ( count( $rows ) <= 0 ) {
throw oxNew(
Exceptions\TaskException::class,
$this,
Registry::getLang()->translateString('D3_DATAWIZARD_ERR_NOEXPORTCONTENT', null, true)
Registry::getLang()->translateString( 'D3_DATAWIZARD_ERR_NOEXPORTCONTENT', null, true )
);
}
$fieldNames = array_keys($rows[0]);
$fieldNames = array_keys( $rows[0] );
return [ $rows, $fieldNames ];
}
protected function getConnection(): Connection
{
return ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get();
}
public function registerFormElement(Input $input): void
/**
* @param Input $input
*/
public function registerFormElement(Input $input)
{
if ($input instanceof Radio || $input instanceof Checkbox) {
$input->setTemplate('<p class="form-check">{{ input }} {{ label }}</p>');
@ -218,30 +212,27 @@ abstract class ExportBase implements QueryBase
/**
* @param string $format
* @param $path
*
* @param $path
* @return string
* @throws ContainerExceptionInterface
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws Exception
* @throws NoSuitableRendererException
* @throws NotFoundExceptionInterface
* @throws Exceptions\NoSuitableRendererException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function executeExport(string $format, $path): string
{
$content = $this->getContent($format);
$content = $this->getContent( $format );
/** @var $oFS d3filesystem */
$oFS = $this->getFileSystem();
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)) {
if (false === $oFS->createFile($filePath, $content, true)) {
throw oxNew(ExportFileException::class, $filePath);
}
return $filePath;
@ -250,7 +241,19 @@ abstract class ExportBase implements QueryBase
return '';
}
protected function getFileSystem(): d3filesystem
/**
* @return \OxidEsales\Eshop\Core\Database\Adapter\DatabaseInterface|null
* @throws DatabaseConnectionException
*/
protected function d3GetDb(): ?\OxidEsales\Eshop\Core\Database\Adapter\DatabaseInterface
{
return DatabaseProvider::getDb(DatabaseProvider::FETCH_MODE_ASSOC);
}
/**
* @return d3filesystem|mixed
*/
protected function getFileSystem()
{
return oxNew(d3filesystem::class);
}
@ -259,16 +262,16 @@ abstract class ExportBase implements QueryBase
* @param string $format
*
* @return string
* @throws ContainerExceptionInterface
* @throws DBALException
* @throws Exception
* @throws NoSuitableRendererException
* @throws NotFoundExceptionInterface
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws Exceptions\NoSuitableRendererException
*/
public function getContent(string $format): string
public function getContent( string $format ): string
{
[ $rows, $fieldNames ] = $this->getExportData($this->getQuery());
[ $rows, $fieldNames ] = $this->getExportData( $this->getQuery() );
return $this->renderContent($rows, $fieldNames, $format);
$content = $this->renderContent( $rows, $fieldNames, $format );
return $content;
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -16,7 +16,7 @@ declare(strict_types=1);
namespace D3\DataWizard\Application\Model\ExportRenderer;
use D3\DataWizard\Application\Model\Exceptions\RenderException;
use League\Csv\ColumnConsistency;
use League\Csv\EncloseField;
use League\Csv\Exception;
use League\Csv\Writer;
use OxidEsales\Eshop\Core\Config;
@ -24,27 +24,23 @@ use OxidEsales\Eshop\Core\Registry;
class Csv implements RendererInterface
{
public function __construct(protected bool $forceEnclose = false)
{}
/**
* @param iterable $rows
* @param iterable $fieldNames
* @param $rows
* @param $fieldNames
*
* @return string
* @throws RenderException
*/
public function getContent(iterable $rows, iterable $fieldNames): string
public function getContent($rows, $fieldNames): string
{
try {
$csv = $this->getCsv();
$this->forceEnclose ? $csv->forceEnclosure() : $csv->relaxEnclosure();
$csv->insertOne((array) $fieldNames);
$csv->insertAll($rows);
return (string) $csv;
$csv->insertOne( $fieldNames );
$csv->insertAll( $rows );
return method_exists($csv, 'getContent') ? $csv->getContent() : (string) $csv;
} catch (Exception $e) {
/** @var RenderException $newException */
$newException = oxNew(RenderException::class, $e->getMessage(), $e->getCode(), $e);
$newException = oxNew(RenderException::class, $e->getMessage(), $e->getCode(), $e );
throw $newException;
}
}
@ -62,14 +58,20 @@ class Csv implements RendererInterface
{
$csv = Writer::createFromString();
$sEncloser = $this->d3GetConfig()->getConfigParam('sGiCsvFieldEncloser') ?? '"';
EncloseField::addTo($csv, "\t\x1f");
$sEncloser = $this->d3GetConfig()->getConfigParam('sGiCsvFieldEncloser');
if (false == $sEncloser) {
$sEncloser = '"';
}
$csv->setEnclosure($sEncloser);
$sDelimiter = $this->d3GetConfig()->getConfigParam('sCSVSign') ?? ';';
$sDelimiter = $this->d3GetConfig()->getConfigParam('sCSVSign');
if (false == $sDelimiter) {
$sDelimiter = ';';
}
$csv->setDelimiter($sDelimiter);
$csv->addValidator(new ColumnConsistency(), 'columns_consistency');
return $csv;
}
@ -84,8 +86,8 @@ class Csv implements RendererInterface
/**
* @return Config
*/
public function d3GetConfig(): Config
public function d3GetConfig()
{
return Registry::getConfig();
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -16,27 +16,24 @@ declare(strict_types=1);
namespace D3\DataWizard\Application\Model\ExportRenderer;
use D3\DataWizard\Application\Model\Exceptions\RenderException;
use JsonException;
class Json implements RendererInterface
{
/**
* @param iterable $rows
* @param iterable $fieldNames
* @param $rows
* @param $fieldNames
*
* @return string
* @throws RenderException
*/
public function getContent( iterable $rows, iterable $fieldNames): string
public function getContent($rows, $fieldNames): string
{
try {
$flags = JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES;
return json_encode($rows, $flags);
} catch (JsonException $e) {
/** @var RenderException $newException */
$newException = oxNew(RenderException::class, $e->getMessage(), $e->getCode(), $e);
throw $newException;
$flags = JSON_PRETTY_PRINT;
$json = json_encode( $rows, $flags );
if ( $json === false ) {
throw oxNew( RenderException::class, json_last_error_msg(), json_last_error());
}
return $json;
}
public function getFileExtension(): string
@ -51,4 +48,4 @@ class Json implements RendererInterface
{
return "D3_DATAWIZARD_EXPORT_FORMAT_JSON";
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -20,12 +20,12 @@ use MathieuViossat\Util\ArrayToTextTable;
class Pretty implements RendererInterface
{
/**
* @param iterable $rows
* @param iterable $fieldNames
* @param $rows
* @param $fieldNames
*
* @return string
*/
public function getContent(iterable $rows, iterable $fieldNames): string
public function getContent($rows, $fieldNames) : string
{
$renderer = $this->getArrayToTextTableInstance($rows);
return $renderer->getTable();
@ -35,7 +35,7 @@ class Pretty implements RendererInterface
* @param $rows
* @return ArrayToTextTable
*/
public function getArrayToTextTableInstance($rows): ArrayToTextTable
public function getArrayToTextTableInstance($rows)
{
return oxNew(ArrayToTextTable::class, $rows);
}
@ -55,4 +55,4 @@ class Pretty implements RendererInterface
{
return "D3_DATAWIZARD_EXPORT_FORMAT_PRETTY";
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -19,9 +19,9 @@ use D3\DataWizard\Application\Model\Exceptions\NoSuitableRendererException;
class RendererBridge
{
public const FORMAT_CSV = 'CSV';
public const FORMAT_PRETTY = 'Pretty';
public const FORMAT_JSON = 'JSON';
const FORMAT_CSV = 'CSV';
const FORMAT_PRETTY = 'Pretty';
const FORMAT_JSON = 'JSON';
/**
* @return array
@ -31,11 +31,11 @@ class RendererBridge
return [
self::FORMAT_CSV => oxNew(Csv::class),
self::FORMAT_PRETTY => oxNew(Pretty::class),
self::FORMAT_JSON => oxNew(Json::class),
self::FORMAT_JSON => oxNew(Json::class)
];
}
public function getTranslatedRendererIdList(): array
public function getTranslatedRendererIdList()
{
$rendererList = $this->getRendererList();
array_walk($rendererList, [$this, 'translateRendererId']);
@ -45,7 +45,7 @@ class RendererBridge
/**
* @param RendererInterface $instance
*/
protected function translateRendererId(RendererInterface &$instance): void
protected function translateRendererId(RendererInterface &$instance)
{
$instance = $instance->getTitleTranslationId();
}
@ -60,8 +60,8 @@ class RendererBridge
{
$format = strtolower($format);
$rendererList = array_change_key_case($this->getRendererList());
$rendererListTypes = array_keys(array_change_key_case($rendererList));
$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];
@ -71,4 +71,4 @@ class RendererBridge
$e = oxNew(NoSuitableRendererException::class, $format);
throw $e;
}
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -18,20 +18,20 @@ namespace D3\DataWizard\Application\Model\ExportRenderer;
interface RendererInterface
{
/**
* @param iterable $rows
* @param iterable $fieldNames
* @param $rows
* @param $fieldNames
*
* @return string
*/
public function getContent(iterable $rows, iterable $fieldNames): string;
public function getContent($rows, $fieldNames) : string;
/**
* @return string
*/
public function getFileExtension(): string;
public function getFileExtension() : string;
/**
* @return string
*/
public function getTitleTranslationId(): string;
}
public function getTitleTranslationId() : string;
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -25,23 +25,23 @@ interface QueryBase
* Ensure that the translations are equally available in the frontend and the backend
* @return string
*/
public function getTitle(): string;
public function getTitle() : string;
/**
* Ensure that the translations are equally available in the frontend and the backend
* @return string
*/
public function getDescription(): string;
public function getDescription() : string;
/**
* @return string
*/
public function getButtonText(): string;
public function getButtonText() : string;
/**
* @return array [string $query, array $parameters]
*/
public function getQuery(): array;
public function getQuery() : array;
/**
* @param Input $input
@ -57,4 +57,4 @@ interface QueryBase
* @return array
*/
public function getFormElements(): array;
}
}

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -11,10 +11,14 @@
* @link https://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
declare(strict_types=1);
return [
$sLangName = "Deutsch";
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = array(
//Navigation
'charset' => 'UTF-8',
'd3mxDataWizard' => '<i class="fas fa-fw fa-hat-wizard"></i> Data Wizard',
@ -38,7 +42,6 @@ return [
'D3_DATAWIZARD_EXPORT_FORMAT_JSON' => 'JSON-Format',
'D3_DATAWIZARD_ACTION_SUBMIT' => 'Aktion starten',
'D3_DATAWIZARD_ACTION_SUBMIT_CONFIRM' => 'Soll die Aktion gestartet werden?',
'D3_DATAWIZARD_DEBUG' => 'Debug: %1$s',
@ -52,5 +55,4 @@ return [
'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',
];
// @codeCoverageIgnoreEnd
);

Voir le fichier

@ -3,7 +3,7 @@
/**
* 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)
@ -11,10 +11,13 @@
* @link https://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
declare(strict_types=1);
return [
$sLangName = "English";
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = array(
//Navigation
'charset' => 'UTF-8',
@ -39,7 +42,6 @@ return [
'D3_DATAWIZARD_EXPORT_FORMAT_JSON' => 'JSON format',
'D3_DATAWIZARD_ACTION_SUBMIT' => 'run action',
'D3_DATAWIZARD_ACTION_SUBMIT_CONFIRM' => 'Should the action be executed?',
'D3_DATAWIZARD_DEBUG' => 'Debug: %1$s',
@ -53,5 +55,4 @@ return [
'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',
];
// @codeCoverageIgnoreEnd
);

Voir le fichier

@ -1,4 +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="@d3datawizard/admin/inc/d3Wizards.tpl" submit="@d3datawizard/admin/inc/d3ActionSubmit.tpl"}]
[{include file="d3Wizards.tpl" submit="d3ActionSubmit.tpl"}]

Voir le fichier

@ -1,4 +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="@d3datawizard/admin/inc/d3Wizards.tpl" submit="@d3datawizard/admin/inc/d3ExportSubmit.tpl"}]
[{include file="d3Wizards.tpl" submit="d3ExportSubmit.tpl"}]

Voir le fichier

@ -6,12 +6,6 @@
[{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"}]
[{if $readonly}]
[{assign var="readonly" value="readonly disabled"}]
[{else}]
[{assign var="readonly" value=""}]
[{/if}]
<style>
button {
margin: 1em 1em 1em 5em;
@ -47,9 +41,9 @@
}, 3000);
document.getElementById('mask').className='on';
document.getElementById('popup2').className='d3loader-2 on';
form = document.getElementById('form_' + id);
form.format.value = format;
form.submit();
document.getElementById('taskid').value = id;
document.getElementById('format').value = format;
document.getElementById('myedit').submit();
}
[{/strip}][{/capture}]
[{oxscript add=$smarty.capture.d3script}]
@ -78,12 +72,12 @@
</h5>
<div class="card-body">
<form name="myedit" id="form_[{$id}]" action="[{$oViewConf->getSelfLink()}]" method="post">
<form name="myedit" id="myedit" action="[{$oViewConf->getSelfLink()}]" method="post">
[{$oViewConf->getHiddenSid()}]
<input type="hidden" name="cl" value="[{$oViewConf->getActiveClassName()}]">
<input type="hidden" name="fnc" value="runTask">
<input type="hidden" name="taskid" value="[{$id}]">
<input type="hidden" name="format" value="CSV">
<input type="hidden" name="taskid" id="taskid" value="">
<input type="hidden" name="format" id="format" value="CSV">
[{if $item->getDescription()}]
@ -97,7 +91,7 @@
<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_[{$id}]">
<p class="card-text collapse" id="collapseExample">
...[{$description|replace:$shorttext:''}]
</p>
[{/if}]
@ -143,4 +137,4 @@
</div>
</div>
[{include file="@d3modcfg_lib/admin/inc/inc.tpl"}]
[{include file="d3_cfg_mod_inc.tpl"}]

Voir le fichier

@ -0,0 +1,8 @@
[{block name="submitElements"}]
<div class="btn-group">
<button type="button" class="btn btn-primary" onclick="startTask('[{$id}]')">
<i class="fas fa-fw fa-magic"></i>
[{oxmultilang ident=$item->getButtonText()}]
</button>
</div>
[{/block}]

Voir le fichier

@ -1,10 +1,10 @@
[{block name="submitElements"}]
<div class="btn-group" [{$readonly}]>
<button type="button" class="btn btn-primary" onclick="startTask('[{$id}]', 'CSV')" [{$readonly}]>
<div class="btn-group">
<button type="button" class="btn btn-primary" onclick="startTask('[{$id}]', 'CSV')">
<i class="fas fa-fw 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" [{$readonly}]>
<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-fw fa-magic"></i>
[{oxmultilang ident=$item->getButtonText()}]
@ -14,7 +14,7 @@
[{block name="dataWizardFormat"}]
[{assign var="rendererBridge" value=$item->getRendererBridge()}]
[{foreach from=$rendererBridge->getTranslatedRendererIdList() key="key" item="translationId"}]
<button class="dropdown-item" onclick="startTask('[{$id}]', '[{$key}]')" [{$readonly}]>
<button class="dropdown-item" onclick="startTask('[{$id}]', '[{$key}]')">
[{oxmultilang ident=$translationId}]
</button>
[{/foreach}]

Voir le fichier

@ -1,25 +0,0 @@
<?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
*/
// @codeCoverageIgnoreStart
declare(strict_types=1);
$sLangName = 'Deutsch';
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = include __DIR__."/../../de/d3DataWizard_translations.php";
// @codeCoverageIgnoreEnd

Voir le fichier

@ -1,25 +0,0 @@
<?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
*/
// @codeCoverageIgnoreStart
declare(strict_types=1);
$sLangName = 'English';
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = include __DIR__."/../../en/d3DataWizard_translations.php";
// @codeCoverageIgnoreEnd

Voir le fichier

@ -1,25 +0,0 @@
<?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
*/
// @codeCoverageIgnoreStart
declare(strict_types=1);
$sLangName = 'Deutsch';
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = include __DIR__."/../../de/d3DataWizard_translations.php";
// @codeCoverageIgnoreEnd

Voir le fichier

@ -1,25 +0,0 @@
<?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
*/
// @codeCoverageIgnoreStart
declare(strict_types=1);
$sLangName = 'English';
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = include __DIR__."/../../en/d3DataWizard_translations.php";
// @codeCoverageIgnoreEnd

Voir le fichier

@ -1,85 +1,61 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [unreleased](https://git.d3data.de/D3Public/DataWizard/compare/3.0.0.0...rel_3.x) - 2023-09-12
## [3.0.0.0](https://git.d3data.de/D3Public/DataWizard/compare/2.1.1.3...3.0.0.0) - 2024-05-13
### Added
- installable in OXID 7.0 + 7.1
- Twig support
### Removed
- support for OXID < 7
## [2.1.1.3](https://git.d3data.de/D3Public/DataWizard/compare/2.1.1.2...2.1.1.3) - 2023-09-12
### Added
- apply roles and rights
## [2.1.1.2](https://git.d3data.de/D3Public/DataWizard/compare/2.1.1.1...2.1.1.2) - 2023-03-30
### Fixed
- fix JavaScript for multiple forms
## [2.1.1.1](https://git.d3data.de/D3Public/DataWizard/compare/2.1.1.0...2.1.1.1) - 2023-03-22
## 1.5.0.1 (2023-03-22)
### Fixed
- wrong cascaded HTML elements
## [2.1.1.0](https://git.d3data.de/D3Public/DataWizard/compare/2.1.0.0...2.1.1.0) - 2022-12-24
### Added
- installable in OXID 6.5.0 and 6.5.1
- request confirmation before execute action
## 1.5.0.0 (2021-12-21)
### Changed
- documentation extended
## [2.1.0.0](https://git.d3data.de/D3Public/DataWizard/compare/2.0.0.0...2.1.0.0) - 2021-12-21
### Changed
- adjust to CLI extension which can export to STDOUT
## [2.0.0.0](https://git.d3data.de/D3Public/DataWizard/compare/1.4.0.0...2.0.0.0) - 2021-12-20
### Added
#### Added
- add tests
- make installable in OXID 6.4
### Changed
- adjust code to PHP 7.3 and up
#### Changed
- adjust to CLI extension which can export to STDOUT
- restrict dependencies to OXID 6.2, use 2.x for newer installations
## [1.4.0.0](https://git.d3data.de/D3Public/DataWizard/compare/1.3.1.0...1.4.0.0) - 2021-11-11
### Added
---
## 1.4.0.0 (2021-11-11)
#### Added
- add JSON export renderer
- add tpl block for easier extension
- enable controller based exception handling
### Changed
#### Changed
- change deprecated CSV export code
- show registered export renderers in admin submit without required tpl block extension
- force get translations from admin
## [1.3.1.0](https://git.d3data.de/D3Public/DataWizard/compare/1.2.0.0...1.3.0.0) - 2021-09-10
### Added
---
## 1.3.1.0 (2021-09-10)
- installable in OXID 6.3.1
## [1.3.0.0](https://git.d3data.de/D3Public/DataWizard/compare/1.2.0.0...1.3.0.0) - 2021-07-29
### Changed
---
## 1.3.0.0 (2021-07-29)
- can handle long task description text
- has more generic admin controller templates
## [1.2.0.0](https://git.d3data.de/D3Public/DataWizard/compare/1.1.0.0...1.2.0.0) - 2021-07-27
### Added
- adjustments for CLI extension
---
### Fixed
## 1.2.0.0 (2021-07-27)
- adjustments for CLI extension
- fix OXID 6.1 incompatibilities
## [1.1.0.0](https://git.d3data.de/D3Public/DataWizard/compare/1.0.0.0...1.1.0.0) - 2021-06-25
### Added
- implement form builder
---
### Fixed
## 1.1.0.0 (2021-06-25)
- implement form builder
- fix key figures export
## [1.0.0.0](https://git.d3data.de/D3Public/DataWizard/releases/tag/1.0.0.0) - 2021-06-22
### Added
---
## 1.0.0.0 (2021-06-22)
- initial implementation

Voir le fichier

@ -9,39 +9,20 @@ The exports are defined via database queries or ready-made data lists. Various e
All exports and tasks are grouped together for better clarity.
Sample exports are included in the package `d3/datawizardtasks`. These are intended to serve as an implementation reference for individual exports.
Sample exports are included in the package d3/datawizardtasks. These are intended to serve as an implementation reference for individual exports.
![administration area](assets/administration_exports.jpg "administration area")
## Table of content
- [Installation](#installation)
- [Usage](#usage)
- [Extensibility](#extensibility)
- [Extension packages](#extension-packages)
- [Changelog](#changelog)
- [Contributing](#contributing)
- [License](#license)
- [Further licences and terms of use](#further-licences-and-terms-of-use)
## Installation
This package requires an Composer installed OXID eShop as defined in [composer.json](composer.json).
Open a command line interface and navigate to the shop root directory (parent of source and vendor). Execute the following command. Adapt the paths to your environment.
In the console in the shop root (above source and vendor), execute the following command:
```bash
php composer require d3/datawizard:^2.0
php composer require d3/datawizard:^1.0
```
Activate the module in the admin area of the shop in "Extensions -> Modules".
## Usage
These package doesn't contain any export or action items. See [Extension packages](#extension_packages) for installable example items.
Log in to the admin area of your shop and navigate to "D³ Modules -> Data Wizard". Go to "Exports" or "Actions" (as desired). Choose your desired item and export or execute it.
## 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:
@ -52,7 +33,7 @@ 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.
### Extension packages
## Extension packages
- `d3/datawizardtasks` - provides sample exports and their implementation reference
- `d3/datawizardcli` - provides the execution of exports or tasks via the command prompt (e.g. as cronjobs)
@ -62,21 +43,9 @@ Independently of this, all extension options are available that the OXID Shop pr
See [CHANGELOG](CHANGELOG.md) for further informations.
## Contributing
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue. Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (git checkout -b feature/AmazingFeature)
- Commit your Changes (git commit -m 'Add some AmazingFeature')
- Push to the Branch (git push origin feature/AmazingFeature)
- Open a Pull Request
## License
## Licence of this software (d3/datawizard)
(status: 2021-05-06)
Distributed under the GPLv3 license.
```
Copyright (c) D3 Data Development (Inh. Thomas Dartsch)
@ -149,4 +118,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
```
```

Voir le fichier

@ -9,40 +9,20 @@ Die Exporte werden über Datenbankabfragen oder fertige Datenlisten definiert. E
Alle Exporte bzw. Tasks sind für eine bessere Übersichtlichkeit in Gruppen zusammengefasst.
Im Paket `d3/datawizardtasks` sind Beispielexporte enthalten. Diese sollen als Implementierungsreferenz für individuelle Exporte dienen.
Im Paket d3/datawizardtasks sind Beispielexporte enthalten. Diese sollen als Implementierungsreferenz für individuelle Exporte dienen.
![Adminbereich](assets/administration_exports.jpg "Adminbereich")
## Inhaltsverzeichnis
- [Installation](#installation)
- [Verwendung](#verwendung)
- [Erweiterbarkeit](#erweiterbarkeit)
- [Erweiterungspakete](#erweiterungspakete)
- [Changelog](#changelog)
- [Beitragen](#beitragen)
- [Lizenz](#lizenz)
- [weitere Lizenzen und Nutzungsbedingungen](#weitere-lizenzen-und-nutzungsbedingungen)
## Installation
Dieses Paket erfordert einen mit Composer installierten OXID eShop in einer in der [composer.json](composer.json) definierten Version.
Öffnen Sie eine Kommandozeile und navigieren Sie zum Stammverzeichnis des Shops (Elternverzeichnis von source und vendor). Führen Sie den folgenden Befehl aus. Passen Sie die Pfadangaben an Ihre Installationsumgebung an.
## Schnellinstallation
Auf der Konsole im Shoproot (oberhalb von source und vendor) folgenden Befehl ausführen:
```bash
php composer require d3/datawizard:^2.0
php composer require d3/datawizard:^1.0
```
Aktivieren Sie das Modul im Shopadmin unter "Erweiterungen -> Module".
## Verwendung
Dieses Paket enthält keine Exporte oder Aktionen. In [Erweiterungspakete](#erweiterungspakete) finden Sie installierbare Beispieleinträge.
Melden Sie sich im Adminbereich Ihres Shops an und navigieren Sie zu "D³ Module -> Data Wizard". Wechseln Sie je nach Wunsch zu "Exporte" oder "Aktionen". Wählen Sie den gewünschten Eintrag und starten Sie den Export bzw. die Aktion.
## 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:
@ -53,7 +33,7 @@ Das Modul stellt das technische Grundgerüst der Exporte dar und erhebt keinen A
Unabhängig dessen stehen alle Erweiterungsmöglichkeiten zur Verfügung, die der OXID Shop für Module bereitstellt.
### Erweiterungspakete
## Erweiterungspakete
- `d3/datawizardtasks` - liefert Beispielexporte und deren Implementierungsreferenz
- `d3/datawizardcli` - ermöglicht die Ausführung der Exporte oder Tasks über die Eingabeaufforderung (z.B. als Cronjobs)
@ -63,21 +43,9 @@ Unabhängig dessen stehen alle Erweiterungsmöglichkeiten zur Verfügung, die de
Siehe [CHANGELOG](CHANGELOG.md) für weitere Informationen.
## Beitragen
Wenn Sie eine Verbesserungsvorschlag haben, legen Sie einen Fork des Repositories an und erstellen Sie einen Pull Request. Alternativ können Sie einfach ein Issue erstellen. Fügen Sie das Projekt zu Ihren Favoriten hinzu. Vielen Dank.
- Erstellen Sie einen Fork des Projekts
- Erstellen Sie einen Feature Branch (git checkout -b feature/AmazingFeature)
- Fügen Sie Ihre Änderungen hinzu (git commit -m 'Add some AmazingFeature')
- Übertragen Sie den Branch (git push origin feature/AmazingFeature)
- Öffnen Sie einen Pull Request
## Lizenz
## Lizenz dieser Software (d3/datawizard)
(Stand: 06.05.2021)
Vertrieben unter der GPLv3 Lizenz.
```
Copyright (c) D3 Data Development (Inh. Thomas Dartsch)

Voir le fichier

@ -1,6 +1,6 @@
{
"name": "d3/datawizard",
"description": "the magical data tool /\n das magische Datenwerkzeug",
"description": "das magische Datenwerkzeug",
"type": "oxideshop-module",
"keywords": [
"oxid",
@ -25,17 +25,24 @@
"GPL-3.0-or-later"
],
"require": {
"php": "^8.0",
"oxid-esales/oxideshop-ce": "7.0 - 7.1",
"php": ">=7.1",
"oxid-esales/oxideshop-ce": "6.3 - 6.7",
"league/csv": "^9.0",
"mathieuviossat/arraytotexttable": "^1.0",
"form-manager/form-manager": "^6.1",
"d3/modcfg": "^7.0",
"beberlei/assert": "^3.3.2"
"form-manager/form-manager": "^5.1 || ^6.1",
"d3/modcfg": "^5.3.6.0"
},
"require-dev": {
"d3/testingtools": "^1.2.0.0",
"phpunit/phpunit": "^9.1.1"
"oxid-esales/oxideshop-ce": "6.8 - 6.9"
},
"extra": {
"oxideshop": {
"blacklist-filter": [
"*.md",
"composer.json"
],
"target-directory": "d3/datawizard"
}
},
"suggest": {
"d3/datawizardtasks": "useful example tasks for Data Wizard",
@ -44,11 +51,7 @@
},
"autoload": {
"psr-4": {
"D3\\DataWizard\\": "./"
"D3\\DataWizard\\": "../../../source/modules/d3/datawizard"
}
},
"scripts": {
"phpunit": "XDEBUG_MODE=coverage ./vendor/bin/phpunit --config=vendor/d3/datawizard/ --no-coverage",
"phpunit-coverage": "XDEBUG_MODE=coverage ./vendor/bin/phpunit --config=vendor/d3/datawizard/ --coverage-html=vendor/d3/datawizard/tests/result/coverage"
}
}

Voir le fichier

@ -1,2 +0,0 @@
modules:
- d3modcfg_lib

Voir le fichier

@ -13,11 +13,12 @@
declare(strict_types=1);
use D3\DataWizard\Application\Model\Constants;
/**
* Metadata version
*/
$sMetadataVersion = '2.1';
$sModuleId = Constants::OXID_MODULE_ID;
$sModuleId = 'd3datawizard';
$logo = '<img src="https://logos.oxidmodule.com/d3logo.svg" alt="(D3)" style="height:1em;width:1em">';
/**
@ -30,31 +31,31 @@ $aModule = [
'de' => '',
'en' => '',
],
'thumbnail' => 'picture.svg',
'version' => '3.0.0.0',
'thumbnail' => '',
'version' => '1.5.0.1',
'author' => 'D&sup3; Data Development (Inh.: Thomas Dartsch)',
'email' => 'support@shopmodule.com',
'url' => 'https://www.oxidmodule.com/',
'controllers' => [
'd3ExportWizard' => D3\DataWizard\Application\Controller\Admin\d3ExportWizard::class,
'd3ActionWizard' => D3\DataWizard\Application\Controller\Admin\d3ActionWizard::class,
'd3ActionWizard' => D3\DataWizard\Application\Controller\Admin\d3ActionWizard::class
],
'extend' => [],
'events' => [],
'templates' => [
'@' . Constants::OXID_MODULE_ID . '/admin/d3ExportWizard.tpl' => 'views/smarty/admin/d3ExportWizard.tpl',
'@' . Constants::OXID_MODULE_ID . '/admin/d3ActionWizard.tpl' => 'views/smarty/admin/d3ActionWizard.tpl',
'@' . Constants::OXID_MODULE_ID . '/admin/inc/d3Wizards.tpl' => 'views/smarty/admin/inc/Wizards.tpl',
'@' . Constants::OXID_MODULE_ID . '/admin/inc/d3ExportSubmit.tpl' => 'views/smarty/admin/inc/exportSubmit.tpl',
'@' . Constants::OXID_MODULE_ID . '/admin/inc/d3ActionSubmit.tpl' => 'views/smarty/admin/inc/actionSubmit.tpl',
'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' => [
[
'group' => $sModuleId.'_general',
'name' => $sModuleId.'_debug',
'type' => 'bool',
'value' => false,
],
'value' => false
]
],
'blocks' => [],
'blocks' => []
];

Voir le fichier

@ -1,36 +0,0 @@
<?xml version="1.0"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
backupGlobals="true"
bootstrap="../../../source/bootstrap.php"
colors="false"
backupStaticAttributes="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="false"
convertWarningsToExceptions="true"
forceCoversAnnotation="false"
processIsolation="false"
stopOnError="false"
stopOnFailure="false"
stopOnIncomplete="false"
stopOnSkipped="false"
beStrictAboutTestsThatDoNotTestAnything="false"
verbose="false"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
<testsuites>
<testsuite name="Unit">
<directory>tests/unit</directory>
</testsuite>
</testsuites>
<coverage includeUncoveredFiles="true" processUncoveredFiles="true">
<include>
<directory suffix=".php">Application</directory>
</include>
<exclude>
<file>../.php-cs-fixer.php</file>
<file>../IntelliSenseHelper.php</file>
</exclude>
</coverage>
<php>
<const name="OXID_PHP_UNIT" value="true"/>
</php>
</phpunit>

Voir le fichier

@ -1,84 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="201px" height="124px" viewBox="0 0 201 124" enable-background="new 0 0 201 124" xml:space="preserve">
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="47.0591" y1="67.5117" x2="47.0591" y2="54.6143">
<stop offset="0.0056" style="stop-color:#3266A9"/>
<stop offset="1" style="stop-color:#0099FF"/>
</linearGradient>
<path fill="url(#SVGID_1_)" d="M50.282,55.502c-0.784-0.592-2.104-0.888-3.961-0.888h-1.376l-2.283,12.898h1.779
c3.76,0,6.032-2.245,6.815-6.733c0.134-0.871,0.202-1.642,0.202-2.313C51.457,57.081,51.064,56.093,50.282,55.502z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="65.9609" y1="49.104" x2="65.9609" y2="36.9434">
<stop offset="0.0056" style="stop-color:#3266A9"/>
<stop offset="1" style="stop-color:#0099FF"/>
</linearGradient>
<path fill="url(#SVGID_2_)" d="M65.72,40.482c1.074,0,1.611,0.381,1.611,1.143c0,0.701-0.321,1.201-0.962,1.5
c-0.209,0.119-0.366,0.194-0.471,0.224c-0.065,0.019-0.158,0.037-0.271,0.056c1.98,1.621,3.702,3.544,5.097,5.699
c0.117-0.321,0.21-0.658,0.277-1.013l0.09-1.008c0-1.223-0.568-2.081-1.701-2.574c0.776-0.402,1.376-0.94,1.801-1.611
c0.425-0.672,0.638-1.418,0.638-2.239c0-0.642-0.198-1.265-0.593-1.868c-0.396-0.605-0.98-1.049-1.757-1.333
c-0.433-0.193-0.876-0.328-1.332-0.402c-0.456-0.075-1.003-0.113-1.645-0.113c-0.82,0-1.663,0.124-2.529,0.37
c-0.865,0.246-1.6,0.563-2.204,0.952s-1.13,0.907-1.578,1.557c-0.036,0.052-0.066,0.109-0.101,0.163
c1.196,0.534,2.341,1.163,3.426,1.874C63.947,40.943,64.68,40.482,65.72,40.482z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="50.0576" y1="87.0566" x2="50.0576" y2="37.8525">
<stop offset="0.0056" style="stop-color:#3266A9"/>
<stop offset="1" style="stop-color:#0099FF"/>
</linearGradient>
<path fill="url(#SVGID_3_)" d="M70.725,49.104c-0.433,1.189-1.208,2.147-2.331,2.871c-1.425,0.918-3.182,1.377-5.271,1.377
c-1.179,0-2.175-0.176-2.988-0.525c-0.813-0.35-1.444-0.864-1.891-1.543c-0.448-0.678-0.671-1.481-0.671-2.405l0.022-0.694
l0.156-0.693h4.367l-0.028,0.179v0.179v0.246c0,1.164,0.628,1.746,1.884,1.746c0.635,0,1.201-0.217,1.696-0.649
c0.495-0.434,0.742-0.94,0.742-1.522c0-0.522-0.194-0.887-0.582-1.097c-0.329-0.208-1.007-0.313-2.036-0.313l0.47-2.754
l1.141-0.067c0.083-0.011,0.154-0.022,0.221-0.033c-0.674-0.551-1.378-1.067-2.11-1.546c-0.044,0.096-0.087,0.195-0.125,0.302
h-4.185c0.192-0.837,0.49-1.56,0.884-2.175c-3.064-1.372-6.46-2.133-10.034-2.133c-13.588,0-24.603,11.014-24.603,24.601
c0,13.59,11.015,24.604,24.603,24.604S74.66,76.043,74.66,62.453C74.66,57.532,73.214,52.949,70.725,49.104z M59.413,59.233
l-0.168,1.275c-0.538,2.953-1.511,5.404-2.921,7.35c-1.298,1.835-3.016,3.179-5.153,4.028c-2.138,0.851-4.494,1.274-7.067,1.274
H33.731l4.264-24.198h10.441c1.141,0,2.204,0.073,3.189,0.218c0.984,0.146,1.868,0.364,2.651,0.655
c1.611,0.537,2.887,1.471,3.827,2.802c0.94,1.332,1.41,2.992,1.41,4.984L59.413,59.233z"/>
</g>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="107.3027" y1="105.8555" x2="93.0727" y2="16.0106">
<stop offset="0" style="stop-color:#B2B2B2;stop-opacity:0"/>
<stop offset="0.2" style="stop-color:#B2B2B2"/>
<stop offset="0.8" style="stop-color:#B2B2B2"/>
<stop offset="1" style="stop-color:#B2B2B2;stop-opacity:0"/>
</linearGradient>
<rect x="99.875" y="14.933" fill="url(#SVGID_4_)" width="0.625" height="92"/>
<script xmlns=""></script>
<g>
<g>
<path fill="none" d="M153.855,40.748H140.76v9.354c0,1.034-0.839,1.872-1.871,1.872h-9.354v20.582
c0,1.031,0.838,1.869,1.871,1.869h22.45c0.083,0,0.159-0.014,0.239-0.023l-5.59-5.588h-13.358c-1.032,0-1.871-0.84-1.871-1.871
c0-1.033,0.839-1.871,1.871-1.871h9.617l-3.742-3.743h-5.875c-1.032,0-1.871-0.837-1.871-1.871c0-1.034,0.839-1.871,1.871-1.871
h3.215c-0.183-1.584,0.68-3.495,2.505-5.326c0.765-0.765,2.763-2.533,4.869-2.533c0.546,0,1.063,0.117,1.527,0.339
c0.346,0.133,0.668,0.338,0.945,0.615l7.52,7.517V42.618C155.728,41.585,154.889,40.748,153.855,40.748z"/>
<polygon fill="none" points="137.018,43.393 132.18,48.231 137.018,48.231 "/>
<path d="M133.275,66.941c0,1.031,0.839,1.871,1.871,1.871h13.358l-3.741-3.742h-9.617
C134.114,65.07,133.275,65.908,133.275,66.941z"/>
<path d="M133.275,59.457c0,1.033,0.839,1.871,1.871,1.871h5.875l-1.73-1.73c-0.272-0.272-0.476-0.587-0.613-0.923
c-0.169-0.339-0.272-0.705-0.316-1.089h-3.215C134.114,57.585,133.275,58.423,133.275,59.457z"/>
<path d="M153.855,74.424h-22.45c-1.033,0-1.871-0.838-1.871-1.869V51.973h9.354c1.032,0,1.871-0.838,1.871-1.872v-9.354h13.096
c1.033,0,1.872,0.837,1.872,1.871v15.579l1.419,1.42l1.301-1.736l-0.989-2.9c-0.358-1.065-0.215-2.155,0.394-3.001
c0.401-0.559,0.971-0.953,1.617-1.147v-8.215c0-3.1-2.514-5.613-5.613-5.613h-14.967c-0.496,0-0.973,0.197-1.322,0.548
L126.34,48.779c-0.351,0.352-0.548,0.827-0.548,1.323v22.453c0,3.1,2.514,5.611,5.613,5.611h22.45
c1.139,0,2.196-0.342,3.081-0.924l-2.842-2.842C154.015,74.41,153.938,74.424,153.855,74.424z M137.018,43.393v4.838h-4.838
L137.018,43.393z"/>
</g>
<g>
<g>
<g>
<path fill="#010002" d="M159.092,62.488l3.655-0.048c0.479-0.006,1.107,0.314,1.388,0.71l2.109,2.982
c0.281,0.393,0.624,0.34,0.769-0.125l1.089-3.486c0.14-0.466,0.636-0.96,1.098-1.103l3.487-1.084
c0.465-0.142,0.52-0.488,0.126-0.768l-2.985-2.112c-0.396-0.281-0.716-0.903-0.705-1.385l0.044-3.656
c0.006-0.479-0.305-0.644-0.694-0.352l-2.929,2.186c-0.385,0.289-1.076,0.397-1.536,0.246l-3.46-1.177
c-0.459-0.153-0.709,0.093-0.555,0.549l1.179,3.46c0.15,0.455,0.043,1.149-0.24,1.539l-2.19,2.926
C158.447,62.182,158.61,62.492,159.092,62.488z"/>
<path fill="#010002" d="M175.635,82.078l0.061-0.063l-29.578-29.571l-0.033,0.032c-0.005-0.002-0.005-0.006-0.009-0.007
c-0.489-0.496-1.99,0.201-3.343,1.552c-1.348,1.353-2.045,2.848-1.553,3.343c0.003,0.005,0.009,0.005,0.01,0.006l-0.033,0.036
l29.575,29.578l0.059-0.064c0.587,0.313,1.962-0.367,3.215-1.625C175.267,84.037,175.943,82.662,175.635,82.078z
M149.582,60.874c-0.715,0.715-1.469,1.239-2.096,1.51l-4.374-4.4c0.624-0.272,1.368-0.795,2.08-1.503
c0.705-0.708,1.222-1.446,1.497-2.066l4.385,4.41C150.801,59.443,150.28,60.174,149.582,60.874z"/>
</g>
</g>
</g>
</g>
</svg>

Avant

Largeur:  |  Hauteur:  |  Taille: 6.4 KiB

Voir le fichier

@ -2,14 +2,51 @@
## Requirements
Please install the packages listed in the composer.json in "require-dev". Unfortunately Composer does not provide an automatic installation.
missing ext-sockets
Both unit and acceptance tests require OXID Testing Library installed.
See https://github.com/OXID-eSales/testing_library.
### Configuration
Make sure the module has been activated with a valid license key.
Configure the error reporting to `error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED);` in the `config.inc.php` due some deprecation issues in original OXID code
Please install the packages listed in the composer.json in "require-dev". Unfortunately Composer does not provide an automatic installation.
Here is an example of Testing Library configuration file `oxideshop/test_config.yml`
```
# This file is auto-generated during the composer install
mandatory_parameters:
shop_path: /var/www/oxideshop/source
shop_tests_path: /var/www/oxideshop/tests
partial_module_paths: d3/datawizard
optional_parameters:
shop_url: null
shop_serial: ''
enable_varnish: false
is_subshop: false
install_shop: false
remote_server_dir: null
shop_setup_path: null
restore_shop_after_tests_suite: false
test_database_name: null
restore_after_acceptance_tests: false
restore_after_unit_tests: false
tmp_path: /tmp/oxid_test_library/
database_restoration_class: DatabaseRestorer
activate_all_modules: false
run_tests_for_shop: false
run_tests_for_modules: true
screen_shots_path: null
screen_shots_url: null
browser_name: firefox
selenium_server_ip: 127.0.0.1
selenium_server_port: '4444'
additional_test_paths: null
```
## Unit Tests
commands are described in composer.json scripts section
To execute unit tests run the following:
```
cd /var/www/oxideshop/
vendor/bin/runtests
```

Voir le fichier

@ -12,7 +12,6 @@
*/
// Include datawizard test config
namespace D3\DataWizard\tests;
use D3\ModCfg\Tests\additional_abstract;
@ -36,6 +35,5 @@ class additional extends additional_abstract
}
try {
d3GetOxidDIC()->get(additional::class);
} catch (Exception) {
}
d3GetModCfgDIC()->get(additional::class);
} catch (Exception $e) {}

Voir le fichier

@ -11,4 +11,5 @@
* @link https://www.oxidmodule.com
*/
const D3DATAWIZARD_REQUIRE_MODCFG = true;
define('D3DATAWIZARD_REQUIRE_MODCFG', true);

27
tests/phpunit.xml Fichier normal
Voir le fichier

@ -0,0 +1,27 @@
<phpunit backupGlobals="true"
backupStaticAttributes="false"
beStrictAboutTestsThatDoNotTestAnything="false"
cacheTokens="true"
colors="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="false"
convertWarningsToExceptions="true"
forceCoversAnnotation="false"
processIsolation="false"
stopOnError="false"
stopOnFailure="false"
stopOnIncomplete="false"
stopOnSkipped="false"
verbose="false">
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">../Application</directory>
<directory suffix=".php">../Modules</directory>
<directory suffix=".php">../public</directory>
<directory suffix=".php">../Setup</directory>
</whitelist>
</filter>
<logging>
<log type="junit" target="reports/logfile.xml"/>
</logging>
</phpunit>

Voir le fichier

@ -15,4 +15,4 @@ class d3TestAction extends ActionBase
{
return ["UPDATE 1"];
}
}
}

Voir le fichier

@ -13,6 +13,6 @@ class d3TestExport extends ExportBase
public function getQuery(): array
{
return ["SELECT 1"];
return "SELECT 1";
}
}
}

Voir le fichier

@ -17,26 +17,23 @@ namespace D3\DataWizard\tests\unit\Application\Controller\Admin;
use D3\DataWizard\Application\Controller\Admin\d3ActionWizard;
use D3\DataWizard\Application\Model\Configuration;
use D3\DataWizard\Application\Model\Constants;
use D3\DataWizard\Application\Model\Exceptions\DataWizardException;
use D3\DataWizard\Application\Model\Exceptions\DebugException;
use D3\DataWizard\Application\Model\ExportRenderer\RendererBridge;
use D3\DataWizard\tests\tools\d3TestAction;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\Config;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Facade\ModuleSettingService;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class d3ActionWizardTest extends d3AdminController
class d3ActionWizardTest extends d3AdminControllerTest
{
/** @var d3ActionWizard */
protected $_oController;
protected $testClassName = d3ActionWizard::class;
public function setUp(): void
public function setUp() : void
{
parent::setUp();
@ -102,7 +99,7 @@ class d3ActionWizardTest extends d3AdminController
{
return [
['test1'],
['test2'],
['test2']
];
}
@ -121,32 +118,37 @@ class d3ActionWizardTest extends d3AdminController
$requestMock->expects($this->any())->method('getRequestEscapedParameter')->willReturnCallback([$this, 'executePassRequestCallback']);
Registry::set(Request::class, $requestMock);
/** @var ModuleSettingService $settingsServiceMock */
$settingsServiceMock = $this->getMockBuilder(ModuleSettingService::class)
->disableOriginalConstructor()
->onlyMethods(['getBoolean'])
/** @var Config|MockObject $configMock */
$configMock = $this->getMockBuilder(Config::class)
->onlyMethods(['getConfigParam'])
->getMock();
$settingsServiceMock->expects($this->once())->method('getBoolean')->with(
$this->identicalTo('d3datawizard_debug'),
$this->identicalTo(Constants::OXID_MODULE_ID)
)->willReturn($blDebug);
$configMock->expects($this->atLeastOnce())->method('getConfigParam')->willReturnCallback(
function ($argName) use ($blDebug) {
switch ($argName) {
case 'd3datawizard_debug':
return $blDebug;
default:
return Registry::getConfig()->getConfigParam($argName);
}
}
);
/** @var d3ActionWizard|MockObject $controllerMock */
$controllerMock = $this->getMockBuilder(d3ActionWizard::class)
->onlyMethods(['getSettingsService'])
->onlyMethods(['d3GetConfig'])
->getMock();
$controllerMock->method('getSettingsService')->willReturn($settingsServiceMock);
$controllerMock->method('d3GetConfig')->willReturn($configMock);
$this->_oController = $controllerMock;
/** @var d3TestAction|MockObject $actionMock */
$actionMock = $this->getMockBuilder(d3TestAction::class)
->onlyMethods([
'getQuery',
'run',
'run'
])
->getMock();
$actionMock->expects($this->atLeastOnce())->method('getQuery')->willReturn(['SELECT 1', ['1']]);
$actionMock->expects($this->exactly((int) !$blDebug))->method('run');
$actionMock->expects($this->exactly((int) !$blDebug))->method('run')->willReturn(true);
/** @var Configuration|MockObject $configurationMock */
$configurationMock = $this->getMockBuilder(Configuration::class)
@ -168,11 +170,14 @@ class d3ActionWizardTest extends d3AdminController
public function executePassRequestCallback($varName)
{
return match ( $varName ) {
'taskid' => 'testTaskId',
'format' => RendererBridge::FORMAT_CSV,
default => oxNew( Request::class )->getRequestEscapedParameter( $varName ),
};
switch ($varName) {
case 'taskid':
return 'testTaskId';
case 'format':
return RendererBridge::FORMAT_CSV;
default:
return oxNew(Request::class)->getRequestEscapedParameter($varName);
}
}
/**
@ -185,15 +190,4 @@ class d3ActionWizardTest extends d3AdminController
'debug' => [true],
];
}
/**
* @return string[][]
*/
public function runTaskFailedDataProvider(): array
{
return [
[DataWizardException::class],
[DBALException::class],
];
}
}
}

Voir le fichier

@ -22,26 +22,24 @@ use D3\DataWizard\Application\Model\Exceptions\DataWizardException;
use D3\DataWizard\Application\Model\Exceptions\DebugException;
use D3\DataWizard\tests\tools\d3TestAction;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use Doctrine\DBAL\Exception as DBALException;
use Exception;
use Doctrine\DBAL\DBALException;
use OxidEsales\Eshop\Core\Config;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\UtilsView;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Facade\ModuleSettingService;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use ReflectionException;
abstract class d3AdminController extends d3ModCfgUnitTestCase
abstract class d3AdminControllerTest extends d3ModCfgUnitTestCase
{
/** @var d3ActionWizard|d3ExportWizard */
protected $_oController;
protected $testClassName;
public function tearDown(): void
public function tearDown() : void
{
parent::tearDown();
@ -56,7 +54,7 @@ abstract class d3AdminController extends d3ModCfgUnitTestCase
*/
public function testConstructor()
{
$this->setValue($this->_oController, 'configuration', oxNew(Configuration::class));
$this->setValue($this->_oController, 'configuration', null);
$this->callMethod(
$this->_oController,
@ -72,21 +70,6 @@ abstract class d3AdminController extends d3ModCfgUnitTestCase
);
}
/**
* @test
* @return void
* @throws ReflectionException
* @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::getViewId
* @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::getViewId
*/
public function canGetViewId(): void
{
$viewId = $this->callMethod($this->_oController, 'getViewId');
$this->assertIsString($viewId);
$this->assertStringStartsWith('d3mxDataWizard', $viewId);
}
/**
* @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::runTask()
* @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::runTask()
@ -99,7 +82,7 @@ abstract class d3AdminController extends d3ModCfgUnitTestCase
$controllerMock = $this->getMockBuilder($this->testClassName)
->onlyMethods(['execute'])
->getMock();
$controllerMock->expects($this->once())->method('execute');
$controllerMock->expects($this->once())->method('execute')->willReturn(true);
$this->_oController = $controllerMock;
@ -121,8 +104,9 @@ abstract class d3AdminController extends d3ModCfgUnitTestCase
{
/** @var DataWizardException|DBALException|DatabaseErrorException|MockObject $exceptionMock */
$exceptionMock = $this->getMockBuilder($exceptionClass)
->setConstructorArgs(['exc_msg', 20, new Exception()])
->disableOriginalConstructor()
->getMock();
$this->setValue($exceptionMock, 'message', 'exc_msg');
/** @var d3ActionWizard|d3ExportWizard|MockObject $controllerMock */
$controllerMock = $this->getMockBuilder($this->testClassName)
@ -153,6 +137,18 @@ abstract class d3AdminController extends d3ModCfgUnitTestCase
);
}
/**
* @return \string[][]
*/
public function runTaskFailedDataProvider(): array
{
return [
[DataWizardException::class],
[DBALException::class],
[DatabaseErrorException::class],
];
}
/**
* @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::execute()
* @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::execute()
@ -173,7 +169,7 @@ abstract class d3AdminController extends d3ModCfgUnitTestCase
$actionMock = $this->getMockBuilder(d3TestAction::class)
->onlyMethods([
'getQuery',
'run',
'run'
])
->getMock();
$actionMock->expects($this->atLeastOnce())->method('getQuery')->willReturn(['SELECT 1', ['1']]);
@ -248,20 +244,19 @@ abstract class d3AdminController extends d3ModCfgUnitTestCase
}
/**
* @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::d3GetConfig
* @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::d3GetConfig
* @test
* @return void
* @throws ReflectionException
* @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::getSettingsService()
* @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::getSettingsService()
*/
public function canGetSettingsService(): void
public function canGetConfig()
{
$this->assertInstanceOf(
ModuleSettingService::class,
Config::class,
$this->callMethod(
$this->_oController,
'getSettingsService'
'd3GetConfig'
)
);
}
}
}

Voir le fichier

@ -17,28 +17,24 @@ namespace D3\DataWizard\tests\unit\Application\Controller\Admin;
use D3\DataWizard\Application\Controller\Admin\d3ExportWizard;
use D3\DataWizard\Application\Model\Configuration;
use D3\DataWizard\Application\Model\Constants;
use D3\DataWizard\Application\Model\Exceptions\DataWizardException;
use D3\DataWizard\Application\Model\Exceptions\DebugException;
use D3\DataWizard\Application\Model\ExportRenderer\RendererBridge;
use D3\DataWizard\tests\tools\d3TestAction;
use D3\DataWizard\tests\tools\d3TestExport;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Config;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Facade\ModuleSettingService;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class d3ExportWizardTest extends d3AdminController
class d3ExportWizardTest extends d3AdminControllerTest
{
/** @var d3ExportWizard */
protected $_oController;
protected $testClassName = d3ExportWizard::class;
public function setUp(): void
public function setUp() : void
{
parent::setUp();
@ -104,7 +100,7 @@ class d3ExportWizardTest extends d3AdminController
{
return [
['test1'],
['test2'],
['test2']
];
}
@ -124,28 +120,33 @@ class d3ExportWizardTest extends d3AdminController
//OnConsecutiveCalls('testTaskId', 'CSV');
Registry::set(Request::class, $requestMock);
/** @var ModuleSettingService $settingsServiceMock */
$settingsServiceMock = $this->getMockBuilder(ModuleSettingService::class)
->disableOriginalConstructor()
->onlyMethods(['getBoolean'])
/** @var Config|MockObject $configMock */
$configMock = $this->getMockBuilder(Config::class)
->onlyMethods(['getConfigParam'])
->getMock();
$settingsServiceMock->expects($this->once())->method('getBoolean')->with(
$this->identicalTo('d3datawizard_debug'),
$this->identicalTo(Constants::OXID_MODULE_ID)
)->willReturn($blDebug);
$configMock->expects($this->atLeastOnce())->method('getConfigParam')->willReturnCallback(
function ($argName) use ($blDebug) {
switch ($argName) {
case 'd3datawizard_debug':
return $blDebug;
default:
return Registry::getConfig()->getConfigParam($argName);
}
}
);
/** @var d3ExportWizard|MockObject $controllerMock */
$controllerMock = $this->getMockBuilder(d3ExportWizard::class)
->onlyMethods(['getSettingsService'])
->onlyMethods(['d3GetConfig'])
->getMock();
$controllerMock->method('getSettingsService')->willReturn($settingsServiceMock);
$controllerMock->method('d3GetConfig')->willReturn($configMock);
$this->_oController = $controllerMock;
/** @var d3TestAction|MockObject $exportMock */
$exportMock = $this->getMockBuilder(d3TestExport::class)
->onlyMethods([
'getQuery',
'run',
'run'
])
->getMock();
$exportMock->expects($this->atLeastOnce())->method('getQuery')->willReturn(['SELECT 1', ['1']]);
@ -191,16 +192,4 @@ class d3ExportWizardTest extends d3AdminController
'debug' => [true],
];
}
/**
* @return string[][]
*/
public function runTaskFailedDataProvider(): array
{
return [
[DataWizardException::class],
[DBALException::class],
[DatabaseErrorException::class],
];
}
}
}

Voir le fichier

@ -18,7 +18,6 @@ namespace D3\DataWizard\tests\unit\Application\Model;
use D3\DataWizard\Application\Model\Exceptions\TaskException;
use D3\DataWizard\tests\tools\d3TestAction;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use Doctrine\DBAL\Connection;
use FormManager\Inputs\Hidden;
use FormManager\Inputs\Number;
use FormManager\Inputs\Radio;
@ -32,14 +31,14 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
/** @var d3TestAction */
protected $_oModel;
public function setUp(): void
public function setUp() : void
{
parent::setUp();
$this->_oModel = oxNew(d3TestAction::class);
}
public function tearDown(): void
public function tearDown() : void
{
parent::tearDown();
@ -95,7 +94,7 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
);
}
public function canGetHasFormElementsDataProvider(): array
public function canGetHasFormElementsDataProvider()
{
return [
'hasFormElements' => [['abc', 'def'], true],
@ -136,7 +135,7 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
$inputMock = $this->getMockBuilder($inputClass)
->onlyMethods([
'setTemplate',
'setAttribute',
'setAttribute'
])
->getMock();
$inputMock->expects($this->atLeastOnce())->method('setTemplate');
@ -161,7 +160,7 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
return [
'Radio' => [Radio::class],
'Checkbox' => [Radio::class],
'Hidden' => [Hidden::class],
'Hidden' => [Hidden::class]
];
}
@ -176,11 +175,11 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
->onlyMethods([
'hasFormElements',
'executeAction',
'getQuery',
'getQuery'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('hasFormElements')->willReturn(false);
$modelMock->expects($this->atLeastOnce())->method('executeAction');
$modelMock->expects($this->atLeastOnce())->method('executeAction')->willReturn(1);
$modelMock->expects($this->atLeastOnce())->method('getQuery')->willReturn([]);
$this->_oModel = $modelMock;
@ -205,11 +204,11 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
'hasFormElements',
'executeAction',
'getQuery',
'getFormElements',
'getFormElements'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('hasFormElements')->willReturn(true);
$modelMock->expects($this->exactly((int) !$blThrowException))->method('executeAction');
$modelMock->expects($this->exactly((int) !$blThrowException))->method('executeAction')->willReturn(1);
$modelMock->expects($this->exactly((int) !$blThrowException))->method('getQuery')->willReturn([]);
$modelMock->expects($this->atLeastOnce())->method('getFormElements')->willReturn($elements);
$this->_oModel = $modelMock;
@ -247,7 +246,7 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
return [
'validElements' => [[$validMock, $validMock], false],
'invalidElements' => [[$validMock, $invalidField], true],
'invalidElements' => [[$validMock, $invalidField], true]
];
}
@ -259,18 +258,17 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
*/
public function canExecuteAction($query, $throwsException)
{
/** @var Database|MockObject $connectionMock */
$connectionMock = $this->getMockBuilder(Connection::class)
->disableOriginalConstructor()
->onlyMethods(['executeStatement'])
/** @var Database|MockObject $dbMock */
$dbMock = $this->getMockBuilder(Database::class)
->onlyMethods(['execute'])
->getMock();
$connectionMock->expects($this->exactly((int) !$throwsException))->method('executeStatement')->willReturn(1);
$dbMock->expects($this->exactly((int) !$throwsException))->method('execute')->willReturn(true);
/** @var d3TestAction|MockObject $modelMock */
$modelMock = $this->getMockBuilder(d3TestAction::class)
->onlyMethods(['getConnection'])
->onlyMethods(['d3GetDb'])
->getMock();
$modelMock->expects($this->exactly((int) !$throwsException))->method('getConnection')->willReturn($connectionMock);
$modelMock->expects($this->exactly((int) !$throwsException))->method('d3GetDb')->willReturn($dbMock);
$this->_oModel = $modelMock;
@ -282,9 +280,9 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
);
} catch (TaskException $e) {
if ($throwsException) {
$this->assertStringContainsString('keine SELECTs exportieren', $e->getMessage());
$this->assertStringContainsString('ACTIONSELECT', $e->getMessage());
} else {
$this->assertStringContainsString('1 Eintrag verändert', $e->getMessage());
$this->assertStringContainsString('ACTIONRESULT', $e->getMessage());
}
}
}
@ -301,18 +299,18 @@ class ActionBaseTest extends d3ModCfgUnitTestCase
}
/**
* @covers \D3\DataWizard\Application\Model\ActionBase::getConnection
* @covers \D3\DataWizard\Application\Model\ActionBase::d3GetDb
* @test
* @throws ReflectionException
*/
public function canGetConnection()
public function canGetDb()
{
$this->assertInstanceOf(
Connection::class,
Database::class,
$this->callMethod(
$this->_oModel,
'getConnection'
'd3GetDb'
)
);
}
}
}

Voir le fichier

@ -21,21 +21,20 @@ use D3\DataWizard\tests\tools\d3TestAction;
use D3\DataWizard\tests\tools\d3TestExport;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class ConfigurationTest extends d3ModCfgUnitTestCase
{
/** @var Configuration */
protected $_oModel;
public function setUp(): void
public function setUp() : void
{
parent::setUp();
$this->_oModel = oxNew(Configuration::class);
}
public function tearDown(): void
public function tearDown() : void
{
parent::tearDown();
@ -45,7 +44,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::__construct
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canConstruct()
{
@ -66,7 +65,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::configure()
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canConfigure()
{
@ -81,7 +80,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::registerAction
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canRegisterAction()
{
@ -114,7 +113,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::registerExport
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canRegisterExport()
{
@ -148,16 +147,16 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
* @param $array
* @return array|false
*/
public function array_flatten($array)
{
public function array_flatten($array) {
if (!is_array($array)) {
return false;
}
$result = [];
$result = array();
foreach ($array as $key => $value) {
if (is_array($value)) {
$result = array_merge($result, $this->array_flatten($value));
} else {
}
else {
$result[$key] = $value;
}
}
@ -167,7 +166,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getGroupedActions()
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetGroupedActions()
{
@ -191,7 +190,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getGroupedExports()
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetGroupedExports()
{
@ -215,7 +214,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getActionGroups()
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetActionGroups()
{
@ -239,7 +238,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getExportGroups()
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetExportGroups()
{
@ -263,11 +262,11 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getActionsByGroup()
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetActionsByGroup()
{
$actionList = ['abc' => ['123'], 'def' => ['456']];
$actionList = ['abc' => '123', 'def' => '456'];
$this->setValue(
$this->_oModel,
@ -276,7 +275,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
);
$this->assertSame(
['456'],
'456',
$this->callMethod(
$this->_oModel,
'getActionsByGroup',
@ -288,11 +287,11 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getExportsByGroup()
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetExportsByGroup()
{
$exportList = ['abc' => ['123'], 'def' => ['456']];
$exportList = ['abc' => '123', 'def' => '456'];
$this->setValue(
$this->_oModel,
@ -301,7 +300,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
);
$this->assertSame(
['456'],
'456',
$this->callMethod(
$this->_oModel,
'getExportsByGroup',
@ -313,7 +312,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getAllActions()
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetAllActions()
{
@ -321,7 +320,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
$modelMock = $this->getMockBuilder(Configuration::class)
->onlyMethods([
'getActionGroups',
'getActionsByGroup',
'getActionsByGroup'
])
->getMock();
$modelMock->expects($this->once())->method('getActionGroups')->willReturn(['123', '456']);
@ -344,7 +343,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getAllExports()
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetAllExports()
{
@ -352,7 +351,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
$modelMock = $this->getMockBuilder(Configuration::class)
->onlyMethods([
'getExportGroups',
'getExportsByGroup',
'getExportsByGroup'
])
->getMock();
$modelMock->expects($this->once())->method('getExportGroups')->willReturn(['123', '456']);
@ -375,7 +374,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getActionById()
* @test
* @throws ReflectionException
* @throws \ReflectionException
* @dataProvider canGetActionByIdDataProvider
*/
public function canGetActionById($id, $throwException)
@ -410,7 +409,7 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Configuration::getExportById()
* @test
* @throws ReflectionException
* @throws \ReflectionException
* @dataProvider canGetActionByIdDataProvider
*/
public function canGetExportById($id, $throwException)
@ -452,4 +451,4 @@ class ConfigurationTest extends d3ModCfgUnitTestCase
'set id' => ['456', false],
];
}
}
}

Voir le fichier

@ -17,10 +17,7 @@ namespace D3\DataWizard\tests\unit\Application\Model\Exceptions;
use D3\DataWizard\Application\Model\Exceptions\DebugException;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use Exception;
use OxidEsales\Eshop\Core\Registry;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class DebugExceptionTest extends d3ModCfgUnitTestCase
{
@ -30,13 +27,13 @@ class DebugExceptionTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Exceptions\DebugException::__construct
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canConstruct()
{
$code = '500';
$exception = oxNew(Exception::class);
$exception = oxNew(\Exception::class);
/** @var DebugException|MockObject $modelMock */
$modelMock = $this->getMockBuilder(DebugException::class)
@ -52,7 +49,7 @@ class DebugExceptionTest extends d3ModCfgUnitTestCase
);
$this->assertStringContainsString(
'Debug: testMessage',
'DEBUG',
$this->callMethod(
$this->_oModel,
'getMessage'
@ -75,4 +72,5 @@ class DebugExceptionTest extends d3ModCfgUnitTestCase
)
);
}
}
}

Voir le fichier

@ -17,10 +17,7 @@ namespace D3\DataWizard\tests\unit\Application\Model\Exceptions;
use D3\DataWizard\Application\Model\Exceptions\ExportFileException;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use Exception;
use OxidEsales\Eshop\Core\Registry;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class ExportFileExceptionTest extends d3ModCfgUnitTestCase
{
@ -30,13 +27,13 @@ class ExportFileExceptionTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Exceptions\ExportFileException::__construct
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canConstruct()
{
$code = '500';
$exception = oxNew(Exception::class);
$exception = oxNew(\Exception::class);
/** @var ExportFileException|MockObject $modelMock */
$modelMock = $this->getMockBuilder(ExportFileException::class)
@ -52,7 +49,7 @@ class ExportFileExceptionTest extends d3ModCfgUnitTestCase
);
$this->assertStringContainsString(
'kann nicht angelegt werden',
'EXPORTFILEERROR',
$this->callMethod(
$this->_oModel,
'getMessage'
@ -75,4 +72,5 @@ class ExportFileExceptionTest extends d3ModCfgUnitTestCase
)
);
}
}
}

Voir le fichier

@ -19,10 +19,8 @@ use D3\DataWizard\Application\Model\Exceptions\InputUnvalidException;
use D3\DataWizard\Application\Model\ExportBase;
use D3\DataWizard\tests\tools\d3TestExport;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use Exception;
use FormManager\Inputs\Number;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class InputUnvalidExceptionTest extends d3ModCfgUnitTestCase
{
@ -32,14 +30,15 @@ class InputUnvalidExceptionTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Exceptions\InputUnvalidException::__construct
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canConstruct()
{
$code = '500';
$exception = oxNew(Exception::class);
$exception = oxNew(\Exception::class);
/** @var Number $invalidField */
$invalidField = new Number(null, [
'required' => true,
'min' => 1,
@ -69,7 +68,7 @@ class InputUnvalidExceptionTest extends d3ModCfgUnitTestCase
[$taskMock, $invalidField, $code, $exception]
);
$this->assertMatchesRegularExpression(
$this->assertRegExp(
'/^testTitle\s-\s*->\s.*\sless\s/m',
$this->callMethod(
$this->_oModel,
@ -93,4 +92,5 @@ class InputUnvalidExceptionTest extends d3ModCfgUnitTestCase
)
);
}
}
}

Voir le fichier

@ -17,10 +17,7 @@ namespace D3\DataWizard\tests\unit\Application\Model\Exceptions;
use D3\DataWizard\Application\Model\Exceptions\NoSuitableRendererException;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use Exception;
use OxidEsales\Eshop\Core\Registry;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class NoSuitableRendererExceptionTest extends d3ModCfgUnitTestCase
{
@ -30,13 +27,13 @@ class NoSuitableRendererExceptionTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Exceptions\NoSuitableRendererException::__construct
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canConstruct()
{
$code = '500';
$exception = oxNew(Exception::class);
$exception = oxNew(\Exception::class);
/** @var NoSuitableRendererException|MockObject $modelMock */
$modelMock = $this->getMockBuilder(NoSuitableRendererException::class)
@ -52,7 +49,7 @@ class NoSuitableRendererExceptionTest extends d3ModCfgUnitTestCase
);
$this->assertStringContainsString(
'kein Renderer f',
'NOSUITABLERENDERER',
$this->callMethod(
$this->_oModel,
'getMessage'
@ -75,4 +72,5 @@ class NoSuitableRendererExceptionTest extends d3ModCfgUnitTestCase
)
);
}
}
}

Voir le fichier

@ -19,9 +19,7 @@ use D3\DataWizard\Application\Model\Exceptions\TaskException;
use D3\DataWizard\Application\Model\ExportBase;
use D3\DataWizard\tests\tools\d3TestExport;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use Exception;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class TaskExceptionTest extends d3ModCfgUnitTestCase
{
@ -31,13 +29,13 @@ class TaskExceptionTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\Exceptions\TaskException::__construct
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canConstruct()
{
$code = '500';
$exception = oxNew(Exception::class);
$exception = oxNew(\Exception::class);
/** @var ExportBase|MockObject $taskMock */
$taskMock = $this->getMockBuilder(d3TestExport::class)
@ -82,4 +80,5 @@ class TaskExceptionTest extends d3ModCfgUnitTestCase
)
);
}
}
}

Voir le fichier

@ -23,14 +23,11 @@ use D3\DataWizard\Application\Model\ExportRenderer\RendererInterface;
use D3\DataWizard\tests\tools\d3TestExport;
use D3\ModCfg\Application\Model\d3filesystem;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Driver\Result;
use FormManager\Inputs\Hidden;
use FormManager\Inputs\Number;
use FormManager\Inputs\Radio;
use OxidEsales\Eshop\Core\Database\Adapter\Doctrine\Database;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
@ -39,14 +36,14 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
/** @var d3TestExport */
protected $_oModel;
public function setUp(): void
public function setUp() : void
{
parent::setUp();
$this->_oModel = oxNew(d3TestExport::class);
}
public function tearDown(): void
public function tearDown() : void
{
parent::tearDown();
@ -102,7 +99,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
);
}
public function canGetHasFormElementsDataProvider(): array
public function canGetHasFormElementsDataProvider()
{
return [
'hasFormElements' => [['abc', 'def'], true],
@ -143,7 +140,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
$inputMock = $this->getMockBuilder($inputClass)
->onlyMethods([
'setTemplate',
'setAttribute',
'setAttribute'
])
->getMock();
$inputMock->expects($this->atLeastOnce())->method('setTemplate');
@ -168,7 +165,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
return [
'Radio' => [Radio::class],
'Checkbox' => [Radio::class],
'Hidden' => [Hidden::class],
'Hidden' => [Hidden::class]
];
}
@ -186,7 +183,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
$modelMock = $this->getMockBuilder(d3TestExport::class)
->onlyMethods([
'hasFormElements',
'executeExport',
'executeExport'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('hasFormElements')->willReturn(false);
@ -217,7 +214,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
->onlyMethods([
'hasFormElements',
'executeExport',
'getFormElements',
'getFormElements'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('hasFormElements')->willReturn(true);
@ -259,7 +256,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
return [
'validElements' => [[$validMock, $validMock], false],
'invalidElements' => [[$validMock, $invalidField], true],
'invalidElements' => [[$validMock, $invalidField], true]
];
}
@ -277,7 +274,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
'startDirectDownload',
'filterFilename',
'trailingslashit',
'createFile',
'createFile'
])
->getMock();
$fsMock->expects($this->exactly((int) !isset($path)))->method('startDirectDownload')->willReturn(true);
@ -290,7 +287,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
->onlyMethods([
'getContent',
'getFileSystem',
'getExportFileName',
'getExportFileName'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('getContent')->willReturn('some content');
@ -323,17 +320,17 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
}
/**
* @covers \D3\DataWizard\Application\Model\ExportBase::getConnection
* @covers \D3\DataWizard\Application\Model\ExportBase::d3GetDb
* @test
* @throws ReflectionException
*/
public function canGetConnection()
public function canGetDb()
{
$this->assertInstanceOf(
Connection::class,
Database::class,
$this->callMethod(
$this->_oModel,
'getConnection'
'd3GetDb'
)
);
}
@ -374,7 +371,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
/** @var d3TestExport|MockObject $modelMock */
$modelMock = $this->getMockBuilder(d3TestExport::class)
->onlyMethods([
'getRendererBridge',
'getRendererBridge'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('getRendererBridge')->willReturn($rendererBridgeMock);
@ -428,7 +425,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
/** @var d3TestExport|MockObject $modelMock */
$modelMock = $this->getMockBuilder(d3TestExport::class)
->onlyMethods([
'getRenderer',
'getRenderer'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('getRenderer')->with($format)->willReturn($rendererMock);
@ -466,7 +463,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
/** @var d3TestExport|MockObject $modelMock */
$modelMock = $this->getMockBuilder(d3TestExport::class)
->onlyMethods([
'getRenderer',
'getRenderer'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('getRenderer')->with($format)->willReturn($rendererMock);
@ -493,7 +490,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
/** @var d3TestExport|MockObject $modelMock */
$modelMock = $this->getMockBuilder(d3TestExport::class)
->onlyMethods([
'getTitle',
'getTitle'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('getTitle')->willReturn('someTitle');
@ -519,7 +516,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
$modelMock = $this->getMockBuilder(d3TestExport::class)
->onlyMethods([
'getExportFilenameBase',
'getFileExtension',
'getFileExtension'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('getExportFilenameBase')->willReturn('base');
@ -527,7 +524,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
$this->_oModel = $modelMock;
$this->assertMatchesRegularExpression(
$this->assertRegExp(
'/^base_(\d{4})-(\d{2})-(\d{2})_(\d{2})-(\d{2})-(\d{2})\.extension$/m',
$this->callMethod(
$this->_oModel,
@ -545,26 +542,19 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
*/
public function canGetExportData($query, $throwsException, $dbResult)
{
/** @var Result|MockObject $resultMock */
$resultMock = $this->getMockBuilder(Result::class)
->onlyMethods(get_class_methods(Result::class))
/** @var Database|MockObject $dbMock */
$dbMock = $this->getMockBuilder(Database::class)
->onlyMethods(['getAll'])
->getMock();
$resultMock->method('fetchAllAssociative')->willReturn($dbResult);
/** @var Database|MockObject $connectionMock */
$connectionMock = $this->getMockBuilder(Connection::class)
->disableOriginalConstructor()
->onlyMethods(['executeQuery'])
->getMock();
$connectionMock->expects($this->exactly((int) !$throwsException))->method('executeQuery')->willReturn($resultMock);
$dbMock->expects($this->exactly((int) !$throwsException))->method('getAll')->willReturn($dbResult);
/** @var d3TestExport|MockObject $modelMock */
$modelMock = $this->getMockBuilder(d3TestExport::class)
->onlyMethods([
'getConnection',
'd3GetDb'
])
->getMock();
$modelMock->expects($this->exactly((int) !$throwsException))->method('getConnection')->willReturn($connectionMock);
$modelMock->expects($this->exactly((int) !$throwsException))->method('d3GetDb')->willReturn($dbMock);
$this->_oModel = $modelMock;
@ -572,7 +562,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
$result = $this->callMethod(
$this->_oModel,
'getExportData',
[[$query, ['param1', 'param2']]]
[[$query], ['param1', 'param2']]
);
$this->assertSame(
@ -580,19 +570,19 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
[
[
'field1' => 'content1',
'field2' => 'content2',
],
'field2' => 'content2'
]
],
[
'field1',
'field2',
],
'field2'
]
],
$result
);
} catch (TaskException $e) {
if ($throwsException) {
$this->assertStringContainsString('Export kann nicht ausgeführt werden', $e->getMessage());
$this->assertStringContainsString('NOEXPORTSELECT', $e->getMessage());
} elseif (!count($dbResult)) {
$this->assertStringContainsString('kein Inhalt', $e->getMessage());
}
@ -623,7 +613,7 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
->onlyMethods([
'getQuery',
'getExportData',
'renderContent',
'renderContent'
])
->getMock();
$modelMock->expects($this->atLeastOnce())->method('getQuery')->willReturn(['SELECT 1', ['arg1', 'arg2']]);
@ -641,4 +631,4 @@ class ExportBaseTest extends d3ModCfgUnitTestCase
)
);
}
}
}

Voir le fichier

@ -17,58 +17,28 @@ namespace D3\DataWizard\tests\unit\Application\Model\ExportRenderer;
use D3\DataWizard\Application\Model\Exceptions\RenderException;
use D3\DataWizard\Application\Model\ExportRenderer\Csv;
use Generator;
use League\Csv\Exception;
use League\Csv\Writer;
use OxidEsales\Eshop\Core\Config;
use OxidEsales\Eshop\Core\Registry;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class CsvTest extends ExportRendererTest
{
/** @var Csv */
protected $_oModel;
public function setUp(): void
public function setUp() : void
{
parent::setUp();
$this->_oModel = oxNew(Csv::class);
}
/**
* @test
*
* @param bool $force
*
* @return void
* @throws ReflectionException
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Csv::__construct
* @dataProvider canForceEncloseDataProvider
*/
public function canForceEnclose(bool $force): void
{
$noForce = oxNew(Csv::class, $force);
$this->assertSame(
$force,
$this->getValue(
$noForce,
'forceEnclose'
)
);
}
public function canForceEncloseDataProvider(): Generator
{
yield 'noForce' => [true];
yield 'force' => [false];
}
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Csv::getContent
* @test
* @throws ReflectionException
* @throws \ReflectionException
* @dataProvider canGetContentDataProvider
*/
public function canGetContent($blThrowException)
@ -80,19 +50,23 @@ class CsvTest extends ExportRendererTest
/** @var Writer|MockObject $csvMock */
$csvMockBuilder = $this->getMockBuilder(Writer::class);
$csvMockBuilder->disableOriginalConstructor();
$onlyMethods = ['__toString', 'insertOne', 'insertAll'];
$onlyMethods = ['insertOne', 'insertAll'];
if (method_exists($csvMockBuilder->getMock(), 'getContent')) {
$onlyMethods[] = 'getContent';
} else {
$csvMockBuilder->addMethods(['getContent']);
}
$csvMockBuilder->onlyMethods($onlyMethods);
$csvMock = $csvMockBuilder->getMock();
$csvMock->method('insertOne')->willReturn(1);
$csvMock->method('insertAll')->willReturn(1);
if ($blThrowException) {
$csvMock->expects($this->atLeastOnce())->method('__toString')->willThrowException(oxNew(Exception::class));
$csvMock->expects($this->atLeastOnce())->method('getContent')->willThrowException(oxNew(Exception::class));
$this->expectException(RenderException::class);
} else {
$csvMock->expects($this->atLeastOnce())->method('__toString')->willReturn($expected);
$csvMock->expects($this->atLeastOnce())->method('getContent')->willReturn($expected);
}
$csvMock->expects($this->atLeastOnce())->method('insertOne')->with($fieldList)->willReturn(1);
$csvMock->expects($this->atLeastOnce())->method('insertAll')->with($valueList)->willReturn(1);
/** @var Csv|MockObject $modelMock */
$modelMock = $this->getMockBuilder(Csv::class)
@ -118,14 +92,14 @@ class CsvTest extends ExportRendererTest
{
return [
'exception' => [true],
'no exception' => [false],
'no exception' => [false]
];
}
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Csv::getCsv
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetCsv()
{
@ -141,7 +115,7 @@ class CsvTest extends ExportRendererTest
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Csv::getCsv
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetCsvNoSettings()
{
@ -151,10 +125,13 @@ class CsvTest extends ExportRendererTest
->getMock();
$configMock->expects($this->atLeastOnce())->method('getConfigParam')->willReturnCallback(
function ($argName) {
return match ( $argName ) {
'sGiCsvFieldEncloser', 'sCSVSign' => null,
default => Registry::getConfig()->getConfigParam( $argName ),
};
switch ($argName) {
case 'sGiCsvFieldEncloser':
case 'sCSVSign':
return false;
default:
return Registry::getConfig()->getConfigParam($argName);
}
}
);
@ -188,7 +165,7 @@ class CsvTest extends ExportRendererTest
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Csv::d3GetConfig
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetConfig()
{
@ -200,4 +177,4 @@ class CsvTest extends ExportRendererTest
)
);
}
}
}

Voir le fichier

@ -15,14 +15,13 @@ namespace D3\DataWizard\tests\unit\Application\Model\ExportRenderer;
use D3\DataWizard\Application\Model\ExportRenderer\RendererInterface;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use ReflectionException;
abstract class ExportRendererTest extends d3ModCfgUnitTestCase
{
/** @var RendererInterface */
protected $_oModel;
public function tearDown(): void
public function tearDown() : void
{
parent::tearDown();
@ -34,11 +33,11 @@ abstract class ExportRendererTest extends d3ModCfgUnitTestCase
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Json::getFileExtension
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Pretty::getFileExtension
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetFileExtension()
{
$this->assertMatchesRegularExpression(
$this->assertRegExp(
"/^[a-z0-9._-]*$/i",
$this->callMethod(
$this->_oModel,
@ -52,7 +51,7 @@ abstract class ExportRendererTest extends d3ModCfgUnitTestCase
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Json::getTitleTranslationId
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Pretty::getTitleTranslationId
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetTitleTranslationId()
{
@ -63,4 +62,4 @@ abstract class ExportRendererTest extends d3ModCfgUnitTestCase
)
);
}
}
}

Voir le fichier

@ -17,14 +17,13 @@ namespace D3\DataWizard\tests\unit\Application\Model\ExportRenderer;
use D3\DataWizard\Application\Model\Exceptions\RenderException;
use D3\DataWizard\Application\Model\ExportRenderer\Json;
use ReflectionException;
class JsonTest extends ExportRendererTest
{
/** @var Json */
protected $_oModel;
public function setUp(): void
public function setUp() : void
{
parent::setUp();
@ -34,7 +33,7 @@ class JsonTest extends ExportRendererTest
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Json::getContent
* @test
* @throws ReflectionException
* @throws \ReflectionException
* @dataProvider canGetContentDataProvider
*/
public function canGetContent($valueList, $expectException)
@ -55,13 +54,13 @@ class JsonTest extends ExportRendererTest
}
/**
* @return string[][]
* @return \string[][]
*/
public function canGetContentDataProvider(): array
{
return [
'valid' => [['value1', "value2"], false],
'invalid' => [["text" => "\xB1\x31"], true], // malformed UTF8 chars
'valid' => [['value1', 'value2'], false],
'invalid' => [["text" => "\xB1\x31"], true] // malformed UTF8 chars
];
}
}
}

Voir le fichier

@ -18,14 +18,13 @@ namespace D3\DataWizard\tests\unit\Application\Model\ExportRenderer;
use D3\DataWizard\Application\Model\ExportRenderer\Pretty;
use MathieuViossat\Util\ArrayToTextTable;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class PrettyTest extends ExportRendererTest
{
/** @var Pretty */
protected $_oModel;
public function setUp(): void
public function setUp() : void
{
parent::setUp();
@ -35,7 +34,7 @@ class PrettyTest extends ExportRendererTest
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Pretty::getContent
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetContent()
{
@ -70,7 +69,7 @@ class PrettyTest extends ExportRendererTest
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\Pretty::getArrayToTextTableInstance
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetArrayToTextTableInstance()
{
@ -83,4 +82,4 @@ class PrettyTest extends ExportRendererTest
)
);
}
}
}

Voir le fichier

@ -23,14 +23,13 @@ use D3\DataWizard\Application\Model\ExportRenderer\RendererBridge;
use D3\DataWizard\Application\Model\ExportRenderer\RendererInterface;
use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class RendererBridgeTest extends d3ModCfgUnitTestCase
{
/** @var RendererBridge */
protected $_oModel;
public function setUp(): void
public function setUp() : void
{
parent::setUp();
@ -47,7 +46,7 @@ class RendererBridgeTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\RendererBridge::getRendererList
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetRendererList()
{
@ -63,7 +62,7 @@ class RendererBridgeTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\RendererBridge::getTranslatedRendererIdList
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canGetTranslatedRendererIdList()
{
@ -85,7 +84,7 @@ class RendererBridgeTest extends d3ModCfgUnitTestCase
/**
* @covers \D3\DataWizard\Application\Model\ExportRenderer\RendererBridge::translateRendererId
* @test
* @throws ReflectionException
* @throws \ReflectionException
*/
public function canTranslateRendererId()
{
@ -109,7 +108,7 @@ class RendererBridgeTest extends d3ModCfgUnitTestCase
* @test
* @param $format
* @param $blThrowException
* @throws ReflectionException
* @throws \ReflectionException
* @dataProvider canGetRendererDataProvider
*/
public function canGetRenderer($format, $blThrowException)
@ -122,7 +121,7 @@ class RendererBridgeTest extends d3ModCfgUnitTestCase
[
'CSV' => $this->getMockBuilder(Csv::class)->getMock(),
'Pretty' => $this->getMockBuilder(Pretty::class)->getMock(),
'JSON' => $this->getMockBuilder(Json::class)->getMock(),
'JSON' => $this->getMockBuilder(Json::class)->getMock()
]
);
@ -146,7 +145,7 @@ class RendererBridgeTest extends d3ModCfgUnitTestCase
{
return [
'existing renderer'=> [RendererBridge::FORMAT_JSON, false],
'unknown renderer'=> ['unknownRenderer', true],
'unknown renderer'=> ['unknownRenderer', true]
];
}
}
}

Voir le fichier

@ -1,8 +0,0 @@
[{block name="submitElements"}]
<div class="btn-group" [{$readonly}]>
<button type="button" class="btn btn-primary" onclick="if (confirm('[{oxmultilang ident="D3_DATAWIZARD_ACTION_SUBMIT_CONFIRM"}]') === true) {startTask('[{$id}]')}" [{$readonly}]>
<i class="fas fa-fw fa-magic"></i>
[{oxmultilang ident=$item->getButtonText()}]
</button>
</div>
[{/block}]

Voir le fichier

@ -1,4 +0,0 @@
{% set 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){% endset %}
{% set d3dw_noitemmessageid %}D3_DATAWIZARD_ERR_NOACTION_INSTALLED{% endset %}
{% include "@d3datawizard/admin/inc/Wizards.html.twig" with {submit: "@d3datawizard/admin/inc/actionSubmit.html.twig"} %}

Voir le fichier

@ -1,4 +0,0 @@
{% set 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)){% endset %}
{% set d3dw_noitemmessageid %}D3_DATAWIZARD_ERR_NOEXPORT_INSTALLED{% endset %}
{% include "@d3datawizard/admin/inc/Wizards.html.twig" with {submit: "@d3datawizard/admin/inc/exportSubmit.html.twig"} %}

Voir le fichier

@ -1,137 +0,0 @@
{% include "headitem.html.twig" with {title: "GENERAL_ADMIN_TITLE"|translate} %}
{{ style({ include: "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" }) }}
{{ script({ include: "https://code.jquery.com/jquery-3.2.1.slim.min.js", dynamic: __oxid_include_dynamic }) }}
{{ script({ include: "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js", dynamic: __oxid_include_dynamic }) }}
{{ script({ include: "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js", dynamic: __oxid_include_dynamic }) }}
{{ style({ 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: {{ d3dw_backgroundimage }};
}
h4 .btn {
font-size: 1.3rem;
}
h5.card-header {
font-size: 1.1rem;
}
.formElements label {
display: inline-block;
margin: .5rem 0;
}
</style>
{% capture assign = "d3script" %}{% apply spaceless %}
function startTask(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('taskid').value = id;
document.getElementById('format').value = format;
document.getElementById('myedit').submit();
}
{% endapply %}{% endcapture %}
{{ script({ add: d3script, dynamic: __oxid_include_dynamic }) }}
<form name="myedit" id="myedit" action="{{ oViewConf.getSelfLink() }}" method="post" style="padding: 0;margin: 0;height:0;">
{{ oViewConf.getHiddenSid()|raw }}
<input type="hidden" name="cl" value="{{ oViewConf.getActiveClassName() }}">
<input type="hidden" name="fnc" value="runTask">
<input type="hidden" name="taskid" id="taskid" value="">
<input type="hidden" name="format" id="format" value="CSV">
{% set groups = oView.getGroups() %}
{% if groups|length %}
<div id="accordion">
{% for group in oView.getGroups() %}
<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 }}">
{{ translate({ 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">
{% for id, item in oView.getGroupTasks(group) %}
<div class="col-sm-6 col-md-4 col-lg-3 pb-4">
<div class="card">
<h5 class="card-header">
{{ item.getTitle() }}
</h5>
<div class="card-body">
{% if item.getDescription() %}
{% set description = item.getDescription() %}
{% set sectionlength = "100" %}
{% if description|length <= sectionlength %}
<p class="card-text">{{ description }}</p>
{% else %}
{% set shorttext = 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>
{% endif %}
{% endif %}
{% if item.hasFormElements() %}
{% for formElement in item.getFormElements() %}
{{ formElement|raw }}
{% endfor %}
{% endif %}
{% block exportSubmit %}
{% include submit %}
{% endblock %}
</div>
</div>
</div>
{% endfor %}
</div>
<div class="clear"></div>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="alert alert-primary" role="alert">
{{ translate({ ident: d3dw_noitemmessageid }) }}
</div>
{% endif %}
</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 "@d3modcfg_lib/admin/inc/inc.html.twig" %}

Voir le fichier

@ -1,8 +0,0 @@
{% block submitElements %}
<div class="btn-group">
<button type="button" class="btn btn-primary" onclick="if (confirm('{{ translate({ ident: "D3_DATAWIZARD_ACTION_SUBMIT_CONFIRM" }) }}') === true) {startTask('{{ id }}')}">
<i class="fas fa-fw fa-magic"></i>
{{ translate({ ident: item.getButtonText() }) }}
</button>
</div>
{% endblock %}

Voir le fichier

@ -1,24 +0,0 @@
{% block submitElements %}
<div class="btn-group">
<button type="button" class="btn btn-primary" onclick="startTask('{{ id }}', 'CSV')">
<i class="fas fa-fw fa-magic"></i>
{{ translate({ 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-fw fa-magic"></i>
{{ translate({ ident: item.getButtonText() }) }}
</span>
</button>
<div class="dropdown-menu">
{% block dataWizardFormat %}
{% set rendererBridge = item.getRendererBridge() %}
{% for key, translationId in rendererBridge.getTranslatedRendererIdList() %}
<button class="dropdown-item" onclick="startTask('{{ id }}', '{{ key }}')">
{{ translate({ ident: translationId }) }}
</button>
{% endfor %}
{% endblock %}
</div>
</div>
{% endblock %}