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