Added feature #7984: Besides stdWrap.crop there is now a function stdWrap.cropHTML...
[Packages/TYPO3.CMS.git] / typo3 / sysext / cms / tslib / class.tslib_content.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2009 Kasper Skaarhoj (kasperYYYY@typo3.com)
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
18 *
19 *
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27 /**
28 * Contains classes for Content Rendering based on TypoScript Template configuration
29 *
30 * $Id$
31 * Revised for TYPO3 3.6 June/2003 by Kasper Skaarhoj
32 * XHTML compliant
33 *
34 * class tslib_cObj : All main TypoScript features, rendering of content objects (cObjects). This class is the backbone of TypoScript Template rendering.
35 * class tslib_controlTable : Makes a table CTABLE (TS cObject)
36 * class tslib_tableOffset : Makes a table-offset (TS)
37 * class tslib_frameset : Generates framesets (TS)
38 *
39 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
40 */
41 /**
42 * [CLASS/FUNCTION INDEX of SCRIPT]
43 *
44 *
45 *
46 * 256: class tslib_cObj
47 * 353: function start($data,$table='')
48 * 387: function setParent($data,$currentRecord)
49 *
50 * SECTION: CONTENT_OBJ:
51 * 412: function getCurrentVal()
52 * 423: function setCurrentVal($value)
53 * 436: function cObjGet($setup,$addKey='')
54 * 460: function cObjGetSingle($name,$conf,$TSkey='__')
55 *
56 * SECTION: Functions rendering content objects (cObjects)
57 * 629: function HTML($conf)
58 * 640: function TEXT($conf)
59 * 651: function CLEARGIF($conf)
60 * 670: function COBJ_ARRAY($conf,$ext='')
61 * 706: function USER($conf,$ext='')
62 * 733: function FILE($conf)
63 * 749: function IMAGE($conf)
64 * 768: function IMG_RESOURCE($conf)
65 * 780: function IMGTEXT($conf)
66 * 1203: function CONTENT($conf)
67 * 1290: function RECORDS($conf)
68 * 1370: function HMENU($conf)
69 * 1402: function CTABLE ($conf)
70 * 1440: function OTABLE ($conf)
71 * 1455: function COLUMNS ($conf)
72 * 1534: function HRULER ($conf)
73 * 1559: function CASEFUNC ($conf)
74 * 1584: function LOAD_REGISTER($conf,$name)
75 * 1624: function FORM($conf,$formData='')
76 * 2145: function SEARCHRESULT($conf)
77 * 2311: function PHP_SCRIPT($conf,$ext='')
78 * 2354: function TEMPLATE($conf)
79 * 2505: function MULTIMEDIA($conf)
80 *
81 * SECTION: Various helper functions for content objects:
82 * 2592: function getSlidePids($pidList, $pidConf)
83 * 2623: function getFieldDefaultValue($noValueInsert, $fieldName, $defaultVal)
84 * 2641: function cImage($file,$conf)
85 * 2669: function getBorderAttr($borderAttr)
86 * 2685: function imageLinkWrap($string,$imageFile,$conf)
87 * 2765: function fileResource($fName, $addParams='alt="" title=""')
88 * 2788: function lastChanged($tstamp)
89 * 2805: function linkWrap($content,$wrap)
90 * 2824: function getAltParam($conf, $longDesc=true)
91 * 2859: function cleanFormName($name)
92 * 2875: function getATagParams($conf, $addGlobal=1)
93 *
94 * SECTION: HTML template processing functions
95 * 2922: function getSubpart($content, $marker)
96 * 2938: function substituteSubpart($content,$marker,$subpartContent,$recursive=1)
97 * 2951: function substituteMarker($content,$marker,$markContent)
98 * 2971: function substituteMarkerArrayCached($content,$markContentArray=array(),$subpartContentArray=array(),$wrappedSubpartContentArray=array())
99 * 3069: function substituteMarkerArray($content,$markContentArray,$wrap='',$uppercase=0)
100 * 3081: function substituteMarkerInObject(&$tree, $markContentArray)
101 * 3104: function fillInMarkerArray($markContentArray, $row, $fieldList='', $nl2br=TRUE, $prefix='FIELD_', $HSC=FALSE)
102 *
103 * SECTION: "stdWrap" + sub functions
104 * 3167: function stdWrap($content,$conf)
105 * 3364: function numRows($conf)
106 * 3388: function listNum($content,$listNum,$char)
107 * 3408: function checkIf($conf)
108 * 3471: function filelist($data)
109 * 3553: function clean_directory($theDir)
110 * 3571: function HTMLparser_TSbridge($theValue, $conf)
111 * 3585: function dataWrap($content,$wrap)
112 * 3598: function insertData($str)
113 * 3628: function prefixComment($str,$conf,$content)
114 * 3652: function substring($content,$options)
115 * 3670: function crop($content,$options)
116 * 3702: function removeBadHTML($text, $conf)
117 * 3746: function textStyle($theValue, $conf)
118 * 3813: function tableStyle($theValue, $conf)
119 * 3854: function addParams($content,$conf)
120 * 3895: function filelink($theValue, $conf)
121 * 3966: function locDataJU($jumpUrl,$conf)
122 * 3997: function calc($val)
123 * 4026: function calcIntExplode($delim, $string)
124 * 4046: function splitObj($value, $conf)
125 * 4108: function parseFunc($theValue, $conf, $ref='')
126 * 4218: function _parseFunc ($theValue, $conf)
127 * 4424: function encaps_lineSplit($theValue, $conf)
128 * 4507: function http_makelinks($data,$conf)
129 * 4574: function mailto_makelinks($data,$conf)
130 * 4617: function getImgResource($file,$fileArray)
131 *
132 * SECTION: Data retrieval etc.
133 * 4810: function getFieldVal($field)
134 * 4830: function getData($string,$fieldArray)
135 * 4975: function rootLineValue($key,$field,$slideBack=0,$altRootLine='')
136 * 4997: function getGlobal($var, $source=NULL)
137 * 5033: function getKey($key,$arr)
138 * 5056: function TCAlookup($inputValue,$conf)
139 *
140 * SECTION: Link functions (typolink)
141 * 5116: function typoLink($linktxt, $conf)
142 * 5481: function typoLink_URL($conf)
143 * 5499: function getTypoLink($label,$params,$urlParameters=array(),$target='')
144 * 5526: function getTypoLink_URL($params,$urlParameters=array(),$target='')
145 * 5538: function typolinkWrap($conf)
146 * 5551: function currentPageUrl($urlParameters=array(),$id=0)
147 * 5564: function getClosestMPvalueForPage($pageId, $raw=FALSE)
148 * 5619: function getMailTo($mailAddress,$linktxt,$initP='?')
149 * 5658: function getQueryArguments($conf,$overruleQueryArgs=array(),$forceArgs=FALSE)
150 *
151 * SECTION: Miscellaneous functions, stand alone
152 * 5754: function wrap($content,$wrap,$char='|')
153 * 5770: function noTrimWrap($content,$wrap)
154 * 5784: function wrapSpace($content, $wrap)
155 * 5810: function callUserFunction($funcName,$conf,$content)
156 * 5851: function processParams($params)
157 * 5869: function keywords($content)
158 * 5886: function caseshift($theValue, $case)
159 * 5911: function HTMLcaseshift($theValue, $case)
160 * 5940: function bytes($sizeInBytes,$labels)
161 * 5951: function calcAge($seconds,$labels)
162 * 5983: function sendNotifyEmail($msg, $recipients, $cc, $email_from, $email_fromName='', $replyTo='')
163 * 6010: function URLqMark($url,$params)
164 * 6026: function checkEmail($email)
165 * 6038: function clearTSProperties($TSArr,$propList)
166 * 6057: function mergeTSRef($confArr,$prop)
167 * 6080: function joinTSarrays($conf,$old_conf)
168 * 6103: function gifBuilderTextBox($gifbuilderConf, $conf, $text)
169 * 6159: function linebreaks($string,$chars,$maxLines=0)
170 * 6190: function getUpdateJS($dataArray, $formName, $arrPrefix, $fieldList)
171 *
172 * SECTION: Database functions, making of queries
173 * 6260: function DBgetDelete($table, $uid, $doExec=FALSE)
174 * 6292: function DBgetUpdate($table, $uid, $dataArr, $fieldList, $doExec=FALSE)
175 * 6334: function DBgetInsert($table, $pid, $dataArr, $fieldList, $doExec=FALSE)
176 * 6371: function DBmayFEUserEdit($table,$row, $feUserRow, $allowedGroups='',$feEditSelf=0)
177 * 6411: function DBmayFEUserEditSelect($table,$feUserRow,$allowedGroups='',$feEditSelf=0)
178 * 6451: function enableFields($table,$show_hidden=0)
179 * 6475: function getTreeList($id,$depth,$begin=0,$dontCheckEnableFields=FALSE,$addSelectFields='',$moreWhereClauses='', $prevId_array=array(), $recursionLevel=0)
180 * 6583: function whereSelectFromList($field,$value)
181 * 6601: function exec_mm_query($select,$local_table,$mm_table,$foreign_table,$whereClause='',$groupBy='',$orderBy='',$limit='')
182 * 6628: function exec_mm_query_uidList($select,$local_table_uidlist,$mm_table,$foreign_table='',$whereClause='',$groupBy='',$orderBy='',$limit='')
183 * 6649: function searchWhere($sw,$searchFieldList,$searchTable='')
184 * 6685: function exec_getQuery($table, $conf)
185 * 6703: function getQuery($table, $conf, $returnQueryArray=FALSE)
186 * 6783: function getWhere($table,$conf, $returnQueryArray=FALSE)
187 * 6878: function checkPidArray($listArr)
188 * 6902: function checkPid($uid)
189 *
190 * SECTION: Frontend editing functions
191 * 6959: function editPanel($content, $conf, $currentRecord='', $dataArr=array())
192 * 7146: function editIcons($content,$params, $conf=array(), $currentRecord='', $dataArr=array(),$addUrlParamStr='')
193 * 7228: function editPanelLinkWrap($string,$formName,$cmd,$currentRecord='',$confirm='',$nPid='')
194 * 7270: function editPanelLinkWrap_doWrap($string,$url,$currentRecord)
195 * 7298: function editPanelPreviewBorder($table,$row,$content,$thick,$conf=array())
196 * 7320: function isDisabled($table,$row)
197 *
198 *
199 * 7351: class tslib_frameset
200 * 7361: function make($setup)
201 * 7398: function frameParams($setup, $typeNum)
202 * 7426: function framesetParams($setup)
203 *
204 *
205 * 7459: class tslib_tableOffset
206 * 7471: function start($content,$offset)
207 *
208 *
209 * 7549: class tslib_controlTable
210 * 7584: function start($offset,$cMargins)
211 *
212 * TOTAL FUNCTIONS: 135
213 * (This index is automatically created/updated by the extension "extdeveval")
214 *
215 */
216
217 // Object TypoScript library included:
218 if(t3lib_extMgm::isLoaded('obts')) {
219 require_once(t3lib_extMgm::extPath('obts').'_tsobject/_tso.php');
220 }
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238 /**
239 * This class contains all main TypoScript features.
240 * This includes the rendering of TypoScript content objects (cObjects).
241 * Is the backbone of TypoScript Template rendering.
242 *
243 * There are lots of functions you can use from your include-scripts.
244 * The class "tslib_cObj" is normally instantiated and referred to as "cObj".
245 * When you call your own PHP-code typically through a USER or USER_INT cObject then it is this class that instantiates the object and calls the main method. Before it does so it will set (if you are using classes) a reference to itself in the internal variable "cObj" of the object. Thus you can access all functions and data from this class by $this->cObj->... from within you classes written to be USER or USER_INT content objects.
246 *
247 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
248 * @package TYPO3
249 * @subpackage tslib
250 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&cHash=4ad9d7acb4
251 */
252 class tslib_cObj {
253 var $align = Array ('center', 'right', 'left');
254
255 /**
256 * Holds ImageMagick parameters and extensions used for compression
257 *
258 * @see IMGTEXT()
259 *
260 * 0= Default
261 * 1= Dont change! (removes all parameters for the image_object!!)
262 * 1x = GIFs
263 * 2x = JPGs
264 */
265 var $image_compression = Array(
266 10 => Array('params'=>'', 'ext'=>'gif'),
267 11 => Array('params'=>'-colors 128', 'ext'=>'gif'),
268 12 => Array('params'=>'-colors 64', 'ext'=>'gif'),
269 13 => Array('params'=>'-colors 32', 'ext'=>'gif'),
270 14 => Array('params'=>'-colors 16', 'ext'=>'gif'),
271 15 => Array('params'=>'-colors 8', 'ext'=>'gif'),
272
273 30 => Array('params'=>'-colors 256', 'ext'=>'png'),
274 31 => Array('params'=>'-colors 128', 'ext'=>'png'),
275 32 => Array('params'=>'-colors 64', 'ext'=>'png'),
276 33 => Array('params'=>'-colors 32', 'ext'=>'png'),
277 34 => Array('params'=>'-colors 16', 'ext'=>'png'),
278 35 => Array('params'=>'-colors 8', 'ext'=>'png'),
279 39 => Array('params'=>'', 'ext'=>'png'),
280
281 20 => Array('params'=>'-quality 100', 'ext'=>'jpg'),
282 21 => Array('params'=>'-quality 90', 'ext'=>'jpg'),
283 22 => Array('params'=>'-quality 80', 'ext'=>'jpg'),
284 23 => Array('params'=>'-quality 70', 'ext'=>'jpg'),
285 24 => Array('params'=>'-quality 60', 'ext'=>'jpg'),
286 25 => Array('params'=>'-quality 50', 'ext'=>'jpg'),
287 26 => Array('params'=>'-quality 40', 'ext'=>'jpg'),
288 27 => Array('params'=>'-quality 30', 'ext'=>'jpg'),
289 28 => Array('params'=>'-quality 20', 'ext'=>'jpg')
290 );
291
292 /**
293 * ImageMagick parameters for image effects
294 *
295 * @see IMGTEXT()
296 */
297 var $image_effects = Array(
298 1 => '-rotate 90',
299 2 => '-rotate 270',
300 3 => '-rotate 180',
301 10 => '-colorspace GRAY',
302 11 => '-sharpen 70',
303 20 => '-normalize',
304 23 => '-contrast',
305 25 => '-gamma 1.3',
306 26 => '-gamma 0.8'
307 );
308
309 /**
310 * Loaded with the current data-record.
311 *
312 * If the instance of this class is used to render records from the database those records are found in this array.
313 * The function stdWrap has TypoScript properties that fetch field-data from this array.
314 * @see init()
315 */
316 var $data = Array();
317 var $oldData = Array(); // Used for backup...
318 var $alternativeData =''; // If this is set with an array before stdWrap, it's used instead of $this->data in the data-property in stdWrap
319 var $parameters = Array(); // Used by the parseFunc function and is loaded with tag-parameters when parsing tags.
320 var $currentValKey = 'currentValue_kidjls9dksoje';
321 var $currentRecord = ''; // This is set to the [table]:[uid] of the record delivered in the $data-array, if the cObjects CONTENT or RECORD is in operation. Note that $GLOBALS['TSFE']->currentRecord is set to an equal value but always indicating the latest record rendered.
322 var $currentRecordTotal = 0; // Set in cObj->RECORDS and cObj->CONTENT to the current number of records selected in a query.
323 var $currentRecordNumber = 0; // Incremented in cObj->RECORDS and cObj->CONTENT before each record rendering.
324 var $parentRecordNumber = 0; // Incremented in parent cObj->RECORDS and cObj->CONTENT before each record rendering.
325 var $parentRecord = array(); // If the tslib_cObj was started from CONTENT, RECORD or SEARCHRESULT cObject's this array has two keys, 'data' and 'currentRecord' which indicates the record and data for the parent cObj.
326 var $regObj; // This may be set as a reference to the calling object of eg. cObjGetSingle. Anyway, just use it as you like. It's used in productsLib.inc for example.
327
328 // internal
329 var $INT_include=0; // Is set to 1 if the instance of this cObj is executed from a PHP_SCRIPT_INT -include script (see pagegen, bottom of document)
330 var $checkPid_cache = Array(); // This is used by checkPid, that checks if pages are accessible. The $checkPid_cache['page_uid'] is set true or false upon this check featuring a caching function for the next request.
331 var $checkPid_badDoktypeList = '255';
332 var $lastTypoLinkUrl=''; // This will be set by typoLink() to the url of the most recent link created.
333 var $lastTypoLinkTarget=''; // DO. link target.
334 var $lastTypoLinkLD = array();
335 var $substMarkerCache=array(); // Caching substituteMarkerArrayCached function
336 var $recordRegister=array(); // Array that registers rendered content elements (or any table) to make sure they are not rendered recursively!
337 var $cObjHookObjectsArr = array(); // Containig hooks for userdefined cObjects
338 protected $stdWrapHookObjects = array(); // Containing hook objects for stdWrap
339 protected $getImgResourceHookObjects; // Containing hook objects for getImgResource
340
341 /**
342 * Set to true by doConvertToUserIntObject() if USER object wants to become USER_INT
343 */
344 protected $doConvertToUserIntObject = false;
345
346 /**
347 * Indicates current object type. Can hold one of OBJECTTYPE_ constants or false.
348 * The value is set and reset inside USER() function. Any time outside of
349 * USER() it is false.
350 */
351 protected $userObjectType = false;
352
353 /**
354 * Indicates that object type is USER.
355 *
356 * @see tslib_cObjh::$userObjectType
357 */
358 const OBJECTTYPE_USER_INT = 1;
359
360 /**
361 * Indicates that object type is USER.
362 *
363 * @see tslib_cObjh::$userObjectType
364 */
365 const OBJECTTYPE_USER = 2;
366
367 /**
368 * Class constructor.
369 * Well, it has to be called manually since it is not a real constructor function.
370 * So after making an instance of the class, call this function and pass to it a database record and the tablename from where the record is from. That will then become the "current" record loaded into memory and accessed by the .fields property found in eg. stdWrap.
371 *
372 * @param array $data the record data that is rendered.
373 * @param string $table the table that the data record is from.
374 * @return void
375 */
376 function start($data,$table='') {
377 global $TYPO3_CONF_VARS;
378 $this->data = $data;
379 $this->currentRecord = $table ? $table.':'.$this->data['uid'] : '';
380 $this->parameters = Array();
381 if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClass'])) {
382 foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClass'] as $classArr) {
383 $this->cObjHookObjectsArr[$classArr[0]] = &t3lib_div::getUserObj($classArr[1]);
384 }
385 }
386
387 if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['stdWrap'])) {
388 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['stdWrap'] as $classData) {
389 $hookObject = &t3lib_div::getUserObj($classData);
390
391 if(!($hookObject instanceof tslib_content_stdWrapHook)) {
392 throw new UnexpectedValueException('$hookObject must implement interface tslib_content_stdWrapHook', 1195043965);
393 }
394
395 $this->stdWrapHookObjects[] = $hookObject;
396 }
397 }
398 }
399
400 /**
401 * Gets the 'getImgResource' hook objects.
402 * The first call initializes the accordant objects.
403 *
404 * @return array The 'getImgResource' hook objects (if any)
405 */
406 protected function getGetImgResourceHookObjects() {
407 if (!isset($this->getImgResourceHookObjects)) {
408 $this->getImgResourceHookObjects = array();
409
410 if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['getImgResource'])) {
411 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['getImgResource'] as $classData) {
412 $hookObject = t3lib_div::getUserObj($classData);
413
414 if(!($hookObject instanceof tslib_cObj_getImgResourceHook)) {
415 throw new UnexpectedValueException('$hookObject must implement interface tslib_cObj_getImgResourceHook', 1218636383);
416 }
417
418 $this->getImgResourceHookObjects[] = $hookObject;
419 }
420 }
421 }
422
423 return $this->getImgResourceHookObjects;
424 }
425
426 /**
427 * Sets the internal variable parentRecord with information about current record.
428 * If the tslib_cObj was started from CONTENT, RECORD or SEARCHRESULT cObject's this array has two keys, 'data' and 'currentRecord' which indicates the record and data for the parent cObj.
429 *
430 * @param array $data: The record array
431 * @param string $currentRecord: This is set to the [table]:[uid] of the record delivered in the $data-array, if the cObjects CONTENT or RECORD is in operation. Note that $GLOBALS['TSFE']->currentRecord is set to an equal value but always indicating the latest record rendered.
432 * @return void
433 * @access private
434 */
435 function setParent($data,$currentRecord) {
436 $this->parentRecord=array('data'=>$data, 'currentRecord'=>$currentRecord);
437 }
438
439
440
441
442
443
444
445
446 /***********************************************
447 *
448 * CONTENT_OBJ:
449 *
450 ***********************************************/
451
452 /**
453 * Returns the "current" value.
454 * The "current" value is just an internal variable that can be used by functions to pass a single value on to another function later in the TypoScript processing.
455 * It's like "load accumulator" in the good old C64 days... basically a "register" you can use as you like.
456 * The TSref will tell if functions are setting this value before calling some other object so that you know if it holds any special information.
457 *
458 * @return mixed The "current" value
459 */
460 function getCurrentVal() {
461 return $this->data[$this->currentValKey];
462 }
463
464 /**
465 * Sets the "current" value.
466 *
467 * @param mixed The variable that you want to set as "current"
468 * @return void
469 * @see getCurrentVal()
470 */
471 function setCurrentVal($value) {
472 $this->data[$this->currentValKey] = $value;
473 }
474
475 /**
476 * Rendering of a "numerical array" of cObjects from TypoScript
477 * Will call ->cObjGetSingle() for each cObject found and accumulate the output.
478 *
479 * @param array $setup: Array with cObjects as values.
480 * @param string $addKey: A prefix for the debugging information
481 * @return string Rendered output from the cObjects in the array.
482 * @see cObjGetSingle()
483 */
484 function cObjGet($setup,$addKey='') {
485 if (is_array($setup)) {
486 $sKeyArray=t3lib_TStemplate::sortedKeyList($setup);
487 $content ='';
488 foreach($sKeyArray as $theKey) {
489 $theValue=$setup[$theKey];
490 if (intval($theKey) && !strstr($theKey,'.')) {
491 $conf=$setup[$theKey.'.'];
492 $content.=$this->cObjGetSingle($theValue,$conf,$addKey.$theKey); // Get the contentObject
493 }
494 }
495 return $content;
496 }
497 }
498
499 /**
500 * Renders a content object
501 *
502 * @param string The content object name, eg. "TEXT" or "USER" or "IMAGE"
503 * @param array The array with TypoScript properties for the content object
504 * @param string A string label used for the internal debugging tracking.
505 * @return string cObject output
506 * @example http://typo3.org/doc.0.html?&encryptionKey=&tx_extrepmgm_pi1[extUid]=267&tx_extrepmgm_pi1[tocEl]=153&cHash=7e74f4d331
507 */
508 function cObjGetSingle($name,$conf,$TSkey='__') {
509 global $TYPO3_CONF_VARS;
510
511 $content='';
512 // Checking that the function is not called eternally. This is done by interrupting at a depth of 100
513 $GLOBALS['TSFE']->cObjectDepthCounter--;
514 if ($GLOBALS['TSFE']->cObjectDepthCounter>0) {
515 $name = trim($name);
516 if ($GLOBALS['TT']->LR) $GLOBALS['TT']->push($TSkey, $name);
517
518 // Checking if the COBJ is a reference to another object. (eg. name of 'blabla.blabla = < styles.something')
519 if (substr($name,0,1)=='<') {
520 $key = trim(substr($name,1));
521 $cF = t3lib_div::makeInstance('t3lib_TSparser');
522 // $name and $conf is loaded with the referenced values.
523 $old_conf=$conf;
524 list($name, $conf) = $cF->getVal($key,$GLOBALS['TSFE']->tmpl->setup);
525 if (is_array($old_conf) && count($old_conf)) {
526 $conf = $this->joinTSarrays($conf,$old_conf);
527 }
528 // Getting the cObject
529 $GLOBALS['TT']->incStackPointer();
530 $content.=$this->cObjGetSingle($name,$conf,$key);
531 $GLOBALS['TT']->decStackPointer();
532 } else {
533
534 $hooked = false;
535 // Application defined cObjects
536 foreach ($this->cObjHookObjectsArr as $cObjName => $hookObj) {
537 if (($name===$cObjName) && method_exists($hookObj, 'cObjGetSingleExt')) {
538 $content.= $hookObj->cObjGetSingleExt($name, $conf, $TSkey, $this);
539 $hooked = true;
540 }
541 }
542 if (!$hooked && isset($GLOBALS['OBTS']['tso_list'][$name]) && t3lib_extMgm::isLoaded('obts')) {
543 $content.= obts_dtutil::renderDatatypeContent($name, $GLOBALS['OBTS']['tso_list'][$name], $conf, $this);
544 } elseif (!$hooked) {
545 // Traditional Content Object branching:
546 switch($name) {
547 case 'COBJ_ARRAY':
548 case 'COA':
549 $content.=$this->COBJ_ARRAY($conf);
550 break;
551 case 'COA_INT':
552 $content.=$this->COBJ_ARRAY($conf,'INT');
553 break;
554 case 'HTML':
555 $content.=$this->HTML($conf);
556 break;
557 case 'TEXT':
558 $content.=$this->TEXT($conf);
559 break;
560 case 'CLEARGIF':
561 $content.=$this->CLEARGIF($conf);
562 break;
563 case 'FILE':
564 $content.=$this->FILE($conf);
565 break;
566 case 'IMAGE':
567 $content.=$this->IMAGE($conf);
568 break;
569 case 'IMG_RESOURCE':
570 $content.=$this->IMG_RESOURCE($conf);
571 break;
572 case 'IMGTEXT':
573 $content.=$this->IMGTEXT($conf);
574 break;
575 case 'CONTENT':
576 $content.=$this->CONTENT($conf);
577 break;
578 case 'RECORDS':
579 $content.=$this->RECORDS($conf);
580 break;
581 case 'HMENU':
582 $content.=$this->HMENU($conf);
583 break;
584 case 'CTABLE':
585 $content.=$this->CTABLE($conf);
586 break;
587 case 'OTABLE':
588 $content.=$this->OTABLE($conf);
589 break;
590 case 'COLUMNS':
591 $content.=$this->COLUMNS($conf);
592 break;
593 case 'HRULER':
594 $content.=$this->HRULER($conf);
595 break;
596 case 'CASE':
597 $content.=$this->CASEFUNC($conf);
598 break;
599 case 'LOAD_REGISTER':
600 case 'RESTORE_REGISTER':
601 $this->LOAD_REGISTER($conf,$name);
602 break;
603 case 'FORM':
604 $content.=$this->FORM($conf);
605 break;
606 case 'SEARCHRESULT':
607 $content.=$this->SEARCHRESULT($conf);
608 break;
609 case 'PHP_SCRIPT':
610 $content.=$this->PHP_SCRIPT($conf);
611 break;
612 case 'PHP_SCRIPT_EXT':
613 $content.=$this->PHP_SCRIPT($conf,'EXT');
614 break;
615 case 'PHP_SCRIPT_INT':
616 $content.=$this->PHP_SCRIPT($conf,'INT');
617 break;
618 case 'USER':
619 $content.=$this->USER($conf);
620 break;
621 case 'USER_INT':
622 $content.=$this->USER($conf,'INT');
623 break;
624 case 'TEMPLATE':
625 $content.=$this->TEMPLATE($conf);
626 break;
627 case 'EDITPANEL':
628 if ($GLOBALS['TSFE']->beUserLogin) {$content.=$this->editPanel($content, $conf);}
629 break;
630 case 'MULTIMEDIA':
631 $content.=$this->MULTIMEDIA($conf);
632 break;
633 case 'MEDIA':
634 $content.=$this->MEDIA($conf);
635 break;
636 case 'SWFOBJECT':
637 $content.=$this->SWFOBJECT($conf);
638 break;
639 case 'QTOBJECT':
640 $content.=$this->QTOBJECT($conf);
641 break;
642 default:
643 // call hook functions for extra processing
644 if($name && is_array($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClassDefault'])) {
645 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClassDefault'] as $classData) {
646 $hookObject = &t3lib_div::getUserObj($classData);
647
648 if(!($hookObject instanceof tslib_content_cObjGetSingleHook)) {
649 throw new UnexpectedValueException('$hookObject must implement interface tslib_content_cObjGetSingleHook', 1195043731);
650 }
651 /* @var $hookObject tslib_content_cObjGetSingleHook */
652 $content .= $hookObject->getSingleContentObject($name, (array) $conf, $TSkey, $this);
653 }
654 }
655 break;
656 }
657 }
658 }
659 if ($GLOBALS['TT']->LR) $GLOBALS['TT']->pull($content);
660 }
661 // Increasing on exit...
662 $GLOBALS['TSFE']->cObjectDepthCounter++;
663 return $content;
664 }
665
666
667
668
669
670
671
672 /********************************************
673 *
674 * Functions rendering content objects (cObjects)
675 *
676 ********************************************/
677
678 /**
679 * Rendering the cObject, HTML
680 *
681 * @param array Array of TypoScript properties
682 * @return string Output
683 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=349&cHash=d3fd0c70b4
684 */
685 function HTML($conf) {
686 return $this->stdWrap($conf['value'],$conf['value.']);
687 }
688
689 /**
690 * Rendering the cObject, TEXT
691 *
692 * @param array Array of TypoScript properties
693 * @return string Output
694 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=350&cHash=b49de28f83
695 */
696 function TEXT($conf) {
697 return $this->stdWrap($conf['value'],$conf);
698 }
699
700 /**
701 * Rendering the cObject, CLEARGIF
702 *
703 * @param array Array of TypoScript properties
704 * @return string Output
705 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=355&cHash=70c0f19915
706 */
707 function CLEARGIF($conf) {
708 $w = $this->stdWrap($conf['width'],$conf['width.']);
709 $h = $this->stdWrap($conf['height'],$conf['height.']);
710 $w = $w ? $w : 1;
711 $h = $h ? $h : 1;
712 $wrap = $conf['wrap'] ? $conf['wrap'] : '|<br />';
713 $theValue = $this->wrap('<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$w.'" height="'.$h.'"'.$this->getBorderAttr(' border="0"').' alt="" title="" />', $wrap);
714
715 return $this->stdWrap($theValue,$conf['stdWrap.']);
716 }
717
718 /**
719 * Rendering the cObject, COBJ_ARRAY / COA and COBJ_ARRAY_INT
720 *
721 * @param array Array of TypoScript properties
722 * @param string If "INT" then the cObject is a "COBJ_ARRAY_INT" (non-cached), otherwise just "COBJ_ARRAY" (cached)
723 * @return string Output
724 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=351&cHash=a09db0329c
725 */
726 function COBJ_ARRAY($conf,$ext='') {
727
728 if (is_array($conf)) {
729 $content = '';
730 switch($ext) {
731 case 'INT':
732 $substKey = $ext . '_SCRIPT.' . $GLOBALS['TSFE']->uniqueHash();
733 $content .= '<!--'.$substKey.'-->';
734 $GLOBALS['TSFE']->config[$ext . 'incScript'][$substKey] = array (
735 'file' => $conf['includeLibs'],
736 'conf' => $conf,
737 'cObj' => serialize($this),
738 'type' => 'COA'
739 );
740 break;
741 default:
742 if ($this->checkIf($conf['if.'])) {
743 $this->includeLibs($conf);
744 $content = $this->cObjGet($conf);
745 if ($conf['wrap']) {
746 $content = $this->wrap($content, $conf['wrap']);
747 }
748 if ($conf['stdWrap.']) {
749 $content = $this->stdWrap($content, $conf['stdWrap.']);
750 }
751 }
752 break;
753 }
754 return $content;
755 } else {
756 $GLOBALS['TT']->setTSlogMessage('No elements in this content object array (COBJ_ARRAY, COA, COA_INT).', 2);
757 }
758 }
759
760 /**
761 * Rendering the cObject, USER and USER_INT
762 *
763 * @param array Array of TypoScript properties
764 * @param string If "INT" then the cObject is a "USER_INT" (non-cached), otherwise just "USER" (cached)
765 * @return string Output
766 * @link http://typo3.org/documentation/document-library/references/doc_core_tsref/4.1.0/view/8/22/
767 */
768 function USER($conf, $ext = '') {
769 $content = '';
770 switch ($ext) {
771 case 'INT':
772 $this->userObjectType = self::OBJECTTYPE_USER_INT;
773 $substKey = $ext . '_SCRIPT.' . $GLOBALS['TSFE']->uniqueHash();
774 $content.='<!--' . $substKey . '-->';
775 $GLOBALS['TSFE']->config[$ext . 'incScript'][$substKey] = array(
776 'file' => $conf['includeLibs'],
777 'conf' => $conf,
778 'cObj' => serialize($this),
779 'type' => 'FUNC'
780 );
781 break;
782 default:
783 if ($this->userObjectType === false) {
784 // Come here only if we are not called from $TSFE->INTincScript_process()!
785 $this->userObjectType = self::OBJECTTYPE_USER;
786 }
787 $this->includeLibs($conf);
788 $tempContent = $this->callUserFunction($conf['userFunc'], $conf, '');
789 if ($this->doConvertToUserIntObject) {
790 $this->doConvertToUserIntObject = false;
791 $content = $this->USER($conf, 'INT');
792 } else {
793 $content .= $tempContent;
794 }
795 break;
796 }
797 $this->userObjectType = false;
798 return $content;
799 }
800
801 /**
802 * Retrieves a type of object called as USER or USER_INT. Object can detect their
803 * type by using this call. It returns OBJECTTYPE_USER_INT or OBJECTTYPE_USER depending on the
804 * current object execution. In all other cases it will return false to indicate
805 * a call out of context.
806 *
807 * @return mixed One of OBJECTTYPE_ class constants or false
808 */
809 public function getUserObjectType() {
810 return $this->userObjectType;
811 }
812
813 /**
814 * Requests the current USER object to be converted to USER_INT.
815 *
816 * @return void
817 */
818 public function convertToUserIntObject() {
819 if ($this->userObjectType !== self::OBJECTTYPE_USER) {
820 $GLOBALS['TT']->setTSlogMessage('tslib_cObj::convertToUserIntObject() ' .
821 'is called in the wrong context or for the wrong object type', 2);
822 }
823 else {
824 $this->doConvertToUserIntObject = true;
825 }
826 }
827
828 /**
829 * Rendering the cObject, FILE
830 *
831 * @param array Array of TypoScript properties
832 * @return string Output
833 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=352&cHash=379c60f8bc
834 */
835 function FILE($conf) {
836 $theValue = $this->fileResource($this->stdWrap($conf['file'],$conf['file.']), trim($this->getAltParam($conf, false)));
837 if ($conf['linkWrap']) {
838 $theValue = $this->linkWrap($theValue,$conf['linkWrap']);
839 }
840 return $this->wrap($theValue,$conf['wrap']);
841 }
842
843 /**
844 * Rendering the cObject, IMAGE
845 *
846 * @param array Array of TypoScript properties
847 * @return string Output
848 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=353&cHash=440681ea56
849 * @see cImage()
850 */
851 function IMAGE($conf) {
852 $content='';
853 if ($this->checkIf($conf['if.'])) {
854 $theValue = $this->cImage($conf['file'],$conf);
855 if ($conf['stdWrap.']) {
856 $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
857 }
858 return $theValue;
859 }
860 }
861
862 /**
863 * Rendering the cObject, IMG_RESOURCE
864 *
865 * @param array Array of TypoScript properties
866 * @return string Output
867 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=354&cHash=46f9299706
868 * @see getImgResource()
869 */
870 function IMG_RESOURCE($conf) {
871 $GLOBALS['TSFE']->lastImgResourceInfo = $this->getImgResource($conf['file'],$conf['file.']);
872 return $this->stdWrap($GLOBALS['TSFE']->lastImgResourceInfo[3],$conf['stdWrap.']);
873 }
874
875 /**
876 * Rendering the cObject, IMGTEXT
877 *
878 * @param array Array of TypoScript properties
879 * @return string Output
880 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=363&cHash=cf2969bce1
881 */
882 function IMGTEXT($conf) {
883 $content='';
884 if (is_array($conf['text.'])) {
885 $content.= $this->stdWrap($this->cObjGet($conf['text.'],'text.'),$conf['text.']); // this gets the surrounding content
886 }
887 $imgList=trim($this->stdWrap($conf['imgList'],$conf['imgList.'])); // gets images
888 if ($imgList) {
889 $imgs = t3lib_div::trimExplode(',',$imgList);
890 $imgStart = intval($this->stdWrap($conf['imgStart'],$conf['imgStart.']));
891
892 $imgCount= count($imgs)-$imgStart;
893
894 $imgMax = intval($this->stdWrap($conf['imgMax'],$conf['imgMax.']));
895 if ($imgMax) {
896 $imgCount = t3lib_div::intInRange($imgCount,0,$imgMax); // reduces the number of images.
897 }
898
899 $imgPath = $this->stdWrap($conf['imgPath'],$conf['imgPath.']);
900
901 // initialisation
902 $caption='';
903 $captionArray = array();
904 if (!$conf['captionSplit'] && !$conf['imageTextSplit'] && is_array($conf['caption.'])) {
905 $caption = $this->stdWrap($this->cObjGet($conf['caption.'], 'caption.'),$conf['caption.']); // global caption, no splitting
906 }
907 if ($conf['captionSplit'] && $conf['captionSplit.']['cObject']) {
908 $legacyCaptionSplit = 1;
909 $capSplit = $this->stdWrap($conf['captionSplit.']['token'], $conf['captionSplit.']['token.']);
910 if (!$capSplit) {$capSplit=chr(10);}
911 $captionArray = explode($capSplit, $this->cObjGetSingle($conf['captionSplit.']['cObject'], $conf['captionSplit.']['cObject.'], 'captionSplit.cObject'));
912 foreach ($captionArray as $ca_key => $ca_val) {
913 $captionArray[$ca_key] = $this->stdWrap(trim($captionArray[$ca_key]), $conf['captionSplit.']['stdWrap.']);
914 }
915 }
916
917 $tablecode='';
918 $position=$this->stdWrap($conf['textPos'],$conf['textPos.']);
919
920 $tmppos = $position&7;
921 $contentPosition = $position&24;
922 $align = $this->align[$tmppos];
923 $cap = ($caption)?1:0;
924 $txtMarg = intval($this->stdWrap($conf['textMargin'],$conf['textMargin.']));
925 if (!$conf['textMargin_outOfText'] && $contentPosition<16) {
926 $txtMarg=0;
927 }
928
929 $cols = intval($this->stdWrap($conf['cols'],$conf['cols.']));
930 $rows = intval($this->stdWrap($conf['rows'],$conf['rows.']));
931 $colspacing = intval($this->stdWrap($conf['colSpace'],$conf['colSpace.']));
932 $rowspacing = intval($this->stdWrap($conf['rowSpace'],$conf['rowSpace.']));
933
934 $border = intval($this->stdWrap($conf['border'],$conf['border.'])) ? 1:0;
935 $borderColor = $this->stdWrap($conf['borderCol'],$conf['borderCol.']);
936 $borderThickness = intval($this->stdWrap($conf['borderThick'],$conf['borderThick.']));
937
938 $borderColor=$borderColor?$borderColor:'black';
939 $borderThickness=$borderThickness?$borderThickness:1;
940
941 $caption_align = $this->stdWrap($conf['captionAlign'],$conf['captionAlign.']);
942 if (!$caption_align) {
943 $caption_align = $align;
944 }
945 // generate cols
946 $colCount = ($cols > 1) ? $cols : 1;
947 if ($colCount > $imgCount) {$colCount = $imgCount;}
948 $rowCount = ($colCount > 1) ? ceil($imgCount / $colCount) : $imgCount;
949 // generate rows
950 if ($rows>1) {
951 $rowCount = $rows;
952 if ($rowCount > $imgCount) {$rowCount = $imgCount;}
953 $colCount = ($rowCount>1) ? ceil($imgCount / $rowCount) : $imgCount;
954 }
955
956 // max Width
957 $colRelations = trim($this->stdWrap($conf['colRelations'],$conf['colRelations.']));
958 $maxW = intval($this->stdWrap($conf['maxW'],$conf['maxW.']));
959
960 $maxWInText = intval($this->stdWrap($conf['maxWInText'],$conf['maxWInText.']));
961 if (!$maxWInText) { // If maxWInText is not set, it's calculated to the 50 % of the max...
962 $maxWInText = round($maxW/2);
963 }
964
965 if ($maxWInText && $contentPosition>=16) { // inText
966 $maxW = $maxWInText;
967 }
968
969 if ($maxW && $colCount > 0) { // If there is a max width and if colCount is greater than column
970 /* debug($border*$borderThickness*2);
971 debug($maxW);
972 debug($colspacing);
973 debug(($maxW-$colspacing*($colCount-1)-$colCount*$border*$borderThickness*2));
974 */
975 $maxW = ceil(($maxW-$colspacing*($colCount-1)-$colCount*$border*$borderThickness*2)/$colCount);
976 }
977 // create the relation between rows
978 $colMaxW = Array();
979 if ($colRelations) {
980 $rel_parts = explode(':',$colRelations);
981 $rel_total = 0;
982 for ($a=0;$a<$colCount;$a++) {
983 $rel_parts[$a] = intval($rel_parts[$a]);
984 $rel_total+= $rel_parts[$a];
985 }
986 if ($rel_total) {
987 for ($a=0;$a<$colCount;$a++) {
988 $colMaxW[$a] = round(($maxW*$colCount)/$rel_total*$rel_parts[$a]);
989 }
990 if (min($colMaxW)<=0 || max($rel_parts)/min($rel_parts)>10) { // The difference in size between the largest and smalles must be within a factor of ten.
991 $colMaxW = Array();
992 }
993 }
994 }
995 $image_compression = intval($this->stdWrap($conf['image_compression'],$conf['image_compression.']));
996 $image_effects = intval($this->stdWrap($conf['image_effects'],$conf['image_effects.']));
997 $image_frames = intval($this->stdWrap($conf['image_frames.']['key'],$conf['image_frames.']['key.']));
998
999 // fetches pictures
1000 $splitArr=array();
1001 $splitArr['imgObjNum']=$conf['imgObjNum'];
1002 $splitArr = $GLOBALS['TSFE']->tmpl->splitConfArray($splitArr,$imgCount);
1003
1004 // EqualHeight
1005 $equalHeight = intval($this->stdWrap($conf['equalH'],$conf['equalH.']));
1006 if ($equalHeight) { // Initiate gifbuilder object in order to get dimensions AND calculate the imageWidth's
1007 $gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
1008 $gifCreator->init();
1009 $relations = Array();
1010 $relations_cols = Array();
1011 $totalMaxW = $maxW*$colCount;
1012 for($a=0;$a<$imgCount;$a++) {
1013 $imgKey = $a+$imgStart;
1014 $imgInfo = $gifCreator->getImageDimensions($imgPath.$imgs[$imgKey]);
1015 $relations[$a] = $imgInfo[1] / $equalHeight; // relationship between the original height and the wished height
1016 if ($relations[$a]) { // if relations is zero, then the addition of this value is omitted as the image is not expected to display because of some error.
1017 $relations_cols[floor($a/$colCount)] += $imgInfo[0]/$relations[$a]; // counts the total width of the row with the new height taken into consideration.
1018 }
1019 }
1020 }
1021
1022 $imageRowsFinalWidths = Array(); // contains the width of every image row
1023 $imageRowsMaxHeights = Array();
1024 $imgsTag=array();
1025 $origImages=array();
1026 for($a=0;$a<$imgCount;$a++) {
1027 $GLOBALS['TSFE']->register['IMAGE_NUM'] = $a;
1028 $GLOBALS['TSFE']->register['IMAGE_NUM_CURRENT'] = $a;
1029
1030 $imgKey = $a+$imgStart;
1031 $totalImagePath = $imgPath.$imgs[$imgKey];
1032 $this->data[$this->currentValKey] = $totalImagePath;
1033 $imgObjNum = intval($splitArr[$a]['imgObjNum']);
1034 $imgConf = $conf[$imgObjNum.'.'];
1035
1036 if ($equalHeight) {
1037 $scale = 1;
1038 if ($totalMaxW) {
1039 $rowTotalMaxW = $relations_cols[floor($a/$colCount)];
1040 if ($rowTotalMaxW > $totalMaxW) {
1041 $scale = $rowTotalMaxW / $totalMaxW;
1042 }
1043 }
1044 // transfer info to the imageObject. Please note, that
1045 $imgConf['file.']['height'] = round($equalHeight/$scale);
1046
1047 unset($imgConf['file.']['width']);
1048 unset($imgConf['file.']['maxW']);
1049 unset($imgConf['file.']['maxH']);
1050 unset($imgConf['file.']['minW']);
1051 unset($imgConf['file.']['minH']);
1052 unset($imgConf['file.']['width.']);
1053 unset($imgConf['file.']['maxW.']);
1054 unset($imgConf['file.']['maxH.']);
1055 unset($imgConf['file.']['minW.']);
1056 unset($imgConf['file.']['minH.']);
1057 $maxW = 0; // setting this to zero, so that it doesn't disturb
1058 }
1059
1060 if ($maxW) {
1061 if (count($colMaxW)) {
1062 $imgConf['file.']['maxW'] = $colMaxW[($a%$colCount)];
1063 } else {
1064 $imgConf['file.']['maxW'] = $maxW;
1065 }
1066 }
1067
1068 // Image Object supplied:
1069 if (is_array($imgConf)) {
1070 if ($this->image_effects[$image_effects]) {
1071 $imgConf['file.']['params'].= ' '.$this->image_effects[$image_effects];
1072 }
1073 if ($image_frames) {
1074 if (is_array($conf['image_frames.'][$image_frames.'.'])) {
1075 $imgConf['file.']['m.'] = $conf['image_frames.'][$image_frames.'.'];
1076 }
1077 }
1078 if ($image_compression && $imgConf['file']!='GIFBUILDER') {
1079 if ($image_compression==1) {
1080 $tempImport = $imgConf['file.']['import'];
1081 $tempImport_dot = $imgConf['file.']['import.'];
1082 unset($imgConf['file.']);
1083 $imgConf['file.']['import'] = $tempImport;
1084 $imgConf['file.']['import.'] = $tempImport_dot;
1085 } elseif (isset($this->image_compression[$image_compression])) {
1086 $imgConf['file.']['params'].= ' '.$this->image_compression[$image_compression]['params'];
1087 $imgConf['file.']['ext'] = $this->image_compression[$image_compression]['ext'];
1088 unset($imgConf['file.']['ext.']);
1089 }
1090 }
1091
1092 // "alt", "title" and "longdesc" attributes:
1093 if (!strlen($imgConf['altText']) && !is_array($imgConf['altText.'])) {
1094 $imgConf['altText'] = $conf['altText'];
1095 $imgConf['altText.'] = $conf['altText.'];
1096 }
1097 if (!strlen($imgConf['titleText']) && !is_array($imgConf['titleText.'])) {
1098 $imgConf['titleText'] = $conf['titleText'];
1099 $imgConf['titleText.'] = $conf['titleText.'];
1100 }
1101 if (!strlen($imgConf['longdescURL']) && !is_array($imgConf['longdescURL.'])) {
1102 $imgConf['longdescURL'] = $conf['longdescURL'];
1103 $imgConf['longdescURL.'] = $conf['longdescURL.'];
1104 }
1105 } else {
1106 $imgConf = array(
1107 'altText' => $conf['altText'],
1108 'titleText' => $conf['titleText'],
1109 'longdescURL' => $conf['longdescURL'],
1110 'file' => $totalImagePath
1111 );
1112 }
1113
1114 $imgsTag[$imgKey] = $this->IMAGE($imgConf);
1115
1116 // Store the original filepath
1117 $origImages[$imgKey]=$GLOBALS['TSFE']->lastImageInfo;
1118
1119 $imageRowsFinalWidths[floor($a/$colCount)] += $GLOBALS['TSFE']->lastImageInfo[0];
1120 if ($GLOBALS['TSFE']->lastImageInfo[1]>$imageRowsMaxHeights[floor($a/$colCount)]) {
1121 $imageRowsMaxHeights[floor($a/$colCount)] = $GLOBALS['TSFE']->lastImageInfo[1];
1122 }
1123 }
1124 // calculating the tableWidth:
1125 // TableWidth problems: It creates problems if the pictures are NOT as wide as the tableWidth.
1126 $tableWidth = max($imageRowsFinalWidths)+ $colspacing*($colCount-1) + $colCount*$border*$borderThickness*2;
1127
1128 // make table for pictures
1129 $index=$imgStart;
1130
1131 $noRows = $this->stdWrap($conf['noRows'],$conf['noRows.']);
1132 $noCols = $this->stdWrap($conf['noCols'],$conf['noCols.']);
1133 if ($noRows) {$noCols=0;} // noRows overrides noCols. They cannot exist at the same time.
1134 if ($equalHeight) {
1135 $noCols=1;
1136 $noRows=0;
1137 }
1138
1139 $rowCount_temp=1;
1140 $colCount_temp=$colCount;
1141 if ($noRows) {
1142 $rowCount_temp = $rowCount;
1143 $rowCount=1;
1144 }
1145 if ($noCols) {
1146 $colCount=1;
1147 }
1148 // col- and rowspans calculated
1149 $colspan = (($colspacing) ? $colCount*2-1 : $colCount);
1150 $rowspan = (($rowspacing) ? $rowCount*2-1 : $rowCount) + $cap;
1151
1152
1153 // Edit icons:
1154 $editIconsHTML = $conf['editIcons']&&$GLOBALS['TSFE']->beUserLogin ? $this->editIcons('',$conf['editIcons'],$conf['editIcons.']) : '';
1155
1156 // strech out table:
1157 $tablecode='';
1158 $flag=0;
1159 if ($conf['noStretchAndMarginCells']!=1) {
1160 $tablecode.='<tr>';
1161 if ($txtMarg && $align=='right') { // If right aligned, the textborder is added on the right side
1162 $tablecode.='<td rowspan="'.($rowspan+1).'" valign="top"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$txtMarg.'" height="1" alt="" title="" />'.($editIconsHTML?'<br />'.$editIconsHTML:'').'</td>';
1163 $editIconsHTML='';
1164 $flag=1;
1165 }
1166 $tablecode.='<td colspan="'.$colspan.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$tableWidth.'" height="1" alt="" /></td>';
1167 if ($txtMarg && $align=='left') { // If left aligned, the textborder is added on the left side
1168 $tablecode.='<td rowspan="'.($rowspan+1).'" valign="top"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$txtMarg.'" height="1" alt="" title="" />'.($editIconsHTML?'<br />'.$editIconsHTML:'').'</td>';
1169 $editIconsHTML='';
1170 $flag=1;
1171 }
1172 if ($flag) $tableWidth+=$txtMarg+1;
1173 // $tableWidth=0;
1174 $tablecode.='</tr>';
1175 }
1176
1177 // draw table
1178 for ($c=0;$c<$rowCount;$c++) { // Looping through rows. If 'noRows' is set, this is '1 time', but $rowCount_temp will hold the actual number of rows!
1179 if ($c && $rowspacing) { // If this is NOT the first time in the loop AND if space is required, a row-spacer is added. In case of "noRows" rowspacing is done further down.
1180 $tablecode.='<tr><td colspan="'.$colspan.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$rowspacing.'"'.$this->getBorderAttr(' border="0"').' alt="" title="" /></td></tr>';
1181 }
1182 $tablecode.='<tr>'; // starting row
1183 for ($b=0; $b<$colCount_temp; $b++) { // Looping through the columns
1184 if ($b && $colspacing) { // If this is NOT the first iteration AND if column space is required. In case of "noCols", the space is done without a separate cell.
1185 if (!$noCols) {
1186 $tablecode.='<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$colspacing.'" height="1"'.$this->getBorderAttr(' border="0"').' alt="" title="" /></td>';
1187 } else {
1188 $colSpacer='<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.($border?$colspacing-6:$colspacing).'" height="'.($imageRowsMaxHeights[$c]+($border?$borderThickness*2:0)).'"'.$this->getBorderAttr(' border="0"').' align="'.($border?'left':'top').'" alt="" title="" />';
1189 $colSpacer='<td valign="top">'.$colSpacer.'</td>'; // added 160301, needed for the new "noCols"-table...
1190 $tablecode.=$colSpacer;
1191 }
1192 }
1193 if (!$noCols || ($noCols && !$b)) {
1194 $tablecode.='<td valign="top">'; // starting the cell. If "noCols" this cell will hold all images in the row, otherwise only a single image.
1195 if ($noCols) {$tablecode.='<table width="'.$imageRowsFinalWidths[$c].'" border="0" cellpadding="0" cellspacing="0"><tr>';} // In case of "noCols" we must set the table-tag that surrounds the images in the row.
1196 }
1197 for ($a=0;$a<$rowCount_temp;$a++) { // Looping through the rows IF "noRows" is set. "noRows" means that the rows of images is not rendered by physical table rows but images are all in one column and spaced apart with clear-gifs. This loop is only one time if "noRows" is not set.
1198 $GLOBALS['TSFE']->register['IMAGE_NUM'] = $imgIndex; // register previous imgIndex
1199 $imgIndex = $index+$a*$colCount_temp;
1200 $GLOBALS['TSFE']->register['IMAGE_NUM_CURRENT'] = $imgIndex;
1201 if ($imgsTag[$imgIndex]) {
1202 if ($rowspacing && $noRows && $a) { // Puts distance between the images IF "noRows" is set and this is the first iteration of the loop
1203 $tablecode.= '<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$rowspacing.'" alt="" title="" /><br />';
1204 }
1205 if ($legacyCaptionSplit) {
1206 $thisCaption = $captionArray[$imgIndex];
1207 } else if ($conf['captionSplit'] || $conf['imageTextSplit']) {
1208 $thisCaption = $this->stdWrap($this->cObjGet($conf['caption.'], 'caption.'), $conf['caption.']);
1209 }
1210 $imageHTML = $imgsTag[$imgIndex].'<br />';
1211 $Talign = (!trim($thisCaption) && !$noRows) ? ' align="left"' : ''; // this is necessary if the tablerows are supposed to space properly together! "noRows" is excluded because else the images "layer" together.
1212 if ($border) {$imageHTML='<table border="0" cellpadding="'.$borderThickness.'" cellspacing="0" bgcolor="'.$borderColor.'"'.$Talign.'><tr><td>'.$imageHTML.'</td></tr></table>';}
1213 $imageHTML.=$editIconsHTML;
1214 $editIconsHTML='';
1215 $imageHTML.=$thisCaption; // Adds caption.
1216 if ($noCols) {$imageHTML='<td valign="top">'.$imageHTML.'</td>';} // If noCols, put in table cell.
1217 $tablecode.=$imageHTML;
1218 }
1219 }
1220 $index++;
1221 if (!$noCols || ($noCols && $b+1==$colCount_temp)) {
1222 if ($noCols) {$tablecode.='</tr></table>';} // In case of "noCols" we must finish the table that surrounds the images in the row.
1223 $tablecode.='</td>'; // Ending the cell. In case of "noCols" the cell holds all pictures!
1224 }
1225 }
1226 $tablecode.='</tr>'; // ending row
1227 }
1228 if ($c) {
1229 switch ($contentPosition) {
1230 case '0': // above
1231 case '8': // below
1232 switch ($align) { // These settings are needed for Firefox
1233 case 'center':
1234 $table_align = 'margin-left: auto; margin-right: auto';
1235 break;
1236 case 'right':
1237 $table_align = 'margin-left: auto; margin-right: 0px';
1238 break;
1239 default: // Most of all: left
1240 $table_align = 'margin-left: 0px; margin-right: auto';
1241 }
1242 $table_align = 'style="'.$table_align.'"';
1243 break;
1244 case '16': // in text
1245 $table_align = 'align="'.$align.'"';
1246 break;
1247 default:
1248 $table_align = '';
1249 }
1250
1251 // Table-tag is inserted
1252 $tablecode = '<table'.($tableWidth?' width="'.$tableWidth.'"':'').' border="0" cellspacing="0" cellpadding="0" '.$table_align.' class="imgtext-table">'.$tablecode;
1253 if ($editIconsHTML) { // IF this value is not long since reset.
1254 $tablecode.='<tr><td colspan="'.$colspan.'">'.$editIconsHTML.'</td></tr>';
1255 $editIconsHTML='';
1256 }
1257 if ($cap) {
1258 $tablecode.='<tr><td colspan="'.$colspan.'" align="'.$caption_align.'">'.$caption.'</td></tr>';
1259 }
1260 $tablecode.='</table>';
1261 if ($conf['tableStdWrap.']) {$tablecode=$this->stdWrap($tablecode,$conf['tableStdWrap.']);}
1262 }
1263
1264 $spaceBelowAbove = intval($this->stdWrap($conf['spaceBelowAbove'],$conf['spaceBelowAbove.']));
1265 switch ($contentPosition) {
1266 case '0': // above
1267 $output= '<div style="text-align:'.$align.';">'.$tablecode.'</div>'.$this->wrapSpace($content, $spaceBelowAbove.'|0');
1268 break;
1269 case '8': // below
1270 $output= $this->wrapSpace($content, '0|'.$spaceBelowAbove).'<div style="text-align:'.$align.';">'.$tablecode.'</div>';
1271 break;
1272 case '16': // in text
1273 $output= $tablecode.$content;
1274 break;
1275 case '24': // in text, no wrap
1276 $theResult = '';
1277 $theResult.= '<table border="0" cellspacing="0" cellpadding="0" class="imgtext-nowrap"><tr>';
1278 if ($align=='right') {
1279 $theResult.= '<td valign="top">'.$content.'</td><td valign="top">'.$tablecode.'</td>';
1280 } else {
1281 $theResult.= '<td valign="top">'.$tablecode.'</td><td valign="top">'.$content.'</td>';
1282 }
1283 $theResult.= '</tr></table>';
1284 $output= $theResult;
1285 break;
1286 }
1287 } else {
1288 $output= $content;
1289 }
1290
1291 if ($conf['stdWrap.']) {
1292 $output = $this->stdWrap($output, $conf['stdWrap.']);
1293 }
1294
1295 return $output;
1296 }
1297
1298 /**
1299 * Rendering the cObject, CONTENT
1300 *
1301 * @param array Array of TypoScript properties
1302 * @return string Output
1303 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=356&cHash=9f3b5c6ba2
1304 */
1305 function CONTENT($conf) {
1306 $theValue='';
1307
1308 $originalRec = $GLOBALS['TSFE']->currentRecord;
1309 if ($originalRec) { // If the currentRecord is set, we register, that this record has invoked this function. It's should not be allowed to do this again then!!
1310 $GLOBALS['TSFE']->recordRegister[$originalRec]++;
1311 }
1312
1313 if ($conf['table']=='pages' || substr($conf['table'],0,3)=='tt_' || substr($conf['table'],0,3)=='fe_' || substr($conf['table'],0,3)=='tx_' || substr($conf['table'],0,4)=='ttx_' || substr($conf['table'],0,5)=='user_' || substr($conf['table'],0,7)=='static_') {
1314
1315 $renderObjName = $conf['renderObj'] ? $conf['renderObj'] : '<'.$conf['table'];
1316 $renderObjKey = $conf['renderObj'] ? 'renderObj' : '';
1317 $renderObjConf = $conf['renderObj.'];
1318
1319 $slide = intval($conf['slide'])?intval($conf['slide']):0;
1320 $slideCollect = intval($conf['slide.']['collect'])?intval($conf['slide.']['collect']):0;
1321 $slideCollectReverse = intval($conf['slide.']['collectReverse'])?true:false;
1322 $slideCollectFuzzy = $slideCollect?(intval($conf['slide.']['collectFuzzy'])?true:false):true;
1323 $again = false;
1324
1325 do {
1326 $res = $this->exec_getQuery($conf['table'],$conf['select.']);
1327 if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
1328 $GLOBALS['TT']->setTSlogMessage($error,3);
1329 } else {
1330 $this->currentRecordTotal = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
1331 $GLOBALS['TT']->setTSlogMessage('NUMROWS: '.$GLOBALS['TYPO3_DB']->sql_num_rows($res));
1332 $cObj =t3lib_div::makeInstance('tslib_cObj');
1333 $cObj->setParent($this->data,$this->currentRecord);
1334 $this->currentRecordNumber=0;
1335 $cobjValue = '';
1336 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
1337
1338 // Versioning preview:
1339 $GLOBALS['TSFE']->sys_page->versionOL($conf['table'],$row,TRUE);
1340
1341 // Language overlay:
1342 if (is_array($row) && $GLOBALS['TSFE']->sys_language_contentOL) {
1343 $row = $GLOBALS['TSFE']->sys_page->getRecordOverlay($conf['table'],$row,$GLOBALS['TSFE']->sys_language_content,$GLOBALS['TSFE']->sys_language_contentOL);
1344 }
1345
1346 if (is_array($row)) { // Might be unset in the sys_language_contentOL
1347 if (!$GLOBALS['TSFE']->recordRegister[$conf['table'].':'.$row['uid']]) {
1348 $this->currentRecordNumber++;
1349 $cObj->parentRecordNumber = $this->currentRecordNumber;
1350 $GLOBALS['TSFE']->currentRecord = $conf['table'].':'.$row['uid'];
1351 $this->lastChanged($row['tstamp']);
1352 $cObj->start($row,$conf['table']);
1353 $tmpValue = $cObj->cObjGetSingle($renderObjName, $renderObjConf, $renderObjKey);
1354 $cobjValue .= $tmpValue;
1355 }
1356 }
1357 }
1358 $GLOBALS['TYPO3_DB']->sql_free_result($res);
1359 }
1360 if ($slideCollectReverse) {
1361 $theValue = $cobjValue.$theValue;
1362 } else {
1363 $theValue .= $cobjValue;
1364 }
1365 if ($slideCollect>0) {
1366 $slideCollect--;
1367 }
1368 if ($slide) {
1369 if ($slide>0) {
1370 $slide--;
1371 }
1372 $conf['select.']['pidInList'] = $this->getSlidePids($conf['select.']['pidInList'], $conf['select.']['pidInList.']);
1373 $again = strlen($conf['select.']['pidInList'])?true:false;
1374 }
1375 } while ($again&&(($slide&&!strlen($tmpValue)&&$slideCollectFuzzy)||($slide&&$slideCollect)));
1376 }
1377
1378 $theValue = $this->wrap($theValue,$conf['wrap']);
1379 if ($conf['stdWrap.']) $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
1380
1381 $GLOBALS['TSFE']->currentRecord = $originalRec; // Restore
1382 return $theValue;
1383 }
1384
1385 /**
1386 * Rendering the cObject, RECORDS
1387 *
1388 * @param array Array of TypoScript properties
1389 * @return string Output
1390 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=357&cHash=303e959472
1391 */
1392 function RECORDS($conf) {
1393 $theValue='';
1394
1395 $originalRec = $GLOBALS['TSFE']->currentRecord;
1396 if ($originalRec) { // If the currentRecord is set, we register, that this record has invoked this function. It's should not be allowed to do this again then!!
1397 $GLOBALS['TSFE']->recordRegister[$originalRec]++;
1398 }
1399
1400 $conf['source'] = $this->stdWrap($conf['source'],$conf['source.']);
1401 if ($conf['tables'] && $conf['source']) {
1402 $allowedTables = $conf['tables'];
1403 if (is_array($conf['conf.'])) {
1404 foreach ($conf['conf.'] as $k => $v) {
1405 if (substr($k,-1)!='.') $allowedTables.=','.$k;
1406 }
1407 }
1408
1409 $loadDB = t3lib_div::makeInstance('FE_loadDBGroup');
1410 $loadDB->start($conf['source'], $allowedTables);
1411 foreach ($loadDB->tableArray as $table => $v) {
1412 if (is_array($GLOBALS['TCA'][$table])) {
1413 $loadDB->additionalWhere[$table]=$this->enableFields($table);
1414 }
1415 }
1416 $loadDB->getFromDB();
1417
1418 reset($loadDB->itemArray);
1419 $data = $loadDB->results;
1420
1421 $cObj =t3lib_div::makeInstance('tslib_cObj');
1422 $cObj->setParent($this->data,$this->currentRecord);
1423 $this->currentRecordNumber=0;
1424 $this->currentRecordTotal = count($loadDB->itemArray);
1425 foreach ($loadDB->itemArray as $val) {
1426 $row = $data[$val['table']][$val['id']];
1427
1428 // Versioning preview:
1429 $GLOBALS['TSFE']->sys_page->versionOL($val['table'],$row);
1430
1431 // Language overlay:
1432 if (is_array($row) && $GLOBALS['TSFE']->sys_language_contentOL) {
1433 $row = $GLOBALS['TSFE']->sys_page->getRecordOverlay($val['table'],$row,$GLOBALS['TSFE']->sys_language_content,$GLOBALS['TSFE']->sys_language_contentOL);
1434 }
1435
1436 if (is_array($row)) { // Might be unset in the content overlay things...
1437 if (!$conf['dontCheckPid']) {
1438 $row = $this->checkPid($row['pid']) ? $row : '';
1439 }
1440 if ($row && !$GLOBALS['TSFE']->recordRegister[$val['table'].':'.$val['id']]) {
1441 $renderObjName = $conf['conf.'][$val['table']] ? $conf['conf.'][$val['table']] : '<'.$val['table'];
1442 $renderObjKey = $conf['conf.'][$val['table']] ? 'conf.'.$val['table'] : '';
1443 $renderObjConf = $conf['conf.'][$val['table'].'.'];
1444 $this->currentRecordNumber++;
1445 $cObj->parentRecordNumber=$this->currentRecordNumber;
1446 $GLOBALS['TSFE']->currentRecord = $val['table'].':'.$val['id'];
1447 $this->lastChanged($row['tstamp']);
1448 $cObj->start($row,$val['table']);
1449 $tmpValue = $cObj->cObjGetSingle($renderObjName, $renderObjConf, $renderObjKey);
1450 $theValue .= $tmpValue;
1451 }# else debug($GLOBALS['TSFE']->recordRegister,'RECORDS');
1452 }
1453 }
1454 }
1455 if ($conf['wrap']) $theValue = $this->wrap($theValue,$conf['wrap']);
1456 if ($conf['stdWrap.']) $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
1457
1458 $GLOBALS['TSFE']->currentRecord = $originalRec; // Restore
1459 return $theValue;
1460 }
1461
1462 /**
1463 * Rendering the cObject, HMENU
1464 *
1465 * @param array Array of TypoScript properties
1466 * @return string Output
1467 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=358&cHash=5400c1c06a
1468 */
1469 function HMENU($conf) {
1470 $content='';
1471 if ($this->checkIf($conf['if.'])) {
1472 $cls = strtolower($conf[1]);
1473 if (t3lib_div::inList($GLOBALS['TSFE']->tmpl->menuclasses,$cls)) {
1474 if ($conf['special.']['value.']) {
1475 $conf['special.']['value'] = $this->stdWrap($conf['special.']['value'], $conf['special.']['value.']);
1476 }
1477 $GLOBALS['TSFE']->register['count_HMENU']++;
1478 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']=0;
1479 $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid']=array();
1480 $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']=array();
1481
1482 $menu = t3lib_div::makeInstance('tslib_'.$cls);
1483 $menu->parent_cObj = $this;
1484 $menu->start($GLOBALS['TSFE']->tmpl, $GLOBALS['TSFE']->sys_page, '', $conf, 1);
1485 $menu->makeMenu();
1486 $content.=$menu->writeMenu();
1487 }
1488 if ($conf['wrap']) $content=$this->wrap($content, $conf['wrap']);
1489 if ($conf['stdWrap.']) $content = $this->stdWrap($content, $conf['stdWrap.']);
1490 }
1491 return $content;
1492 }
1493
1494 /**
1495 * Rendering the cObject, CTABLE
1496 *
1497 * @param array Array of TypoScript properties
1498 * @return string Output
1499 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=359&cHash=2e0065b4e7
1500 */
1501 function CTABLE ($conf) {
1502 $controlTable = t3lib_div::makeInstance('tslib_controlTable');
1503 if ($conf['tableParams']) {
1504 $controlTable->tableParams = $conf['tableParams'];
1505 }
1506 // loads the pagecontent
1507 $controlTable->contentW = $conf['cWidth'];
1508 // loads the menues if any
1509 if (is_array($conf['c.'])) {
1510 $controlTable->content = $this->cObjGet($conf['c.'],'c.');
1511 $controlTable->contentTDparams = isset($conf['c.']['TDParams']) ? $conf['c.']['TDParams'] : 'valign="top"';
1512 }
1513 if (is_array($conf['lm.'])) {
1514 $controlTable->lm = $this->cObjGet($conf['lm.'],'lm.');
1515 $controlTable->lmTDparams = isset($conf['lm.']['TDParams']) ? $conf['lm.']['TDParams'] : 'valign="top"';
1516 }
1517 if (is_array($conf['tm.'])) {
1518 $controlTable->tm = $this->cObjGet($conf['tm.'],'tm.');
1519 $controlTable->tmTDparams = isset($conf['tm.']['TDParams']) ? $conf['tm.']['TDParams'] : 'valign="top"';
1520 }
1521 if (is_array($conf['rm.'])) {
1522 $controlTable->rm = $this->cObjGet($conf['rm.'],'rm.');
1523 $controlTable->rmTDparams = isset($conf['rm.']['TDParams']) ? $conf['rm.']['TDParams'] : 'valign="top"';
1524 }
1525 if (is_array($conf['bm.'])) {
1526 $controlTable->bm = $this->cObjGet($conf['bm.'],'bm.');
1527 $controlTable->bmTDparams = isset($conf['bm.']['TDParams']) ? $conf['bm.']['TDParams'] : 'valign="top"';
1528 }
1529 return $controlTable->start($conf['offset'],$conf['cMargins']);
1530 }
1531
1532 /**
1533 * Rendering the cObject, OTABLE
1534 *
1535 * @param array Array of TypoScript properties
1536 * @return string Output
1537 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=360&cHash=02c9552d38
1538 */
1539 function OTABLE ($conf) {
1540 $controlTable = t3lib_div::makeInstance('tslib_tableOffset');
1541 if ($conf['tableParams']) {
1542 $controlTable->tableParams = $conf['tableParams'];
1543 }
1544 return $controlTable->start($this->cObjGet($conf),$conf['offset']);
1545 }
1546
1547 /**
1548 * Rendering the cObject, COLUMNS
1549 *
1550 * @param array Array of TypoScript properties
1551 * @return string Output
1552 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=361&cHash=7e4e228cad
1553 */
1554 function COLUMNS ($conf) {
1555 $content='';
1556 if (is_array($conf) && $this->checkIf($conf['if.'])) {
1557 $tdRowCount=0;
1558 $tableParams = $conf['tableParams'] ? ' '.$conf['tableParams'] : ' border="0" cellspacing="0" cellpadding="0"';
1559 $TDparams = $conf['TDparams'] ? ' '.$conf['TDparams']:' valign="top"';
1560 $rows = t3lib_div::intInRange($conf['rows'],2,20);
1561 $totalWidth = intval($conf['totalWidth']);
1562 $columnWidth=0;
1563
1564 $totalGapWidth=0;
1565 $gapData = Array(
1566 'gapWidth' => $this->stdWrap($conf['gapWidth'],$conf['gapWidth.']),
1567 'gapBgCol' => $this->stdWrap($conf['gapBgCol'],$conf['gapBgCol.']),
1568 'gapLineThickness' => $this->stdWrap($conf['gapLineThickness'],$conf['gapLineThickness.']),
1569 'gapLineCol' => $this->stdWrap($conf['gapLineCol'],$conf['gapLineCol.'])
1570 );
1571 $gapData = $GLOBALS['TSFE']->tmpl->splitConfArray($gapData,$rows-1);
1572 foreach ($gapData as $val) {
1573 $totalGapWidth+=intval($val['gapWidth']);
1574 }
1575
1576 if ($totalWidth) {
1577 $columnWidth = ceil(($totalWidth-$totalGapWidth)/$rows);
1578 $TDparams.=' width="'.$columnWidth.'"';
1579 $tableParams.=' width="'.$totalWidth.'"';
1580 } else {
1581 $TDparams.=' width="'.floor(100/$rows).'%"';
1582 $tableParams.=' width="100%"';
1583 }
1584
1585 for ($a=1;$a<=$rows;$a++) {
1586 $tdRowCount++;
1587 $content.='<td'.$TDparams.'>';
1588 $content.=$this->cObjGetSingle($conf[$a],$conf[$a.'.'], $a);
1589 $content.='</td>';
1590 if ($a < $rows) {
1591 $gapConf = $gapData[($a-1)];
1592 $gapWidth = intval($gapConf['gapWidth']);
1593 if ($gapWidth) {
1594 $tdPar = $gapConf['gapBgCol'] ? ' bgcolor="'.$gapConf['gapBgCol'].'"' : '';
1595 $gapLine = intval($gapConf['gapLineThickness']);
1596 if ($gapLine) {
1597 $gapSurround = t3lib_div::intInRange(($gapWidth-$gapLine)/2, 1, 1000);
1598 // right gap
1599 $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapSurround.'" height="1" alt="" title="" /></td>';
1600 $tdRowCount++;
1601 // line:
1602 $GtdPar = $gapConf['gapLineCol'] ? ' bgcolor="'.$gapConf['gapLineCol'].'"' : ' bgcolor="black"';
1603 $content.='<td'.$GtdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapLine.'" height="1" alt="" title="" /></td>';
1604 $tdRowCount++;
1605 // left gap
1606 $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapSurround.'" height="1" alt="" title="" /></td>';
1607 $tdRowCount++;
1608 } else {
1609 $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapWidth.'" height="1" alt="" title="" /></td>';
1610 $tdRowCount++;
1611 }
1612 }
1613 }
1614 }
1615 $content = '<tr>'.$content.'</tr>';
1616 $content = '<table'.$tableParams.'>'.$content.'</table>';
1617 $content.= $this->cObjGetSingle($conf['after'],$conf['after.'], 'after');
1618 if ($conf['stdWrap.']) {
1619 $content = $this->stdWrap($content,$conf['stdWrap.']);
1620 }
1621 }
1622 return $content;
1623 }
1624
1625 /**
1626 * Rendering the cObject, HRULER
1627 *
1628 * @param array Array of TypoScript properties
1629 * @return string Output
1630 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=362&cHash=2a462aa084
1631 */
1632 function HRULER ($conf) {
1633 $lineThickness = t3lib_div::intInRange($this->stdWrap($conf['lineThickness'],$conf['lineThickness.']),1,50);
1634 $lineColor = $conf['lineColor'] ? $conf['lineColor'] : 'black';
1635 $spaceBefore = intval($conf['spaceLeft']);
1636 $spaceAfter = intval($conf['spaceRight']);
1637 $tableWidth = $conf['tableWidth'] ? $conf['tableWidth'] : '99%';
1638 $content='';
1639
1640 $content.='<table border="0" cellspacing="0" cellpadding="0" width="'.htmlspecialchars($tableWidth).'" summary=""><tr>';
1641 if ($spaceBefore) {$content.='<td width="1"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$spaceBefore.'" height="1" alt="" title="" /></td>'; }
1642 $content.='<td bgcolor="'.$lineColor.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$lineThickness.'" alt="" title="" /></td>';
1643 if ($spaceAfter) {$content.='<td width="1"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$spaceAfter.'" height="1" alt="" title="" /></td>'; }
1644 $content.='</tr></table>';
1645
1646 $content = $this->stdWrap($content, $conf['stdWrap.']);
1647 return $content;
1648 }
1649
1650 /**
1651 * Rendering the cObject, CASE
1652 *
1653 * @param array Array of TypoScript properties
1654 * @return string Output
1655 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=364&cHash=cffedd09e3
1656 */
1657 function CASEFUNC ($conf){
1658 $content='';
1659 if ($this->checkIf($conf['if.'])) {
1660 if ($conf['setCurrent'] || $conf['setCurrent.']){$this->data[$this->currentValKey] = $this->stdWrap($conf['setCurrent'], $conf['setCurrent.']);}
1661 $key = $this->stdWrap($conf['key'],$conf['key.']);
1662 $key = strlen($conf[$key]) ? $key : 'default';
1663 $name = $conf[$key];
1664 $theValue = $this->cObjGetSingle($name,$conf[$key.'.'], $key);
1665 if ($conf['stdWrap.']) {
1666 $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
1667 }
1668 return $theValue;
1669 }
1670 }
1671
1672 /**
1673 * Rendering the cObject, LOAD_REGISTER and RESTORE_REGISTER
1674 * NOTICE: This cObject does NOT return any content since it just sets internal data based on the TypoScript properties.
1675 *
1676 * @param array Array of TypoScript properties
1677 * @param string If "RESTORE_REGISTER" then the cObject rendered is "RESTORE_REGISTER", otherwise "LOAD_REGISTER"
1678 * @return string Empty string (the cObject only sets internal data!)
1679 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=365&cHash=4935524e2e
1680 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=366&cHash=4f9485e8cc
1681 */
1682 function LOAD_REGISTER($conf,$name) {
1683 if ($name=='RESTORE_REGISTER') {
1684 $GLOBALS['TSFE']->register = array_pop($GLOBALS['TSFE']->registerStack);
1685 } else {
1686 array_push($GLOBALS['TSFE']->registerStack,$GLOBALS['TSFE']->register);
1687 if (is_array($conf)) {
1688 foreach ($conf as $theKey => $theValue) {
1689 if (!strstr($theKey,'.') || !isset($conf[substr($theKey,0,-1)])) { // Only if 1) the property is set but not the value itself, 2) the value and/or any property
1690 if (strstr($theKey,'.')) {
1691 $theKey = substr($theKey,0,-1);
1692 }
1693 $GLOBALS['TSFE']->register[$theKey] = $this->stdWrap($conf[$theKey],$conf[$theKey.'.']);
1694 }
1695 }
1696 }
1697 }
1698 return '';
1699 }
1700
1701 /**
1702 * Rendering the cObject, FORM
1703 *
1704 * Note on $formData:
1705 * In the optional $formData array each entry represents a line in the ordinary setup.
1706 * In those entries each entry (0,1,2...) represents a space normally divided by the '|' line.
1707 *
1708 * $formData [] = array('Name:', 'name=input, 25 ', 'Default value....');
1709 * $formData [] = array('Email:', 'email=input, 25 ', 'Default value for email....');
1710 *
1711 * - corresponds to the $conf['data'] value being :
1712 * Name:|name=input, 25 |Default value....||Email:|email=input, 25 |Default value for email....
1713 *
1714 * If $formData is an array the value of $conf['data'] is ignored.
1715 *
1716 * @param array Array of TypoScript properties
1717 * @param array Alternative formdata overriding whatever comes from TypoScript
1718 * @return string Output
1719 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=367&cHash=bbc518d930
1720 */
1721 function FORM($conf,$formData='') {
1722 $content='';
1723 if (is_array($formData)) {
1724 $dataArr = $formData;
1725 } else {
1726 $data = $this->stdWrap($conf['data'],$conf['data.']);
1727 // Clearing dataArr
1728 $dataArr = array();
1729 // Getting the original config
1730 if (trim($data)) {
1731 $data = str_replace(chr(10),'||',$data);
1732 $dataArr = explode('||',$data);
1733 }
1734 // Adding the new dataArray config form:
1735 if (is_array($conf['dataArray.'])) { // dataArray is supplied
1736 $sKeyArray = t3lib_TStemplate::sortedKeyList($conf['dataArray.'], TRUE);
1737 foreach ($sKeyArray as $theKey) {
1738 $dAA = $conf['dataArray.'][$theKey.'.'];
1739 if (is_array($dAA)) {
1740 $temp = array();
1741 list($temp[0]) = explode('|',$dAA['label.'] ? $this->stdWrap($dAA['label'],$dAA['label.']) : $dAA['label']);
1742 list($temp[1]) = explode('|',$dAA['type']);
1743 if ($dAA['required']) {
1744 $temp[1] = '*'.$temp[1];
1745 }
1746 list($temp[2]) = explode('|',$dAA['value.'] ? $this->stdWrap($dAA['value'],$dAA['value.']) : $dAA['value']);
1747 // If value Array is set, then implode those values.
1748 if (is_array($dAA['valueArray.'])) {
1749 $temp_accum = array();
1750 foreach ($dAA['valueArray.'] as $dAKey_vA => $dAA_vA) {
1751 if (is_array($dAA_vA) && !strcmp(intval($dAKey_vA).'.',$dAKey_vA)) {
1752 $temp_vA=array();
1753 list($temp_vA[0])= explode('=',$dAA_vA['label.'] ? $this->stdWrap($dAA_vA['label'],$dAA_vA['label.']) : $dAA_vA['label']);
1754 if ($dAA_vA['selected']) {$temp_vA[0]='*'.$temp_vA[0];}
1755 list($temp_vA[1])= explode(',',$dAA_vA['value']);
1756 }
1757 $temp_accum[] = implode('=',$temp_vA);
1758 }
1759 $temp[2] = implode(',',$temp_accum);
1760 }
1761 list($temp[3]) = explode('|',$dAA['specialEval.'] ? $this->stdWrap($dAA['specialEval'],$dAA['specialEval.']) : $dAA['specialEval']);
1762
1763 // adding the form entry to the dataArray
1764 $dataArr[] = implode('|',$temp);
1765 }
1766 }
1767 }
1768 }
1769
1770 $attachmentCounter = '';
1771 $hiddenfields = '';
1772 $fieldlist = Array();
1773 $propertyOverride = Array();
1774 $fieldname_hashArray = Array();
1775 $cc = 0;
1776
1777 $xhtmlStrict = t3lib_div::inList('xhtml_strict,xhtml_11,xhtml_2',$GLOBALS['TSFE']->xhtmlDoctype);
1778 // Formname
1779 if ($conf['formName']) {
1780 $formname = $this->cleanFormName($conf['formName']);
1781 } else {
1782 $formname = $GLOBALS['TSFE']->uniqueHash();
1783 $formname = 'a'.$formname; // form name has to start with a letter to reach XHTML compliance
1784 }
1785
1786 if (isset($conf['fieldPrefix'])) {
1787 if ($conf['fieldPrefix']) {
1788 $prefix = $this->cleanFormName($conf['fieldPrefix']);
1789 } else {
1790 $prefix = '';
1791 }
1792 } else {
1793 $prefix = $formname;
1794 }
1795
1796 foreach ($dataArr as $val) {
1797
1798 $cc++;
1799 $confData=Array();
1800 if (is_array($formData)) {
1801 $parts = $val;
1802 $val = 1; // true...
1803 } else {
1804 $val = trim($val);
1805 $parts = explode('|',$val);
1806 }
1807 if ($val && strcspn($val,'#/')) {
1808 // label:
1809 $confData['label'] = trim($parts[0]);
1810 // field:
1811 $fParts = explode(',',$parts[1]);
1812 $fParts[0]=trim($fParts[0]);
1813 if (substr($fParts[0],0,1)=='*') {
1814 $confData['required']=1;
1815 $fParts[0] = substr($fParts[0],1);
1816 }
1817 $typeParts = explode('=',$fParts[0]);
1818 $confData['type'] = trim(strtolower(end($typeParts)));
1819 if (count($typeParts)==1) {
1820 $confData['fieldname'] = $this->cleanFormName($parts[0]);
1821 if (strtolower(preg_replace('/[^[:alnum:]]/','',$confData['fieldname']))=='email') {$confData['fieldname']='email';}
1822 // Duplicate fieldnames resolved
1823 if (isset($fieldname_hashArray[md5($confData['fieldname'])])) {
1824 $confData['fieldname'].='_'.$cc;
1825 }
1826 $fieldname_hashArray[md5($confData['fieldname'])]=$confData['fieldname'];
1827 // Attachment names...
1828 if ($confData['type']=='file') {
1829 $confData['fieldname']='attachment'.$attachmentCounter;
1830 $attachmentCounter=intval($attachmentCounter)+1;
1831 }
1832 } else {
1833 $confData['fieldname'] = str_replace(' ','_',trim($typeParts[0]));
1834 }
1835 $fieldCode='';
1836
1837 if ($conf['wrapFieldName']) {
1838 $confData['fieldname'] = $this->wrap($confData['fieldname'],$conf['wrapFieldName']);
1839 }
1840
1841 // Set field name as current:
1842 $this->setCurrentVal($confData['fieldname']);
1843
1844 // Additional parameters
1845 if (trim($confData['type'])) {
1846 $addParams=trim($conf['params']);
1847 if (is_array($conf['params.']) && isset($conf['params.'][$confData['type']])) {
1848 $addParams=trim($conf['params.'][$confData['type']]);
1849 }
1850 if (strcmp('',$addParams)) { $addParams=' '.$addParams; }
1851 } else $addParams='';
1852
1853 if ($conf['dontMd5FieldNames']) {
1854 $fName = $confData['fieldname'];
1855 } else {
1856 $fName = md5($confData['fieldname']);
1857 }
1858
1859 // Accessibility: Set id = fieldname attribute:
1860 if ($conf['accessibility'] || $xhtmlStrict) {
1861 $elementIdAttribute = ' id="'.$prefix.$fName.'"';
1862 } else {
1863 $elementIdAttribute = '';
1864 }
1865
1866 // Create form field based on configuration/type:
1867 switch ($confData['type']) {
1868 case 'textarea':
1869 $cols=trim($fParts[1]) ? intval($fParts[1]) : 20;
1870 $compWidth = doubleval($conf['compensateFieldWidth'] ? $conf['compensateFieldWidth'] : $GLOBALS['TSFE']->compensateFieldWidth);
1871 $compWidth = $compWidth ? $compWidth : 1;
1872 $cols = t3lib_div::intInRange($cols*$compWidth, 1, 120);
1873
1874 $rows=trim($fParts[2]) ? t3lib_div::intInRange($fParts[2],1,30) : 5;
1875 $wrap=trim($fParts[3]);
1876 if ($conf['noWrapAttr'] || $wrap === 'disabled') {
1877 $wrap='';
1878 } else {
1879 $wrap = $wrap ? ' wrap="'.$wrap.'"' : ' wrap="virtual"';
1880 }
1881 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], str_replace('\n',chr(10),trim($parts[2])));
1882 $fieldCode=sprintf('<textarea name="%s"%s cols="%s" rows="%s"%s%s>%s</textarea>',
1883 $confData['fieldname'], $elementIdAttribute, $cols, $rows, $wrap, $addParams, t3lib_div::formatForTextarea($default));
1884 break;
1885 case 'input':
1886 case 'password':
1887 $size=trim($fParts[1]) ? intval($fParts[1]) : 20;
1888 $compWidth = doubleval($conf['compensateFieldWidth'] ? $conf['compensateFieldWidth'] : $GLOBALS['TSFE']->compensateFieldWidth);
1889 $compWidth = $compWidth ? $compWidth : 1;
1890 $size = t3lib_div::intInRange($size*$compWidth, 1, 120);
1891 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], trim($parts[2]));
1892
1893 if ($confData['type']=='password') {
1894 $default='';
1895 }
1896
1897 $max=trim($fParts[2]) ? ' maxlength="'.t3lib_div::intInRange($fParts[2],1,1000).'"' : "";
1898 $theType = $confData['type']=='input' ? 'text' : 'password';
1899
1900 $fieldCode=sprintf('<input type="%s" name="%s"%s size="%s"%s value="%s"%s />',
1901 $theType, $confData['fieldname'], $elementIdAttribute, $size, $max, htmlspecialchars($default), $addParams);
1902
1903 break;
1904 case 'file':
1905 $size=trim($fParts[1]) ? t3lib_div::intInRange($fParts[1],1,60) : 20;
1906 $fieldCode=sprintf('<input type="file" name="%s"%s size="%s"%s />',
1907 $confData['fieldname'], $elementIdAttribute, $size, $addParams);
1908 break;
1909 case 'check':
1910 // alternative default value:
1911 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], trim($parts[2]));
1912 $checked = $default ? ' checked="checked"' : '';
1913 $fieldCode=sprintf('<input type="checkbox" value="%s" name="%s"%s%s%s />',
1914 1, $confData['fieldname'], $elementIdAttribute, $checked, $addParams);
1915 break;
1916 case 'select':
1917 $option='';
1918 $valueParts = explode(',',$parts[2]);
1919 // size
1920 if (strtolower(trim($fParts[1]))=='auto') {$fParts[1]=count($valueParts);} // Auto size set here. Max 20
1921 $size=trim($fParts[1]) ? t3lib_div::intInRange($fParts[1],1,20) : 1;
1922 // multiple
1923 $multiple = strtolower(trim($fParts[2]))=='m' ? ' multiple="multiple"' : '';
1924
1925 $items=array(); // Where the items will be
1926 $defaults=array(); //RTF
1927 $pCount = count($valueParts);
1928 for($a=0;$a<$pCount;$a++) {
1929 $valueParts[$a]=trim($valueParts[$a]);
1930 if (substr($valueParts[$a],0,1)=='*') { // Finding default value
1931 $sel='selected';
1932 $valueParts[$a] = substr($valueParts[$a],1);
1933 } else $sel='';
1934 // Get value/label
1935 $subParts=explode('=',$valueParts[$a]);
1936 $subParts[1] = (isset($subParts[1])?trim($subParts[1]):trim($subParts[0])); // Sets the value
1937 $items[] = $subParts; // Adds the value/label pair to the items-array
1938 if ($sel) {$defaults[]=$subParts[1];} // Sets the default value if value/label pair is marked as default.
1939 }
1940 // alternative default value:
1941 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], $defaults);
1942 if (!is_array($default)) {
1943 $defaults=array();
1944 $defaults[] = $default;
1945 } else $defaults=$default;
1946 // Create the select-box:
1947 $iCount = count($items);
1948 for($a=0;$a<$iCount;$a++) {
1949 $option.='<option value="'.$items[$a][1].'"'.(in_array($items[$a][1],$defaults)?' selected="selected"':'').'>'.trim($items[$a][0]).'</option>'; //RTF
1950 }
1951
1952 if ($multiple) $confData['fieldname'].='[]'; // The fieldname must be prepended '[]' if multiple select. And the reason why it's prepended is, because the required-field list later must also have [] prepended.
1953 $fieldCode=sprintf('<select name="%s"%s size="%s"%s%s>%s</select>',
1954 $confData['fieldname'], $elementIdAttribute, $size, $multiple, $addParams, $option); //RTF
1955 break;
1956 case 'radio':
1957 $option='';
1958
1959 $valueParts = explode(',',$parts[2]);
1960 $items=array(); // Where the items will be
1961 $default='';
1962 $pCount = count($valueParts);
1963 for($a=0;$a<$pCount;$a++) {
1964 $valueParts[$a]=trim($valueParts[$a]);
1965 if (substr($valueParts[$a],0,1)=='*') {
1966 $sel='checked';
1967 $valueParts[$a] = substr($valueParts[$a],1);
1968 } else $sel='';
1969 // Get value/label
1970 $subParts=explode('=',$valueParts[$a]);
1971 $subParts[1] = (isset($subParts[1])?trim($subParts[1]):trim($subParts[0])); // Sets the value
1972 $items[] = $subParts; // Adds the value/label pair to the items-array
1973 if ($sel) {$default=$subParts[1];} // Sets the default value if value/label pair is marked as default.
1974 }
1975 // alternative default value:
1976 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], $default);
1977 // Create the select-box:
1978 $iCount = count($items);
1979 for($a=0;$a<$iCount;$a++) {
1980 $radioId = $prefix.$fName.$this->cleanFormName($items[$a][0]);
1981 if ($conf['accessibility']) {
1982 $radioLabelIdAttribute = ' id="'.$radioId.'"';
1983 } else {
1984 $radioLabelIdAttribute = '';
1985 }
1986 $option .= '<input type="radio" name="'.$confData['fieldname'].'"'.$radioLabelIdAttribute.' value="'.$items[$a][1].'"'.(!strcmp($items[$a][1],$default)?' checked="checked"':'').$addParams.' />';
1987 if ($conf['accessibility']) {
1988 $option .= '<label for="'.$radioId.'">' . $this->stdWrap(trim($items[$a][0]), $conf['radioWrap.']) . '</label>';
1989 } else {
1990 $option .= $this->stdWrap(trim($items[$a][0]), $conf['radioWrap.']);
1991 }
1992 }
1993
1994 if ($conf['accessibility']) {
1995 $accessibilityWrap = $conf['radioWrap.']['accessibilityWrap'];
1996
1997 $search = array(
1998 '###RADIO_FIELD_ID###',
1999 '###RADIO_GROUP_LABEL###'
2000 );
2001 $replace = array(
2002 $elementIdAttribute,
2003 $confData['label']
2004 );
2005 $accessibilityWrap = str_replace($search, $replace, $accessibilityWrap);
2006
2007 $option = $this->wrap($option, $accessibilityWrap);
2008 }
2009
2010 $fieldCode = $option;
2011 break;
2012 case 'hidden':
2013 $value = trim($parts[2]);
2014 if (strlen($value) && t3lib_div::inList('recipient_copy,recipient',$confData['fieldname']) && $GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
2015 break;
2016 }
2017 if (strlen($value) && t3lib_div::inList('recipient_copy,recipient',$confData['fieldname'])) {
2018 $value = $GLOBALS['TSFE']->codeString($value);
2019 }
2020 $hiddenfields.= sprintf('<input type="hidden" name="%s"%s value="%s" />',
2021 $confData['fieldname'], $elementIdAttribute, htmlspecialchars($value));
2022 break;
2023 case 'property':
2024 if (t3lib_div::inList('type,locationData,goodMess,badMess,emailMess',$confData['fieldname'])) {
2025 $value=trim($parts[2]);
2026 $propertyOverride[$confData['fieldname']] = $value;
2027 $conf[$confData['fieldname']] = $value;
2028 }
2029 break;
2030 case 'submit':
2031 $value=trim($parts[2]);
2032 if ($conf['image.']) {
2033 $this->data[$this->currentValKey] = $value;
2034 $image = $this->IMG_RESOURCE($conf['image.']);
2035 $params = $conf['image.']['params'] ? ' '.$conf['image.']['params'] : '';
2036 $params.= $this->getAltParam($conf['image.'], false);
2037 $params.= $addParams;
2038 } else {
2039 $image = '';
2040 }
2041 if ($image) {
2042 $fieldCode=sprintf('<input type="image" name="%s"%s src="%s"%s />',
2043 $confData['fieldname'], $elementIdAttribute, $image, $params);
2044 } else {
2045 $fieldCode=sprintf('<input type="submit" name="%s"%s value="%s"%s />',
2046 $confData['fieldname'], $elementIdAttribute, t3lib_div::deHSCentities(htmlspecialchars($value)), $addParams);
2047 }
2048 break;
2049 case 'reset':
2050 $value=trim($parts[2]);
2051 $fieldCode=sprintf('<input type="reset" name="%s"%s value="%s"%s />',
2052 $confData['fieldname'], $elementIdAttribute, t3lib_div::deHSCentities(htmlspecialchars($value)), $addParams);
2053 break;
2054 case 'label':
2055 $fieldCode = nl2br(htmlspecialchars(trim($parts[2])));
2056 break;
2057 default:
2058 $confData['type'] = 'comment';
2059 $fieldCode = trim($parts[2]).'&nbsp;';
2060 break;
2061 }
2062 if ($fieldCode) {
2063
2064 // Checking for special evaluation modes:
2065 if (t3lib_div::inList('textarea,input,password',$confData['type']) && strlen(trim($parts[3]))) {
2066 $modeParameters = t3lib_div::trimExplode(':',$parts[3]);
2067 } else {
2068 $modeParameters = array();
2069 }
2070
2071 // Adding evaluation based on settings:
2072 switch ((string)$modeParameters[0]) {
2073 case 'EREG':
2074 $fieldlist[] = '_EREG';
2075 $fieldlist[] = $modeParameters[1];
2076 $fieldlist[] = $modeParameters[2];
2077 $fieldlist[] = $confData['fieldname'];
2078 $fieldlist[] = $confData['label'];
2079 $confData['required'] = 1; // Setting this so "required" layout is used.
2080 break;
2081 case 'EMAIL':
2082 $fieldlist[] = '_EMAIL';
2083 $fieldlist[] = $confData['fieldname'];
2084 $fieldlist[] = $confData['label'];
2085 $confData['required'] = 1; // Setting this so "required" layout is used.
2086 break;
2087 default:
2088 if ($confData['required']) {
2089 $fieldlist[] = $confData['fieldname'];
2090 $fieldlist[] = $confData['label'];
2091 }
2092 break;
2093 }
2094
2095 // Field:
2096 $fieldLabel = $confData['label'];
2097 if ($conf['accessibility'] && trim($fieldLabel) && !preg_match('/^(label|hidden|comment)$/',$confData['type'])) {
2098 $fieldLabel = '<label for="'.$prefix.$fName.'">'.$fieldLabel.'</label>';
2099 }
2100
2101 // Getting template code:
2102 $fieldCode = $this->stdWrap($fieldCode, $conf['fieldWrap.']);
2103 $labelCode = $this->stdWrap($fieldLabel, $conf['labelWrap.']);
2104 $commentCode = $this->stdWrap($confData['label'], $conf['commentWrap.']); // RTF
2105 $result = $conf['layout'];
2106 if ($conf['REQ'] && $confData['required']) {
2107 if (is_array($conf['REQ.']['fieldWrap.']))
2108 $fieldCode = $this->stdWrap($fieldCode, $conf['REQ.']['fieldWrap.']);
2109 if (is_array($conf['REQ.']['labelWrap.']))
2110 $labelCode = $this->stdWrap($fieldLabel, $conf['REQ.']['labelWrap.']);
2111 if ($conf['REQ.']['layout']) {
2112 $result = $conf['REQ.']['layout'];
2113 }
2114 }
2115 if ($confData['type']=='comment' && $conf['COMMENT.']['layout']) {
2116 $result = $conf['COMMENT.']['layout'];
2117 }
2118 if ($confData['type']=='check' && $conf['CHECK.']['layout']) {
2119 $result = $conf['CHECK.']['layout'];
2120 }
2121 if ($confData['type']=='radio' && $conf['RADIO.']['layout']) {
2122 $result = $conf['RADIO.']['layout'];
2123 }
2124 if ($confData['type']=='label' && $conf['LABEL.']['layout']) {
2125 $result = $conf['LABEL.']['layout'];
2126 }
2127 $result = str_replace('###FIELD###',$fieldCode,$result);
2128 $result = str_replace('###LABEL###',$labelCode,$result);
2129 $result = str_replace('###COMMENT###',$commentCode,$result); //RTF
2130 $content.= $result;
2131 }
2132 }
2133 }
2134 if ($conf['stdWrap.']) { $content = $this->stdWrap($content, $conf['stdWrap.']); }
2135
2136
2137 // redirect (external: where to go afterwards. internal: where to submit to)
2138 $theRedirect = $this->stdWrap($conf['redirect'], $conf['redirect.']); // redirect should be set to the page to redirect to after an external script has been used. If internal scripts is used, and if no 'type' is set that dictates otherwise, redirect is used as the url to jump to as long as it's an integer (page)
2139 $page = $GLOBALS['TSFE']->page;
2140 if (!$theRedirect) { // Internal: Just submit to current page
2141 $LD = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'],'index.php', '', $this->getClosestMPvalueForPage($page['uid']));
2142 } elseif (t3lib_div::testInt($theRedirect)) { // Internal: Submit to page with ID $theRedirect
2143 $page = $GLOBALS['TSFE']->sys_page->getPage_noCheck($theRedirect);
2144 $LD = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'],'index.php', '', $this->getClosestMPvalueForPage($page['uid']));
2145 } else { // External URL, redirect-hidden field is rendered!
2146 $LD = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'],'', '', $this->getClosestMPvalueForPage($page['uid']));
2147 $LD['totalURL'] = $theRedirect;
2148 $hiddenfields.= '<input type="hidden" name="redirect" value="'.htmlspecialchars($LD['totalURL']).'" />'; // 18-09-00 added
2149 }
2150
2151 // Formtype (where to submit to!):
2152 $formtype = $propertyOverride['type'] ? $propertyOverride['type'] : $this->stdWrap($conf['type'], $conf['type.']);
2153 if (t3lib_div::testInt($formtype)) { // Submit to a specific page
2154 $page = $GLOBALS['TSFE']->sys_page->getPage_noCheck($formtype);
2155 $LD_A = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'], '', '', $this->getClosestMPvalueForPage($page['uid']));
2156 $action = $LD_A['totalURL'];
2157 } elseif ($formtype) { // Submit to external script
2158 $LD_A = $LD;
2159 $action = $formtype;
2160 } elseif (t3lib_div::testInt($theRedirect)) {
2161 $LD_A = $LD;
2162 $action = $LD_A['totalURL'];
2163 } else { // Submit to "nothing" - which is current page
2164 $LD_A = $GLOBALS['TSFE']->tmpl->linkData($GLOBALS['TSFE']->page, $conf['target'], $conf['no_cache'], '', '', $this->getClosestMPvalueForPage($page['uid']));
2165 $action = $LD_A['totalURL'];
2166 }
2167
2168 // Recipient:
2169 $theEmail = $this->stdWrap($conf['recipient'], $conf['recipient.']);
2170 if ($theEmail && !$GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
2171 $theEmail = $GLOBALS['TSFE']->codeString($theEmail);
2172 $hiddenfields.= '<input type="hidden" name="recipient" value="'.htmlspecialchars($theEmail).'" />';
2173 }
2174
2175 // location data:
2176 if ($conf['locationData']) {
2177 if ($conf['locationData']=='HTTP_POST_VARS' && isset($_POST['locationData'])) {
2178 $locationData = t3lib_div::_POST('locationData');
2179 } else {
2180 $locationData = $GLOBALS['TSFE']->id.':'.$this->currentRecord; // locationData is [hte page id]:[tablename]:[uid of record]. Indicates on which page the record (from tablename with uid) is shown. Used to check access.
2181 }
2182 $hiddenfields.='<input type="hidden" name="locationData" value="'.htmlspecialchars($locationData).'" />';
2183 }
2184
2185 // hidden fields:
2186 if (is_array($conf['hiddenFields.'])) {
2187 foreach ($conf['hiddenFields.'] as $hF_key => $hF_conf) {
2188 if (substr($hF_key,-1)!='.') {
2189 $hF_value = $this->cObjGetSingle($hF_conf,$conf['hiddenFields.'][$hF_key.'.'],'hiddenfields');
2190 if (strlen($hF_value) && t3lib_div::inList('recipient_copy,recipient',$hF_key)) {
2191 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
2192 continue;
2193 }
2194 $hF_value = $GLOBALS['TSFE']->codeString($hF_value);
2195 }
2196 $hiddenfields.= '<input type="hidden" name="'.$hF_key.'" value="'.htmlspecialchars($hF_value).'" />';
2197 }
2198 }
2199 }
2200
2201 // Wrap all hidden fields in a div tag (see http://bugs.typo3.org/view.php?id=678)
2202 $hiddenfields = '<div style="display:none;">'.$hiddenfields.'</div>';
2203
2204 if ($conf['REQ']) {
2205 $validateForm=' onsubmit="return validateForm(\''.$formname.'\',\''.implode(',',$fieldlist).'\','.t3lib_div::quoteJSvalue($conf['goodMess']).','.t3lib_div::quoteJSvalue($conf['badMess']).','.t3lib_div::quoteJSvalue($conf['emailMess']).')"';
2206 $GLOBALS['TSFE']->additionalHeaderData['JSFormValidate'] = '<script type="text/javascript" src="'.$GLOBALS['TSFE']->absRefPrefix.'t3lib/jsfunc.validateform.js"></script>';
2207 } else $validateForm='';
2208
2209 // Create form tag:
2210 $theTarget = ($theRedirect?$LD['target']:$LD_A['target']);
2211 $content = array(
2212 '<form'.
2213 ' action="'.htmlspecialchars($action).'"'.
2214 ' id="'.$formname.'"'.($xhtmlStrict ? '' : ' name="'.$formname.'"').
2215 ' enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'"'.
2216 ' method="'.($conf['method']?$conf['method']:'post').'"'.
2217 ($theTarget ? ' target="'.$theTarget.'"' : '').
2218 $validateForm.
2219 '>',
2220 $hiddenfields.$content,
2221 '</form>'
2222 );
2223
2224 if ($conf['arrayReturnMode']) {
2225 $content['validateForm']=$validateForm;
2226 $content['formname']=$formname;
2227 return $content;
2228 } else {
2229 return implode('',$content);
2230 }
2231 }
2232
2233 /**
2234 * Rendering the cObject, SEARCHRESULT
2235 *
2236 * @param array Array of TypoScript properties
2237 * @return string Output
2238 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=368&cHash=d00731cd7b
2239 */
2240 function SEARCHRESULT($conf) {
2241 if (t3lib_div::_GP('sword') && t3lib_div::_GP('scols')) {
2242 $search = t3lib_div::makeInstance('tslib_search');
2243 $search->register_and_explode_search_string(t3lib_div::_GP('sword'));
2244 $search->register_tables_and_columns(t3lib_div::_GP('scols'),$conf['allowedCols']);
2245 // depth
2246 $depth=100;
2247 // the startId is found
2248 $theStartId=0;
2249 if (t3lib_div::testInt(t3lib_div::_GP('stype'))) {
2250 $temp_theStartId=t3lib_div::_GP('stype');
2251 $rootLine = $GLOBALS['TSFE']->sys_page->getRootLine($temp_theStartId);
2252 // The page MUST have a rootline with the Level0-page of the current site inside!!
2253 foreach ($rootLine as $val) {
2254 if($val['uid']==$GLOBALS['TSFE']->tmpl->rootLine[0]['uid']) {
2255 $theStartId = $temp_theStartId;
2256 }
2257 }
2258 } else if (t3lib_div::_GP('stype')) {
2259 if (substr(t3lib_div::_GP('stype'),0,1)=='L') {
2260 $pointer = intval(substr(t3lib_div::_GP('stype'),1));
2261 $theRootLine = $GLOBALS['TSFE']->tmpl->rootLine;
2262 // location Data:
2263 $locDat_arr = explode(':',t3lib_div::_POST('locationData'));
2264 $pId = intval($locDat_arr[0]);
2265 if ($pId) {
2266 $altRootLine = $GLOBALS['TSFE']->sys_page->getRootLine($pId);
2267 ksort($altRootLine);
2268 if (count($altRootLine)) {
2269 // check if the rootline has the real Level0 in it!!
2270 $hitRoot=0;
2271 $theNewRoot=array();
2272 foreach ($altRootLine as $val) {
2273 if($hitRoot || $val['uid']==$GLOBALS['TSFE']->tmpl->rootLine[0]['uid']) {
2274 $hitRoot=1;
2275 $theNewRoot[]=$val;
2276 }
2277 }
2278 if ($hitRoot) {
2279 $theRootLine = $theNewRoot; // Override the real rootline if any thing
2280 }
2281 }
2282 }
2283 $key = $this->getKey($pointer,$theRootLine);
2284 $theStartId = $theRootLine[$key]['uid'];
2285 }
2286 }
2287 if (!$theStartId) {
2288 // If not set, we use current page
2289 $theStartId = $GLOBALS['TSFE']->id;
2290 }
2291 // generate page-tree
2292 $search->pageIdList.= $this->getTreeList(-1*$theStartId,$depth);
2293
2294 $endClause = 'pages.uid IN ('.$search->pageIdList.')
2295 AND pages.doktype in ('.$GLOBALS['TYPO3_CONF_VARS']['FE']['content_doktypes'].($conf['addExtUrlsAndShortCuts']?',3,4':'').')
2296 AND pages.no_search=0'.
2297 $this->enableFields($search->fTable).
2298 $this->enableFields('pages');
2299
2300 if ($conf['languageField.'][$search->fTable]) {
2301 $endClause.= ' AND '.$search->fTable.'.'.$conf['languageField.'][$search->fTable].' = '.intval($GLOBALS['TSFE']->sys_language_uid); // (using sys_language_uid which is the ACTUAL language of the page. sys_language_content is only for selecting DISPLAY content!)
2302 }
2303
2304 // build query
2305 $search->build_search_query($endClause);
2306
2307 // count...
2308 if (t3lib_div::testInt(t3lib_div::_GP('scount'))) {
2309 $search->res_count = t3lib_div::_GP('scount');
2310 } else {
2311 $search->count_query();
2312 }
2313
2314 // range
2315 $spointer = intval(t3lib_div::_GP('spointer'));
2316 if (isset($conf['range'])) {
2317 $theRange = intval($conf['range']);
2318 } else {
2319 $theRange = 20;
2320 }
2321
2322 // Order By:
2323 if (!$conf['noOrderBy']) {
2324 $search->queryParts['ORDERBY'] = 'pages.lastUpdated, pages.tstamp';
2325 }
2326
2327 $search->queryParts['LIMIT'] = $spointer.','.$theRange;
2328
2329 // search...
2330 $search->execute_query();
2331 if ($GLOBALS['TYPO3_DB']->sql_num_rows($search->result)) {
2332 $GLOBALS['TSFE']->register['SWORD_PARAMS'] = $search->get_searchwords();
2333
2334 $total = $search->res_count;
2335 $rangeLow = t3lib_div::intInRange($spointer+1,1,$total);
2336 $rangeHigh = t3lib_div::intInRange($spointer+$theRange,1,$total);
2337 // prev/next url:
2338 $LD = $GLOBALS['TSFE']->tmpl->linkData($GLOBALS['TSFE']->page,$conf['target'],1,'', '', $this->getClosestMPvalueForPage($GLOBALS['TSFE']->page['uid']));
2339 $targetPart = $LD['target'] ? ' target="'.htmlspecialchars($LD['target']).'"' : '';
2340 $urlParams = $this->URLqMark($LD['totalURL'],
2341 '&sword='.rawurlencode(t3lib_div::_GP('sword')).
2342 '&scols='.rawurlencode(t3lib_div::_GP('scols')).
2343 '&stype='.rawurlencode(t3lib_div::_GP('stype')).
2344 '&scount='.$total);
2345 // substitution:
2346 $result= $this->cObjGetSingle($conf['layout'],$conf['layout.'], 'layout');
2347 $result = str_replace('###RANGELOW###',$rangeLow,$result);
2348 $result = str_replace('###RANGEHIGH###',$rangeHigh,$result);
2349 $result = str_replace('###TOTAL###',$total,$result);
2350
2351 if ($rangeHigh<$total) {
2352 $next = $this->cObjGetSingle($conf['next'], $conf['next.'], 'next');
2353 $next = '<a href="'.htmlspecialchars($urlParams.'&spointer='.($spointer+$theRange)).'"'.$targetPart.$GLOBALS['TSFE']->ATagParams.'>'.$next.'</a>';
2354 } else $next='';
2355 $result = str_replace('###NEXT###',$next,$result);
2356
2357 if ($rangeLow>1) {
2358 $prev = $this->cObjGetSingle($conf['prev'], $conf['prev.'], 'prev');
2359 $prev = '<a href="'.htmlspecialchars($urlParams.'&spointer='.($spointer-$theRange)).'"'.$targetPart.$GLOBALS['TSFE']->ATagParams.'>'.$prev.'</a>';
2360 } else $prev='';
2361 $result = str_replace('###PREV###',$prev,$result);
2362
2363 // searching result
2364 $theValue = $this->cObjGetSingle($conf['resultObj'], $conf['resultObj.'],'resultObj');
2365 $cObj = t3lib_div::makeInstance('tslib_cObj');
2366 $cObj->setParent($this->data,$this->currentRecord);
2367 $renderCode='';
2368 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($search->result)) {
2369 // versionOL() here? This is search result displays, is that possible to preview anyway? Or are records selected here already future versions?
2370 $cObj->start($row);
2371 $renderCode.=$cObj->cObjGetSingle($conf['renderObj'], $conf['renderObj.'],'renderObj');
2372 }
2373 $theValue.=$this->wrap($renderCode,$conf['renderWrap']);
2374 $theValue = str_replace('###RESULT###',$theValue,$result);
2375 } else {
2376 $theValue = $this->cObjGetSingle($conf['noResultObj'], $conf['noResultObj.'],'noResultObj');
2377 }
2378
2379 $GLOBALS['TT']->setTSlogMessage('Search in fields: '.$search->listOfSearchFields);
2380
2381 // wrapping
2382 $content=$theValue;
2383 if ($conf['wrap']) {
2384 $content=$this->wrap($content, $conf['wrap']);
2385 }
2386 if ($conf['stdWrap.']) {
2387 $content=$this->stdWrap($content, $conf['stdWrap.']);
2388 }
2389 // returning
2390 $GLOBALS['TSFE']->set_no_cache();
2391 return $content;
2392 }
2393 }
2394
2395 /**
2396 * Rendering the cObject, PHP_SCRIPT, PHP_SCRIPT_INT and PHP_SCRIPT_EXT
2397 *
2398 * @param array Array of TypoScript properties
2399 * @param string If "INT", then rendering "PHP_SCRIPT_INT"; If "EXT", then rendering "PHP_SCRIPT_EXT"; Default is rendering "PHP_SCRIPT" (cached)
2400 * @return string Output
2401 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=370&cHash=aa107f2ad8
2402 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=371&cHash=53f71d025e
2403 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=372&cHash=91fe391e1c
2404 */
2405 function PHP_SCRIPT($conf,$ext='') {
2406 $incFile = $GLOBALS['TSFE']->tmpl->getFileName($conf['file']);
2407 $content='';
2408 if ($incFile && $GLOBALS['TSFE']->checkFileInclude($incFile)) {
2409 switch($ext) {
2410 case 'INT':
2411 case 'EXT':
2412 $substKey = $ext.'_SCRIPT.'.$GLOBALS['TSFE']->uniqueHash();
2413 $content.='<!--'.$substKey.'-->';
2414 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey] = array(
2415 'file'=>$incFile,
2416 'conf'=>$conf,
2417 'type'=>'SCRIPT'
2418 );
2419 if ($ext=='INT') {
2420 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey]['cObj'] = serialize($this);
2421 } else {
2422 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey]['data'] = $this->data;
2423 }
2424 break;
2425 default:
2426 // Added 31-12-00: Make backup...
2427 $this->oldData = $this->data;
2428 // Include file..
2429 include('./'.$incFile);
2430 // Added 31-12-00: restore...
2431 if ($RESTORE_OLD_DATA) {
2432 $this->data = $this->oldData;
2433 }
2434 break;
2435 }
2436 }
2437 return $content;
2438 }
2439
2440 /**
2441 * Rendering the cObject, TEMPLATE
2442 *
2443 * @param array Array of TypoScript properties
2444 * @return string Output
2445 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=373&cHash=109a171b1e
2446 * @see substituteMarkerArrayCached()
2447 */
2448 function TEMPLATE($conf) {
2449 $subparts = Array();
2450 $marks = Array();
2451 $wraps = Array();
2452 $content='';
2453
2454 list($PRE,$POST) = explode('|',$conf['markerWrap'] ? $conf['markerWrap'] : '### | ###');
2455 $POST = trim($POST);
2456 $PRE = trim($PRE);
2457
2458 // Getting the content
2459 $content = $this->cObjGetSingle($conf['template'],$conf['template.'],'template');
2460 if ($conf['workOnSubpart']) {
2461 $content = $this->getSubpart($content, $PRE.$conf['workOnSubpart'].$POST);
2462 }
2463
2464 // Fixing all relative paths found:
2465 if ($conf['relPathPrefix']) {
2466 $htmlParser = t3lib_div::makeInstance('t3lib_parsehtml');
2467 $content = $htmlParser->prefixResourcePath($conf['relPathPrefix'],$content,$conf['relPathPrefix.']);
2468 }
2469
2470 if ($content) {
2471 if ($conf['nonCachedSubst']) { // NON-CACHED:
2472 // Getting marks
2473 if (is_array($conf['marks.'])) {
2474 foreach ($conf['marks.'] as $theKey => $theValue) {
2475 if (!strstr($theKey,'.')) {
2476 $content = str_replace(
2477 $PRE.$theKey.$POST,
2478 $this->cObjGetSingle($theValue,$conf['marks.'][$theKey.'.'],'marks.'.$theKey),
2479 $content);
2480 }
2481 }
2482 }
2483
2484 // Getting subparts.
2485 if (is_array($conf['subparts.'])) {
2486 foreach ($conf['subparts.'] as $theKey => $theValue) {
2487 if (!strstr($theKey,'.')) {
2488 $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
2489 if ($subpart) {
2490 $this->setCurrentVal($subpart);
2491 $content = $this->substituteSubpart(
2492 $content,
2493 $PRE.$theKey.$POST,
2494 $this->cObjGetSingle($theValue,$conf['subparts.'][$theKey.'.'],'subparts.'.$theKey),
2495 1
2496 );
2497 }
2498 }
2499 }
2500 }
2501 // Getting subpart wraps
2502 if (is_array($conf['wraps.'])) {
2503 foreach ($conf['wraps.'] as $theKey => $theValue) {
2504 if (!strstr($theKey,'.')) {
2505 $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
2506 if ($subpart) {
2507 $this->setCurrentVal($subpart);
2508 $content = $this->substituteSubpart(
2509 $content,
2510 $PRE.$theKey.$POST,
2511 explode('|',$this->cObjGetSingle($theValue,$conf['wraps.'][$theKey.'.'],'wraps.'.$theKey)),
2512 1
2513 );
2514 }
2515 }
2516 }
2517 }
2518 } else { // CACHED
2519 // Getting subparts.
2520 if (is_array($conf['subparts.'])) {
2521 foreach ($conf['subparts.'] as $theKey => $theValue) {
2522 if (!strstr($theKey,'.')) {
2523 $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
2524 if ($subpart) {
2525 $GLOBALS['TSFE']->register['SUBPART_'.$theKey] = $subpart;
2526 $subparts[$theKey]['name'] = $theValue;
2527 $subparts[$theKey]['conf'] = $conf['subparts.'][$theKey.'.'];
2528 }
2529 }
2530 }
2531 }
2532 // Getting marks
2533 if (is_array($conf['marks.'])) {
2534 foreach ($conf['marks.'] as $theKey => $theValue) {
2535 if (!strstr($theKey,'.')) {
2536 $marks[$theKey]['name'] = $theValue;
2537 $marks[$theKey]['conf'] = $conf['marks.'][$theKey.'.'];
2538 }
2539 }
2540 }
2541 // Getting subpart wraps
2542 if (is_array($conf['wraps.'])) {
2543 foreach ($conf['wraps.'] as $theKey => $theValue) {
2544 if (!strstr($theKey,'.')) {
2545 $wraps[$theKey]['name'] = $theValue;
2546 $wraps[$theKey]['conf'] = $conf['wraps.'][$theKey.'.'];
2547 }
2548 }
2549 }
2550 // Getting subparts
2551 $subpartArray =array();
2552 foreach ($subparts as $theKey => $theValue) {
2553 // Set current with the content of the subpart...
2554 $this->data[$this->currentValKey] = $GLOBALS['TSFE']->register['SUBPART_'.$theKey];
2555 // Get subpart cObject and substitute it!
2556 $subpartArray[$PRE.$theKey.$POST] = $this->cObjGetSingle($theValue['name'],$theValue['conf'],'subparts.'.$theKey);
2557 }
2558 $this->data[$this->currentValKey] = ''; // Reset current to empty
2559
2560 // Getting marks
2561 $markerArray =array();
2562 foreach ($marks as $theKey => $theValue) {
2563 $markerArray[$PRE.$theKey.$POST] = $this->cObjGetSingle($theValue['name'],$theValue['conf'],'marks.'.$theKey);
2564 }
2565 // Getting wraps
2566 $subpartWraps =array();
2567 foreach ($wraps as $theKey => $theValue) {
2568 $subpartWraps[$PRE.$theKey.$POST] = explode('|',$this->cObjGetSingle($theValue['name'],$theValue['conf'],'wraps.'.$theKey));
2569 }
2570
2571 // Substitution
2572 if ($conf['substMarksSeparately']) {
2573 $content = $this->substituteMarkerArrayCached($content,array(),$subpartArray,$subpartWraps);
2574 $content = $this->substituteMarkerArray($content, $markerArray);
2575 } else {
2576 $content = $this->substituteMarkerArrayCached($content,$markerArray,$subpartArray,$subpartWraps);
2577 }
2578 }
2579 }
2580 return $content;
2581 }