Added feature #9292: Integrate hook at the end of tslib_cObj::getImgResource
authorOliver Hader <oliver.hader@typo3.org>
Sun, 30 Aug 2009 19:42:09 +0000 (19:42 +0000)
committerOliver Hader <oliver.hader@typo3.org>
Sun, 30 Aug 2009 19:42:09 +0000 (19:42 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@5847 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
t3lib/core_autoload.php
typo3/sysext/cms/tslib/class.tslib_content.php
typo3/sysext/cms/tslib/interfaces/interface.tslib_content_getimgresourcehook.php [new file with mode: 0644]

index 9b8012a..d219b11 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2009-08-30  Oliver Hader  <oliver@typo3.org>
+
+       * Added feature #9292: Integrate hook at the end of tslib_cObj::getImgResource
+
 2009-08-30  Christian Kuhn  <lolli@schwarzbu.ch>
 
        * Follow-up to #11431: Unit test for getPage_preProcess hook
index 9f0e518..ed4f384 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 // DO NOT CHANGE THIS FILE! It is automatically generated by extdeveval::buildAutoloadRegistry.
-// This file was generated on 2009-07-27 14:34
+// This file was generated on 2009-08-30 21:43
 
 
 return array(
@@ -127,6 +127,7 @@ return array(
        'tx_cms_treelistcacheupdate' => PATH_tslib . 'hooks/class.tx_cms_treelistcacheupdate.php',
        'tslib_content_cobjgetsinglehook' => PATH_tslib . 'interfaces/interface.tslib_content_cobjgetsinglehook.php',
        'tslib_content_getdatahook' => PATH_tslib . 'interfaces/interface.tslib_content_getdatahook.php',
+       'tslib_cobj_getimgresourcehook' => PATH_tslib . 'interfaces/interface.tslib_content_getimgresourcehook.php',
        'tslib_content_stdwraphook' => PATH_tslib . 'interfaces/interface.tslib_content_stdwraphook.php',
        'user_various' => PATH_tslib . 'media/scripts/example_callfunction.php',
        'tslib_gmenu_foldout' => PATH_tslib . 'media/scripts/gmenu_foldout.php',
index a649e50..55dd295 100644 (file)
@@ -335,7 +335,8 @@ class tslib_cObj {
        var $substMarkerCache=array();  // Caching substituteMarkerArrayCached function
        var $recordRegister=array();    // Array that registers rendered content elements (or any table) to make sure they are not rendered recursively!
        var $cObjHookObjectsArr = array();              // Containig hooks for userdefined cObjects
-       protected $stdWrapHookObjects = array();                // Containig hook objects for stdWrap
+       protected $stdWrapHookObjects = array();                // Containing hook objects for stdWrap
+       protected $getImgResourceHookObjects;                   // Containing hook objects for getImgResource 
 
        /**
         * Set to true by doConvertToUserIntObject() if USER object wants to become USER_INT
@@ -394,7 +395,32 @@ class tslib_cObj {
                                $this->stdWrapHookObjects[] = $hookObject;
                        }
                }
+       }
+
+       /**
+        * Gets the 'getImgResource' hook objects.
+        * The first call initializes the accordant objects.
+        *
+        * @return      array           The 'getImgResource' hook objects (if any)
+        */
+       protected function getGetImgResourceHookObjects() {
+               if (!isset($this->getImgResourceHookObjects)) {
+                       $this->getImgResourceHookObjects = array();
+
+                       if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['getImgResource'])) {
+                               foreach($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['getImgResource'] as $classData) {
+                                       $hookObject = t3lib_div::getUserObj($classData);
+
+                                       if(!($hookObject instanceof tslib_cObj_getImgResourceHook)) {
+                                               throw new UnexpectedValueException('$hookObject must implement interface tslib_cObj_getImgResourceHook', 1218636383);
+                                       }
 
+                                       $this->getImgResourceHookObjects[] = $hookObject;
+                               }
+                       }
+               }
+
+               return $this->getImgResourceHookObjects;
        }
 
        /**
@@ -4764,7 +4790,7 @@ class tslib_cObj {
                                                $gifCreator->start($fileArray,$this->data);
                                                $theImage = $gifCreator->gifBuild();
                                        }
-                                       return $gifCreator->getImageDimensions($theImage);
+                                       $imageResource = $gifCreator->getImageDimensions($theImage);
                                break;
                                default:
                                        if ($fileArray['import.'])      {
@@ -4894,23 +4920,35 @@ class tslib_cObj {
                                                        }
                                                        $GLOBALS['TSFE']->tmpl->fileCache[$hash]['origFile'] = $theImage;
                                                        $GLOBALS['TSFE']->tmpl->fileCache[$hash]['origFile_mtime'] = @filemtime($theImage);     // This is needed by tslib_gifbuilder, ln 100ff in order for the setup-array to create a unique filename hash.
+                                                       $GLOBALS['TSFE']->tmpl->fileCache[$hash]['fileCacheHash'] = $hash;
                                                }
-                                               return $GLOBALS['TSFE']->tmpl->fileCache[$hash];
+                                               $imageResource = $GLOBALS['TSFE']->tmpl->fileCache[$hash];
                                        }
 
                                break;
                        }
                }
                $theImage = $GLOBALS['TSFE']->tmpl->getFileName($file);
-               if ($theImage)  {
+                       // If image was processed by GIFBUILDER:
+                       // ($imageResource indicates that it was processed the regular way)
+               if (!isset($imageResource) && $theImage) {
                        $gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
                        /* @var $gifCreator tslib_gifbuilder */
                        $gifCreator->init();
                        $info= $gifCreator->imageMagickConvert($theImage,'WEB','','','','','');
                        $info['origFile'] = $theImage;
                        $info['origFile_mtime'] = @filemtime($theImage);        // This is needed by tslib_gifbuilder, ln 100ff in order for the setup-array to create a unique filename hash.
-                       return $info;
+                       $imageResource = $info;
                }
+
+                       // Hook 'getImgResource': Post-processing of image resources 
+               if (isset($imageResource)) {
+                       foreach($this->getGetImgResourceHookObjects() as $hookObject) {
+                               $imageResource = $hookObject->getImgResourcePostProcess($file, (array)$fileArray, $imageResource, $this);
+                       }
+               }
+
+               return $imageResource;
        }
 
        /**
diff --git a/typo3/sysext/cms/tslib/interfaces/interface.tslib_content_getimgresourcehook.php b/typo3/sysext/cms/tslib/interfaces/interface.tslib_content_getimgresourcehook.php
new file mode 100644 (file)
index 0000000..76ab55a
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2008-2009 Oliver Hader <oliver@typo3.org>
+*  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 classes which hook into tslib_content and do additional getImgResource processing
+ *
+ * @author     Oliver Hader <oliver@typo3.org>
+ * @package TYPO3
+ * @subpackage cms
+ */
+interface tslib_cObj_getImgResourceHook {
+       /**
+        * Hook for post-processing image resources
+        *
+        * @param       string          $file: Original image file
+        * @param       array           $configuration: TypoScript getImgResource properties
+        * @param       array           $imageResource: Information of the created/converted image resource
+        * @param       tslib_cObj      $parent: Parent content object
+        * @return      array           Modified image resource information
+        */
+       public function getImgResourcePostProcess($file, array $configuration, array $imageResource, tslib_cObj $parent);
+}
+
+?>
\ No newline at end of file