* @link https://www.oxidmodule.com */ declare(strict_types=1); namespace D3\DataWizard\Application\Model; use D3\DataWizard\Application\Model\Exceptions\InputUnvalidException; use FormManager\Inputs\Checkbox; use FormManager\Inputs\Input; use FormManager\Inputs\Radio; use OxidEsales\Eshop\Core\DatabaseProvider; use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; use OxidEsales\Eshop\Core\Exception\DatabaseErrorException; use OxidEsales\Eshop\Core\Registry; abstract class ActionBase implements QueryBase { protected $formElements = []; /** * @return string */ public function getDescription() : string { return ''; } /** * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function run() { if ($this->hasFormElements()) { /** @var Input $element */ foreach ($this->getFormElements() as $element) { if (false === $element->isValid()) { throw oxNew(InputUnvalidException::class, $this, $element); } } } $this->executeAction( $this->getQuery() ); } /** * @param array $query * * @return int * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function executeAction( array $query ): int { [ $queryString, $parameters ] = $query; $queryString = trim($queryString); if ( strtolower( substr( $queryString, 0, 6 ) ) === 'select' ) { throw oxNew( Exceptions\TaskException::class, $this, Registry::getLang()->translateString( 'D3_DATAWIZARD_ERR_ACTIONSELECT' ) ); } $affected = DatabaseProvider::getDb( DatabaseProvider::FETCH_MODE_ASSOC )->execute( $queryString, $parameters ); throw oxNew( Exceptions\TaskException::class, $this, sprintf( Registry::getLang()->translateString( $affected === 1 ? 'D3_DATAWIZARD_ERR_ACTIONRESULT' : 'D3_DATAWIZARD_ERR_ACTIONRESULTS' ), $affected ) ); } /** * @return string */ public function getButtonText() : string { return "D3_DATAWIZARD_ACTION_SUBMIT"; } /** * @param Input $input */ public function registerFormElement(Input $input) { switch (get_class($input)) { case Radio::class: case Checkbox::class: $input->setTemplate('

{{ input }} {{ label }}

'); $input->setAttribute('class', 'form-check-input'); break; default: $input->setTemplate('

{{ label }} {{ input }}

'); $input->setAttribute('class', 'form-control'); } $this->formElements[] = $input; } /** * @return bool */ public function hasFormElements(): bool { return (bool) count($this->formElements); } /** * @return array */ public function getFormElements(): array { return $this->formElements; } }