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