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