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