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