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