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