Added feature #16177: Add DB structure update pre-processing hook in EM
authorXavier Perseguers <typo3@perseguers.ch>
Tue, 2 Nov 2010 10:32:53 +0000 (10:32 +0000)
committerXavier Perseguers <typo3@perseguers.ch>
Tue, 2 Nov 2010 10:32:53 +0000 (10:32 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@9241 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
typo3/sysext/em/ext_autoload.php
typo3/sysext/em/interfaces/interface.em_index_checkdatabaseupdateshook.php [new file with mode: 0644]
typo3/sysext/em/mod1/class.em_index.php

index 881533c..ba738ee 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2010-11-02  Xavier Perseguers  <typo3@perseguers.ch>
+
+       * Added feature #16177: Add DB structure update pre-processing hook in EM
+
 2010-11-01  Steffen Gebert  <steffen@steffen-gebert.de>
 
        * Fixed bug #11957: Close Button is at the wrong place when editing a file in filelist (Thanks to Simon Schaufelberger)
index ab821f3..6d91786 100644 (file)
@@ -1,8 +1,10 @@
 <?php
 $emClassesPath = PATH_site . 'typo3/sysext/em/classes/';
+$emInterfacesPath = PATH_site . 'typo3/sysext/em/interfaces/';
 return array(
        'sc_mod_tools_em_index' => $emClassesPath . '../mod1/class.em_index.php',
        'em_connection_exception' => $emClassesPath . 'exception/class.em_connection_exception.php',
        'em_tasks_updateextensionlist' => $emClassesPath . 'tasks/class.em_tasks_updateextensionlist.php',
+       'em_index_checkdatabaseupdateshook' => $emInterfacesPath . 'interface.em_index_checkdatabaseupdateshook.php',
 );
-?>
+?>
\ No newline at end of file
diff --git a/typo3/sysext/em/interfaces/interface.em_index_checkdatabaseupdateshook.php b/typo3/sysext/em/interfaces/interface.em_index_checkdatabaseupdateshook.php
new file mode 100644 (file)
index 0000000..196f29b
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2010 Xavier Perseguers <typo3@perseguers.ch>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*  A copy is found in the textfile GPL.txt and important notices to the license
+*  from the author is found in LICENSE.txt distributed with these scripts.
+*
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Interface for hook in SC_mod_tools_em_index::checkDBupdates.
+ *
+ * @author Xavier Perseguers <typo3@perseguers.ch>
+ * @package TYPO3
+ * @subpackage em
+ */
+interface em_index_checkDatabaseUpdatesHook {
+
+       /**
+        * Hook that allows pre-processing of database structure modifications.
+        * The hook implementation may return a user form that will temporarily
+        * replace the standard database update form. This allows additional
+        * operations to be performed before the database structure gets updated.
+        *
+        * @param string $extKey: Extension key
+        * @param array $extInfo: Extension information array
+        * @param array $diff: Database differences
+        * @param t3lib_install $instObj: Instance of the installer
+        * @param SC_mod_tools_em_index $parent: The calling parent object
+        * @return string Either empty string or a pre-processing user form
+        */
+       public function preProcessDatabaseUpdates($extKey, array $extInfo, array $diff, t3lib_install $instObj, SC_mod_tools_em_index $parent);
+
+}
+
+?>
\ No newline at end of file
index 2ce7565..9132852 100644 (file)
@@ -5525,6 +5525,7 @@ $EM_CONF[$_EXTKEY] = '.$this->arrayToCode($EM_CONF, 0).';
                $dbStatus = array();
 
                        // Updating tables and fields?
+               $showUpdateStatements = TRUE;
                if (is_array($extInfo['files']) && in_array('ext_tables.sql', $extInfo['files'])) {
                        $fileContent = t3lib_div::getUrl($this->getExtPath($extKey,$extInfo['type']).'ext_tables.sql');
 
@@ -5543,18 +5544,37 @@ $EM_CONF[$_EXTKEY] = '.$this->arrayToCode($EM_CONF, 0).';
                                        $instObj->performUpdateQueries($update_statements['change'],$instObj->INSTALL['database_update']);
                                        $instObj->performUpdateQueries($update_statements['create_table'],$instObj->INSTALL['database_update']);
                                } else {
-                                       $content .= $instObj->generateUpdateDatabaseForm_checkboxes(
-                                               $update_statements['add'], $GLOBALS['LANG']->getLL('checkDBupdates_add_fields'));
-                                       $content .= $instObj->generateUpdateDatabaseForm_checkboxes(
-                                               $update_statements['change'], $GLOBALS['LANG']->getLL('checkDBupdates_changing_fields'), 1, 0, $update_statements['change_currentValue']);
-                                       $content .= $instObj->generateUpdateDatabaseForm_checkboxes(
-                                               $update_statements['create_table'], $GLOBALS['LANG']->getLL('checkDBupdates_add_tables'));
+                                       if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/mod/tools/em/index.php']['checkDBupdates'])) {
+                                               foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/mod/tools/em/index.php']['checkDBupdates'] as $classData) {
+                                                       $hookObject = t3lib_div::getUserObj($classData);
+
+                                                       if (!($hookObject instanceof em_index_checkDatabaseUpdatesHook)) {
+                                                               throw new UnexpectedValueException('$hookObject must implement interface em_index_checkDatabaseUpdatesHook', 1288418476);
+                                                       }
+
+                                                       /* @var $hookObject em_index_checkDatabaseUpdatesHook */
+                                                       $preprocessContent = $hookObject->preProcessDatabaseUpdates($extKey, $extInfo, $diff, $instObj, $this);
+                                                       if ($preprocessContent) {
+                                                               $content .= $preprocessContent;
+                                                               $showUpdateStatements = FALSE;
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                                       if ($showUpdateStatements) {
+                                               $content .= $instObj->generateUpdateDatabaseForm_checkboxes(
+                                                       $update_statements['add'], $GLOBALS['LANG']->getLL('checkDBupdates_add_fields'));
+                                               $content .= $instObj->generateUpdateDatabaseForm_checkboxes(
+                                                       $update_statements['change'], $GLOBALS['LANG']->getLL('checkDBupdates_changing_fields'), 1, 0, $update_statements['change_currentValue']);
+                                               $content .= $instObj->generateUpdateDatabaseForm_checkboxes(
+                                                       $update_statements['create_table'], $GLOBALS['LANG']->getLL('checkDBupdates_add_tables'));
+                                       }
                                }
                        }
                }
 
                        // Importing static tables?
-               if (is_array($extInfo['files']) && in_array('ext_tables_static+adt.sql',$extInfo['files']))     {
+               if ($showUpdateStatements && is_array($extInfo['files']) && in_array('ext_tables_static+adt.sql',$extInfo['files']))    {
                        $fileContent = t3lib_div::getUrl($this->getExtPath($extKey,$extInfo['type']).'ext_tables_static+adt.sql');
 
                        $statements = $instObj->getStatementArray($fileContent,1);