From c2203a0d0649de0dd8b2f957c27ce97388f4ccce Mon Sep 17 00:00:00 2001 From: Philipp Dieter Date: Fri, 16 Apr 2021 11:55:50 +0200 Subject: [PATCH] [TASK] Improve error and config handling --- Classes/Controller/AbstractEIDController.php | 212 ++++++++++++++++++ Classes/Controller/ActionController.php | 40 +++- Classes/Controller/EIDController.php | 56 +++++ .../ScriptswitchNoscriptViewHelper.php | 53 +++++ .../Public/Css/backend/default/visual.css | 4 + ...ion_builder-make-git-dir-configurable.diff | 26 +++ ext_localconf.php | 33 +++ ext_tables.php | 3 + 8 files changed, 419 insertions(+), 8 deletions(-) create mode 100644 Classes/Controller/AbstractEIDController.php create mode 100644 Classes/Controller/EIDController.php create mode 100644 Classes/ViewHelpers/ScriptswitchNoscriptViewHelper.php create mode 100644 Resources/Public/Css/backend/default/visual.css create mode 100755 build/patches/extension_builder-make-git-dir-configurable.diff diff --git a/Classes/Controller/AbstractEIDController.php b/Classes/Controller/AbstractEIDController.php new file mode 100644 index 0000000..de08d51 --- /dev/null +++ b/Classes/Controller/AbstractEIDController.php @@ -0,0 +1,212 @@ + + * + ***/ + +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use TYPO3\CMS\Core\Cache\CacheManager; +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Database\Query\Restriction\DefaultRestrictionContainer; +use TYPO3\CMS\Core\Log\LogManager; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface; +use TYPO3\CMS\Extbase\Object\ObjectManager; +use TYPO3\CMS\Frontend\Plugin\AbstractPlugin; +use TYPO3\CMS\Frontend\Utility\EidUtility; + +/** + * AbstractEIDController + */ +class AbstractEIDController +{ + + /** + * @var BackendConfigurationManager + */ + protected $configurationManager; + + /** + * ApiUtility + */ + protected $apiUtility = null; + + /* + * extension Key + */ + protected $extensionKey = null; + + /* + * objectManager + */ + protected $objectManager = null; + + /* + * storagePids + */ + protected $settings = null; + + /* + * storagePids + */ + protected $storagePids = []; + + /* + * logManager + */ + protected $logManager = null; + + /* + * logger + */ + protected $importLogger = null; + + + /* + * returns the extensionkey set in the exended calss + */ + public function getExtensionKey() { + return $this->extensionKey; + } + + /** + * Construct + * + * @param ObjectManager $objectManager + * @param array $configuration + */ + public function __construct(ObjectManager $objectManager = null, + array $configuration = []) + { + $this->objectManager = GeneralUtility::makeInstance( + ObjectManager::class + ); + $this->initFrontendController(); + $this->configurationManager = $this->objectManager->get( + ConfigurationManagerInterface::class + ); + $this->configurationManager->setConfiguration(array()); + $frameworkConfiguration = $this->configurationManager->getConfiguration( + ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK, + $this->getExtensionKey() + ); + $this->settings = $frameworkConfiguration; + $this->storagePids = explode( + ',', + str_replace( + ' ', + '', + $frameworkConfiguration['persistence']['storagePid'] + ) + ); + $this->logManager = $this->objectManager->get( + LogManager::Class + ); + $this->importLogger = $this->logManager->getLogger( + 'importLogger' + ); + } + + /** + * Initialize frontentController + */ + private function initFrontendController() + { + $currentDomain = strtok(GeneralUtility::getIndpEnv('HTTP_HOST'), ':'); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable('sys_domain'); + $queryBuilder->setRestrictions( + GeneralUtility::makeInstance(DefaultRestrictionContainer::class) + ); + $result = $queryBuilder + ->select('uid', 'pid', 'domainName') + ->from('sys_domain') + ->where( + $queryBuilder->expr()->eq( + 'domainName', + $queryBuilder->createNamedParameter( + $currentDomain, + \PDO::PARAM_STR + ) + ) + ) + ->orderBy('sorting', 'ASC') + ->execute() + ->fetchAll(); + //if (count($result) < 1) { + // throw new \Exception('Domain not configured'); + //} + $frontendController = GeneralUtility::makeInstance( + \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController::class, + $GLOBALS['TYPO3_CONF_VARS'], + null, + 0, + true + ); + $GLOBALS['TSFE'] = $frontendController; + $frontendController->connectToDB(); + $frontendController->fe_user = EidUtility::initFeUser(); + $frontendController->id = $result[0]['pid']; + $frontendController->determineId(); + $frontendController->initTemplate(); + $frontendController->getConfigArray(); + EidUtility::initTCA(); + } + + /** + * process incoming requst + * + * checks if there is a method avaiable for the request and executes it, if + * found + * + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * @return void + */ + public function processRequest(ServerRequestInterface $request, + ResponseInterface $response = null) + { + $apiObject = explode('/', $request->getUri()->getPath())[3]; + $apiObjectId = explode('/', $request->getUri()->getPath())[4]; + if (!$apiObject) { + return $response->withStatus(404); + } + $httpMethod = strtolower($request->getMethod()); + if ($apiObjectId) { + $requestMethod = $httpMethod + . ucfirst($apiObject) + . 'SingleRequest'; + $request->apiObjectId = $apiObjectId; + } else { + $requestMethod = $httpMethod + . ucfirst($apiObject) + . 'Request'; + } + if (method_exists($this, $requestMethod)) { + $responseData = $this->$requestMethod($request, $response); + $response = $response->withHeader( + 'Content-Type', + 'application/json; charset=utf-8' + ); + if (is_array($responseData) + && array_key_exists('errors', $responseData) + ) { + $response = $response->withStatus(400); + } + $response->getBody()->write(\json_encode($responseData)); + return $response; + } else { + return $response->withStatus(404); + } + } + +} diff --git a/Classes/Controller/ActionController.php b/Classes/Controller/ActionController.php index 8c633c1..53153d1 100644 --- a/Classes/Controller/ActionController.php +++ b/Classes/Controller/ActionController.php @@ -123,6 +123,11 @@ class ActionController extends BaseController */ protected $uriBuilder = null; + /** + * general config + */ + protected $config = []; + /** * propertyMappginConfigrtationBuolder */ @@ -176,6 +181,9 @@ class ActionController extends BaseController */ public function initializeAction() { + $this->config = GeneralUtility::removeDotsFromTS( + $GLOBALS['TSFE']->config['config'] + ); $this->pageType = GeneralUtility::_GP('type'); if (!is_numeric($this->pageType)) { $this->pageType = 0; @@ -209,6 +217,16 @@ class ActionController extends BaseController $this->arguments->addNewArgument('submit', 'string', false, false); } + /** + * returns an instance of uribuilder + */ + public function getUriBuilder() + { + return $this->objectManager->get( + UriBuilder::class + ); + } + /** * shortcut * @@ -376,15 +394,21 @@ class ActionController extends BaseController /** * function to add validation error manually in the controller */ - protected function addValidationError($field, $keyword) { + protected function addValidationError( + $field, $keyword, $overwrite = false + ) { $this->responseStatus = [400 => 'validationError']; - $this->errors[$field] = [ - 'keyword' => $keyword, - ]; - $this->errorLabels[$field] = $this->getErrorLabel( - $field, - $keyword - ); + if (!array_key_exists($field, $this->errors) + || $overwrite == true + ) { + $this->errors[$field] = [ + 'keyword' => $keyword, + ]; + $this->errorLabels[$field] = $this->getErrorLabel( + $field, + $keyword + ); + } } diff --git a/Classes/Controller/EIDController.php b/Classes/Controller/EIDController.php new file mode 100644 index 0000000..ca08b54 --- /dev/null +++ b/Classes/Controller/EIDController.php @@ -0,0 +1,56 @@ + + * + ***/ + +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use TYPO3\CMS\Core\Cache\CacheManager; +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Database\Query\Restriction\DefaultRestrictionContainer; +use TYPO3\CMS\Core\Log\LogManager; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface; +use TYPO3\CMS\Extbase\Object\ObjectManager; +use TYPO3\CMS\Frontend\Plugin\AbstractPlugin; +use TYPO3\CMS\Frontend\Utility\EidUtility; + +/** + * EIDController + */ +class EIDController extends AbstractEIDController +{ + + public function scriptEnabled( + ServerRequestInterface $request, + ResponseInterface $response = null + ) { + $GLOBALS['TSFE']->fe_user->setKey('ses', 'scriptstate', 1); + $GLOBALS["TSFE"]->storeSessionData(); + $response->getBody()->write(\json_encode([])); + return $response; + } + + public function scriptDisabled( + ServerRequestInterface $request, + ResponseInterface $response = null + ) { + $GLOBALS['TSFE']->fe_user->setKey('ses', 'scriptstate', 0); + //\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump( + // $GLOBALS['TSFE']->fe_user->getKey('ses', 'scriptstate') + //); + $GLOBALS["TSFE"]->storeSessionData(); + $response->getBody()->write(\json_encode([])); + return $response; + } + +} diff --git a/Classes/ViewHelpers/ScriptswitchNoscriptViewHelper.php b/Classes/ViewHelpers/ScriptswitchNoscriptViewHelper.php new file mode 100644 index 0000000..fd685fb --- /dev/null +++ b/Classes/ViewHelpers/ScriptswitchNoscriptViewHelper.php @@ -0,0 +1,53 @@ +fe_user->getKey('ses', 'scriptstate') + //); + + $scriptstate = $GLOBALS['TSFE']->fe_user->getKey('ses', 'scriptstate'); + + if ($scriptstate) { + $_ = ''; + } else { + $_ = ' + + '; + } + + return $_; + } +} diff --git a/Resources/Public/Css/backend/default/visual.css b/Resources/Public/Css/backend/default/visual.css new file mode 100644 index 0000000..43435d3 --- /dev/null +++ b/Resources/Public/Css/backend/default/visual.css @@ -0,0 +1,4 @@ +.CodeMirror { + border: 1px solid #eee; + height: auto !important; +} diff --git a/build/patches/extension_builder-make-git-dir-configurable.diff b/build/patches/extension_builder-make-git-dir-configurable.diff new file mode 100755 index 0000000..5361cbf --- /dev/null +++ b/build/patches/extension_builder-make-git-dir-configurable.diff @@ -0,0 +1,26 @@ +--- webroot/typo3conf/ext/extension_builder/Classes/Service/FileGenerator.php 2020-06-08 22:07:03.000000000 +0200 ++++ webroot/typo3conf/ext/extension_builder/Classes/Service/FileGenerator.php 2020-08-12 01:39:57.931302902 +0200 +@@ -202,10 +202,6 @@ + GeneralUtility::mkdir($this->extensionDirectory); + } + +- $this->generateGitIgnore(); +- +- $this->generateGitAttributes(); +- + $this->generateEditorConfig(); + + $this->generateComposerJson(); +@@ -240,7 +236,11 @@ + $this->generateDocumentationFiles(); + } + +- $this->generateEmptyGitRepository(); ++ $extensionSettings = $extension->getSettings(); ++ if ($extensionSettings['overwriteSettings']['.git'] ?? false) { ++ $this->generateEmptyGitRepository(); ++ $this->generateGitIgnore(); ++ } + } + + protected function generateYamlSettingsFile() diff --git a/ext_localconf.php b/ext_localconf.php index fd18f63..32e1ddb 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -57,3 +57,36 @@ $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['nodeRegistry'][1549297828] = [ $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['c'] = []; $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['c'][] = 'Cjel\TemplatesAide\ViewHelpers'; + +$GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['n'] = []; +$GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['n'][] + = 'GeorgRinger\News\ViewHelpers'; + +call_user_func( + function() + { + $GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['script_enabled'] = + \Cjel\TemplatesAide\Controller\EIDController::class + . '::scriptEnabled'; + if (isset($_SERVER['REQUEST_URI'])) { + $uriParts = explode('/', $_SERVER['REQUEST_URI']); + if ($uriParts[1] === 'script' && $uriParts[2] === 'enabled') { + $_GET['eID'] = 'script_enabled'; + } + } + $GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['script_disabled'] = + \Cjel\TemplatesAide\Controller\EIDController::class + . '::scriptDisabled'; + if (isset($_SERVER['REQUEST_URI'])) { + $uriParts = explode('/', $_SERVER['REQUEST_URI']); + if ($uriParts[1] === 'script' && $uriParts[2] === 'disabled') { + $_GET['eID'] = 'script_disabled'; + } + } + //$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['script_enable'] = + // \Cjel\TemplatesAide\Controller\EIDController::class + // . '::scriptEnable'; + + + } +); diff --git a/ext_tables.php b/ext_tables.php index 778d708..389b9e0 100644 --- a/ext_tables.php +++ b/ext_tables.php @@ -40,6 +40,9 @@ call_user_func( 'EXT:templates_aide/Resources/Public/Css/backend/production-stage'; } + $GLOBALS['TBE_STYLES']['skins']['backend']['stylesheetDirectories']['default'] = + 'EXT:templates_aide/Resources/Public/Css/backend/default'; + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::registerPageTSConfigFile( 'templates_aide', 'Resources/Private/PageTSConfig/default.tsconfig',