From e193531782000e725aa6461df848036decf75a47 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 11 Jul 2018 14:05:45 +0200 Subject: [PATCH] [FEATURE] Adding new feature for selecting Theme features/extensions in order minimize loaded configuration by using the Theme. More information in Documentation/ExtensionsAndFeaturesInThemes.rst. --- ChangeLog.md | 9 +- Classes/Domain/Model/AbstractTheme.php | 102 ++++++++++++++-- Classes/Domain/Model/Theme.php | 49 +++++++- ...ncludeStaticTypoScriptSourcesAtEndHook.php | 8 +- Classes/Slots/BackendUtilitySlot.php | 110 ++++++++++++++++-- Configuration/TCA/Overrides/sys_template.php | 26 ++++- .../ExtensionsAndFeaturesInThemes.rst | 79 +++++++++++++ Resources/Private/Language/de.locallang.xlf | 8 ++ Resources/Private/Language/locallang.xlf | 6 + .../Private/Partials/Meta/Screenshots.html | 2 +- Resources/Private/Partials/Themes/Theme.html | 2 +- .../Partials/Themes/ThemeSelected.html | 2 +- .../Partials/Themes/ThemeSmallPreview.html | 2 +- .../Templates/Editor/ShowThemeDetails.html | 2 +- composer.json | 2 +- ext_emconf.php | 2 +- ext_tables.sql | 4 +- 17 files changed, 379 insertions(+), 36 deletions(-) create mode 100644 Documentation/ExtensionsAndFeaturesInThemes.rst diff --git a/ChangeLog.md b/ChangeLog.md index f1c97c07..1307e06a 100755 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,6 +1,11 @@ -## Themes Change-Log +# Themes Change-Log +## 2018-07-11 Release of version 8.7.2 + +### 2018-06-11 Thomas Deuling + +* [FEATURE] Adding new feature for selecting Theme features/extensions in order minimize loaded configuration by using the Theme. More information in Documentation/ExtensionsAndFeaturesInThemes.rst. ### 2015-08-02 Thomas Deuling -* [TASK] Adding new content element wizard for buttoncontent +* [TASK] Adding new content element wizard for buttoncontent diff --git a/Classes/Domain/Model/AbstractTheme.php b/Classes/Domain/Model/AbstractTheme.php index f833124e..02c494d3 100755 --- a/Classes/Domain/Model/AbstractTheme.php +++ b/Classes/Domain/Model/AbstractTheme.php @@ -6,13 +6,16 @@ use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Core\Utility\PathUtility; +use TYPO3\CMS\Core\TypoScript\TemplateService; +use TYPO3\CMS\Extbase\DomainObject\AbstractEntity; /** * Class AbstractTheme. * * @todo get rid of getExtensionname, use EXT:extname as theme name to avoid conflicts in the database */ -class AbstractTheme extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity +class AbstractTheme extends AbstractEntity { /** * @var string @@ -67,6 +70,7 @@ class AbstractTheme extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity /** * Constructs a new Theme. * + * @param string $extensionName * @api */ public function __construct($extensionName) @@ -107,7 +111,11 @@ public function getDescription() */ public function getPreviewImage() { - return $this->previewImage; + // We need to use a real image file path, because in case of using a file + // reference, a non admin backend user might not have access to the storage! + $previewImage = GeneralUtility::getFileAbsFileName($this->previewImage); + $previewImage = PathUtility::getAbsoluteWebPath($previewImage); + return $previewImage; } /** @@ -162,7 +170,7 @@ public function getVersion() } /** - * @todo missing docblock + * @return array */ public function getAuthor() { @@ -186,10 +194,15 @@ public function getManualUrl() */ public function getTypoScriptConfig() { - if (file_exists($this->getTypoScriptConfigAbsPath()) && is_file($this->getTypoScriptConfigAbsPath())) { - return file_get_contents($this->getTypoScriptConfigAbsPath()); + $typoScriptConfig = ''; + $typoScriptConfigAbsPath = $this->getTypoScriptConfigAbsPath(); + if (file_exists($typoScriptConfigAbsPath) && is_file($typoScriptConfigAbsPath)) { + $typoScriptConfig = file_get_contents($typoScriptConfigAbsPath); } - return ''; + + + + return $typoScriptConfig; } /** @@ -235,10 +248,12 @@ public function getRelativePath() * * @param array $params Array of parameters from the parent class. Includes idList, templateId, pid, and row. * @param \TYPO3\CMS\Core\TypoScript\TemplateService $pObj Reference back to parent object, t3lib_tstemplate or one of its subclasses. + * @param array $extensions Array of additional TypoScript for extensions + * @param array $features Array of additional TypoScript for features * * @return void */ - public function addTypoScriptForFe(&$params, \TYPO3\CMS\Core\TypoScript\TemplateService &$pObj) + public function addTypoScriptForFe(&$params, TemplateService &$pObj, $extensions=[], $features=[]) { // @codingStandardsIgnoreStart $themeItem = [ @@ -261,6 +276,79 @@ public function addTypoScriptForFe(&$params, \TYPO3\CMS\Core\TypoScript\Template 'ext_themes'.str_replace('_', '', $this->getExtensionName()), $params['templateId'] ); + // + // Additional TypoScript for extensions + if(count($extensions) > 0) { + foreach($extensions as $extension) { + $themeItem = $this->getTypoScriptDataForProcessing($extension, 'extension'); + $pObj->processTemplate( + $themeItem, + $params['idList'].',ext_theme'.str_replace('_', '', $this->getExtensionName()), + $params['pid'], 'ext_theme'.str_replace('_', '', $this->getExtensionName()), + $params['templateId'] + ); + } + } + // + // Additional TypoScript for features + if(count($features) > 0) { + foreach($features as $feature) { + $themeItem = $this->getTypoScriptDataForProcessing($feature, 'feature'); + $pObj->processTemplate( + $themeItem, + $params['idList'].',ext_theme'.str_replace('_', '', $this->getExtensionName()), + $params['pid'], 'ext_theme'.str_replace('_', '', $this->getExtensionName()), + $params['templateId'] + ); + } + } + } + + /** + * @param $key string Key of the Extension or Feature + * @param $type string Typ can be either extension or feature. + * @return array + */ + protected function getTypoScriptDataForProcessing($key, $type='extension') { + $relPath = ''; + $keyParts = explode('_', $key); + $extensionKey = GeneralUtility::camelCaseToLowerCaseUnderscored($keyParts[0]); + $extensionPath = ExtensionManagementUtility::extPath($extensionKey); + if($type === 'feature') { + $relPath = $extensionPath . 'Configuration/TypoScript/Features/' . $keyParts[1] . '/'; + } + else if($type === 'extension') { + $relPath = $extensionPath . 'Resources/Private/Extensions/' . $keyParts[1] . '/TypoScript/'; + } + $themeItem = [ + 'constants' => '', + 'config' => '', + 'include_static' => '', + 'include_static_file' => '', + 'title' => 'themes:' . $this->getExtensionName() . ':' . $relPath, + 'uid' => md5($this->getExtensionName() . ':' . $relPath), + ]; + $setupFile = GeneralUtility::getFileAbsFileName($relPath . 'setup.txt'); + if(file_exists($setupFile)) { + $themeItem['config'] = file_get_contents($setupFile); + } + else { + $setupFile = GeneralUtility::getFileAbsFileName($relPath . 'setup.typoscript'); + if(file_exists($setupFile)) { + $themeItem['config'] = file_get_contents($setupFile); + } + } + $constantsFile = GeneralUtility::getFileAbsFileName($relPath . 'constants.txt'); + if(file_exists($constantsFile)) { + $themeItem['constants'] = file_get_contents($constantsFile); + } + else { + $constantsFile = GeneralUtility::getFileAbsFileName($relPath . 'constants.typoscript'); + if(file_exists($constantsFile)) { + $themeItem['constants'] = file_get_contents($constantsFile); + } + } + return $themeItem; } /** diff --git a/Classes/Domain/Model/Theme.php b/Classes/Domain/Model/Theme.php index 023cf355..80459167 100755 --- a/Classes/Domain/Model/Theme.php +++ b/Classes/Domain/Model/Theme.php @@ -4,6 +4,8 @@ use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Core\Utility\PathUtility; +use TYPO3\CMS\Core\TypoScript\TemplateService; /** * Class Theme. @@ -15,6 +17,8 @@ class Theme extends AbstractTheme /** * Constructs a new Theme. * + * @param $extensionName + * @throws \Exception * @api */ public function __construct($extensionName) @@ -99,11 +103,15 @@ protected function importExtEmConf() public function getAllPreviewImages() { $buffer = $this->metaInformation['screenshots']; - $buffer[] = [ - 'file' => $this->getPreviewImage(), - 'caption' => '', - ]; - + if(count($buffer) > 0) { + foreach($buffer as $key => $image) { + // We need to use a real image file path, because in case of using a file + // reference, a non admin backend user might not have access to the storage! + $previewImage = GeneralUtility::getFileAbsFileName($image['file']); + $previewImage = PathUtility::getAbsoluteWebPath($previewImage); + $buffer[$key]['file'] = $previewImage; + } + } return $buffer; } @@ -138,10 +146,12 @@ public function getRelativePath() * * @param array $params Array of parameters from the parent class. Includes idList, templateId, pid, and row. * @param object $pObj Reference back to parent object, t3lib_tstemplate or one of its subclasses. + * @param array $extensions Array of additional TypoScript for extensions + * @param array $features Array of additional TypoScript for features * * @return void */ - public function addTypoScriptForFe(&$params, \TYPO3\CMS\Core\TypoScript\TemplateService &$pObj) + public function addTypoScriptForFe(&$params, TemplateService &$pObj, $extensions=[], $features=[]) { // @codingStandardsIgnoreStart $themeItem = [ @@ -166,5 +176,32 @@ public function addTypoScriptForFe(&$params, \TYPO3\CMS\Core\TypoScript\Template $params['pid'], 'ext_theme'.str_replace('_', '', $this->getExtensionName()), $params['templateId'] ); + // + // Additional TypoScript for extensions + if(count($extensions) > 0) { + foreach($extensions as $extension) { + $themeItem = $this->getTypoScriptDataForProcessing($extension, 'extension'); + $pObj->processTemplate( + $themeItem, + $params['idList'].',ext_theme'.str_replace('_', '', $this->getExtensionName()), + $params['pid'], 'ext_theme'.str_replace('_', '', $this->getExtensionName()), + $params['templateId'] + ); + } + } + // + // Additional TypoScript for features + if(count($features) > 0) { + foreach($features as $feature) { + $themeItem = $this->getTypoScriptDataForProcessing($feature, 'feature'); + $pObj->processTemplate( + $themeItem, + $params['idList'].',ext_theme'.str_replace('_', '', $this->getExtensionName()), + $params['pid'], 'ext_theme'.str_replace('_', '', $this->getExtensionName()), + $params['templateId'] + ); + } + } } + } diff --git a/Classes/Hooks/T3libTstemplateIncludeStaticTypoScriptSourcesAtEndHook.php b/Classes/Hooks/T3libTstemplateIncludeStaticTypoScriptSourcesAtEndHook.php index f043fdce..fcd9c213 100755 --- a/Classes/Hooks/T3libTstemplateIncludeStaticTypoScriptSourcesAtEndHook.php +++ b/Classes/Hooks/T3libTstemplateIncludeStaticTypoScriptSourcesAtEndHook.php @@ -6,6 +6,7 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Core\TypoScript\TemplateService; /** * Class T3libTstemplateIncludeStaticTypoScriptSourcesAtEndHook. @@ -22,12 +23,11 @@ class T3libTstemplateIncludeStaticTypoScriptSourcesAtEndHook * * @return void */ - public static function main(&$params, \TYPO3\CMS\Core\TypoScript\TemplateService &$pObj) + public static function main(&$params, TemplateService &$pObj) { $idList = $params['idList']; $templateId = $params['templateId']; $pid = $params['pid']; - $row = $params['row']; if ($templateId === $idList) { /** @var \TYPO3\CMS\Core\Database\Query\QueryBuilder $queryBuilder */ $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) @@ -64,7 +64,9 @@ public static function main(&$params, \TYPO3\CMS\Core\TypoScript\TemplateService $theme = $themeRepository->findByUid($tRow['tx_themes_skin']); } if ($theme !== null) { - $theme->addTypoScriptForFe($params, $pObj); + $themeExtensions = GeneralUtility::trimExplode(',', $tRow['tx_themes_extensions'], true); + $themeFeatures = GeneralUtility::trimExplode(',', $tRow['tx_themes_features'], true); + $theme->addTypoScriptForFe($params, $pObj, $themeExtensions, $themeFeatures); } // @todo add hook to inject template overlays, e.g. for previewed constants before save ... // Call hook for possible manipulation of current skin. constants diff --git a/Classes/Slots/BackendUtilitySlot.php b/Classes/Slots/BackendUtilitySlot.php index 1966e768..61689e2e 100755 --- a/Classes/Slots/BackendUtilitySlot.php +++ b/Classes/Slots/BackendUtilitySlot.php @@ -2,14 +2,30 @@ namespace KayStrobach\Themes\Slots; +use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Backend\Configuration\TsConfigParser; /** * This class automatically adds the theme TSConfig for the current page * to the Page TSConfig either by using a signal slot. */ -class BackendUtilitySlot extends \TYPO3\CMS\Backend\Configuration\TsConfigParser +class BackendUtilitySlot extends TsConfigParser { + + /** + * Selected/activated extensions in Theme (selected by sys_template) + * @var array + */ + protected $themeExtensions = []; + + /** + * Selected/activated features in Theme (selected by sys_template) + * @var array + */ + protected $themeFeatures = []; + /** * Retrieves the theme TSConfig for the given page. * @@ -18,28 +34,48 @@ class BackendUtilitySlot extends \TYPO3\CMS\Backend\Configuration\TsConfigParser * @param $rootLine * @param $returnPartArray * - * @return string The found TSConfig or an empty string. + * @return array The found TSConfig or an empty string. */ public function getPagesTsConfigPreInclude($typoscriptDataArray, $pageUid, $rootLine, $returnPartArray) { $pageUid = (int) $pageUid; - if ($pageUid === 0) { - return; + return []; } - /** @var \KayStrobach\Themes\Domain\Repository\ThemeRepository $themeRepository */ $themeRepository = GeneralUtility::makeInstance('KayStrobach\Themes\\Domain\\Repository\\ThemeRepository'); $theme = $themeRepository->findByPageOrRootline($pageUid); - if (!isset($theme)) { - return ''; + return []; } - + // Append Theme tsconfig.txt $defaultDataArray['defaultPageTSconfig'] = array_shift($typoscriptDataArray); + // + // Fetch Theme Extensions and Features + $this->fetchThemeExtensionsAndFeatures($pageUid); + // + // Additional TypoScript for extensions + if(count($this->themeExtensions) > 0) { + foreach($this->themeExtensions as $extension) { + $tsconfig = $this->getTypoScriptDataForProcessing($extension, 'extension'); + if($tsconfig !== '') { + array_unshift($typoscriptDataArray, $tsconfig); + } + } + } + // + // Additional TypoScript for features + if(count($this->themeFeatures) > 0) { + foreach ($this->themeFeatures as $feature) { + $tsconfig = $this->getTypoScriptDataForProcessing($feature, 'feature'); + if($tsconfig !== '') { + array_unshift($typoscriptDataArray, $tsconfig); + } + } + } + // array_unshift($typoscriptDataArray, $theme->getTypoScriptConfig()); $typoscriptDataArray = $defaultDataArray + $typoscriptDataArray; - return [ $typoscriptDataArray, $pageUid, @@ -47,4 +83,60 @@ public function getPagesTsConfigPreInclude($typoscriptDataArray, $pageUid, $root $returnPartArray, ]; } + + /** + * Fetches the selected Extensions and Features by the Theme + * @param $pageUid + */ + protected function fetchThemeExtensionsAndFeatures($pageUid) { + /** @var \TYPO3\CMS\Core\Database\Query\QueryBuilder $queryBuilder */ + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable('sys_template'); + $queryBuilder->select('*') + ->from('sys_template') + ->where( + $queryBuilder->expr()->eq( + 'pid', $queryBuilder->createNamedParameter((int)$pageUid, \PDO::PARAM_INT) + ) + ); + /** @var \Doctrine\DBAL\Driver\Statement $statement */ + $statement = $queryBuilder->execute(); + if ($statement->rowCount()>0) { + $tRow = $statement->fetch(); + $this->themeExtensions = GeneralUtility::trimExplode(',', $tRow['tx_themes_extensions'], true); + $this->themeFeatures = GeneralUtility::trimExplode(',', $tRow['tx_themes_features'], true); + } + } + + /** + * @param $key string Key of the Extension or Feature + * @param $type string Typ can be either extension or feature. + * @return array + */ + protected function getTypoScriptDataForProcessing($key, $type='extension') { + $relPath = ''; + $keyParts = explode('_', $key); + $extensionKey = GeneralUtility::camelCaseToLowerCaseUnderscored($keyParts[0]); + $extensionPath = ExtensionManagementUtility::extPath($extensionKey); + if($type === 'feature') { + $relPath = $extensionPath . 'Configuration/PageTS/Features/' . $keyParts[1] . '/'; + } + else if($type === 'extension') { + $relPath = $extensionPath . 'Resources/Private/Extensions/' . $keyParts[1] . '/PageTS/'; + } + // + $tsconfig = ''; + $constantsFile = GeneralUtility::getFileAbsFileName($relPath . 'tsconfig.txt'); + if(file_exists($constantsFile)) { + $tsconfig = file_get_contents($constantsFile); + } + else { + $constantsFile = GeneralUtility::getFileAbsFileName($relPath . 'tsconfig.typoscript'); + if(file_exists($constantsFile)) { + $tsconfig = file_get_contents($constantsFile); + } + } + return $tsconfig; + } + } diff --git a/Configuration/TCA/Overrides/sys_template.php b/Configuration/TCA/Overrides/sys_template.php index 60e68253..d84d3104 100755 --- a/Configuration/TCA/Overrides/sys_template.php +++ b/Configuration/TCA/Overrides/sys_template.php @@ -21,8 +21,32 @@ ] ], ], + 'tx_themes_extensions' => [ + 'label' => 'LLL:EXT:themes/Resources/Private/Language/locallang.xlf:theme_extensions', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectMultipleSideBySide', + 'size' => 10, + 'maxitems' => 100, + 'items' => [], + 'enableMultiSelectFilterTextfield' => true, + 'softref' => 'ext_fileref' + ] + ], + 'tx_themes_features' => [ + 'label' => 'LLL:EXT:themes/Resources/Private/Language/locallang.xlf:theme_features', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectMultipleSideBySide', + 'size' => 10, + 'maxitems' => 100, + 'items' => [], + 'enableMultiSelectFilterTextfield' => true, + 'softref' => 'ext_fileref' + ] + ], ]; // Add the skin selector for backend users. \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('sys_template', $tempColumn); -\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('sys_template', '--div--;Themes,tx_themes_skin'); +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('sys_template', '--div--;Themes,tx_themes_skin,tx_themes_extensions,tx_themes_features'); diff --git a/Documentation/ExtensionsAndFeaturesInThemes.rst b/Documentation/ExtensionsAndFeaturesInThemes.rst new file mode 100644 index 00000000..781a77e2 --- /dev/null +++ b/Documentation/ExtensionsAndFeaturesInThemes.rst @@ -0,0 +1,79 @@ +# Extensions and features in Themes + +A Theme can support a lot of different extensions and features. The problem might be, that your theme often loads lot of extension and feature stuff, that isn't required in every usecase. Therefore we added an additional selection for such extension and feature stuff in the Sys-Template. + + +## Registering Extensions and Features + +You can register new supported extensions and features by using Page-TypoScript of your Theme. + +``` +TCEFORM { + sys_template { + # Define some supported features + tx_themes_features.addItems { + ThemeBootstrap4_GoogleAnalytics = Google-Analytics + ThemeBootstrap4_Piwik = Piwik + } + # Define some extensions + tx_themes_extensions.addItems { + ThemeBootstrap4_News = News + ThemeBootstrap4_Fahrzeugsuche = Fahrzeugsuche + } + } +} +``` + +As you can see, we have two sections - `tx_themes_features` for the features and `tx_themes_extensions` for the extensions. This script simply adds some selection items in your TypoScript Root-Template Record. In this record you are now able to select the extensions and features as you need. Because this selections are based on the Root-Template of each website root, you are able to provide these settings only for the related website tree. + +## Providing Extension and Feature configuration in your Theme + +### Providing Features + +For providing a feature in your theme, you simply need the following three files: + +1. `Configuration/PageTS/Features/IconsFontAwesome4/tsconfig.typoscript` +2. `Configuration/TypoScript/Features/IconsFontAwesome4/constants.typoscript` +3. `Configuration/TypoScript/Features/IconsFontAwesome4/setup.typoscript` + +These files would need the following registration: + +``` +TCEFORM { + sys_template { + tx_themes_features.addItems { + ThemeBootstrap4_IconsFontAwesome4 = Icons: FontAwesome 4 + } + } +} +``` + +The registration key `ThemeBootstrap4_IconsFontAwesome4` explained: + +* `ThemeBootstrap4` represents the Theme extension key (upper camel case) +* `IconsFontAwesome4` represents the feature folder within the Theme + +### Providing Extensions + +For providing an extension in your theme, you simply need the following three files: + +1. `Resources/Private/Extensions/News/PageTS/tsconfig.typoscript` +2. `Resources/Private/Extensions/News/TypoScript/constants.typoscript` +3. `Resources/Private/Extensions/News/TypoScript/setup.typoscript` + +These files would need the following registration: + +``` +TCEFORM { + sys_template { + tx_themes_extensions.addItems { + ThemeBootstrap4_News = News + } + } +} +``` + +The registration key `ThemeBootstrap4_IconsFontAwesome4` explained: + +* `ThemeBootstrap4` represents the Theme extension key (upper camel case) +* `News` represents the extension folder within the Theme (based in Resources/Private/Extensions/) diff --git a/Resources/Private/Language/de.locallang.xlf b/Resources/Private/Language/de.locallang.xlf index 7e5b86d1..26f2a56d 100755 --- a/Resources/Private/Language/de.locallang.xlf +++ b/Resources/Private/Language/de.locallang.xlf @@ -11,6 +11,14 @@ Themes Themes + + Theme extensions + Theme-Extensions + + + Theme features + Theme-Features + Configure Theme Theme anpassen diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf index 144a29de..14b9372d 100755 --- a/Resources/Private/Language/locallang.xlf +++ b/Resources/Private/Language/locallang.xlf @@ -13,6 +13,12 @@ Themes + + Theme extensions + + + Theme features + Configure Theme diff --git a/Resources/Private/Partials/Meta/Screenshots.html b/Resources/Private/Partials/Meta/Screenshots.html index 6401c70a..bcfc2bc6 100755 --- a/Resources/Private/Partials/Meta/Screenshots.html +++ b/Resources/Private/Partials/Meta/Screenshots.html @@ -11,7 +11,7 @@ diff --git a/Resources/Private/Partials/Themes/Theme.html b/Resources/Private/Partials/Themes/Theme.html index c26ab3e9..d6d0f9ff 100755 --- a/Resources/Private/Partials/Themes/Theme.html +++ b/Resources/Private/Partials/Themes/Theme.html @@ -1,6 +1,6 @@
  • - + {screenshot.caption}
    {theme.title} diff --git a/Resources/Private/Partials/Themes/ThemeSelected.html b/Resources/Private/Partials/Themes/ThemeSelected.html index a35deeea..e01913fb 100755 --- a/Resources/Private/Partials/Themes/ThemeSelected.html +++ b/Resources/Private/Partials/Themes/ThemeSelected.html @@ -29,7 +29,7 @@
    - +
    diff --git a/Resources/Private/Partials/Themes/ThemeSmallPreview.html b/Resources/Private/Partials/Themes/ThemeSmallPreview.html index 703b4ee2..fa355881 100755 --- a/Resources/Private/Partials/Themes/ThemeSmallPreview.html +++ b/Resources/Private/Partials/Themes/ThemeSmallPreview.html @@ -4,7 +4,7 @@
    - + {screenshot.caption}
    diff --git a/Resources/Private/Templates/Editor/ShowThemeDetails.html b/Resources/Private/Templates/Editor/ShowThemeDetails.html index 4bfb8b01..3477e6ab 100755 --- a/Resources/Private/Templates/Editor/ShowThemeDetails.html +++ b/Resources/Private/Templates/Editor/ShowThemeDetails.html @@ -52,7 +52,7 @@
    - +
    diff --git a/composer.json b/composer.json index 44061151..f9d1ed78 100755 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "typo3-themes/themes", "type": "typo3-cms-extension", "description": "TYPO3 THEMES", - "version": "8.7.0", + "version": "8.7.2", "homepage": "http://typo3-themes.org", "license": ["GPL-2.0+"], "keywords": ["TYPO3 CMS", "TYPO3 THEMES", "THEMES", "THEMES", "FLUID", "CUSTOMIZE"], diff --git a/ext_emconf.php b/ext_emconf.php index 0a9e1c18..46ace291 100755 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -13,7 +13,7 @@ 'description' => '', 'category' => 'fe', 'shy' => 0, - 'version' => '8.7.0', + 'version' => '8.7.2', 'dependencies' => '', 'conflicts' => '', 'priority' => '', diff --git a/ext_tables.sql b/ext_tables.sql index 075535cc..55ed40b6 100755 --- a/ext_tables.sql +++ b/ext_tables.sql @@ -1,5 +1,7 @@ CREATE TABLE sys_template ( - tx_themes_skin tinytext NOT NULL + tx_themes_skin tinytext NOT NULL, + tx_themes_extensions text, + tx_themes_features text, ); #