[!!!][TASK] Allow New Content Element override with custom module 17/43417/8
authorBenjamin Mack <benni@typo3.org>
Fri, 18 Sep 2015 11:01:26 +0000 (13:01 +0200)
committerWouter Wolters <typo3@wouterwolters.nl>
Fri, 6 Nov 2015 07:41:15 +0000 (08:41 +0100)
Use a module / route to override the new content element
wizard instead of hard-coded paths to extensions, used
e.g. in templavoila.

Resolves: #70055
Releases: master
Change-Id: I648cbbde5dd024ace2d4189fadf434dc498d32f8
Reviewed-on: https://review.typo3.org/43417
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
typo3/sysext/backend/Classes/ClickMenu/ClickMenu.php
typo3/sysext/backend/Classes/Controller/NewRecordController.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-70055-OverrideNewContentElementWizardViaPageTSconfig.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/View/AdminPanelView.php
typo3/sysext/recordlist/Classes/RecordList/DatabaseRecordList.php

index ea7cf0c..5c274c3 100644 (file)
@@ -685,12 +685,14 @@ class ClickMenu
      */
     public function DB_newWizard($table, $uid, $rec)
     {
-        //  If mod.web_list.newContentWiz.overrideWithExtension is set, use that extension's create new content wizard instead:
-        $tmpTSc = BackendUtility::getModTSconfig($this->pageinfo['uid'], 'mod.web_list');
-        $tmpTSc = $tmpTSc['properties']['newContentWiz.']['overrideWithExtension'];
-
-        $newContentWizScriptPath = ExtensionManagementUtility::isLoaded($tmpTSc) ? ExtensionManagementUtility::extRelPath($tmpTSc) . 'mod1/db_new_content_el.php?' : BackendUtility::getModuleUrl('new_content_element') . '&';
-        $url = $table === 'pages' ? BackendUtility::getModuleUrl('db_new', ['id' => $uid, 'pagesOnly' => 1]) : $newContentWizScriptPath . 'id=' . $rec['pid'] . '&sys_language_uid=' . (int)$rec['sys_language_uid'];
+        if ($table === 'pages') {
+            $url = BackendUtility::getModuleUrl('db_new', ['id' => $uid, 'pagesOnly' => 1]);
+        } else {
+            //  If mod.newContentElementWizard.override is set, use a custom module instead
+            $tsConfig = BackendUtility::getModTSconfig($this->pageinfo['uid'], 'mod');
+            $newContentWizardModuleName = $tsConfig['properties']['newContentElementWizard.']['override'] ?: 'new_content_element';
+            $url = BackendUtility::getModuleUrl($newContentWizardModuleName, ['id' => $rec['pid'], 'sys_language_uid' => (int)$rec['sys_language_uid']]);
+        }
         return $this->linkItem(
             $this->languageService->makeEntities($this->languageService->getLL('CM_newWizard')),
             $this->iconFactory->getIcon(($table === 'pages' ? 'actions-page-new' : 'actions-document-new'), Icon::SIZE_SMALL)->render(),
index 6369f3a..391b20d 100644 (file)
@@ -503,11 +503,11 @@ class NewRecordController extends AbstractModule
                         if ($table == 'tt_content') {
                             $groupName = $lang->getLL('createNewContent');
                             $rowContent = $newContentIcon . '<strong>' . $lang->getLL('createNewContent') . '</strong><ul>';
-                            // If mod.web_list.newContentWiz.overrideWithExtension is set, use that extension's wizard instead:
-                            $overrideExt = $this->web_list_modTSconfig['properties']['newContentWiz.']['overrideWithExtension'];
-                            $pathToWizard = ExtensionManagementUtility::isLoaded($overrideExt) ? ExtensionManagementUtility::extRelPath($overrideExt) . 'mod1/db_new_content_el.php?' : BackendUtility::getModuleUrl('new_content_element') . '&';
-                            $href = $pathToWizard . 'id=' . $this->id . '&returnUrl=' . rawurlencode(GeneralUtility::getIndpEnv('REQUEST_URI'));
-                            $rowContent .= '<li>' . $newLink . ' ' . BackendUtility::wrapInHelp($table, '') . '</li><li><a href="' . htmlspecialchars($href) . '">' . $newContentIcon . htmlspecialchars($lang->getLL('clickForWizard')) . '</a></li></ul>';
+                            // If mod.newContentElementWizard.override is set, use that extension's wizard instead:
+                            $tsConfig = BackendUtility::getModTSconfig($this->id, 'mod');
+                            $moduleName = $tsConfig['properties']['newContentElementWizard.']['override'] ?: 'new_content_element';
+                            $url = BackendUtility::getModuleUrl($moduleName, ['id' => $this->id, 'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI')]);
+                            $rowContent .= '<li>' . $newLink . ' ' . BackendUtility::wrapInHelp($table, '') . '</li><li><a href="' . htmlspecialchars($url) . '">' . $newContentIcon . htmlspecialchars($lang->getLL('clickForWizard')) . '</a></li></ul>';
                         } else {
                             // Get the title
                             if ($v['ctrl']['readOnly'] || $v['ctrl']['hideTable'] || $v['ctrl']['is_static']) {
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-70055-OverrideNewContentElementWizardViaPageTSconfig.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-70055-OverrideNewContentElementWizardViaPageTSconfig.rst
new file mode 100644 (file)
index 0000000..a01eb7e
--- /dev/null
@@ -0,0 +1,42 @@
+========================================================================
+Breaking: #70055 - Override New Content Element Wizard via page TSconfig
+========================================================================
+
+Description
+===========
+
+In the past it was possible to override the "New Content Element Wizard" via custom scripts
+when using page TSconfig via ``mod.web_list.newContentWiz.overrideWithExtension = myextension`` to define an extension,
+which then needed a file placed under ``mod1/db_new_content_el.php``. The script was then called with certain parameters instead
+of the wizard.
+
+The new way of handling entry-points and custom scripts is now built via modules and routes. The former option
+``mod.web_list.newContentWiz.overrideWithExtension`` has been removed and a new option
+``mod.newContentElementWizard.override`` was introduced instead. Instead of setting the option to a certain extension key,
+a custom module or route has to be specified.
+
+Example:
+
+.. code-block:: typoscript
+
+       mod.newContentElementWizard.override = my_custom_module
+
+
+Impact
+======
+
+Using the old TSconfig option ``mod.web_list.newContentWiz.overrideWithExtension`` has no effect anymore and
+will fallback to the regular new content element wizard provided by the TYPO3 Core.
+
+
+Affected Installations
+======================
+
+Any installation using this option with extensions providing custom New Content Element Wizards, e.g. templavoila.
+
+
+Migration
+=========
+
+The extension providing the script must be changed to register a route or module and set the TSconfig option to the route identifier,
+instead of a raw PHP script. Any usages in TSconfig need to be adapted to use the new TSconfig option.
index aabf1c0..e329fc2 100755 (executable)
@@ -18,7 +18,6 @@ use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
 use TYPO3\CMS\Core\Type\Bitmask\Permission;
-use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
@@ -633,10 +632,10 @@ class AdminPanelView
     public function ext_makeToolBar()
     {
         $tsfe = $this->getTypoScriptFrontendController();
-        //  If mod.web_list.newContentWiz.overrideWithExtension is set, use that extension's create new content wizard instead:
-        $tsConfig = BackendUtility::getModTSconfig($tsfe->page['uid'], 'mod.web_list');
-        $tsConfig = $tsConfig['properties']['newContentWiz.']['overrideWithExtension'];
-        $newContentWizScriptPath = ExtensionManagementUtility::isLoaded($tsConfig) ? ExtensionManagementUtility::extRelPath($tsConfig) . 'mod1/db_new_content_el.php?' : BackendUtility::getModuleUrl('new_content_element') . '&';
+        //  If mod.newContentElementWizard.override is set, use that extension's create new content wizard instead:
+        $tsConfig = BackendUtility::getModTSconfig($tsfe->page['uid'], 'mod');
+        $moduleName = $tsConfig['properties']['newContentElementWizard.']['override'] ?: 'new_content_element';
+        $newContentWizScriptPath = BackendUtility::getModuleUrl($moduleName);
         $perms = $this->getBackendUser()->calcPerms($tsfe->page);
         $langAllowed = $this->getBackendUser()->checkLanguageAccess($tsfe->sys_language_uid);
         $id = $tsfe->id;
index 9573ea3..7a05598 100644 (file)
@@ -1128,12 +1128,10 @@ class DatabaseRecordList extends AbstractDatabaseRecordList
                                 ? $this->iconFactory->getIcon('actions-page-new', Icon::SIZE_SMALL)
                                 : $this->iconFactory->getIcon('actions-add', Icon::SIZE_SMALL);
                             if ($table === 'tt_content' && $this->newWizards) {
-                                // If mod.web_list.newContentWiz.overrideWithExtension is set, use that extension's create new content wizard instead:
-                                $tmpTSc = BackendUtility::getModTSconfig($this->pageinfo['uid'], 'mod.web_list');
-                                $tmpTSc = $tmpTSc['properties']['newContentWiz.']['overrideWithExtension'];
-                                $newContentWizScriptPath = ExtensionManagementUtility::isLoaded($tmpTSc)
-                                    ? ExtensionManagementUtility::extRelPath($tmpTSc) . 'mod1/db_new_content_el.php?id=' . $this->id
-                                    : BackendUtility::getModuleUrl('new_content_element', array('id' => $this->id));
+                                // If mod.newContentElementWizard.override is set, use that extension's create new content wizard instead:
+                                $tmpTSc = BackendUtility::getModTSconfig($this->pageinfo['uid'], 'mod');
+                                $newContentElementWizard = $tmpTSc['properties']['newContentElementWizard.']['override'] ?: 'new_content_element';
+                                $newContentWizScriptPath = BackendUtility::getModuleUrl($newContentElementWizard, array('id' => $this->id));
 
                                 $onClick = 'return jumpExt(' . GeneralUtility::quoteJSvalue($newContentWizScriptPath) . ');';
                                 $icon = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars($onClick) . '" title="'