Added feature #14463: Add post initialization hook for tslib_cObj
[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 $this->stdWrapHookObjects = array();
388 if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['stdWrap'])) {
389 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['stdWrap'] as $classData) {
390 $hookObject = t3lib_div::getUserObj($classData);
391
392 if(!($hookObject instanceof tslib_content_stdWrapHook)) {
393 throw new UnexpectedValueException('$hookObject must implement interface tslib_content_stdWrapHook', 1195043965);
394 }
395
396 $this->stdWrapHookObjects[] = $hookObject;
397 }
398 }
399
400 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['postInit'])) {
401 foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['postInit'] as $classData) {
402 $postInitializationProcessor = t3lib_div::getUserObj($classData);
403
404 if(!($postInitializationProcessor instanceof tslib_content_PostInitHook)) {
405 throw new UnexpectedValueException('$postInitializationProcessor must implement interface tslib_content_PostInitHook', 1274563549);
406 }
407
408 $postInitializationProcessor->postProcessContentObjectInitialization($this);
409 }
410 }
411 }
412
413 /**
414 * Gets the 'getImgResource' hook objects.
415 * The first call initializes the accordant objects.
416 *
417 * @return array The 'getImgResource' hook objects (if any)
418 */
419 protected function getGetImgResourceHookObjects() {
420 if (!isset($this->getImgResourceHookObjects)) {
421 $this->getImgResourceHookObjects = array();
422
423 if(is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['getImgResource'])) {
424 foreach($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['getImgResource'] as $classData) {
425 $hookObject = t3lib_div::getUserObj($classData);
426
427 if(!($hookObject instanceof tslib_cObj_getImgResourceHook)) {
428 throw new UnexpectedValueException('$hookObject must implement interface tslib_cObj_getImgResourceHook', 1218636383);
429 }
430
431 $this->getImgResourceHookObjects[] = $hookObject;
432 }
433 }
434 }
435
436 return $this->getImgResourceHookObjects;
437 }
438
439 /**
440 * Sets the internal variable parentRecord with information about current record.
441 * 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.
442 *
443 * @param array $data: The record array
444 * @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.
445 * @return void
446 * @access private
447 */
448 function setParent($data,$currentRecord) {
449 $this->parentRecord=array('data'=>$data, 'currentRecord'=>$currentRecord);
450 }
451
452
453
454
455
456
457
458
459 /***********************************************
460 *
461 * CONTENT_OBJ:
462 *
463 ***********************************************/
464
465 /**
466 * Returns the "current" value.
467 * 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.
468 * It's like "load accumulator" in the good old C64 days... basically a "register" you can use as you like.
469 * 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.
470 *
471 * @return mixed The "current" value
472 */
473 function getCurrentVal() {
474 return $this->data[$this->currentValKey];
475 }
476
477 /**
478 * Sets the "current" value.
479 *
480 * @param mixed The variable that you want to set as "current"
481 * @return void
482 * @see getCurrentVal()
483 */
484 function setCurrentVal($value) {
485 $this->data[$this->currentValKey] = $value;
486 }
487
488 /**
489 * Rendering of a "numerical array" of cObjects from TypoScript
490 * Will call ->cObjGetSingle() for each cObject found and accumulate the output.
491 *
492 * @param array $setup: Array with cObjects as values.
493 * @param string $addKey: A prefix for the debugging information
494 * @return string Rendered output from the cObjects in the array.
495 * @see cObjGetSingle()
496 */
497 function cObjGet($setup,$addKey='') {
498 if (is_array($setup)) {
499 $sKeyArray=t3lib_TStemplate::sortedKeyList($setup);
500 $content ='';
501 foreach($sKeyArray as $theKey) {
502 $theValue=$setup[$theKey];
503 if (intval($theKey) && !strstr($theKey,'.')) {
504 $conf=$setup[$theKey.'.'];
505 $content.=$this->cObjGetSingle($theValue,$conf,$addKey.$theKey); // Get the contentObject
506 }
507 }
508 return $content;
509 }
510 }
511
512 /**
513 * Renders a content object
514 *
515 * @param string The content object name, eg. "TEXT" or "USER" or "IMAGE"
516 * @param array The array with TypoScript properties for the content object
517 * @param string A string label used for the internal debugging tracking.
518 * @return string cObject output
519 * @example http://typo3.org/doc.0.html?&encryptionKey=&tx_extrepmgm_pi1[extUid]=267&tx_extrepmgm_pi1[tocEl]=153&cHash=7e74f4d331
520 */
521 function cObjGetSingle($name,$conf,$TSkey='__') {
522 global $TYPO3_CONF_VARS;
523
524 $content='';
525 // Checking that the function is not called eternally. This is done by interrupting at a depth of 100
526 $GLOBALS['TSFE']->cObjectDepthCounter--;
527 if ($GLOBALS['TSFE']->cObjectDepthCounter>0) {
528 $name = trim($name);
529 if ($GLOBALS['TT']->LR) $GLOBALS['TT']->push($TSkey, $name);
530
531 // Checking if the COBJ is a reference to another object. (eg. name of 'blabla.blabla = < styles.something')
532 if (substr($name,0,1)=='<') {
533 $key = trim(substr($name,1));
534 $cF = t3lib_div::makeInstance('t3lib_TSparser');
535 // $name and $conf is loaded with the referenced values.
536 $old_conf=$conf;
537 list($name, $conf) = $cF->getVal($key,$GLOBALS['TSFE']->tmpl->setup);
538 if (is_array($old_conf) && count($old_conf)) {
539 $conf = $this->joinTSarrays($conf,$old_conf);
540 }
541 // Getting the cObject
542 $GLOBALS['TT']->incStackPointer();
543 $content.=$this->cObjGetSingle($name,$conf,$key);
544 $GLOBALS['TT']->decStackPointer();
545 } else {
546
547 $hooked = false;
548 // Application defined cObjects
549 foreach ($this->cObjHookObjectsArr as $cObjName => $hookObj) {
550 if (($name===$cObjName) && method_exists($hookObj, 'cObjGetSingleExt')) {
551 $content.= $hookObj->cObjGetSingleExt($name, $conf, $TSkey, $this);
552 $hooked = true;
553 }
554 }
555 if (!$hooked && isset($GLOBALS['OBTS']['tso_list'][$name]) && t3lib_extMgm::isLoaded('obts')) {
556 $content.= obts_dtutil::renderDatatypeContent($name, $GLOBALS['OBTS']['tso_list'][$name], $conf, $this);
557 } elseif (!$hooked) {
558 // Traditional Content Object branching:
559 switch($name) {
560 case 'COBJ_ARRAY':
561 case 'COA':
562 $content.=$this->COBJ_ARRAY($conf);
563 break;
564 case 'COA_INT':
565 $content.=$this->COBJ_ARRAY($conf,'INT');
566 break;
567 case 'HTML':
568 $content.=$this->HTML($conf);
569 break;
570 case 'TEXT':
571 $content.=$this->TEXT($conf);
572 break;
573 case 'CLEARGIF':
574 $content.=$this->CLEARGIF($conf);
575 break;
576 case 'FILE':
577 $content.=$this->FILE($conf);
578 break;
579 case 'IMAGE':
580 $content.=$this->IMAGE($conf);
581 break;
582 case 'IMG_RESOURCE':
583 $content.=$this->IMG_RESOURCE($conf);
584 break;
585 case 'IMGTEXT':
586 $content.=$this->IMGTEXT($conf);
587 break;
588 case 'CONTENT':
589 $content.=$this->CONTENT($conf);
590 break;
591 case 'RECORDS':
592 $content.=$this->RECORDS($conf);
593 break;
594 case 'HMENU':
595 $content.=$this->HMENU($conf);
596 break;
597 case 'CTABLE':
598 $content.=$this->CTABLE($conf);
599 break;
600 case 'OTABLE':
601 $content.=$this->OTABLE($conf);
602 break;
603 case 'COLUMNS':
604 $content.=$this->COLUMNS($conf);
605 break;
606 case 'HRULER':
607 $content.=$this->HRULER($conf);
608 break;
609 case 'CASE':
610 $content.=$this->CASEFUNC($conf);
611 break;
612 case 'LOAD_REGISTER':
613 case 'RESTORE_REGISTER':
614 $this->LOAD_REGISTER($conf,$name);
615 break;
616 case 'FORM':
617 $content.=$this->FORM($conf);
618 break;
619 case 'SEARCHRESULT':
620 $content.=$this->SEARCHRESULT($conf);
621 break;
622 case 'PHP_SCRIPT':
623 $content.=$this->PHP_SCRIPT($conf);
624 break;
625 case 'PHP_SCRIPT_EXT':
626 $content.=$this->PHP_SCRIPT($conf,'EXT');
627 break;
628 case 'PHP_SCRIPT_INT':
629 $content.=$this->PHP_SCRIPT($conf,'INT');
630 break;
631 case 'USER':
632 $content.=$this->USER($conf);
633 break;
634 case 'USER_INT':
635 $content.=$this->USER($conf,'INT');
636 break;
637 case 'TEMPLATE':
638 $content.=$this->TEMPLATE($conf);
639 break;
640 case 'EDITPANEL':
641 if ($GLOBALS['TSFE']->beUserLogin) {$content.=$this->editPanel($content, $conf);}
642 break;
643 case 'MULTIMEDIA':
644 $content.=$this->MULTIMEDIA($conf);
645 break;
646 case 'MEDIA':
647 $content.=$this->MEDIA($conf);
648 break;
649 case 'SWFOBJECT':
650 $content.=$this->SWFOBJECT($conf);
651 break;
652 case 'QTOBJECT':
653 $content.=$this->QTOBJECT($conf);
654 break;
655 default:
656 // call hook functions for extra processing
657 if($name && is_array($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClassDefault'])) {
658 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClassDefault'] as $classData) {
659 $hookObject = t3lib_div::getUserObj($classData);
660
661 if(!($hookObject instanceof tslib_content_cObjGetSingleHook)) {
662 throw new UnexpectedValueException('$hookObject must implement interface tslib_content_cObjGetSingleHook', 1195043731);
663 }
664 /* @var $hookObject tslib_content_cObjGetSingleHook */
665 $content .= $hookObject->getSingleContentObject($name, (array) $conf, $TSkey, $this);
666 }
667 }
668 break;
669 }
670 }
671 }
672 if ($GLOBALS['TT']->LR) $GLOBALS['TT']->pull($content);
673 }
674 // Increasing on exit...
675 $GLOBALS['TSFE']->cObjectDepthCounter++;
676 return $content;
677 }
678
679
680
681
682
683
684
685 /********************************************
686 *
687 * Functions rendering content objects (cObjects)
688 *
689 ********************************************/
690
691 /**
692 * Rendering the cObject, HTML
693 *
694 * @param array Array of TypoScript properties
695 * @return string Output
696 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=349&cHash=d3fd0c70b4
697 */
698 function HTML($conf) {
699 return $this->stdWrap($conf['value'],$conf['value.']);
700 }
701
702 /**
703 * Rendering the cObject, TEXT
704 *
705 * @param array Array of TypoScript properties
706 * @return string Output
707 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=350&cHash=b49de28f83
708 */
709 function TEXT($conf) {
710 return $this->stdWrap($conf['value'],$conf);
711 }
712
713 /**
714 * Rendering the cObject, CLEARGIF
715 *
716 * @param array Array of TypoScript properties
717 * @return string Output
718 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=355&cHash=70c0f19915
719 */
720 function CLEARGIF($conf) {
721 $w = $this->stdWrap($conf['width'],$conf['width.']);
722 $h = $this->stdWrap($conf['height'],$conf['height.']);
723 $w = $w ? $w : 1;
724 $h = $h ? $h : 1;
725 $wrap = $conf['wrap'] ? $conf['wrap'] : '|<br />';
726 $theValue = $this->wrap('<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$w.'" height="'.$h.'"'.$this->getBorderAttr(' border="0"').' alt="" title="" />', $wrap);
727
728 return $this->stdWrap($theValue,$conf['stdWrap.']);
729 }
730
731 /**
732 * Rendering the cObject, COBJ_ARRAY / COA and COBJ_ARRAY_INT
733 *
734 * @param array Array of TypoScript properties
735 * @param string If "INT" then the cObject is a "COBJ_ARRAY_INT" (non-cached), otherwise just "COBJ_ARRAY" (cached)
736 * @return string Output
737 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=351&cHash=a09db0329c
738 */
739 function COBJ_ARRAY($conf,$ext='') {
740
741 if (is_array($conf)) {
742 $content = '';
743 switch($ext) {
744 case 'INT':
745 $substKey = $ext . '_SCRIPT.' . $GLOBALS['TSFE']->uniqueHash();
746 $content .= '<!--'.$substKey.'-->';
747 $GLOBALS['TSFE']->config[$ext . 'incScript'][$substKey] = array (
748 'file' => $conf['includeLibs'],
749 'conf' => $conf,
750 'cObj' => serialize($this),
751 'type' => 'COA'
752 );
753 break;
754 default:
755 if ($this->checkIf($conf['if.'])) {
756 $this->includeLibs($conf);
757 $content = $this->cObjGet($conf);
758 if ($conf['wrap']) {
759 $content = $this->wrap($content, $conf['wrap']);
760 }
761 if ($conf['stdWrap.']) {
762 $content = $this->stdWrap($content, $conf['stdWrap.']);
763 }
764 }
765 break;
766 }
767 return $content;
768 } else {
769 $GLOBALS['TT']->setTSlogMessage('No elements in this content object array (COBJ_ARRAY, COA, COA_INT).', 2);
770 }
771 }
772
773 /**
774 * Rendering the cObject, USER and USER_INT
775 *
776 * @param array Array of TypoScript properties
777 * @param string If "INT" then the cObject is a "USER_INT" (non-cached), otherwise just "USER" (cached)
778 * @return string Output
779 * @link http://typo3.org/documentation/document-library/references/doc_core_tsref/4.1.0/view/8/22/
780 */
781 function USER($conf, $ext = '') {
782 $content = '';
783 switch ($ext) {
784 case 'INT':
785 $this->userObjectType = self::OBJECTTYPE_USER_INT;
786 $substKey = $ext . '_SCRIPT.' . $GLOBALS['TSFE']->uniqueHash();
787 $content.='<!--' . $substKey . '-->';
788 $GLOBALS['TSFE']->config[$ext . 'incScript'][$substKey] = array(
789 'file' => $conf['includeLibs'],
790 'conf' => $conf,
791 'cObj' => serialize($this),
792 'type' => 'FUNC'
793 );
794 break;
795 default:
796 if ($this->userObjectType === false) {
797 // Come here only if we are not called from $TSFE->INTincScript_process()!
798 $this->userObjectType = self::OBJECTTYPE_USER;
799 }
800 $this->includeLibs($conf);
801 $tempContent = $this->callUserFunction($conf['userFunc'], $conf, '');
802 if ($this->doConvertToUserIntObject) {
803 $this->doConvertToUserIntObject = false;
804 $content = $this->USER($conf, 'INT');
805 } else {
806 $content .= $tempContent;
807 }
808 break;
809 }
810 $this->userObjectType = false;
811 return $content;
812 }
813
814 /**
815 * Retrieves a type of object called as USER or USER_INT. Object can detect their
816 * type by using this call. It returns OBJECTTYPE_USER_INT or OBJECTTYPE_USER depending on the
817 * current object execution. In all other cases it will return false to indicate
818 * a call out of context.
819 *
820 * @return mixed One of OBJECTTYPE_ class constants or false
821 */
822 public function getUserObjectType() {
823 return $this->userObjectType;
824 }
825
826 /**
827 * Requests the current USER object to be converted to USER_INT.
828 *
829 * @return void
830 */
831 public function convertToUserIntObject() {
832 if ($this->userObjectType !== self::OBJECTTYPE_USER) {
833 $GLOBALS['TT']->setTSlogMessage('tslib_cObj::convertToUserIntObject() ' .
834 'is called in the wrong context or for the wrong object type', 2);
835 }
836 else {
837 $this->doConvertToUserIntObject = true;
838 }
839 }
840
841 /**
842 * Rendering the cObject, FILE
843 *
844 * @param array Array of TypoScript properties
845 * @return string Output
846 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=352&cHash=379c60f8bc
847 */
848 function FILE($conf) {
849 $theValue = $this->fileResource($this->stdWrap($conf['file'],$conf['file.']), trim($this->getAltParam($conf, false)));
850 if ($conf['linkWrap']) {
851 $theValue = $this->linkWrap($theValue,$conf['linkWrap']);
852 }
853 return $this->wrap($theValue,$conf['wrap']);
854 }
855
856 /**
857 * Rendering the cObject, IMAGE
858 *
859 * @param array Array of TypoScript properties
860 * @return string Output
861 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=353&cHash=440681ea56
862 * @see cImage()
863 */
864 function IMAGE($conf) {
865 $content='';
866 if ($this->checkIf($conf['if.'])) {
867 $theValue = $this->cImage($conf['file'],$conf);
868 if ($conf['stdWrap.']) {
869 $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
870 }
871 return $theValue;
872 }
873 }
874
875 /**
876 * Rendering the cObject, IMG_RESOURCE
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]=354&cHash=46f9299706
881 * @see getImgResource()
882 */
883 function IMG_RESOURCE($conf) {
884 $GLOBALS['TSFE']->lastImgResourceInfo = $this->getImgResource($conf['file'],$conf['file.']);
885 return $this->stdWrap($GLOBALS['TSFE']->lastImgResourceInfo[3],$conf['stdWrap.']);
886 }
887
888 /**
889 * Rendering the cObject, IMGTEXT
890 *
891 * @param array Array of TypoScript properties
892 * @return string Output
893 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=363&cHash=cf2969bce1
894 */
895 function IMGTEXT($conf) {
896 $content='';
897 if (is_array($conf['text.'])) {
898 $content.= $this->stdWrap($this->cObjGet($conf['text.'],'text.'),$conf['text.']); // this gets the surrounding content
899 }
900 $imgList=trim($this->stdWrap($conf['imgList'],$conf['imgList.'])); // gets images
901 if ($imgList) {
902 $imgs = t3lib_div::trimExplode(',',$imgList);
903 $imgStart = intval($this->stdWrap($conf['imgStart'],$conf['imgStart.']));
904
905 $imgCount= count($imgs)-$imgStart;
906
907 $imgMax = intval($this->stdWrap($conf['imgMax'],$conf['imgMax.']));
908 if ($imgMax) {
909 $imgCount = t3lib_div::intInRange($imgCount,0,$imgMax); // reduces the number of images.
910 }
911
912 $imgPath = $this->stdWrap($conf['imgPath'],$conf['imgPath.']);
913
914 // initialisation
915 $caption='';
916 $captionArray = array();
917 if (!$conf['captionSplit'] && !$conf['imageTextSplit'] && is_array($conf['caption.'])) {
918 $caption = $this->stdWrap($this->cObjGet($conf['caption.'], 'caption.'),$conf['caption.']); // global caption, no splitting
919 }
920 if ($conf['captionSplit'] && $conf['captionSplit.']['cObject']) {
921 $legacyCaptionSplit = 1;
922 $capSplit = $this->stdWrap($conf['captionSplit.']['token'], $conf['captionSplit.']['token.']);
923 if (!$capSplit) {$capSplit=LF;}
924 $captionArray = explode($capSplit, $this->cObjGetSingle($conf['captionSplit.']['cObject'], $conf['captionSplit.']['cObject.'], 'captionSplit.cObject'));
925 foreach ($captionArray as $ca_key => $ca_val) {
926 $captionArray[$ca_key] = $this->stdWrap(trim($captionArray[$ca_key]), $conf['captionSplit.']['stdWrap.']);
927 }
928 }
929
930 $tablecode='';
931 $position=$this->stdWrap($conf['textPos'],$conf['textPos.']);
932
933 $tmppos = $position&7;
934 $contentPosition = $position&24;
935 $align = $this->align[$tmppos];
936 $cap = ($caption)?1:0;
937 $txtMarg = intval($this->stdWrap($conf['textMargin'],$conf['textMargin.']));
938 if (!$conf['textMargin_outOfText'] && $contentPosition<16) {
939 $txtMarg=0;
940 }
941
942 $cols = intval($this->stdWrap($conf['cols'],$conf['cols.']));
943 $rows = intval($this->stdWrap($conf['rows'],$conf['rows.']));
944 $colspacing = intval($this->stdWrap($conf['colSpace'],$conf['colSpace.']));
945 $rowspacing = intval($this->stdWrap($conf['rowSpace'],$conf['rowSpace.']));
946
947 $border = intval($this->stdWrap($conf['border'],$conf['border.'])) ? 1:0;
948 $borderColor = $this->stdWrap($conf['borderCol'],$conf['borderCol.']);
949 $borderThickness = intval($this->stdWrap($conf['borderThick'],$conf['borderThick.']));
950
951 $borderColor=$borderColor?$borderColor:'black';
952 $borderThickness=$borderThickness?$borderThickness:1;
953
954 $caption_align = $this->stdWrap($conf['captionAlign'],$conf['captionAlign.']);
955 if (!$caption_align) {
956 $caption_align = $align;
957 }
958 // generate cols
959 $colCount = ($cols > 1) ? $cols : 1;
960 if ($colCount > $imgCount) {$colCount = $imgCount;}
961 $rowCount = ($colCount > 1) ? ceil($imgCount / $colCount) : $imgCount;
962 // generate rows
963 if ($rows>1) {
964 $rowCount = $rows;
965 if ($rowCount > $imgCount) {$rowCount = $imgCount;}
966 $colCount = ($rowCount>1) ? ceil($imgCount / $rowCount) : $imgCount;
967 }
968
969 // max Width
970 $colRelations = trim($this->stdWrap($conf['colRelations'],$conf['colRelations.']));
971 $maxW = intval($this->stdWrap($conf['maxW'],$conf['maxW.']));
972
973 $maxWInText = intval($this->stdWrap($conf['maxWInText'],$conf['maxWInText.']));
974 if (!$maxWInText) { // If maxWInText is not set, it's calculated to the 50 % of the max...
975 $maxWInText = round($maxW/2);
976 }
977
978 if ($maxWInText && $contentPosition>=16) { // inText
979 $maxW = $maxWInText;
980 }
981
982 if ($maxW && $colCount > 0) { // If there is a max width and if colCount is greater than column
983 /* debug($border*$borderThickness*2);
984 debug($maxW);
985 debug($colspacing);
986 debug(($maxW-$colspacing*($colCount-1)-$colCount*$border*$borderThickness*2));
987 */
988 $maxW = ceil(($maxW-$colspacing*($colCount-1)-$colCount*$border*$borderThickness*2)/$colCount);
989 }
990 // create the relation between rows
991 $colMaxW = Array();
992 if ($colRelations) {
993 $rel_parts = explode(':',$colRelations);
994 $rel_total = 0;
995 for ($a=0;$a<$colCount;$a++) {
996 $rel_parts[$a] = intval($rel_parts[$a]);
997 $rel_total+= $rel_parts[$a];
998 }
999 if ($rel_total) {
1000 for ($a=0;$a<$colCount;$a++) {
1001 $colMaxW[$a] = round(($maxW*$colCount)/$rel_total*$rel_parts[$a]);
1002 }
1003 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.
1004 $colMaxW = Array();
1005 }
1006 }
1007 }
1008 $image_compression = intval($this->stdWrap($conf['image_compression'],$conf['image_compression.']));
1009 $image_effects = intval($this->stdWrap($conf['image_effects'],$conf['image_effects.']));
1010 $image_frames = intval($this->stdWrap($conf['image_frames.']['key'],$conf['image_frames.']['key.']));
1011
1012 // fetches pictures
1013 $splitArr=array();
1014 $splitArr['imgObjNum']=$conf['imgObjNum'];
1015 $splitArr = $GLOBALS['TSFE']->tmpl->splitConfArray($splitArr,$imgCount);
1016
1017 // EqualHeight
1018 $equalHeight = intval($this->stdWrap($conf['equalH'],$conf['equalH.']));
1019 if ($equalHeight) { // Initiate gifbuilder object in order to get dimensions AND calculate the imageWidth's
1020 $gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
1021 $gifCreator->init();
1022 $relations = Array();
1023 $relations_cols = Array();
1024 $totalMaxW = $maxW*$colCount;
1025 for($a=0;$a<$imgCount;$a++) {
1026 $imgKey = $a+$imgStart;
1027 $imgInfo = $gifCreator->getImageDimensions($imgPath.$imgs[$imgKey]);
1028 $relations[$a] = $imgInfo[1] / $equalHeight; // relationship between the original height and the wished height
1029 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.
1030 $relations_cols[floor($a/$colCount)] += $imgInfo[0]/$relations[$a]; // counts the total width of the row with the new height taken into consideration.
1031 }
1032 }
1033 }
1034
1035 $imageRowsFinalWidths = Array(); // contains the width of every image row
1036 $imageRowsMaxHeights = Array();
1037 $imgsTag=array();
1038 $origImages=array();
1039 for($a=0;$a<$imgCount;$a++) {
1040 $GLOBALS['TSFE']->register['IMAGE_NUM'] = $a;
1041 $GLOBALS['TSFE']->register['IMAGE_NUM_CURRENT'] = $a;
1042
1043 $imgKey = $a+$imgStart;
1044 $totalImagePath = $imgPath.$imgs[$imgKey];
1045 $this->data[$this->currentValKey] = $totalImagePath;
1046 $imgObjNum = intval($splitArr[$a]['imgObjNum']);
1047 $imgConf = $conf[$imgObjNum.'.'];
1048
1049 if ($equalHeight) {
1050 $scale = 1;
1051 if ($totalMaxW) {
1052 $rowTotalMaxW = $relations_cols[floor($a/$colCount)];
1053 if ($rowTotalMaxW > $totalMaxW) {
1054 $scale = $rowTotalMaxW / $totalMaxW;
1055 }
1056 }
1057 // transfer info to the imageObject. Please note, that
1058 $imgConf['file.']['height'] = round($equalHeight/$scale);
1059
1060 unset($imgConf['file.']['width']);
1061 unset($imgConf['file.']['maxW']);
1062 unset($imgConf['file.']['maxH']);
1063 unset($imgConf['file.']['minW']);
1064 unset($imgConf['file.']['minH']);
1065 unset($imgConf['file.']['width.']);
1066 unset($imgConf['file.']['maxW.']);
1067 unset($imgConf['file.']['maxH.']);
1068 unset($imgConf['file.']['minW.']);
1069 unset($imgConf['file.']['minH.']);
1070 $maxW = 0; // setting this to zero, so that it doesn't disturb
1071 }
1072
1073 if ($maxW) {
1074 if (count($colMaxW)) {
1075 $imgConf['file.']['maxW'] = $colMaxW[($a%$colCount)];
1076 } else {
1077 $imgConf['file.']['maxW'] = $maxW;
1078 }
1079 }
1080
1081 // Image Object supplied:
1082 if (is_array($imgConf)) {
1083 if ($this->image_effects[$image_effects]) {
1084 $imgConf['file.']['params'].= ' '.$this->image_effects[$image_effects];
1085 }
1086 if ($image_frames) {
1087 if (is_array($conf['image_frames.'][$image_frames.'.'])) {
1088 $imgConf['file.']['m.'] = $conf['image_frames.'][$image_frames.'.'];
1089 }
1090 }
1091 if ($image_compression && $imgConf['file']!='GIFBUILDER') {
1092 if ($image_compression==1) {
1093 $tempImport = $imgConf['file.']['import'];
1094 $tempImport_dot = $imgConf['file.']['import.'];
1095 unset($imgConf['file.']);
1096 $imgConf['file.']['import'] = $tempImport;
1097 $imgConf['file.']['import.'] = $tempImport_dot;
1098 } elseif (isset($this->image_compression[$image_compression])) {
1099 $imgConf['file.']['params'].= ' '.$this->image_compression[$image_compression]['params'];
1100 $imgConf['file.']['ext'] = $this->image_compression[$image_compression]['ext'];
1101 unset($imgConf['file.']['ext.']);
1102 }
1103 }
1104
1105 // "alt", "title" and "longdesc" attributes:
1106 if (!strlen($imgConf['altText']) && !is_array($imgConf['altText.'])) {
1107 $imgConf['altText'] = $conf['altText'];
1108 $imgConf['altText.'] = $conf['altText.'];
1109 }
1110 if (!strlen($imgConf['titleText']) && !is_array($imgConf['titleText.'])) {
1111 $imgConf['titleText'] = $conf['titleText'];
1112 $imgConf['titleText.'] = $conf['titleText.'];
1113 }
1114 if (!strlen($imgConf['longdescURL']) && !is_array($imgConf['longdescURL.'])) {
1115 $imgConf['longdescURL'] = $conf['longdescURL'];
1116 $imgConf['longdescURL.'] = $conf['longdescURL.'];
1117 }
1118 } else {
1119 $imgConf = array(
1120 'altText' => $conf['altText'],
1121 'titleText' => $conf['titleText'],
1122 'longdescURL' => $conf['longdescURL'],
1123 'file' => $totalImagePath
1124 );
1125 }
1126
1127 $imgsTag[$imgKey] = $this->IMAGE($imgConf);
1128
1129 // Store the original filepath
1130 $origImages[$imgKey]=$GLOBALS['TSFE']->lastImageInfo;
1131
1132 $imageRowsFinalWidths[floor($a/$colCount)] += $GLOBALS['TSFE']->lastImageInfo[0];
1133 if ($GLOBALS['TSFE']->lastImageInfo[1]>$imageRowsMaxHeights[floor($a/$colCount)]) {
1134 $imageRowsMaxHeights[floor($a/$colCount)] = $GLOBALS['TSFE']->lastImageInfo[1];
1135 }
1136 }
1137 // calculating the tableWidth:
1138 // TableWidth problems: It creates problems if the pictures are NOT as wide as the tableWidth.
1139 $tableWidth = max($imageRowsFinalWidths)+ $colspacing*($colCount-1) + $colCount*$border*$borderThickness*2;
1140
1141 // make table for pictures
1142 $index=$imgStart;
1143
1144 $noRows = $this->stdWrap($conf['noRows'],$conf['noRows.']);
1145 $noCols = $this->stdWrap($conf['noCols'],$conf['noCols.']);
1146 if ($noRows) {$noCols=0;} // noRows overrides noCols. They cannot exist at the same time.
1147 if ($equalHeight) {
1148 $noCols=1;
1149 $noRows=0;
1150 }
1151
1152 $rowCount_temp=1;
1153 $colCount_temp=$colCount;
1154 if ($noRows) {
1155 $rowCount_temp = $rowCount;
1156 $rowCount=1;
1157 }
1158 if ($noCols) {
1159 $colCount=1;
1160 }
1161 // col- and rowspans calculated
1162 $colspan = (($colspacing) ? $colCount*2-1 : $colCount);
1163 $rowspan = (($rowspacing) ? $rowCount*2-1 : $rowCount) + $cap;
1164
1165
1166 // Edit icons:
1167 $editIconsHTML = $conf['editIcons']&&$GLOBALS['TSFE']->beUserLogin ? $this->editIcons('',$conf['editIcons'],$conf['editIcons.']) : '';
1168
1169 // strech out table:
1170 $tablecode='';
1171 $flag=0;
1172 if ($conf['noStretchAndMarginCells']!=1) {
1173 $tablecode.='<tr>';
1174 if ($txtMarg && $align=='right') { // If right aligned, the textborder is added on the right side
1175 $tablecode.='<td rowspan="'.($rowspan+1).'" valign="top"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$txtMarg.'" height="1" alt="" title="" />'.($editIconsHTML?'<br />'.$editIconsHTML:'').'</td>';
1176 $editIconsHTML='';
1177 $flag=1;
1178 }
1179 $tablecode.='<td colspan="'.$colspan.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$tableWidth.'" height="1" alt="" /></td>';
1180 if ($txtMarg && $align=='left') { // If left aligned, the textborder is added on the left side
1181 $tablecode.='<td rowspan="'.($rowspan+1).'" valign="top"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$txtMarg.'" height="1" alt="" title="" />'.($editIconsHTML?'<br />'.$editIconsHTML:'').'</td>';
1182 $editIconsHTML='';
1183 $flag=1;
1184 }
1185 if ($flag) $tableWidth+=$txtMarg+1;
1186 // $tableWidth=0;
1187 $tablecode.='</tr>';
1188 }
1189
1190 // draw table
1191 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!
1192 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.
1193 $tablecode.='<tr><td colspan="'.$colspan.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$rowspacing.'"'.$this->getBorderAttr(' border="0"').' alt="" title="" /></td></tr>';
1194 }
1195 $tablecode.='<tr>'; // starting row
1196 for ($b=0; $b<$colCount_temp; $b++) { // Looping through the columns
1197 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.
1198 if (!$noCols) {
1199 $tablecode.='<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$colspacing.'" height="1"'.$this->getBorderAttr(' border="0"').' alt="" title="" /></td>';
1200 } else {
1201 $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="" />';
1202 $colSpacer='<td valign="top">'.$colSpacer.'</td>'; // added 160301, needed for the new "noCols"-table...
1203 $tablecode.=$colSpacer;
1204 }
1205 }
1206 if (!$noCols || ($noCols && !$b)) {
1207 $tablecode.='<td valign="top">'; // starting the cell. If "noCols" this cell will hold all images in the row, otherwise only a single image.
1208 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.
1209 }
1210 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.
1211 $GLOBALS['TSFE']->register['IMAGE_NUM'] = $imgIndex; // register previous imgIndex
1212 $imgIndex = $index+$a*$colCount_temp;
1213 $GLOBALS['TSFE']->register['IMAGE_NUM_CURRENT'] = $imgIndex;
1214 if ($imgsTag[$imgIndex]) {
1215 if ($rowspacing && $noRows && $a) { // Puts distance between the images IF "noRows" is set and this is the first iteration of the loop
1216 $tablecode.= '<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$rowspacing.'" alt="" title="" /><br />';
1217 }
1218 if ($legacyCaptionSplit) {
1219 $thisCaption = $captionArray[$imgIndex];
1220 } else if ($conf['captionSplit'] || $conf['imageTextSplit']) {
1221 $thisCaption = $this->stdWrap($this->cObjGet($conf['caption.'], 'caption.'), $conf['caption.']);
1222 }
1223 $imageHTML = $imgsTag[$imgIndex].'<br />';
1224 $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.
1225 if ($border) {$imageHTML='<table border="0" cellpadding="'.$borderThickness.'" cellspacing="0" bgcolor="'.$borderColor.'"'.$Talign.'><tr><td>'.$imageHTML.'</td></tr></table>';}
1226 $imageHTML.=$editIconsHTML;
1227 $editIconsHTML='';
1228 $imageHTML.=$thisCaption; // Adds caption.
1229 if ($noCols) {$imageHTML='<td valign="top">'.$imageHTML.'</td>';} // If noCols, put in table cell.
1230 $tablecode.=$imageHTML;
1231 }
1232 }
1233 $index++;
1234 if (!$noCols || ($noCols && $b+1==$colCount_temp)) {
1235 if ($noCols) {$tablecode.='</tr></table>';} // In case of "noCols" we must finish the table that surrounds the images in the row.
1236 $tablecode.='</td>'; // Ending the cell. In case of "noCols" the cell holds all pictures!
1237 }
1238 }
1239 $tablecode.='</tr>'; // ending row
1240 }
1241 if ($c) {
1242 switch ($contentPosition) {
1243 case '0': // above
1244 case '8': // below
1245 switch ($align) { // These settings are needed for Firefox
1246 case 'center':
1247 $table_align = 'margin-left: auto; margin-right: auto';
1248 break;
1249 case 'right':
1250 $table_align = 'margin-left: auto; margin-right: 0px';
1251 break;
1252 default: // Most of all: left
1253 $table_align = 'margin-left: 0px; margin-right: auto';
1254 }
1255 $table_align = 'style="'.$table_align.'"';
1256 break;
1257 case '16': // in text
1258 $table_align = 'align="'.$align.'"';
1259 break;
1260 default:
1261 $table_align = '';
1262 }
1263
1264 // Table-tag is inserted
1265 $tablecode = '<table'.($tableWidth?' width="'.$tableWidth.'"':'').' border="0" cellspacing="0" cellpadding="0" '.$table_align.' class="imgtext-table">'.$tablecode;
1266 if ($editIconsHTML) { // IF this value is not long since reset.
1267 $tablecode.='<tr><td colspan="'.$colspan.'">'.$editIconsHTML.'</td></tr>';
1268 $editIconsHTML='';
1269 }
1270 if ($cap) {
1271 $tablecode.='<tr><td colspan="'.$colspan.'" align="'.$caption_align.'">'.$caption.'</td></tr>';
1272 }
1273 $tablecode.='</table>';
1274 if ($conf['tableStdWrap.']) {$tablecode=$this->stdWrap($tablecode,$conf['tableStdWrap.']);}
1275 }
1276
1277 $spaceBelowAbove = intval($this->stdWrap($conf['spaceBelowAbove'],$conf['spaceBelowAbove.']));
1278 switch ($contentPosition) {
1279 case '0': // above
1280 $output= '<div style="text-align:'.$align.';">'.$tablecode.'</div>'.$this->wrapSpace($content, $spaceBelowAbove.'|0');
1281 break;
1282 case '8': // below
1283 $output= $this->wrapSpace($content, '0|'.$spaceBelowAbove).'<div style="text-align:'.$align.';">'.$tablecode.'</div>';
1284 break;
1285 case '16': // in text
1286 $output= $tablecode.$content;
1287 break;
1288 case '24': // in text, no wrap
1289 $theResult = '';
1290 $theResult.= '<table border="0" cellspacing="0" cellpadding="0" class="imgtext-nowrap"><tr>';
1291 if ($align=='right') {
1292 $theResult.= '<td valign="top">'.$content.'</td><td valign="top">'.$tablecode.'</td>';
1293 } else {
1294 $theResult.= '<td valign="top">'.$tablecode.'</td><td valign="top">'.$content.'</td>';
1295 }
1296 $theResult.= '</tr></table>';
1297 $output= $theResult;
1298 break;
1299 }
1300 } else {
1301 $output= $content;
1302 }
1303
1304 if ($conf['stdWrap.']) {
1305 $output = $this->stdWrap($output, $conf['stdWrap.']);
1306 }
1307
1308 return $output;
1309 }
1310
1311 /**
1312 * Rendering the cObject, CONTENT
1313 *
1314 * @param array Array of TypoScript properties
1315 * @return string Output
1316 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=356&cHash=9f3b5c6ba2
1317 */
1318 function CONTENT($conf) {
1319 $theValue='';
1320
1321 $originalRec = $GLOBALS['TSFE']->currentRecord;
1322 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!!
1323 $GLOBALS['TSFE']->recordRegister[$originalRec]++;
1324 }
1325
1326 $conf['table'] = trim($this->stdWrap($conf['table'], $conf['table.']));
1327 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_') {
1328
1329 $renderObjName = $conf['renderObj'] ? $conf['renderObj'] : '<'.$conf['table'];
1330 $renderObjKey = $conf['renderObj'] ? 'renderObj' : '';
1331 $renderObjConf = $conf['renderObj.'];
1332
1333 $slide = intval($conf['slide'])?intval($conf['slide']):0;
1334 $slideCollect = intval($conf['slide.']['collect'])?intval($conf['slide.']['collect']):0;
1335 $slideCollectReverse = intval($conf['slide.']['collectReverse'])?true:false;
1336 $slideCollectFuzzy = $slideCollect?(intval($conf['slide.']['collectFuzzy'])?true:false):true;
1337 $again = false;
1338
1339 do {
1340 $res = $this->exec_getQuery($conf['table'],$conf['select.']);
1341 if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
1342 $GLOBALS['TT']->setTSlogMessage($error,3);
1343 } else {
1344 $this->currentRecordTotal = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
1345 $GLOBALS['TT']->setTSlogMessage('NUMROWS: '.$GLOBALS['TYPO3_DB']->sql_num_rows($res));
1346 $cObj =t3lib_div::makeInstance('tslib_cObj');
1347 $cObj->setParent($this->data,$this->currentRecord);
1348 $this->currentRecordNumber=0;
1349 $cobjValue = '';
1350 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
1351
1352 // Versioning preview:
1353 $GLOBALS['TSFE']->sys_page->versionOL($conf['table'],$row,TRUE);
1354
1355 // Language overlay:
1356 if (is_array($row) && $GLOBALS['TSFE']->sys_language_contentOL) {
1357 $row = $GLOBALS['TSFE']->sys_page->getRecordOverlay($conf['table'],$row,$GLOBALS['TSFE']->sys_language_content,$GLOBALS['TSFE']->sys_language_contentOL);
1358 }
1359
1360 if (is_array($row)) { // Might be unset in the sys_language_contentOL
1361 if (!$GLOBALS['TSFE']->recordRegister[$conf['table'].':'.$row['uid']]) {
1362 $this->currentRecordNumber++;
1363 $cObj->parentRecordNumber = $this->currentRecordNumber;
1364 $GLOBALS['TSFE']->currentRecord = $conf['table'].':'.$row['uid'];
1365 $this->lastChanged($row['tstamp']);
1366 $cObj->start($row,$conf['table']);
1367 $tmpValue = $cObj->cObjGetSingle($renderObjName, $renderObjConf, $renderObjKey);
1368 $cobjValue .= $tmpValue;
1369 }
1370 }
1371 }
1372 $GLOBALS['TYPO3_DB']->sql_free_result($res);
1373 }
1374 if ($slideCollectReverse) {
1375 $theValue = $cobjValue.$theValue;
1376 } else {
1377 $theValue .= $cobjValue;
1378 }
1379 if ($slideCollect>0) {
1380 $slideCollect--;
1381 }
1382 if ($slide) {
1383 if ($slide>0) {
1384 $slide--;
1385 }
1386 $conf['select.']['pidInList'] = $this->getSlidePids($conf['select.']['pidInList'], $conf['select.']['pidInList.']);
1387 $again = strlen($conf['select.']['pidInList'])?true:false;
1388 }
1389 } while ($again&&(($slide&&!strlen($tmpValue)&&$slideCollectFuzzy)||($slide&&$slideCollect)));
1390 }
1391
1392 $theValue = $this->wrap($theValue,$conf['wrap']);
1393 if ($conf['stdWrap.']) $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
1394
1395 $GLOBALS['TSFE']->currentRecord = $originalRec; // Restore
1396 return $theValue;
1397 }
1398
1399 /**
1400 * Rendering the cObject, RECORDS
1401 *
1402 * @param array Array of TypoScript properties
1403 * @return string Output
1404 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=357&cHash=303e959472
1405 */
1406 function RECORDS($conf) {
1407 $theValue='';
1408
1409 $originalRec = $GLOBALS['TSFE']->currentRecord;
1410 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!!
1411 $GLOBALS['TSFE']->recordRegister[$originalRec]++;
1412 }
1413
1414 $conf['source'] = $this->stdWrap($conf['source'],$conf['source.']);
1415 if ($conf['tables'] && $conf['source']) {
1416 $allowedTables = $conf['tables'];
1417 if (is_array($conf['conf.'])) {
1418 foreach ($conf['conf.'] as $k => $v) {
1419 if (substr($k,-1)!='.') $allowedTables.=','.$k;
1420 }
1421 }
1422
1423 $loadDB = t3lib_div::makeInstance('FE_loadDBGroup');
1424 $loadDB->start($conf['source'], $allowedTables);
1425 foreach ($loadDB->tableArray as $table => $v) {
1426 if (is_array($GLOBALS['TCA'][$table])) {
1427 $loadDB->additionalWhere[$table]=$this->enableFields($table);
1428 }
1429 }
1430 $loadDB->getFromDB();
1431
1432 reset($loadDB->itemArray);
1433 $data = $loadDB->results;
1434
1435 $cObj =t3lib_div::makeInstance('tslib_cObj');
1436 $cObj->setParent($this->data,$this->currentRecord);
1437 $this->currentRecordNumber=0;
1438 $this->currentRecordTotal = count($loadDB->itemArray);
1439 foreach ($loadDB->itemArray as $val) {
1440 $row = $data[$val['table']][$val['id']];
1441
1442 // Versioning preview:
1443 $GLOBALS['TSFE']->sys_page->versionOL($val['table'],$row);
1444
1445 // Language overlay:
1446 if (is_array($row) && $GLOBALS['TSFE']->sys_language_contentOL) {
1447 $row = $GLOBALS['TSFE']->sys_page->getRecordOverlay($val['table'],$row,$GLOBALS['TSFE']->sys_language_content,$GLOBALS['TSFE']->sys_language_contentOL);
1448 }
1449
1450 if (is_array($row)) { // Might be unset in the content overlay things...
1451 if (!$conf['dontCheckPid']) {
1452 $row = $this->checkPid($row['pid']) ? $row : '';
1453 }
1454 if ($row && !$GLOBALS['TSFE']->recordRegister[$val['table'].':'.$val['id']]) {
1455 $renderObjName = $conf['conf.'][$val['table']] ? $conf['conf.'][$val['table']] : '<'.$val['table'];
1456 $renderObjKey = $conf['conf.'][$val['table']] ? 'conf.'.$val['table'] : '';
1457 $renderObjConf = $conf['conf.'][$val['table'].'.'];
1458 $this->currentRecordNumber++;
1459 $cObj->parentRecordNumber=$this->currentRecordNumber;
1460 $GLOBALS['TSFE']->currentRecord = $val['table'].':'.$val['id'];
1461 $this->lastChanged($row['tstamp']);
1462 $cObj->start($row,$val['table']);
1463 $tmpValue = $cObj->cObjGetSingle($renderObjName, $renderObjConf, $renderObjKey);
1464 $theValue .= $tmpValue;
1465 }# else debug($GLOBALS['TSFE']->recordRegister,'RECORDS');
1466 }
1467 }
1468 }
1469 if ($conf['wrap']) $theValue = $this->wrap($theValue,$conf['wrap']);
1470 if ($conf['stdWrap.']) $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
1471
1472 $GLOBALS['TSFE']->currentRecord = $originalRec; // Restore
1473 return $theValue;
1474 }
1475
1476 /**
1477 * Rendering the cObject, HMENU
1478 *
1479 * @param array Array of TypoScript properties
1480 * @return string Output
1481 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=358&cHash=5400c1c06a
1482 */
1483 function HMENU($conf) {
1484 $content='';
1485 if ($this->checkIf($conf['if.'])) {
1486 $cls = strtolower($conf[1]);
1487 if (t3lib_div::inList($GLOBALS['TSFE']->tmpl->menuclasses,$cls)) {
1488 if ($conf['special.']['value.']) {
1489 $conf['special.']['value'] = $this->stdWrap($conf['special.']['value'], $conf['special.']['value.']);
1490 }
1491 $GLOBALS['TSFE']->register['count_HMENU']++;
1492 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']=0;
1493 $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid']=array();
1494 $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']=array();
1495
1496 $menu = t3lib_div::makeInstance('tslib_'.$cls);
1497 $menu->parent_cObj = $this;
1498 $menu->start($GLOBALS['TSFE']->tmpl, $GLOBALS['TSFE']->sys_page, '', $conf, 1);
1499 $menu->makeMenu();
1500 $content.=$menu->writeMenu();
1501 }
1502 if ($conf['wrap']) $content=$this->wrap($content, $conf['wrap']);
1503 if ($conf['stdWrap.']) $content = $this->stdWrap($content, $conf['stdWrap.']);
1504 }
1505 return $content;
1506 }
1507
1508 /**
1509 * Rendering the cObject, CTABLE
1510 *
1511 * @param array Array of TypoScript properties
1512 * @return string Output
1513 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=359&cHash=2e0065b4e7
1514 */
1515 function CTABLE ($conf) {
1516 $controlTable = t3lib_div::makeInstance('tslib_controlTable');
1517 if ($conf['tableParams']) {
1518 $controlTable->tableParams = $conf['tableParams'];
1519 }
1520 // loads the pagecontent
1521 $controlTable->contentW = $conf['cWidth'];
1522 // loads the menues if any
1523 if (is_array($conf['c.'])) {
1524 $controlTable->content = $this->cObjGet($conf['c.'],'c.');
1525 $controlTable->contentTDparams = isset($conf['c.']['TDParams']) ? $conf['c.']['TDParams'] : 'valign="top"';
1526 }
1527 if (is_array($conf['lm.'])) {
1528 $controlTable->lm = $this->cObjGet($conf['lm.'],'lm.');
1529 $controlTable->lmTDparams = isset($conf['lm.']['TDParams']) ? $conf['lm.']['TDParams'] : 'valign="top"';
1530 }
1531 if (is_array($conf['tm.'])) {
1532 $controlTable->tm = $this->cObjGet($conf['tm.'],'tm.');
1533 $controlTable->tmTDparams = isset($conf['tm.']['TDParams']) ? $conf['tm.']['TDParams'] : 'valign="top"';
1534 }
1535 if (is_array($conf['rm.'])) {
1536 $controlTable->rm = $this->cObjGet($conf['rm.'],'rm.');
1537 $controlTable->rmTDparams = isset($conf['rm.']['TDParams']) ? $conf['rm.']['TDParams'] : 'valign="top"';
1538 }
1539 if (is_array($conf['bm.'])) {
1540 $controlTable->bm = $this->cObjGet($conf['bm.'],'bm.');
1541 $controlTable->bmTDparams = isset($conf['bm.']['TDParams']) ? $conf['bm.']['TDParams'] : 'valign="top"';
1542 }
1543 return $controlTable->start($conf['offset'],$conf['cMargins']);
1544 }
1545
1546 /**
1547 * Rendering the cObject, OTABLE
1548 *
1549 * @param array Array of TypoScript properties
1550 * @return string Output
1551 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=360&cHash=02c9552d38
1552 */
1553 function OTABLE ($conf) {
1554 $controlTable = t3lib_div::makeInstance('tslib_tableOffset');
1555 if ($conf['tableParams']) {
1556 $controlTable->tableParams = $conf['tableParams'];
1557 }
1558 return $controlTable->start($this->cObjGet($conf),$conf['offset']);
1559 }
1560
1561 /**
1562 * Rendering the cObject, COLUMNS
1563 *
1564 * @param array Array of TypoScript properties
1565 * @return string Output
1566 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=361&cHash=7e4e228cad
1567 */
1568 function COLUMNS ($conf) {
1569 $content='';
1570 if (is_array($conf) && $this->checkIf($conf['if.'])) {
1571 $tdRowCount=0;
1572 $tableParams = $conf['tableParams'] ? ' '.$conf['tableParams'] : ' border="0" cellspacing="0" cellpadding="0"';
1573 $TDparams = $conf['TDparams'] ? ' '.$conf['TDparams']:' valign="top"';
1574 $rows = t3lib_div::intInRange($conf['rows'],2,20);
1575 $totalWidth = intval($conf['totalWidth']);
1576 $columnWidth=0;
1577
1578 $totalGapWidth=0;
1579 $gapData = Array(
1580 'gapWidth' => $this->stdWrap($conf['gapWidth'],$conf['gapWidth.']),
1581 'gapBgCol' => $this->stdWrap($conf['gapBgCol'],$conf['gapBgCol.']),
1582 'gapLineThickness' => $this->stdWrap($conf['gapLineThickness'],$conf['gapLineThickness.']),
1583 'gapLineCol' => $this->stdWrap($conf['gapLineCol'],$conf['gapLineCol.'])
1584 );
1585 $gapData = $GLOBALS['TSFE']->tmpl->splitConfArray($gapData,$rows-1);
1586 foreach ($gapData as $val) {
1587 $totalGapWidth+=intval($val['gapWidth']);
1588 }
1589
1590 if ($totalWidth) {
1591 $columnWidth = ceil(($totalWidth-$totalGapWidth)/$rows);
1592 $TDparams.=' width="'.$columnWidth.'"';
1593 $tableParams.=' width="'.$totalWidth.'"';
1594 } else {
1595 $TDparams.=' width="'.floor(100/$rows).'%"';
1596 $tableParams.=' width="100%"';
1597 }
1598
1599 for ($a=1;$a<=$rows;$a++) {
1600 $tdRowCount++;
1601 $content.='<td'.$TDparams.'>';
1602 $content.=$this->cObjGetSingle($conf[$a],$conf[$a.'.'], $a);
1603 $content.='</td>';
1604 if ($a < $rows) {
1605 $gapConf = $gapData[($a-1)];
1606 $gapWidth = intval($gapConf['gapWidth']);
1607 if ($gapWidth) {
1608 $tdPar = $gapConf['gapBgCol'] ? ' bgcolor="'.$gapConf['gapBgCol'].'"' : '';
1609 $gapLine = intval($gapConf['gapLineThickness']);
1610 if ($gapLine) {
1611 $gapSurround = t3lib_div::intInRange(($gapWidth-$gapLine)/2, 1, 1000);
1612 // right gap
1613 $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapSurround.'" height="1" alt="" title="" /></td>';
1614 $tdRowCount++;
1615 // line:
1616 $GtdPar = $gapConf['gapLineCol'] ? ' bgcolor="'.$gapConf['gapLineCol'].'"' : ' bgcolor="black"';
1617 $content.='<td'.$GtdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapLine.'" height="1" alt="" title="" /></td>';
1618 $tdRowCount++;
1619 // left gap
1620 $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapSurround.'" height="1" alt="" title="" /></td>';
1621 $tdRowCount++;
1622 } else {
1623 $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapWidth.'" height="1" alt="" title="" /></td>';
1624 $tdRowCount++;
1625 }
1626 }
1627 }
1628 }
1629 $content = '<tr>'.$content.'</tr>';
1630 $content = '<table'.$tableParams.'>'.$content.'</table>';
1631 $content.= $this->cObjGetSingle($conf['after'],$conf['after.'], 'after');
1632 if ($conf['stdWrap.']) {
1633 $content = $this->stdWrap($content,$conf['stdWrap.']);
1634 }
1635 }
1636 return $content;
1637 }
1638
1639 /**
1640 * Rendering the cObject, HRULER
1641 *
1642 * @param array Array of TypoScript properties
1643 * @return string Output
1644 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=362&cHash=2a462aa084
1645 */
1646 function HRULER ($conf) {
1647 $lineThickness = t3lib_div::intInRange($this->stdWrap($conf['lineThickness'],$conf['lineThickness.']),1,50);
1648 $lineColor = $conf['lineColor'] ? $conf['lineColor'] : 'black';
1649 $spaceBefore = intval($conf['spaceLeft']);
1650 $spaceAfter = intval($conf['spaceRight']);
1651 $tableWidth = $conf['tableWidth'] ? $conf['tableWidth'] : '99%';
1652 $content='';
1653
1654 $content.='<table border="0" cellspacing="0" cellpadding="0" width="'.htmlspecialchars($tableWidth).'" summary=""><tr>';
1655 if ($spaceBefore) {$content.='<td width="1"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$spaceBefore.'" height="1" alt="" title="" /></td>'; }
1656 $content.='<td bgcolor="'.$lineColor.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$lineThickness.'" alt="" title="" /></td>';
1657 if ($spaceAfter) {$content.='<td width="1"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$spaceAfter.'" height="1" alt="" title="" /></td>'; }
1658 $content.='</tr></table>';
1659
1660 $content = $this->stdWrap($content, $conf['stdWrap.']);
1661 return $content;
1662 }
1663
1664 /**
1665 * Rendering the cObject, CASE
1666 *
1667 * @param array Array of TypoScript properties
1668 * @return string Output
1669 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=364&cHash=cffedd09e3
1670 */
1671 function CASEFUNC ($conf){
1672 $content='';
1673 if ($this->checkIf($conf['if.'])) {
1674 if ($conf['setCurrent'] || $conf['setCurrent.']){$this->data[$this->currentValKey] = $this->stdWrap($conf['setCurrent'], $conf['setCurrent.']);}
1675 $key = $this->stdWrap($conf['key'],$conf['key.']);
1676 $key = strlen($conf[$key]) ? $key : 'default';
1677 $name = $conf[$key];
1678 $theValue = $this->cObjGetSingle($name,$conf[$key.'.'], $key);
1679 if ($conf['stdWrap.']) {
1680 $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
1681 }
1682 return $theValue;
1683 }
1684 }
1685
1686 /**
1687 * Rendering the cObject, LOAD_REGISTER and RESTORE_REGISTER
1688 * NOTICE: This cObject does NOT return any content since it just sets internal data based on the TypoScript properties.
1689 *
1690 * @param array Array of TypoScript properties
1691 * @param string If "RESTORE_REGISTER" then the cObject rendered is "RESTORE_REGISTER", otherwise "LOAD_REGISTER"
1692 * @return string Empty string (the cObject only sets internal data!)
1693 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=365&cHash=4935524e2e
1694 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=366&cHash=4f9485e8cc
1695 */
1696 function LOAD_REGISTER($conf,$name) {
1697 if ($name=='RESTORE_REGISTER') {
1698 $GLOBALS['TSFE']->register = array_pop($GLOBALS['TSFE']->registerStack);
1699 } else {
1700 array_push($GLOBALS['TSFE']->registerStack,$GLOBALS['TSFE']->register);
1701 if (is_array($conf)) {
1702 foreach ($conf as $theKey => $theValue) {
1703 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
1704 if (strstr($theKey,'.')) {
1705 $theKey = substr($theKey,0,-1);
1706 }
1707 $GLOBALS['TSFE']->register[$theKey] = $this->stdWrap($conf[$theKey],$conf[$theKey.'.']);
1708 }
1709 }
1710 }
1711 }
1712 return '';
1713 }
1714
1715 /**
1716 * Rendering the cObject, FORM
1717 *
1718 * Note on $formData:
1719 * In the optional $formData array each entry represents a line in the ordinary setup.
1720 * In those entries each entry (0,1,2...) represents a space normally divided by the '|' line.
1721 *
1722 * $formData [] = array('Name:', 'name=input, 25 ', 'Default value....');
1723 * $formData [] = array('Email:', 'email=input, 25 ', 'Default value for email....');
1724 *
1725 * - corresponds to the $conf['data'] value being :
1726 * Name:|name=input, 25 |Default value....||Email:|email=input, 25 |Default value for email....
1727 *
1728 * If $formData is an array the value of $conf['data'] is ignored.
1729 *
1730 * @param array Array of TypoScript properties
1731 * @param array Alternative formdata overriding whatever comes from TypoScript
1732 * @return string Output
1733 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=367&cHash=bbc518d930
1734 */
1735 function FORM($conf,$formData='') {
1736 $content='';
1737 if (is_array($formData)) {
1738 $dataArr = $formData;
1739 } else {
1740 $data = $this->stdWrap($conf['data'],$conf['data.']);
1741 // Clearing dataArr
1742 $dataArr = array();
1743 // Getting the original config
1744 if (trim($data)) {
1745 $data = str_replace(LF,'||',$data);
1746 $dataArr = explode('||',$data);
1747 }
1748 // Adding the new dataArray config form:
1749 if (is_array($conf['dataArray.'])) { // dataArray is supplied
1750 $sKeyArray = t3lib_TStemplate::sortedKeyList($conf['dataArray.'], TRUE);
1751 foreach ($sKeyArray as $theKey) {
1752 $dAA = $conf['dataArray.'][$theKey.'.'];
1753 if (is_array($dAA)) {
1754 $temp = array();
1755 list($temp[0]) = explode('|',$dAA['label.'] ? $this->stdWrap($dAA['label'],$dAA['label.']) : $dAA['label']);
1756 list($temp[1]) = explode('|',$dAA['type']);
1757 if ($dAA['required']) {
1758 $temp[1] = '*'.$temp[1];
1759 }
1760 list($temp[2]) = explode('|',$dAA['value.'] ? $this->stdWrap($dAA['value'],$dAA['value.']) : $dAA['value']);
1761 // If value Array is set, then implode those values.
1762 if (is_array($dAA['valueArray.'])) {
1763 $temp_accum = array();
1764 foreach ($dAA['valueArray.'] as $dAKey_vA => $dAA_vA) {
1765 if (is_array($dAA_vA) && !strcmp(intval($dAKey_vA).'.',$dAKey_vA)) {
1766 $temp_vA=array();
1767 list($temp_vA[0])= explode('=',$dAA_vA['label.'] ? $this->stdWrap($dAA_vA['label'],$dAA_vA['label.']) : $dAA_vA['label']);
1768 if ($dAA_vA['selected']) {$temp_vA[0]='*'.$temp_vA[0];}
1769 list($temp_vA[1])= explode(',',$dAA_vA['value']);
1770 }
1771 $temp_accum[] = implode('=',$temp_vA);
1772 }
1773 $temp[2] = implode(',',$temp_accum);
1774 }
1775 list($temp[3]) = explode('|',$dAA['specialEval.'] ? $this->stdWrap($dAA['specialEval'],$dAA['specialEval.']) : $dAA['specialEval']);
1776
1777 // adding the form entry to the dataArray
1778 $dataArr[] = implode('|',$temp);
1779 }
1780 }
1781 }
1782 }
1783
1784 $attachmentCounter = '';
1785 $hiddenfields = '';
1786 $fieldlist = Array();
1787 $propertyOverride = Array();
1788 $fieldname_hashArray = Array();
1789 $cc = 0;
1790
1791 $xhtmlStrict = t3lib_div::inList('xhtml_strict,xhtml_11,xhtml_2',$GLOBALS['TSFE']->xhtmlDoctype);
1792 // Formname
1793 if ($conf['formName']) {
1794 $formname = $this->cleanFormName($conf['formName']);
1795 } else {
1796 $formname = $GLOBALS['TSFE']->uniqueHash();
1797 $formname = 'a'.$formname; // form name has to start with a letter to reach XHTML compliance
1798 }
1799
1800 if (isset($conf['fieldPrefix'])) {
1801 if ($conf['fieldPrefix']) {
1802 $prefix = $this->cleanFormName($conf['fieldPrefix']);
1803 } else {
1804 $prefix = '';
1805 }
1806 } else {
1807 $prefix = $formname;
1808 }
1809
1810 foreach ($dataArr as $val) {
1811
1812 $cc++;
1813 $confData=Array();
1814 if (is_array($formData)) {
1815 $parts = $val;
1816 $val = 1; // true...
1817 } else {
1818 $val = trim($val);
1819 $parts = explode('|',$val);
1820 }
1821 if ($val && strcspn($val,'#/')) {
1822 // label:
1823 $confData['label'] = trim($parts[0]);
1824 // field:
1825 $fParts = explode(',',$parts[1]);
1826 $fParts[0]=trim($fParts[0]);
1827 if (substr($fParts[0],0,1)=='*') {
1828 $confData['required']=1;
1829 $fParts[0] = substr($fParts[0],1);
1830 }
1831 $typeParts = explode('=',$fParts[0]);
1832 $confData['type'] = trim(strtolower(end($typeParts)));
1833 if (count($typeParts)==1) {
1834 $confData['fieldname'] = $this->cleanFormName($parts[0]);
1835 if (strtolower(preg_replace('/[^[:alnum:]]/','',$confData['fieldname']))=='email') {$confData['fieldname']='email';}
1836 // Duplicate fieldnames resolved
1837 if (isset($fieldname_hashArray[md5($confData['fieldname'])])) {
1838 $confData['fieldname'].='_'.$cc;
1839 }
1840 $fieldname_hashArray[md5($confData['fieldname'])]=$confData['fieldname'];
1841 // Attachment names...
1842 if ($confData['type']=='file') {
1843 $confData['fieldname']='attachment'.$attachmentCounter;
1844 $attachmentCounter=intval($attachmentCounter)+1;
1845 }
1846 } else {
1847 $confData['fieldname'] = str_replace(' ','_',trim($typeParts[0]));
1848 }
1849 $fieldCode='';
1850
1851 if ($conf['wrapFieldName']) {
1852 $confData['fieldname'] = $this->wrap($confData['fieldname'],$conf['wrapFieldName']);
1853 }
1854
1855 // Set field name as current:
1856 $this->setCurrentVal($confData['fieldname']);
1857
1858 // Additional parameters
1859 if (trim($confData['type'])) {
1860 $addParams=trim($conf['params']);
1861 if (is_array($conf['params.']) && isset($conf['params.'][$confData['type']])) {
1862 $addParams=trim($conf['params.'][$confData['type']]);
1863 }
1864 if (strcmp('',$addParams)) { $addParams=' '.$addParams; }
1865 } else $addParams='';
1866
1867 if ($conf['dontMd5FieldNames']) {
1868 $fName = $confData['fieldname'];
1869 } else {
1870 $fName = md5($confData['fieldname']);
1871 }
1872
1873 // Accessibility: Set id = fieldname attribute:
1874 if ($conf['accessibility'] || $xhtmlStrict) {
1875 $elementIdAttribute = ' id="'.$prefix.$fName.'"';
1876 } else {
1877 $elementIdAttribute = '';
1878 }
1879
1880 // Create form field based on configuration/type:
1881 switch ($confData['type']) {
1882 case 'textarea':
1883 $cols=trim($fParts[1]) ? intval($fParts[1]) : 20;
1884 $compWidth = doubleval($conf['compensateFieldWidth'] ? $conf['compensateFieldWidth'] : $GLOBALS['TSFE']->compensateFieldWidth);
1885 $compWidth = $compWidth ? $compWidth : 1;
1886 $cols = t3lib_div::intInRange($cols*$compWidth, 1, 120);
1887
1888 $rows=trim($fParts[2]) ? t3lib_div::intInRange($fParts[2],1,30) : 5;
1889 $wrap=trim($fParts[3]);
1890 if ($conf['noWrapAttr'] || $wrap === 'disabled') {
1891 $wrap='';
1892 } else {
1893 $wrap = $wrap ? ' wrap="'.$wrap.'"' : ' wrap="virtual"';
1894 }
1895 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], str_replace('\n',LF,trim($parts[2])));
1896 $fieldCode=sprintf('<textarea name="%s"%s cols="%s" rows="%s"%s%s>%s</textarea>',
1897 $confData['fieldname'], $elementIdAttribute, $cols, $rows, $wrap, $addParams, t3lib_div::formatForTextarea($default));
1898 break;
1899 case 'input':
1900 case 'password':
1901 $size=trim($fParts[1]) ? intval($fParts[1]) : 20;
1902 $compWidth = doubleval($conf['compensateFieldWidth'] ? $conf['compensateFieldWidth'] : $GLOBALS['TSFE']->compensateFieldWidth);
1903 $compWidth = $compWidth ? $compWidth : 1;
1904 $size = t3lib_div::intInRange($size*$compWidth, 1, 120);
1905 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], trim($parts[2]));
1906
1907 if ($confData['type']=='password') {
1908 $default='';
1909 }
1910
1911 $max=trim($fParts[2]) ? ' maxlength="'.t3lib_div::intInRange($fParts[2],1,1000).'"' : "";
1912 $theType = $confData['type']=='input' ? 'text' : 'password';
1913
1914 $fieldCode=sprintf('<input type="%s" name="%s"%s size="%s"%s value="%s"%s />',
1915 $theType, $confData['fieldname'], $elementIdAttribute, $size, $max, htmlspecialchars($default), $addParams);
1916
1917 break;
1918 case 'file':
1919 $size=trim($fParts[1]) ? t3lib_div::intInRange($fParts[1],1,60) : 20;
1920 $fieldCode=sprintf('<input type="file" name="%s"%s size="%s"%s />',
1921 $confData['fieldname'], $elementIdAttribute, $size, $addParams);
1922 break;
1923 case 'check':
1924 // alternative default value:
1925 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], trim($parts[2]));
1926 $checked = $default ? ' checked="checked"' : '';
1927 $fieldCode=sprintf('<input type="checkbox" value="%s" name="%s"%s%s%s />',
1928 1, $confData['fieldname'], $elementIdAttribute, $checked, $addParams);
1929 break;
1930 case 'select':
1931 $option='';
1932 $valueParts = explode(',',$parts[2]);
1933 // size
1934 if (strtolower(trim($fParts[1]))=='auto') {$fParts[1]=count($valueParts);} // Auto size set here. Max 20
1935 $size=trim($fParts[1]) ? t3lib_div::intInRange($fParts[1],1,20) : 1;
1936 // multiple
1937 $multiple = strtolower(trim($fParts[2]))=='m' ? ' multiple="multiple"' : '';
1938
1939 $items=array(); // Where the items will be
1940 $defaults=array(); //RTF
1941 $pCount = count($valueParts);
1942 for($a=0;$a<$pCount;$a++) {
1943 $valueParts[$a]=trim($valueParts[$a]);
1944 if (substr($valueParts[$a],0,1)=='*') { // Finding default value
1945 $sel='selected';
1946 $valueParts[$a] = substr($valueParts[$a],1);
1947 } else $sel='';
1948 // Get value/label
1949 $subParts=explode('=',$valueParts[$a]);
1950 $subParts[1] = (isset($subParts[1])?trim($subParts[1]):trim($subParts[0])); // Sets the value
1951 $items[] = $subParts; // Adds the value/label pair to the items-array
1952 if ($sel) {$defaults[]=$subParts[1];} // Sets the default value if value/label pair is marked as default.
1953 }
1954 // alternative default value:
1955 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], $defaults);
1956 if (!is_array($default)) {
1957 $defaults=array();
1958 $defaults[] = $default;
1959 } else $defaults=$default;
1960 // Create the select-box:
1961 $iCount = count($items);
1962 for($a=0;$a<$iCount;$a++) {
1963 $option.='<option value="'.$items[$a][1].'"'.(in_array($items[$a][1],$defaults)?' selected="selected"':'').'>'.trim($items[$a][0]).'</option>'; //RTF
1964 }
1965
1966 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.
1967 $fieldCode=sprintf('<select name="%s"%s size="%s"%s%s>%s</select>',
1968 $confData['fieldname'], $elementIdAttribute, $size, $multiple, $addParams, $option); //RTF
1969 break;
1970 case 'radio':
1971 $option='';
1972
1973 $valueParts = explode(',',$parts[2]);
1974 $items=array(); // Where the items will be
1975 $default='';
1976 $pCount = count($valueParts);
1977 for($a=0;$a<$pCount;$a++) {
1978 $valueParts[$a]=trim($valueParts[$a]);
1979 if (substr($valueParts[$a],0,1)=='*') {
1980 $sel='checked';
1981 $valueParts[$a] = substr($valueParts[$a],1);
1982 } else $sel='';
1983 // Get value/label
1984 $subParts=explode('=',$valueParts[$a]);
1985 $subParts[1] = (isset($subParts[1])?trim($subParts[1]):trim($subParts[0])); // Sets the value
1986 $items[] = $subParts; // Adds the value/label pair to the items-array
1987 if ($sel) {$default=$subParts[1];} // Sets the default value if value/label pair is marked as default.
1988 }
1989 // alternative default value:
1990 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], $default);
1991 // Create the select-box:
1992 $iCount = count($items);
1993 for($a=0;$a<$iCount;$a++) {
1994 $radioId = $prefix.$fName.$this->cleanFormName($items[$a][0]);
1995 if ($conf['accessibility']) {
1996 $radioLabelIdAttribute = ' id="'.$radioId.'"';
1997 } else {
1998 $radioLabelIdAttribute = '';
1999 }
2000 $option .= '<input type="radio" name="'.$confData['fieldname'].'"'.$radioLabelIdAttribute.' value="'.$items[$a][1].'"'.(!strcmp($items[$a][1],$default)?' checked="checked"':'').$addParams.' />';
2001 if ($conf['accessibility']) {
2002 $option .= '<label for="'.$radioId.'">' . $this->stdWrap(trim($items[$a][0]), $conf['radioWrap.']) . '</label>';
2003 } else {
2004 $option .= $this->stdWrap(trim($items[$a][0]), $conf['radioWrap.']);
2005 }
2006 }
2007
2008 if ($conf['accessibility']) {
2009 $accessibilityWrap = $conf['radioWrap.']['accessibilityWrap'];
2010
2011 $search = array(
2012 '###RADIO_FIELD_ID###',
2013 '###RADIO_GROUP_LABEL###'
2014 );
2015 $replace = array(
2016 $elementIdAttribute,
2017 $confData['label']
2018 );
2019 $accessibilityWrap = str_replace($search, $replace, $accessibilityWrap);
2020
2021 $option = $this->wrap($option, $accessibilityWrap);
2022 }
2023
2024 $fieldCode = $option;
2025 break;
2026 case 'hidden':
2027 $value = trim($parts[2]);
2028 if (strlen($value) && t3lib_div::inList('recipient_copy,recipient',$confData['fieldname']) && $GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
2029 break;
2030 }
2031 if (strlen($value) && t3lib_div::inList('recipient_copy,recipient',$confData['fieldname'])) {
2032 $value = $GLOBALS['TSFE']->codeString($value);
2033 }
2034 $hiddenfields.= sprintf('<input type="hidden" name="%s"%s value="%s" />',
2035 $confData['fieldname'], $elementIdAttribute, htmlspecialchars($value));
2036 break;
2037 case 'property':
2038 if (t3lib_div::inList('type,locationData,goodMess,badMess,emailMess',$confData['fieldname'])) {
2039 $value=trim($parts[2]);
2040 $propertyOverride[$confData['fieldname']] = $value;
2041 $conf[$confData['fieldname']] = $value;
2042 }
2043 break;
2044 case 'submit':
2045 $value=trim($parts[2]);
2046 if ($conf['image.']) {
2047 $this->data[$this->currentValKey] = $value;
2048 $image = $this->IMG_RESOURCE($conf['image.']);
2049 $params = $conf['image.']['params'] ? ' '.$conf['image.']['params'] : '';
2050 $params.= $this->getAltParam($conf['image.'], false);
2051 $params.= $addParams;
2052 } else {
2053 $image = '';
2054 }
2055 if ($image) {
2056 $fieldCode=sprintf('<input type="image" name="%s"%s src="%s"%s />',
2057 $confData['fieldname'], $elementIdAttribute, $image, $params);
2058 } else {
2059 $fieldCode=sprintf('<input type="submit" name="%s"%s value="%s"%s />',
2060 $confData['fieldname'], $elementIdAttribute, t3lib_div::deHSCentities(htmlspecialchars($value)), $addParams);
2061 }
2062 break;
2063 case 'reset':
2064 $value=trim($parts[2]);
2065 $fieldCode=sprintf('<input type="reset" name="%s"%s value="%s"%s />',
2066 $confData['fieldname'], $elementIdAttribute, t3lib_div::deHSCentities(htmlspecialchars($value)), $addParams);
2067 break;
2068 case 'label':
2069 $fieldCode = nl2br(htmlspecialchars(trim($parts[2])));
2070 break;
2071 default:
2072 $confData['type'] = 'comment';
2073 $fieldCode = trim($parts[2]).'&nbsp;';
2074 break;
2075 }
2076 if ($fieldCode) {
2077
2078 // Checking for special evaluation modes:
2079 if (t3lib_div::inList('textarea,input,password',$confData['type']) && strlen(trim($parts[3]))) {
2080 $modeParameters = t3lib_div::trimExplode(':',$parts[3]);
2081 } else {
2082 $modeParameters = array();
2083 }
2084
2085 // Adding evaluation based on settings:
2086 switch ((string)$modeParameters[0]) {
2087 case 'EREG':
2088 $fieldlist[] = '_EREG';
2089 $fieldlist[] = $modeParameters[1];
2090 $fieldlist[] = $modeParameters[2];
2091 $fieldlist[] = $confData['fieldname'];
2092 $fieldlist[] = $confData['label'];
2093 $confData['required'] = 1; // Setting this so "required" layout is used.
2094 break;
2095 case 'EMAIL':
2096 $fieldlist[] = '_EMAIL';
2097 $fieldlist[] = $confData['fieldname'];
2098 $fieldlist[] = $confData['label'];
2099 $confData['required'] = 1; // Setting this so "required" layout is used.
2100 break;
2101 default:
2102 if ($confData['required']) {
2103 $fieldlist[] = $confData['fieldname'];
2104 $fieldlist[] = $confData['label'];
2105 }
2106 break;
2107 }
2108
2109 // Field:
2110 $fieldLabel = $confData['label'];
2111 if ($conf['accessibility'] && trim($fieldLabel) && !preg_match('/^(label|hidden|comment)$/',$confData['type'])) {
2112 $fieldLabel = '<label for="'.$prefix.$fName.'">'.$fieldLabel.'</label>';
2113 }
2114
2115 // Getting template code:
2116 $fieldCode = $this->stdWrap($fieldCode, $conf['fieldWrap.']);
2117 $labelCode = $this->stdWrap($fieldLabel, $conf['labelWrap.']);
2118 $commentCode = $this->stdWrap($confData['label'], $conf['commentWrap.']); // RTF
2119 $result = $conf['layout'];
2120 if ($conf['REQ'] && $confData['required']) {
2121 if (is_array($conf['REQ.']['fieldWrap.']))
2122 $fieldCode = $this->stdWrap($fieldCode, $conf['REQ.']['fieldWrap.']);
2123 if (is_array($conf['REQ.']['labelWrap.']))
2124 $labelCode = $this->stdWrap($fieldLabel, $conf['REQ.']['labelWrap.']);
2125 if ($conf['REQ.']['layout']) {
2126 $result = $conf['REQ.']['layout'];
2127 }
2128 }
2129 if ($confData['type']=='comment' && $conf['COMMENT.']['layout']) {
2130 $result = $conf['COMMENT.']['layout'];
2131 }
2132 if ($confData['type']=='check' && $conf['CHECK.']['layout']) {
2133 $result = $conf['CHECK.']['layout'];
2134 }
2135 if ($confData['type']=='radio' && $conf['RADIO.']['layout']) {
2136 $result = $conf['RADIO.']['layout'];
2137 }
2138 if ($confData['type']=='label' && $conf['LABEL.']['layout']) {
2139 $result = $conf['LABEL.']['layout'];
2140 }
2141 $result = str_replace('###FIELD###',$fieldCode,$result);
2142 $result = str_replace('###LABEL###',$labelCode,$result);
2143 $result = str_replace('###COMMENT###',$commentCode,$result); //RTF
2144 $content.= $result;
2145 }
2146 }
2147 }
2148 if ($conf['stdWrap.']) { $content = $this->stdWrap($content, $conf['stdWrap.']); }
2149
2150
2151 // redirect (external: where to go afterwards. internal: where to submit to)
2152 $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)
2153 $page = $GLOBALS['TSFE']->page;
2154 if (!$theRedirect) { // Internal: Just submit to current page
2155 $LD = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'],'index.php', '', $this->getClosestMPvalueForPage($page['uid']));
2156 } elseif (t3lib_div::testInt($theRedirect)) { // Internal: Submit to page with ID $theRedirect
2157 $page = $GLOBALS['TSFE']->sys_page->getPage_noCheck($theRedirect);
2158 $LD = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'],'index.php', '', $this->getClosestMPvalueForPage($page['uid']));
2159 } else { // External URL, redirect-hidden field is rendered!
2160 $LD = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'],'', '', $this->getClosestMPvalueForPage($page['uid']));
2161 $LD['totalURL'] = $theRedirect;
2162 $hiddenfields.= '<input type="hidden" name="redirect" value="'.htmlspecialchars($LD['totalURL']).'" />'; // 18-09-00 added
2163 }
2164
2165 // Formtype (where to submit to!):
2166 $formtype = $propertyOverride['type'] ? $propertyOverride['type'] : $this->stdWrap($conf['type'], $conf['type.']);
2167 if (t3lib_div::testInt($formtype)) { // Submit to a specific page
2168 $page = $GLOBALS['TSFE']->sys_page->getPage_noCheck($formtype);
2169 $LD_A = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'], '', '', $this->getClosestMPvalueForPage($page['uid']));
2170 $action = $LD_A['totalURL'];
2171 } elseif ($formtype) { // Submit to external script
2172 $LD_A = $LD;
2173 $action = $formtype;
2174 } elseif (t3lib_div::testInt($theRedirect)) {
2175 $LD_A = $LD;
2176 $action = $LD_A['totalURL'];
2177 } else { // Submit to "nothing" - which is current page
2178 $LD_A = $GLOBALS['TSFE']->tmpl->linkData($GLOBALS['TSFE']->page, $conf['target'], $conf['no_cache'], '', '', $this->getClosestMPvalueForPage($page['uid']));
2179 $action = $LD_A['totalURL'];
2180 }
2181
2182 // Recipient:
2183 $theEmail = $this->stdWrap($conf['recipient'], $conf['recipient.']);
2184 if ($theEmail && !$GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
2185 $theEmail = $GLOBALS['TSFE']->codeString($theEmail);
2186 $hiddenfields.= '<input type="hidden" name="recipient" value="'.htmlspecialchars($theEmail).'" />';
2187 }
2188
2189 // location data:
2190 if ($conf['locationData']) {
2191 if ($conf['locationData']=='HTTP_POST_VARS' && isset($_POST['locationData'])) {
2192 $locationData = t3lib_div::_POST('locationData');
2193 } else {
2194 $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.
2195 }
2196 $hiddenfields.='<input type="hidden" name="locationData" value="'.htmlspecialchars($locationData).'" />';
2197 }
2198
2199 // hidden fields:
2200 if (is_array($conf['hiddenFields.'])) {
2201 foreach ($conf['hiddenFields.'] as $hF_key => $hF_conf) {
2202 if (substr($hF_key,-1)!='.') {
2203 $hF_value = $this->cObjGetSingle($hF_conf,$conf['hiddenFields.'][$hF_key.'.'],'hiddenfields');
2204 if (strlen($hF_value) && t3lib_div::inList('recipient_copy,recipient',$hF_key)) {
2205 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
2206 continue;
2207 }
2208 $hF_value = $GLOBALS['TSFE']->codeString($hF_value);
2209 }
2210 $hiddenfields.= '<input type="hidden" name="'.$hF_key.'" value="'.htmlspecialchars($hF_value).'" />';
2211 }
2212 }
2213 }
2214
2215 // Wrap all hidden fields in a div tag (see http://bugs.typo3.org/view.php?id=678)
2216 $hiddenfields = '<div style="display:none;">'.$hiddenfields.'</div>';
2217
2218 if ($conf['REQ']) {
2219 $validateForm = ' onsubmit="return validateForm(\'' .
2220 $formname . '\',\'' . implode(',',$fieldlist) . '\',' .
2221 t3lib_div::quoteJSvalue($conf['goodMess']) . ',' .
2222 t3lib_div::quoteJSvalue($conf['badMess']) . ',' .
2223 t3lib_div::quoteJSvalue($conf['emailMess']) . ')"';
2224 $GLOBALS['TSFE']->additionalHeaderData['JSFormValidate'] =
2225 '<script type="text/javascript" src="' .
2226 t3lib_div::createVersionNumberedFilename($GLOBALS['TSFE']->absRefPrefix .
2227 't3lib/jsfunc.validateform.js') .
2228 '"></script>';
2229 } else {
2230 $validateForm = '';
2231 }
2232
2233 // Create form tag:
2234 $theTarget = ($theRedirect?$LD['target']:$LD_A['target']);
2235 $content = array(
2236 '<form'.
2237 ' action="'.htmlspecialchars($action).'"'.
2238 ' id="'.$formname.'"'.($xhtmlStrict ? '' : ' name="'.$formname.'"').
2239 ' enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'"'.
2240 ' method="'.($conf['method']?$conf['method']:'post').'"'.
2241 ($theTarget ? ' target="'.$theTarget.'"' : '').
2242 $validateForm.
2243 '>',
2244 $hiddenfields.$content,
2245 '</form>'
2246 );
2247
2248 if ($conf['arrayReturnMode']) {
2249 $content['validateForm']=$validateForm;
2250 $content['formname']=$formname;
2251 return $content;
2252 } else {
2253 return implode('',$content);
2254 }
2255 }
2256
2257 /**
2258 * Rendering the cObject, SEARCHRESULT
2259 *
2260 * @param array Array of TypoScript properties
2261 * @return string Output
2262 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=368&cHash=d00731cd7b
2263 */
2264 function SEARCHRESULT($conf) {
2265 if (t3lib_div::_GP('sword') && t3lib_div::_GP('scols')) {
2266 $search = t3lib_div::makeInstance('tslib_search');
2267 $search->register_and_explode_search_string(t3lib_div::_GP('sword'));
2268 $search->register_tables_and_columns(t3lib_div::_GP('scols'),$conf['allowedCols']);
2269 // depth
2270 $depth=100;
2271 // the startId is found
2272 $theStartId=0;
2273 if (t3lib_div::testInt(t3lib_div::_GP('stype'))) {
2274 $temp_theStartId=t3lib_div::_GP('stype');
2275 $rootLine = $GLOBALS['TSFE']->sys_page->getRootLine($temp_theStartId);
2276 // The page MUST have a rootline with the Level0-page of the current site inside!!
2277 foreach ($rootLine as $val) {
2278 if($val['uid']==$GLOBALS['TSFE']->tmpl->rootLine[0]['uid']) {
2279 $theStartId = $temp_theStartId;
2280 }
2281 }
2282 } else if (t3lib_div::_GP('stype')) {
2283 if (substr(t3lib_div::_GP('stype'),0,1)=='L') {
2284 $pointer = intval(substr(t3lib_div::_GP('stype'),1));
2285 $theRootLine = $GLOBALS['TSFE']->tmpl->rootLine;
2286 // location Data:
2287 $locDat_arr = explode(':',t3lib_div::_POST('locationData'));
2288 $pId = intval($locDat_arr[0]);
2289 if ($pId) {
2290 $altRootLine = $GLOBALS['TSFE']->sys_page->getRootLine($pId);
2291 ksort($altRootLine);
2292 if (count($altRootLine)) {
2293 // check if the rootline has the real Level0 in it!!
2294 $hitRoot=0;
2295 $theNewRoot=array();
2296 foreach ($altRootLine as $val) {
2297 if($hitRoot || $val['uid']==$GLOBALS['TSFE']->tmpl->rootLine[0]['uid']) {
2298 $hitRoot=1;
2299 $theNewRoot[]=$val;
2300 }
2301 }
2302 if ($hitRoot) {
2303 $theRootLine = $theNewRoot; // Override the real rootline if any thing
2304 }
2305 }
2306 }
2307 $key = $this->getKey($pointer,$theRootLine);
2308 $theStartId = $theRootLine[$key]['uid'];
2309 }
2310 }
2311 if (!$theStartId) {
2312 // If not set, we use current page
2313 $theStartId = $GLOBALS['TSFE']->id;
2314 }
2315 // generate page-tree
2316 $search->pageIdList.= $this->getTreeList(-1*$theStartId,$depth);
2317
2318 $endClause = 'pages.uid IN ('.$search->pageIdList.')
2319 AND pages.doktype in ('.$GLOBALS['TYPO3_CONF_VARS']['FE']['content_doktypes'].($conf['addExtUrlsAndShortCuts']?',3,4':'').')
2320 AND pages.no_search=0'.
2321 $this->enableFields($search->fTable).
2322 $this->enableFields('pages');
2323
2324 if ($conf['languageField.'][$search->fTable]) {
2325 $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!)
2326 }
2327
2328 // build query
2329 $search->build_search_query($endClause);
2330
2331 // count...
2332 if (t3lib_div::testInt(t3lib_div::_GP('scount'))) {
2333 $search->res_count = t3lib_div::_GP('scount');
2334 } else {
2335 $search->count_query();
2336 }
2337
2338 // range
2339 $spointer = intval(t3lib_div::_GP('spointer'));
2340 if (isset($conf['range'])) {
2341 $theRange = intval($conf['range']);
2342 } else {
2343 $theRange = 20;
2344 }
2345
2346 // Order By:
2347 if (!$conf['noOrderBy']) {
2348 $search->queryParts['ORDERBY'] = 'pages.lastUpdated, pages.tstamp';
2349 }
2350
2351 $search->queryParts['LIMIT'] = $spointer.','.$theRange;
2352
2353 // search...
2354 $search->execute_query();
2355 if ($GLOBALS['TYPO3_DB']->sql_num_rows($search->result)) {
2356 $GLOBALS['TSFE']->register['SWORD_PARAMS'] = $search->get_searchwords();
2357
2358 $total = $search->res_count;
2359 $rangeLow = t3lib_div::intInRange($spointer+1,1,$total);
2360 $rangeHigh = t3lib_div::intInRange($spointer+$theRange,1,$total);
2361 // prev/next url:
2362 $LD = $GLOBALS['TSFE']->tmpl->linkData($GLOBALS['TSFE']->page,$conf['target'],1,'', '', $this->getClosestMPvalueForPage($GLOBALS['TSFE']->page['uid']));
2363 $targetPart = $LD['target'] ? ' target="'.htmlspecialchars($LD['target']).'"' : '';
2364 $urlParams = $this->URLqMark($LD['totalURL'],
2365 '&sword='.rawurlencode(t3lib_div::_GP('sword')).
2366 '&scols='.rawurlencode(t3lib_div::_GP('scols')).
2367 '&stype='.rawurlencode(t3lib_div::_GP('stype')).
2368 '&scount='.$total);
2369 // substitution:
2370 $result= $this->cObjGetSingle($conf['layout'],$conf['layout.'], 'layout');
2371 $result = str_replace('###RANGELOW###',$rangeLow,$result);
2372 $result = str_replace('###RANGEHIGH###',$rangeHigh,$result);
2373 $result = str_replace('###TOTAL###',$total,$result);
2374
2375 if ($rangeHigh<$total) {
2376 $next = $this->cObjGetSingle($conf['next'], $conf['next.'], 'next');
2377 $next = '<a href="'.htmlspecialchars($urlParams.'&spointer='.($spointer+$theRange)).'"'.$targetPart.$GLOBALS['TSFE']->ATagParams.'>'.$next.'</a>';
2378 } else $next='';
2379 $result = str_replace('###NEXT###',$next,$result);
2380
2381 if ($rangeLow>1) {
2382 $prev = $this->cObjGetSingle($conf['prev'], $conf['prev.'], 'prev');
2383 $prev = '<a href="'.htmlspecialchars($urlParams.'&spointer='.($spointer-$theRange)).'"'.$targetPart.$GLOBALS['TSFE']->ATagParams.'>'.$prev.'</a>';
2384 } else $prev='';
2385 $result = str_replace('###PREV###',$prev,$result);
2386
2387 // searching result
2388 $theValue = $this->cObjGetSingle($conf['resultObj'], $conf['resultObj.'],'resultObj');
2389 $cObj = t3lib_div::makeInstance('tslib_cObj');
2390 $cObj->setParent($this->data,$this->currentRecord);
2391 $renderCode='';
2392 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($search->result)) {
2393 // versionOL() here? This is search result displays, is that possible to preview anyway? Or are records selected here already future versions?
2394 $cObj->start($row);
2395 $renderCode.=$cObj->cObjGetSingle($conf['renderObj'], $conf['renderObj.'],'renderObj');
2396 }
2397 $theValue.=$this->wrap($renderCode,$conf['renderWrap']);
2398 $theValue = str_replace('###RESULT###',$theValue,$result);
2399 } else {
2400 $theValue = $this->cObjGetSingle($conf['noResultObj'], $conf['noResultObj.'],'noResultObj');
2401 }
2402
2403 $GLOBALS['TT']->setTSlogMessage('Search in fields: '.$search->listOfSearchFields);
2404
2405 // wrapping
2406 $content=$theValue;
2407 if ($conf['wrap']) {
2408 $content=$this->wrap($content, $conf['wrap']);
2409 }
2410 if ($conf['stdWrap.']) {
2411 $content=$this->stdWrap($content, $conf['stdWrap.']);
2412 }
2413 // returning
2414 $GLOBALS['TSFE']->set_no_cache();
2415 return $content;
2416 }
2417 }
2418
2419 /**
2420 * Rendering the cObject, PHP_SCRIPT, PHP_SCRIPT_INT and PHP_SCRIPT_EXT
2421 *
2422 * @param array Array of TypoScript properties
2423 * @param string If "INT", then rendering "PHP_SCRIPT_INT"; If "EXT", then rendering "PHP_SCRIPT_EXT"; Default is rendering "PHP_SCRIPT" (cached)
2424 * @return string Output
2425 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=370&cHash=aa107f2ad8
2426 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=371&cHash=53f71d025e
2427 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=372&cHash=91fe391e1c
2428 */
2429 function PHP_SCRIPT($conf,$ext='') {
2430 $incFile = $GLOBALS['TSFE']->tmpl->getFileName($conf['file']);
2431 $content='';
2432 if ($incFile && $GLOBALS['TSFE']->checkFileInclude($incFile)) {
2433 switch($ext) {
2434 case 'INT':
2435 case 'EXT':
2436 $substKey = $ext.'_SCRIPT.'.$GLOBALS['TSFE']->uniqueHash();
2437 $content.='<!--'.$substKey.'-->';
2438 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey] = array(
2439 'file'=>$incFile,
2440 'conf'=>$conf,
2441 'type'=>'SCRIPT'
2442 );
2443 if ($ext=='INT') {
2444 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey]['cObj'] = serialize($this);
2445 } else {
2446 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey]['data'] = $this->data;
2447 }
2448 break;
2449 default:
2450 // Added 31-12-00: Make backup...
2451 $this->oldData = $this->data;
2452 // Include file..
2453 include('./'.$incFile);
2454 // Added 31-12-00: restore...
2455 if ($RESTORE_OLD_DATA) {
2456 $this->data = $this->oldData;
2457 }
2458 break;
2459 }
2460 }
2461 return $content;
2462 }
2463
2464 /**
2465 * Rendering the cObject, TEMPLATE
2466 *
2467 * @param array Array of TypoScript properties
2468 * @return string Output
2469 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=373&cHash=109a171b1e
2470 * @see substituteMarkerArrayCached()
2471 */
2472 function TEMPLATE($conf) {
2473 $subparts = Array();
2474 $marks = Array();
2475 $wraps = Array();
2476 $content='';
2477
2478 list($PRE,$POST) = explode('|',$conf['markerWrap'] ? $conf['markerWrap'] : '### | ###');
2479 $POST = trim($POST);
2480 $PRE = trim($PRE);
2481
2482 // Getting the content
2483 $content = $this->cObjGetSingle($conf['template'],$conf['template.'],'template');
2484 if ($conf['workOnSubpart']) {
2485 $content = $this->getSubpart($content, $PRE.$conf['workOnSubpart'].$POST);
2486 }
2487
2488 // Fixing all relative paths found:
2489 if ($conf['relPathPrefix']) {
2490 $htmlParser = t3lib_div::makeInstance('t3lib_parsehtml');
2491 $content = $htmlParser->prefixResourcePath($conf['relPathPrefix'],$content,$conf['relPathPrefix.']);
2492 }
2493
2494 if ($content) {
2495 if ($conf['nonCachedSubst']) { // NON-CACHED:
2496 // Getting marks
2497 if (is_array($conf['marks.'])) {
2498 foreach ($conf['marks.'] as $theKey => $theValue) {
2499 if (!strstr($theKey,'.')) {
2500 $content = str_replace(
2501 $PRE.$theKey.$POST,
2502 $this->cObjGetSingle($theValue,$conf['marks.'][$theKey.'.'],'marks.'.$theKey),
2503 $content);
2504 }
2505 }
2506 }
2507
2508 // Getting subparts.
2509 if (is_array($conf['subparts.'])) {
2510 foreach ($conf['subparts.'] as $theKey => $theValue) {
2511 if (!strstr($theKey,'.')) {
2512 $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
2513 if ($subpart) {
2514 $this->setCurrentVal($subpart);
2515 $content = $this->substituteSubpart(
2516 $content,
2517 $PRE.$theKey.$POST,
2518 $this->cObjGetSingle($theValue,$conf['subparts.'][$theKey.'.'],'subparts.'.$theKey),
2519 1
2520 );
2521 }
2522 }
2523 }
2524 }
2525 // Getting subpart wraps
2526 if (is_array($conf['wraps.'])) {
2527 foreach ($conf['wraps.'] as $theKey => $theValue) {
2528 if (!strstr($theKey,'.')) {
2529 $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
2530 if ($subpart) {
2531 $this->setCurrentVal($subpart);
2532 $content = $this->substituteSubpart(
2533 $content,
2534 $PRE.$theKey.$POST,
2535 explode('|',$this->cObjGetSingle($theValue,$conf['wraps.'][$theKey.'.'],'wraps.'.$theKey)),
2536 1
2537 );
2538 }
2539 }
2540 }
2541 }
2542 } else { // CACHED
2543 // Getting subparts.
2544 if (is_array($conf['subparts.'])) {
2545 foreach ($conf['subparts.'] as $theKey => $theValue) {
2546 if (!strstr($theKey,'.')) {
2547 $subpart = $this->getSubpart($content, $PRE