[FEATURE] Substitute markers and subparts recursively
authorJigal van Hemert <jigal@xs4all.nl>
Sat, 30 Jul 2011 20:38:00 +0000 (22:38 +0200)
committerSteffen Kamper <info@sk-typo3.de>
Mon, 1 Aug 2011 17:55:47 +0000 (19:55 +0200)
Introduce new function to substitute markers and (nested) subparts
recursively. The data array defines the structure of single and subpart
markers and the function takes care of handling all the (sub)templates.

Change-Id: Ie746aff506a895c6992d6ecf9acd532704838bbf
Resolves: #28595
Reviewed-on: http://review.typo3.org/3917
Tested-by: Philipp Gampe
Reviewed-by: Xavier Perseguers
Tested-by: Xavier Perseguers
Reviewed-by: Steffen Kamper
t3lib/class.t3lib_parsehtml.php
typo3/sysext/cms/tslib/class.tslib_content.php

index 49eaa07..78707a3 100644 (file)
@@ -267,6 +267,91 @@ class t3lib_parsehtml {
                return $content;
        }
 
+       /**
+        * Replaces all markers and subparts in a template with the content provided in the structured array.
+        *
+        * The array is built like the template with its markers and subparts. Keys represent the marker name and the values the
+        * content.
+        * If the value is not an array the key will be treated as a single marker.
+        * If the value is an array the key will be treated as a subpart marker.
+        * Repeated subpart contents are of course elements in the array, so every subpart value must contain an array with its
+        * markers.
+        *
+        * $markersAndSubparts = array (
+        *   '###SINGLEMARKER1###' => 'value 1',
+        *   '###SUBPARTMARKER1###' => array(
+        *       0 => array(
+        *         '###SINGLEMARKER2###' => 'value 2',
+        *       ),
+        *       1 => array(
+        *         '###SINGLEMARKER2###' => 'value 3',
+        *       )
+        *   )
+        * )
+        * Subparts can be nested, so below the 'SINGLEMARKER2' it is possible to have another subpart marker with an array as the
+        * value, which in its turn contains the elements of the sub-subparts.
+        *
+        * @static
+        * @param string $content       The content stream, typically HTML template content.
+        * @param array $markersAndSubparts     The array of single markers and subpart contents.
+        * @param string $wrap  A wrap value - [part1] | [part2] - for the markers before substitution.
+        * @param bool $uppercase       If set, all marker string substitution is done with upper-case markers.
+        * @param bool $deleteUnused    If set, all unused single markers are deleted.
+        * @return string       The processed output stream
+        */
+       public static function substituteMarkerAndSubpartArrayRecursive($content, array $markersAndSubparts, $wrap = '',
+                                                                                                                                       $uppercase = FALSE, $deleteUnused = FALSE) {
+               $wraps = t3lib_div::trimExplode('|', $wrap);
+               $singleItems = array();
+               $compoundItems = array();
+                       // split markers and subparts into separate arrays
+               foreach ($markersAndSubparts as $markerName => $markerContent) {
+                       if (is_array($markerContent)) {
+                               $compoundItems[] = $markerName;
+                       } else {
+                               $singleItems[$markerName] = $markerContent;
+                       }
+               }
+               $subTemplates = array();
+               $subpartSubstitutes = array();
+                       // build a cache for the sub template
+               foreach ($compoundItems as $subpartMarker) {
+                       if ($uppercase) {
+                                       // use strtr instead of strtoupper to avoid locale problems with Turkish
+                               $subpartMarker = strtr($subpartMarker, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
+                       }
+
+                       if (count($wraps) > 0) {
+                               $subpartMarker = $wraps[0] . $subpartMarker . $wraps[1];
+                       }
+                       $subTemplates[$subpartMarker] = self::getSubpart($content, $subpartMarker);
+               }
+                       // replace the subpart contents recursively
+               foreach ($compoundItems as $subpartMarker) {
+                       foreach ($markersAndSubparts[$subpartMarker] as $partialMarkersAndSubparts) {
+                               $completeMarker = $subpartMarker;
+                               if ($uppercase) {
+                                               // use strtr instead of strtoupper to avoid locale problems with Turkish
+                                       $completeMarker = strtr($completeMarker, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
+                               }
+
+                               if (count($wraps) > 0) {
+                                       $completeMarker = $wraps[0] . $completeMarker . $wraps[1];
+                               }
+                               $subpartSubstitutes[$completeMarker] .= self::substituteMarkerAndSubpartArrayRecursive(
+                                       $subTemplates[$completeMarker],
+                                       $partialMarkersAndSubparts,
+                                       $wrap,
+                                       $uppercase,
+                                       $deleteUnused
+                               );
+                       }
+               }
+                       // substitute the single markers and subparts
+               $result = self::substituteSubpartArray($content, $subpartSubstitutes);
+               $result = self::substituteMarkerArray($result, $singleItems, $wrap, $uppercase, $deleteUnused);
+               return $result;
+       }
 
        /************************************
         *
index e094d30..9c333d2 100644 (file)
@@ -1735,6 +1735,24 @@ class tslib_cObj {
        }
 
        /**
+        * Replaces all markers and subparts in a template with the content provided in the structured array.
+        *
+        * @param $content
+        * @param array $markersAndSubparts
+        * @param string $wrap
+        * @param bool $uppercase
+        * @param bool $deleteUnused
+        * @return string
+        * @see t3lib_parsehtml::substituteMarkerAndSubpartArrayRecursive()
+        */
+       public function substituteMarkerAndSubpartArrayRecursive($content, array $markersAndSubparts, $wrap = '', $uppercase = FALSE,
+                                                                                                                        $deleteUnused = FALSE) {
+               return t3lib_parsehtml::substituteMarkerAndSubpartArrayRecursive(
+                       $content, $markersAndSubparts, $wrap, $uppercase, $deleteUnused
+               );
+       }
+
+       /**
         * Adds elements to the input $markContentArray based on the values from
         * the fields from $fieldList found in $row
         *