2 /***************************************************************
5 * (c) 1999-2005 Kasper Skaarhoj (kasperYYYY@typo3.com)
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.
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.
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.
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
28 * Contains classes for Content Rendering based on TypoScript Template configuration
31 * Revised for TYPO3 3.6 June/2003 by Kasper Skaarhoj
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)
39 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
42 * [CLASS/FUNCTION INDEX of SCRIPT]
46 * 257: class tslib_cObj
47 * 351: function start($data,$table='')
48 * 366: function setParent($data,$currentRecord)
50 * SECTION: CONTENT_OBJ:
51 * 391: function getCurrentVal()
52 * 402: function setCurrentVal($value)
53 * 415: function cObjGet($setup,$addKey='')
54 * 439: function cObjGetSingle($name,$conf,$TSkey='__')
56 * SECTION: Functions rendering content objects (cObjects)
57 * 585: function HTML($conf)
58 * 596: function TEXT($conf)
59 * 607: function CLEARGIF($conf)
60 * 626: function COBJ_ARRAY($conf,$ext='')
61 * 662: function USER($conf,$ext='')
62 * 689: function FILE($conf)
63 * 705: function IMAGE($conf)
64 * 724: function IMG_RESOURCE($conf)
65 * 736: function IMGTEXT($conf)
66 * 1145: function CONTENT($conf)
67 * 1231: function RECORDS($conf)
68 * 1311: function HMENU($conf)
69 * 1343: function CTABLE ($conf)
70 * 1381: function OTABLE ($conf)
71 * 1396: function COLUMNS ($conf)
72 * 1475: function HRULER ($conf)
73 * 1500: function CASEFUNC ($conf)
74 * 1525: function LOAD_REGISTER($conf,$name)
75 * 1565: function FORM($conf,$formData='')
76 * 2062: function SEARCHRESULT($conf)
77 * 2228: function PHP_SCRIPT($conf,$ext='')
78 * 2271: function TEMPLATE($conf)
79 * 2422: function MULTIMEDIA($conf)
81 * SECTION: Various helper functions for content objects:
82 * 2509: function getSlidePids($pidList, $pidConf)
83 * 2541: function netprintApplication_offsiteLinkWrap($str,$imgConf,$conf)
84 * 2582: function getFieldDefaultValue($noValueInsert, $fieldName, $defaultVal)
85 * 2600: function cImage($file,$conf)
86 * 2628: function getBorderAttr($borderAttr)
87 * 2644: function imageLinkWrap($string,$imageFile,$conf)
88 * 2724: function fileResource($fName, $addParams='alt="" title=""')
89 * 2747: function lastChanged($tstamp)
90 * 2764: function linkWrap($content,$wrap)
91 * 2782: function getAltParam($conf)
92 * 2817: function cleanFormName($name)
93 * 2833: function getATagParams($conf, $addGlobal=1)
95 * SECTION: HTML template processing functions
96 * 2880: function getSubpart($content, $marker)
97 * 2896: function substituteSubpart($content,$marker,$subpartContent,$recursive=1)
98 * 2909: function substituteMarker($content,$marker,$markContent)
99 * 2929: function substituteMarkerArrayCached($content,$markContentArray=array(),$subpartContentArray=array(),$wrappedSubpartContentArray=array())
100 * 3027: function substituteMarkerArray($content,$markContentArray,$wrap='',$uppercase=0)
101 * 3048: function substituteMarkerInObject(&$tree, $markContentArray)
102 * 3071: function fillInMarkerArray($markContentArray, $row, $fieldList='', $nl2br=TRUE, $prefix='FIELD_', $HSC=FALSE)
104 * SECTION: "stdWrap" + sub functions
105 * 3134: function stdWrap($content,$conf)
106 * 3308: function numRows($conf)
107 * 3329: function listNum($content,$listNum,$char)
108 * 3349: function checkIf($conf)
109 * 3412: function filelist($data)
110 * 3494: function clean_directory($theDir)
111 * 3512: function HTMLparser_TSbridge($theValue, $conf)
112 * 3526: function dataWrap($content,$wrap)
113 * 3539: function insertData($str)
114 * 3569: function prefixComment($str,$conf,$content)
115 * 3593: function substring($content,$options)
116 * 3611: function crop($content,$options)
117 * 3643: function removeBadHTML($text, $conf)
118 * 3687: function textStyle($theValue, $conf)
119 * 3754: function tableStyle($theValue, $conf)
120 * 3795: function addParams($content,$conf)
121 * 3838: function filelink($theValue, $conf)
122 * 3908: function locDataJU($jumpUrl,$conf)
123 * 3939: function calc($val)
124 * 3968: function calcIntExplode($delim, $string)
125 * 3988: function splitObj($value, $conf)
126 * 4050: function parseFunc($theValue, $conf, $ref='')
127 * 4160: function _parseFunc ($theValue, $conf)
128 * 4362: function encaps_lineSplit($theValue, $conf)
129 * 4445: function http_makelinks($data,$conf)
130 * 4512: function mailto_makelinks($data,$conf)
131 * 4555: function getImgResource($file,$fileArray)
133 * SECTION: Data retrieval etc.
134 * 4747: function getFieldVal($field)
135 * 4767: function getData($string,$fieldArray)
136 * 4897: function rootLineValue($key,$field,$slideBack=0,$altRootLine='')
137 * 4919: function getGlobal($var, $source=NULL)
138 * 4955: function getKey($key,$arr)
139 * 4978: function TCAlookup($inputValue,$conf)
141 * SECTION: Link functions (typolink)
142 * 5038: function typoLink($linktxt, $conf)
143 * 5335: function typoLink_URL($conf)
144 * 5353: function getTypoLink($label,$params,$urlParameters=array(),$target='')
145 * 5380: function getTypoLink_URL($params,$urlParameters=array(),$target='')
146 * 5392: function typolinkWrap($conf)
147 * 5405: function currentPageUrl($urlParameters=array(),$id=0)
148 * 5418: function getClosestMPvalueForPage($pageId, $raw=FALSE)
149 * 5468: function getMailTo($mailAddress,$linktxt,$initP='?')
150 * 5506: function getQueryArguments($conf,$overruleQueryArgs=array(),$forceArgs=FALSE)
152 * SECTION: Miscellaneous functions, stand alone
153 * 5591: function wrap($content,$wrap,$char='|')
154 * 5607: function noTrimWrap($content,$wrap)
155 * 5621: function wrapSpace($content, $wrap)
156 * 5647: function callUserFunction($funcName,$conf,$content)
157 * 5688: function processParams($params)
158 * 5706: function keywords($content)
159 * 5723: function caseshift($theValue, $case)
160 * 5748: function HTMLcaseshift($theValue, $case)
161 * 5777: function bytes($sizeInBytes,$labels)
162 * 5788: function calcAge($seconds,$labels)
163 * 5820: function sendNotifyEmail($msg, $recipients, $cc, $email_from, $email_fromName='', $replyTo='')
164 * 5847: function URLqMark($url,$params)
165 * 5863: function checkEmail($email)
166 * 5875: function clearTSProperties($TSArr,$propList)
167 * 5894: function mergeTSRef($confArr,$prop)
168 * 5917: function joinTSarrays($conf,$old_conf)
169 * 5940: function gifBuilderTextBox($gifbuilderConf, $conf, $text)
170 * 5996: function linebreaks($string,$chars,$maxLines=0)
171 * 6027: function getUpdateJS($dataArray, $formName, $arrPrefix, $fieldList)
173 * SECTION: Database functions, making of queries
174 * 6096: function DBgetDelete($table, $uid, $doExec=FALSE)
175 * 6128: function DBgetUpdate($table, $uid, $dataArr, $fieldList, $doExec=FALSE)
176 * 6170: function DBgetInsert($table, $pid, $dataArr, $fieldList, $doExec=FALSE)
177 * 6207: function DBmayFEUserEdit($table,$row, $feUserRow, $allowedGroups='',$feEditSelf=0)
178 * 6247: function DBmayFEUserEditSelect($table,$feUserRow,$allowedGroups='',$feEditSelf=0)
179 * 6287: function enableFields($table,$show_hidden=0)
180 * 6311: function getTreeList($id,$depth,$begin=0,$dontCheckEnableFields=FALSE,$addSelectFields='',$moreWhereClauses='', $prevId_array=array(), $recursionLevel=0)
181 * 6417: function whereSelectFromList($field,$value)
182 * 6435: function exec_mm_query($select,$local_table,$mm_table,$foreign_table,$whereClause='',$groupBy='',$orderBy='',$limit='')
183 * 6462: function exec_mm_query_uidList($select,$local_table_uidlist,$mm_table,$foreign_table='',$whereClause='',$groupBy='',$orderBy='',$limit='')
184 * 6483: function searchWhere($sw,$searchFieldList,$searchTable='')
185 * 6519: function exec_getQuery($table, $conf)
186 * 6537: function getQuery($table, $conf, $returnQueryArray=FALSE)
187 * 6616: function getWhere($table,$conf, $returnQueryArray=FALSE)
188 * 6711: function checkPidArray($listArr)
189 * 6734: function checkPid($uid)
191 * SECTION: Frontend editing functions
192 * 6790: function editPanel($content, $conf, $currentRecord='', $dataArr=array())
193 * 6965: function editIcons($content,$params, $conf=array(), $currentRecord='', $dataArr=array(),$addUrlParamStr='')
194 * 7033: function editPanelLinkWrap($string,$formName,$cmd,$currentRecord='',$confirm='',$nPid='')
195 * 7075: function editPanelLinkWrap_doWrap($string,$url,$currentRecord)
196 * 7103: function editPanelPreviewBorder($table,$row,$content,$thick,$conf=array())
197 * 7125: function isDisabled($table,$row)
200 * 7156: class tslib_frameset
201 * 7166: function make($setup)
202 * 7203: function frameParams($setup, $typeNum)
203 * 7246: function framesetParams($setup)
206 * 7279: class tslib_tableOffset
207 * 7291: function start($content,$offset)
210 * 7369: class tslib_controlTable
211 * 7404: function start($offset,$cMargins)
213 * TOTAL FUNCTIONS: 136
214 * (This index is automatically created/updated by the extension "extdeveval")
219 // Includes this class since it is used for parsing HTML
220 require_once(PATH_t3lib
."class.t3lib_parsehtml.php");
222 // Object TypoScript library included:
223 if(t3lib_extMgm
::isLoaded('obts')) {
224 require_once(t3lib_extMgm
::extPath('obts').'_tsobject/_tso.php');
244 * This class contains all main TypoScript features.
245 * This includes the rendering of TypoScript content objects (cObjects).
246 * Is the backbone of TypoScript Template rendering.
248 * There are lots of functions you can use from your include-scripts.
249 * The class "tslib_cObj" is normally instantiated and referred to as "cObj".
250 * When you call your own PHP-code typically through a USER or USER_INT cObject then it is this class that instantiates the object and calls the main method. Before it does so it will set (if you are using classes) a reference to itself in the internal variable "cObj" of the object. Thus you can access all functions and data from this class by $this->cObj->... from within you classes written to be USER or USER_INT content objects.
252 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
255 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&cHash=4ad9d7acb4
258 var $align = Array ('center', 'right', 'left');
261 * Holds ImageMagick parameters and extensions used for compression
266 * 1= Dont change! (removes all parameters for the image_object!!)
270 var $image_compression = Array(
271 10 => Array('params'=>'', 'ext'=>'gif'),
272 11 => Array('params'=>'-colors 128', 'ext'=>'gif'),
273 12 => Array('params'=>'-colors 64', 'ext'=>'gif'),
274 13 => Array('params'=>'-colors 32', 'ext'=>'gif'),
275 14 => Array('params'=>'-colors 16', 'ext'=>'gif'),
276 15 => Array('params'=>'-colors 8', 'ext'=>'gif'),
278 30 => Array('params'=>'-colors 256', 'ext'=>'png'),
279 31 => Array('params'=>'-colors 128', 'ext'=>'png'),
280 32 => Array('params'=>'-colors 64', 'ext'=>'png'),
281 33 => Array('params'=>'-colors 32', 'ext'=>'png'),
282 34 => Array('params'=>'-colors 16', 'ext'=>'png'),
283 35 => Array('params'=>'-colors 8', 'ext'=>'png'),
284 39 => Array('params'=>'', 'ext'=>'png'),
286 20 => Array('params'=>'-quality 100', 'ext'=>'jpg'),
287 21 => Array('params'=>'-quality 90', 'ext'=>'jpg'),
288 22 => Array('params'=>'-quality 80', 'ext'=>'jpg'),
289 23 => Array('params'=>'-quality 70', 'ext'=>'jpg'),
290 24 => Array('params'=>'-quality 60', 'ext'=>'jpg'),
291 25 => Array('params'=>'-quality 50', 'ext'=>'jpg'),
292 26 => Array('params'=>'-quality 40', 'ext'=>'jpg'),
293 27 => Array('params'=>'-quality 30', 'ext'=>'jpg'),
294 28 => Array('params'=>'-quality 20', 'ext'=>'jpg')
298 * ImageMagick parameters for image effects
302 var $image_effects = Array(
306 10 => '-colorspace GRAY',
315 * Loaded with the current data-record.
317 * If the instance of this class is used to render records from the database those records are found in this array.
318 * The function stdWrap has TypoScript properties that fetch field-data from this array.
322 var $oldData = Array(); // Used for backup...
323 var $alternativeData =''; // If this is set with an array before stdWrap, it's used instead of $this->data in the data-property in stdWrap
324 var $parameters = Array(); // Used by the parseFunc function and is loaded with tag-parameters when parsing tags.
325 var $currentValKey = 'currentValue_kidjls9dksoje';
326 var $currentRecord = ''; // This is set to the [table]:[uid] of the record delivered in the $data-array, if the cObjects CONTENT or RECORD is in operation. Note that $GLOBALS['TSFE']->currentRecord is set to an equal value but always indicating the latest record rendered.
327 var $currentRecordTotal = 0; // Set in cObj->RECORDS and cObj->CONTENT to the current number of records selected in a query.
328 var $currentRecordNumber = 0; // Incremented in cObj->RECORDS and cObj->CONTENT before each record rendering.
329 var $parentRecordNumber = 0; // Incremented in parent cObj->RECORDS and cObj->CONTENT before each record rendering.
330 var $parentRecord = array(); // If the tslib_cObj was started from CONTENT, RECORD or SEARCHRESULT cObject's this array has two keys, 'data' and 'currentRecord' which indicates the record and data for the parent cObj.
331 var $regObj; // This may be set as a reference to the calling object of eg. cObjGetSingle. Anyway, just use it as you like. It's used in productsLib.inc for example.
334 var $INT_include=0; // Is set to 1 if the instance of this cObj is executed from a PHP_SCRIPT_INT -include script (see pagegen, bottom of document)
335 var $checkPid_cache = Array(); // This is used by checkPid, that checks if pages are accessible. The $checkPid_cache['page_uid'] is set true or false upon this check featuring a caching function for the next request.
336 var $checkPid_badDoktypeList = '255';
337 var $lastTypoLinkUrl=''; // This will be set by typoLink() to the url of the most recent link created.
338 var $lastTypoLinkTarget=''; // DO. link target.
339 var $substMarkerCache=array(); // Caching substituteMarkerArrayCached function
340 var $recordRegister=array(); // Array that registers rendered content elements (or any table) to make sure they are not rendered recursively!
341 var $cObjHookObjectsArr = array(); // Containig hooks for userdefined cObjects
345 * Well, it has to be called manually since it is not a real constructor function.
346 * So after making an instance of the class, call this function and pass to it a database record and the tablename from where the record is from. That will then become the "current" record loaded into memory and accessed by the .fields property found in eg. stdWrap.
348 * @param array $data the record data that is rendered.
349 * @param string $table the table that the data record is from.
352 function start($data,$table='') {
353 global $TYPO3_CONF_VARS;
355 $this->currentRecord
= $table ?
$table.':'.$this->data
['uid'] : '';
356 $this->parameters
= Array();
357 if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClass'])) {
358 foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClass'] as $classArr) {
359 $this->cObjHookObjectsArr
[$classArr[0]] = &t3lib_div
::getUserObj($classArr[1]);
365 * Sets the internal variable parentRecord with information about current record.
366 * If the tslib_cObj was started from CONTENT, RECORD or SEARCHRESULT cObject's this array has two keys, 'data' and 'currentRecord' which indicates the record and data for the parent cObj.
368 * @param array $data: The record array
369 * @param string $currentRecord: This is set to the [table]:[uid] of the record delivered in the $data-array, if the cObjects CONTENT or RECORD is in operation. Note that $GLOBALS['TSFE']->currentRecord is set to an equal value but always indicating the latest record rendered.
373 function setParent($data,$currentRecord) {
374 $this->parentRecord
=array('data'=>$data, 'currentRecord'=>$currentRecord);
384 /***********************************************
388 ***********************************************/
391 * Returns the "current" value.
392 * The "current" value is just an internal variable that can be used by functions to pass a single value on to another function later in the TypoScript processing.
393 * It's like "load accumulator" in the good old C64 days... basically a "register" you can use as you like.
394 * The TSref will tell if functions are setting this value before calling some other object so that you know if it holds any special information.
396 * @return mixed The "current" value
398 function getCurrentVal() {
399 return $this->data
[$this->currentValKey
];
403 * Sets the "current" value.
405 * @param mixed The variable that you want to set as "current"
407 * @see getCurrentVal()
409 function setCurrentVal($value) {
410 $this->data
[$this->currentValKey
] = $value;
414 * Rendering of a "numerical array" of cObjects from TypoScript
415 * Will call ->cObjGetSingle() for each cObject found and accumulate the output.
417 * @param array $setup: Array with cObjects as values.
418 * @param string $addKey: A prefix for the debugging information
419 * @return string Rendered output from the cObjects in the array.
420 * @see cObjGetSingle()
422 function cObjGet($setup,$addKey='') {
423 if (is_array($setup)) {
424 $sKeyArray=t3lib_TStemplate
::sortedKeyList($setup);
426 foreach($sKeyArray as $theKey) {
427 $theValue=$setup[$theKey];
428 if (intval($theKey) && !strstr($theKey,'.')) {
429 $conf=$setup[$theKey.'.'];
430 $content.=$this->cObjGetSingle($theValue,$conf,$addKey.$theKey); // Get the contentObject
438 * Renders a content object
440 * @param string The content object name, eg. "TEXT" or "USER" or "IMAGE"
441 * @param array The array with TypoScript properties for the content object
442 * @param string A string label used for the internal debugging tracking.
443 * @return string cObject output
444 * @example http://typo3.org/doc.0.html?&encryptionKey=&tx_extrepmgm_pi1[extUid]=267&tx_extrepmgm_pi1[tocEl]=153&cHash=7e74f4d331
446 function cObjGetSingle($name,$conf,$TSkey='__') {
448 // Checking that the function is not called eternally. This is done by interrupting at a depth of 100
449 $GLOBALS['TSFE']->cObjectDepthCounter
--;
450 if ($GLOBALS['TSFE']->cObjectDepthCounter
>0) {
452 if ($GLOBALS['TT']->LR
) $GLOBALS['TT']->push($TSkey, $name);
454 // Checking if the COBJ is a reference to another object. (eg. name of 'blabla.blabla = < styles.something')
455 if (substr($name,0,1)=='<') {
456 $key = trim(substr($name,1));
457 $cF = t3lib_div
::makeInstance('t3lib_TSparser');
458 // $name and $conf is loaded with the referenced values.
460 list($name, $conf) = $cF->getVal($key,$GLOBALS['TSFE']->tmpl
->setup
);
461 if (is_array($old_conf) && count($old_conf)) {
462 $conf = $this->joinTSarrays($conf,$old_conf);
465 // Getting the cObject
466 $GLOBALS['TT']->incStackPointer();
467 $content.=$this->cObjGetSingle($name,$conf,$key);
468 $GLOBALS['TT']->decStackPointer();
472 // Application defined cObjects
473 foreach ($this->cObjHookObjectsArr
as $cObjName => $hookObj) {
474 if (($name===$cObjName) && method_exists($hookObj, 'cObjGetSingleExt')) {
475 $content.= $hookObj->cObjGetSingleExt($name, $conf, $TSkey, $this);
479 if (!$hooked && t3lib_extMgm
::isLoaded('obts') && isset($GLOBALS['OBTS']['tso_list'][$name])) {
480 $content.= obts_dtutil
::renderDatatypeContent($name, $GLOBALS['OBTS']['tso_list'][$name], $conf, $this);
481 } elseif (!$hooked) {
482 // Traditional Content Object branching:
486 $content.=$this->COBJ_ARRAY($conf);
489 $content.=$this->COBJ_ARRAY($conf,'INT');
492 $content.=$this->HTML($conf);
495 $content.=$this->TEXT($conf);
498 $content.=$this->CLEARGIF($conf);
501 $content.=$this->FILE($conf);
504 $content.=$this->IMAGE($conf);
507 $content.=$this->IMG_RESOURCE($conf);
510 $content.=$this->IMGTEXT($conf);
513 $content.=$this->CONTENT($conf);
516 $content.=$this->RECORDS($conf);
519 $content.=$this->HMENU($conf);
522 $content.=$this->CTABLE($conf);
525 $content.=$this->OTABLE($conf);
528 $content.=$this->COLUMNS($conf);
531 $content.=$this->HRULER($conf);
534 $content.=$this->CASEFUNC($conf);
536 case 'LOAD_REGISTER':
537 case 'RESTORE_REGISTER':
538 $this->LOAD_REGISTER($conf,$name);
541 $content.=$this->FORM($conf);
544 $content.=$this->SEARCHRESULT($conf);
547 $content.=$this->PHP_SCRIPT($conf);
549 case 'PHP_SCRIPT_EXT':
550 $content.=$this->PHP_SCRIPT($conf,'EXT');
552 case 'PHP_SCRIPT_INT':
553 $content.=$this->PHP_SCRIPT($conf,'INT');
556 $content.=$this->USER($conf);
559 $content.=$this->USER($conf,'INT');
562 $content.=$this->TEMPLATE($conf);
565 if ($GLOBALS['TSFE']->beUserLogin
) {$content.=$this->editPanel($content, $conf);}
568 $content.=$this->MULTIMEDIA($conf);
573 if ($GLOBALS['TT']->LR
) $GLOBALS['TT']->pull($content);
575 // Increasing on exit...
576 $GLOBALS['TSFE']->cObjectDepthCounter++
;
586 /********************************************
588 * Functions rendering content objects (cObjects)
590 ********************************************/
593 * Rendering the cObject, HTML
595 * @param array Array of TypoScript properties
596 * @return string Output
597 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=349&cHash=d3fd0c70b4
599 function HTML($conf) {
600 return $this->stdWrap($conf['value'],$conf['value.']);
604 * Rendering the cObject, TEXT
606 * @param array Array of TypoScript properties
607 * @return string Output
608 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=350&cHash=b49de28f83
610 function TEXT($conf) {
611 return $this->stdWrap($conf['value'],$conf);
615 * Rendering the cObject, CLEARGIF
617 * @param array Array of TypoScript properties
618 * @return string Output
619 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=355&cHash=70c0f19915
621 function CLEARGIF($conf) {
622 $w = $this->stdWrap($conf['width'],$conf['width.']);
623 $h = $this->stdWrap($conf['height'],$conf['height.']);
626 $wrap = $conf['wrap'] ?
$conf['wrap'] : '|<br />';
627 $theValue = $this->wrap('<img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$w.'" height="'.$h.'"'.$this->getBorderAttr(' border="0"').' alt="" title="" />', $wrap);
629 return $this->stdWrap($theValue,$conf['stdWrap.']);
633 * Rendering the cObject, COBJ_ARRAY / COA and COBJ_ARRAY_INT
635 * @param array Array of TypoScript properties
636 * @param string If "INT" then the cObject is a "COBJ_ARRAY_INT" (non-cached), otherwise just "COBJ_ARRAY" (cached)
637 * @return string Output
638 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=351&cHash=a09db0329c
640 function COBJ_ARRAY($conf,$ext='') {
644 $substKey = $ext.'_SCRIPT.'.$GLOBALS['TSFE']->uniqueHash();
645 $content.='<!--'.$substKey.'-->';
646 $GLOBALS['TSFE']->config
[$ext.'incScript'][$substKey] = array(
649 'cObj'=>serialize($this),
654 if ($this->checkIf($conf['if.'])) {
655 $content=$this->cObjGet($conf);
657 $content=$this->wrap($content, $conf['wrap']);
659 if ($conf['stdWrap.']) {
660 $content=$this->stdWrap($content, $conf['stdWrap.']);
669 * Rendering the cObject, USER and USER_INT
671 * @param array Array of TypoScript properties
672 * @param string If "INT" then the cObject is a "USER_INT" (non-cached), otherwise just "USER" (cached)
673 * @return string Output
674 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=369&cHash=b623aca0a9
676 function USER($conf,$ext='') {
680 $substKey = $ext.'_SCRIPT.'.$GLOBALS['TSFE']->uniqueHash();
681 $content.='<!--'.$substKey.'-->';
682 $GLOBALS['TSFE']->config
[$ext.'incScript'][$substKey] = array(
685 'cObj' => serialize($this),
690 $content.=$this->callUserFunction($conf['userFunc'],$conf,'');
697 * Rendering the cObject, FILE
699 * @param array Array of TypoScript properties
700 * @return string Output
701 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=352&cHash=379c60f8bc
703 function FILE($conf) {
704 $theValue = $this->fileResource($this->stdWrap($conf['file'],$conf['file.']), trim($this->getAltParam($conf)));
705 if ($conf['linkWrap']) {
706 $theValue = $this->linkWrap($theValue,$conf['linkWrap']);
708 return $this->wrap($theValue,$conf['wrap']);
712 * Rendering the cObject, IMAGE
714 * @param array Array of TypoScript properties
715 * @return string Output
716 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=353&cHash=440681ea56
719 function IMAGE($conf) {
721 if ($this->checkIf($conf['if.'])) {
722 $theValue = $this->cImage($conf['file'],$conf);
723 if ($conf['stdWrap.']) {
724 $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
731 * Rendering the cObject, IMG_RESOURCE
733 * @param array Array of TypoScript properties
734 * @return string Output
735 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=354&cHash=46f9299706
736 * @see getImgResource()
738 function IMG_RESOURCE($conf) {
739 $imgArray = $this->getImgResource($conf['file'],$conf['file.']);
740 return $this->stdWrap($imgArray[3],$conf['stdWrap.']);
744 * Rendering the cObject, IMGTEXT
746 * @param array Array of TypoScript properties
747 * @return string Output
748 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=363&cHash=cf2969bce1
750 function IMGTEXT($conf) {
752 if (is_array($conf['text.'])) {
753 $content.= $this->stdWrap($this->cObjGet($conf['text.'],'text.'),$conf['text.']); // this gets the surrounding content
755 $imgList=trim($this->stdWrap($conf['imgList'],$conf['imgList.'])); // gets images
757 $imgs = t3lib_div
::trimExplode(',',$imgList);
758 $imgStart = intval($this->stdWrap($conf['imgStart'],$conf['imgStart.']));
760 $imgCount= count($imgs)-$imgStart;
762 $imgMax = intval($this->stdWrap($conf['imgMax'],$conf['imgMax.']));
764 $imgCount = t3lib_div
::intInRange($imgCount,0,$conf['imgMax']); // reduces the number of images.
767 $imgPath = $this->stdWrap($conf['imgPath'],$conf['imgPath.']);
771 if (!$conf['captionSplit'] && !$conf['imageTextSplit'] && is_array($conf['caption.'])) {
772 $caption = $this->stdWrap($this->cObjGet($conf['caption.'], 'caption.'),$conf['caption.']); // global caption, no splitting
776 $position=$this->stdWrap($conf['textPos'],$conf['textPos.']);
778 $tmppos = $position&7;
779 $contentPosition = $position&24;
780 $align = $this->align
[$tmppos];
781 $cap = ($caption)?
1:0;
782 $txtMarg = intval($this->stdWrap($conf['textMargin'],$conf['textMargin.']));
783 if (!$conf['textMargin_outOfText'] && $contentPosition<16) {
787 $cols = intval($this->stdWrap($conf['cols'],$conf['cols.']));
788 $rows = intval($this->stdWrap($conf['rows'],$conf['rows.']));
789 $colspacing = intval($this->stdWrap($conf['colSpace'],$conf['colSpace.']));
790 $rowspacing = intval($this->stdWrap($conf['rowSpace'],$conf['rowSpace.']));
792 $border = intval($this->stdWrap($conf['border'],$conf['border.'])) ?
1:0;
793 $borderColor = $this->stdWrap($conf['borderCol'],$conf['borderCol.']);
794 $borderThickness = intval($this->stdWrap($conf['borderThick'],$conf['borderThick.']));
796 $borderColor=$borderColor?
$borderColor:'black';
797 $borderThickness=$borderThickness?
$borderThickness:1;
799 $caption_align = $this->stdWrap($conf['captionAlign'],$conf['captionAlign.']);
800 if (!$caption_align) {
801 $caption_align = $align;
804 $colCount = ($cols > 1) ?
$cols : 1;
805 if ($colCount > $imgCount) {$colCount = $imgCount;}
806 $rowCount = ($colCount > 1) ?
ceil($imgCount / $colCount) : $imgCount;
810 if ($rowCount > $imgCount) {$rowCount = $imgCount;}
811 $colCount = ($rowCount>1) ?
ceil($imgCount / $rowCount) : $imgCount;
815 $colRelations = trim($this->stdWrap($conf['colRelations'],$conf['colRelations.']));
816 $maxW = intval($this->stdWrap($conf['maxW'],$conf['maxW.']));
818 $maxWInText = intval($this->stdWrap($conf['maxWInText'],$conf['maxWInText.']));
819 if (!$maxWInText) { // If maxWInText is not set, it's calculated to the 50 % of the max...
820 $maxWInText = round($maxW/2);
823 if ($maxWInText && $contentPosition>=16) { // inText
827 if ($maxW && $colCount > 0) { // If there is a max width and if colCount is greater than column
828 /* debug($border*$borderThickness*2);
831 debug(($maxW-$colspacing*($colCount-1)-$colCount*$border*$borderThickness*2));
833 $maxW = ceil(($maxW-$colspacing*($colCount-1)-$colCount*$border*$borderThickness*2)/$colCount);
835 // create the relation between rows
838 $rel_parts = explode(':',$colRelations);
840 for ($a=0;$a<$colCount;$a++
) {
841 $rel_parts[$a] = intval($rel_parts[$a]);
842 $rel_total+
= $rel_parts[$a];
845 for ($a=0;$a<$colCount;$a++
) {
846 $colMaxW[$a] = round(($maxW*$colCount)/$rel_total*$rel_parts[$a]);
848 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.
853 $image_compression = intval($this->stdWrap($conf['image_compression'],$conf['image_compression.']));
854 $image_effects = intval($this->stdWrap($conf['image_effects'],$conf['image_effects.']));
855 $image_frames = intval($this->stdWrap($conf['image_frames.']['key'],$conf['image_frames.']['key.']));
859 $splitArr['imgObjNum']=$conf['imgObjNum'];
860 $splitArr = $GLOBALS['TSFE']->tmpl
->splitConfArray($splitArr,$imgCount);
863 $equalHeight = intval($this->stdWrap($conf['equalH'],$conf['equalH.']));
864 if ($equalHeight) { // Initiate gifbuilder object in order to get dimensions AND calculate the imageWidth's
865 $gifCreator = t3lib_div
::makeInstance('tslib_gifbuilder');
867 $relations = Array();
868 $relations_cols = Array();
869 $totalMaxW = $maxW*$colCount;
870 for($a=0;$a<$imgCount;$a++
) {
871 $imgKey = $a+
$imgStart;
872 $imgInfo = $gifCreator->getImageDimensions($imgPath.$imgs[$imgKey]);
873 $relations[$a] = $imgInfo[1] / $equalHeight; // relationship between the original height and the wished height
874 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.
875 $relations_cols[floor($a/$colCount)] +
= $imgInfo[0]/$relations[$a]; // counts the total width of the row with the new height taken into consideration.
880 $imageRowsFinalWidths = Array(); // contains the width of every image row
881 $imageRowsMaxHeights = Array();
884 for($a=0;$a<$imgCount;$a++
) {
885 $GLOBALS['TSFE']->register
['IMAGE_NUM'] = $a;
887 $imgKey = $a+
$imgStart;
888 $totalImagePath = $imgPath.$imgs[$imgKey];
889 $this->data
[$this->currentValKey
] = $totalImagePath;
890 $imgObjNum = intval($splitArr[$a]['imgObjNum']);
891 $imgConf = $conf[$imgObjNum.'.'];
896 $rowTotalMaxW = $relations_cols[floor($a/$colCount)];
897 if ($rowTotalMaxW > $totalMaxW) {
898 $scale = $rowTotalMaxW / $totalMaxW;
901 // transfer info to the imageObject. Please note, that
902 $imgConf['file.']['height'] = round($equalHeight/$scale);
904 unset($imgConf['file.']['width']);
905 unset($imgConf['file.']['maxW']);
906 unset($imgConf['file.']['maxH']);
907 unset($imgConf['file.']['minW']);
908 unset($imgConf['file.']['minH']);
909 unset($imgConf['file.']['width.']);
910 unset($imgConf['file.']['maxW.']);
911 unset($imgConf['file.']['maxH.']);
912 unset($imgConf['file.']['minW.']);
913 unset($imgConf['file.']['minH.']);
914 $maxW = 0; // setting this to zero, so that it doesn't disturb
918 if (count($colMaxW)) {
919 $imgConf['file.']['maxW'] = $colMaxW[($a%
$colCount)];
921 $imgConf['file.']['maxW'] = $maxW;
925 // Image Object supplied:
926 if (is_array($imgConf)) {
927 if ($this->image_effects
[$image_effects]) {
928 $imgConf['file.']['params'].= ' '.$this->image_effects
[$image_effects];
931 if (is_array($conf['image_frames.'][$image_frames.'.'])) {
932 $imgConf['file.']['m.'] = $conf['image_frames.'][$image_frames.'.'];
935 if ($image_compression && $imgConf['file']!='GIFBUILDER') {
936 if ($image_compression==1) {
937 $tempImport = $imgConf['file.']['import'];
938 $tempImport_dot = $imgConf['file.']['import.'];
939 unset($imgConf['file.']);
940 $imgConf['file.']['import'] = $tempImport;
941 $imgConf['file.']['import.'] = $tempImport_dot;
942 } elseif (isset($this->image_compression
[$image_compression])) {
943 $imgConf['file.']['params'].= ' '.$this->image_compression
[$image_compression]['params'];
944 $imgConf['file.']['ext'] = $this->image_compression
[$image_compression]['ext'];
945 unset($imgConf['file.']['ext.']);
949 // "alt", "title" and "longdesc" attributes:
950 if (!strlen($imgConf['altText']) && !is_array($imgConf['altText.'])) {
951 $imgConf['altText'] = $conf['altText'];
952 $imgConf['altText.'] = $conf['altText.'];
954 if (!strlen($imgConf['titleText']) && !is_array($imgConf['titleText.'])) {
955 $imgConf['titleText'] = $conf['titleText'];
956 $imgConf['titleText.'] = $conf['titleText.'];
958 if (!strlen($imgConf['longdescURL']) && !is_array($imgConf['longdescURL.'])) {
959 $imgConf['longdescURL'] = $conf['longdescURL'];
960 $imgConf['longdescURL.'] = $conf['longdescURL.'];
964 'altText' => $conf['altText'],
965 'titleText' => $conf['titleText'],
966 'longdescURL' => $conf['longdescURL'],
967 'file' => $totalImagePath
971 $imgsTag[$imgKey] = $this->IMAGE($imgConf);
973 // Store the original filepath
974 $origImages[$imgKey]=$GLOBALS['TSFE']->lastImageInfo
;
976 $imageRowsFinalWidths[floor($a/$colCount)] +
= $GLOBALS['TSFE']->lastImageInfo
[0];
977 if ($GLOBALS['TSFE']->lastImageInfo
[1]>$imageRowsMaxHeights[floor($a/$colCount)]) {
978 $imageRowsMaxHeights[floor($a/$colCount)] = $GLOBALS['TSFE']->lastImageInfo
[1];
981 // calculating the tableWidth:
982 // TableWidth problems: It creates problems if the pictures are NOT as wide as the tableWidth.
983 $tableWidth = max($imageRowsFinalWidths)+
$colspacing*($colCount-1) +
$colCount*$border*$borderThickness*2;
985 // make table for pictures
988 $noRows = $this->stdWrap($conf['noRows'],$conf['noRows.']);
989 $noCols = $this->stdWrap($conf['noCols'],$conf['noCols.']);
990 if ($noRows) {$noCols=0;} // noRows overrides noCols. They cannot exist at the same time.
997 $colCount_temp=$colCount;
999 $rowCount_temp = $rowCount;
1005 // col- and rowspans calculated
1006 $colspan = (($colspacing) ?
$colCount*2-1 : $colCount);
1007 $rowspan = (($rowspacing) ?
$rowCount*2-1 : $rowCount) +
$cap;
1011 $editIconsHTML = $conf['editIcons']&&$GLOBALS['TSFE']->beUserLogin ?
$this->editIcons('',$conf['editIcons'],$conf['editIcons.']) : '';
1013 // strech out table:
1016 if ($conf['noStretchAndMarginCells']!=1) {
1018 if ($txtMarg && $align=='right') { // If right aligned, the textborder is added on the right side
1019 $tablecode.='<td rowspan="'.($rowspan+
1).'" valign="top"><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$txtMarg.'" height="1" alt="" title="" />'.($editIconsHTML?
'<br />'.$editIconsHTML:'').'</td>';
1023 $tablecode.='<td colspan="'.$colspan.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$tableWidth.'" height="1" alt="" /></td>';
1024 if ($txtMarg && $align=='left') { // If left aligned, the textborder is added on the left side
1025 $tablecode.='<td rowspan="'.($rowspan+
1).'" valign="top"><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$txtMarg.'" height="1" alt="" title="" />'.($editIconsHTML?
'<br />'.$editIconsHTML:'').'</td>';
1029 if ($flag) $tableWidth+
=$txtMarg+
1;
1031 $tablecode.='</tr>';
1035 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!
1036 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.
1037 $tablecode.='<tr><td colspan="'.$colspan.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="1" height="'.$rowspacing.'"'.$this->getBorderAttr(' border="0"').' alt="" title="" /></td></tr>';
1039 $tablecode.='<tr>'; // starting row
1040 for ($b=0; $b<$colCount_temp; $b++
) { // Looping through the columns
1041 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.
1043 $tablecode.='<td><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$colspacing.'" height="1"'.$this->getBorderAttr(' border="0"').' alt="" title="" /></td>';
1045 $colSpacer='<img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.($border?
$colspacing-6:$colspacing).'" height="'.($imageRowsMaxHeights[$c]+
($border?
$borderThickness*2:0)).'"'.$this->getBorderAttr(' border="0"').' align="'.($border?
'left':'top').'" alt="" title="" />';
1046 $colSpacer='<td valign="top">'.$colSpacer.'</td>'; // added 160301, needed for the new "noCols"-table...
1047 $tablecode.=$colSpacer;
1050 if (!$noCols ||
($noCols && !$b)) {
1051 $tablecode.='<td valign="top">'; // starting the cell. If "noCols" this cell will hold all images in the row, otherwise only a single image.
1052 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.
1054 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.
1055 $GLOBALS['TSFE']->register
['IMAGE_NUM'] = $imgIndex; // register previous imgIndex
1056 $imgIndex = $index+
$a*$colCount_temp;
1057 if ($imgsTag[$imgIndex]) {
1058 if ($rowspacing && $noRows && $a) { // Puts distance between the images IF "noRows" is set and this is the first iteration of the loop
1059 $tablecode.= '<img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="1" height="'.$rowspacing.'" alt="" title="" /><br />';
1061 if ($conf['captionSplit'] ||
$conf['imageTextSplit']) {
1062 $thisCaption = $this->stdWrap($this->cObjGet($conf['caption.'], 'caption.'), $conf['caption.']);
1064 $imageHTML = $imgsTag[$imgIndex].'<br />';
1065 $Talign = (!trim($thisCaption) && !$noRows && !$conf['netprintApplicationLink']) ?
' align="left"' : ''; // this is necessary if the tablerows are supposed to space properly together! "noRows" is excluded because else the images "layer" together.
1066 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...)
1067 $imageHTML.=$editIconsHTML; $editIconsHTML='';
1068 if ($conf['netprintApplicationLink']) {$imageHTML = $this->netprintApplication_offsiteLinkWrap($imageHTML,$origImages[$imgIndex],$conf['netprintApplicationLink.']);}
1069 $imageHTML.=$thisCaption; // Adds caption.
1070 if ($noCols) {$imageHTML='<td valign="top">'.$imageHTML.'</td>';} // If noCols, put in table cell.
1071 $tablecode.=$imageHTML;
1075 if (!$noCols ||
($noCols && $b+
1==$colCount_temp)) {
1076 if ($noCols) {$tablecode.='</tr></table>';} // In case of "noCols" we must finish the table that surrounds the images in the row.
1077 $tablecode.='</td>'; // Ending the cell. In case of "noCols" the cell holds all pictures!
1080 $tablecode.='</tr>'; // ending row
1083 switch ($contentPosition) {
1086 switch ($align) { // These settings are needed for Firefox
1088 $table_align = 'margin-left: auto; margin-right: auto';
1091 $table_align = 'margin-left: auto; margin-right: 0px';
1093 default: // Most of all: left
1094 $table_align = 'margin-left: 0px; margin-right: auto';
1096 $table_align = 'style="'.$table_align.'"';
1098 case '16': // in text
1099 $table_align = 'align="'.$align.'"';
1105 // Table-tag is inserted
1106 $tablecode = '<table'.($tableWidth?
' width="'.$tableWidth.'"':'').' border="0" cellspacing="0" cellpadding="0" '.$table_align.' class="imgtext-table">'.$tablecode;
1107 if ($editIconsHTML) { // IF this value is not long since reset.
1108 $tablecode.='<tr><td colspan="'.$colspan.'">'.$editIconsHTML.'</td></tr>';
1112 $tablecode.='<tr><td colspan="'.$colspan.'" align="'.$caption_align.'">'.$caption.'</td></tr>';
1114 $tablecode.='</table>';
1115 if ($conf['tableStdWrap.']) {$tablecode=$this->stdWrap($tablecode,$conf['tableStdWrap.']);}
1118 $spaceBelowAbove = intval($this->stdWrap($conf['spaceBelowAbove'],$conf['spaceBelowAbove.']));
1119 switch ($contentPosition) {
1121 $output= '<div style="text-align:'.$align.';">'.$tablecode.'</div>'.$this->wrapSpace($content, $spaceBelowAbove.'|0');
1124 $output= $this->wrapSpace($content, '0|'.$spaceBelowAbove).'<div style="text-align:'.$align.';">'.$tablecode.'</div>';
1126 case '16': // in text
1127 $output= $tablecode.$content;
1129 case '24': // in text, no wrap
1131 $theResult.= '<table border="0" cellspacing="0" cellpadding="0" class="imgtext-nowrap"><tr>';
1132 if ($align=='right') {
1133 $theResult.= '<td valign="top">'.$content.'</td><td valign="top">'.$tablecode.'</td>';
1135 $theResult.= '<td valign="top">'.$tablecode.'</td><td valign="top">'.$content.'</td>';
1137 $theResult.= '</tr></table>';
1138 $output= $theResult;
1145 if ($conf['stdWrap.']) {
1146 $output = $this->stdWrap($output, $conf['stdWrap.']);
1153 * Rendering the cObject, CONTENT
1155 * @param array Array of TypoScript properties
1156 * @return string Output
1157 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=356&cHash=9f3b5c6ba2
1159 function CONTENT($conf) {
1162 $originalRec = $GLOBALS['TSFE']->currentRecord
;
1163 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!!
1164 $GLOBALS['TSFE']->recordRegister
[$originalRec]++
;
1167 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_') {
1169 $renderObjName = $conf['renderObj'] ?
$conf['renderObj'] : '<'.$conf['table'];
1170 $renderObjKey = $conf['renderObj'] ?
'renderObj' : '';
1171 $renderObjConf = $conf['renderObj.'];
1173 $slide = intval($conf['slide'])?
intval($conf['slide']):0;
1174 $slideCollect = intval($conf['slide.']['collect'])?
intval($conf['slide.']['collect']):0;
1175 $slideCollectReverse = intval($conf['slide.']['collectReverse'])?
true:false;
1176 $slideCollectFuzzy = $slideCollect?
(intval($conf['slide.']['collectFuzzy'])?
true:false):true;
1180 $res = $this->exec_getQuery($conf['table'],$conf['select.']);
1181 if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
1182 $GLOBALS['TT']->setTSlogMessage($error,3);
1184 $this->currentRecordTotal
= $GLOBALS['TYPO3_DB']->sql_num_rows($res);
1185 $GLOBALS['TT']->setTSlogMessage('NUMROWS: '.$GLOBALS['TYPO3_DB']->sql_num_rows($res));
1186 $cObj =t3lib_div
::makeInstance('tslib_cObj');
1187 $cObj->setParent($this->data
,$this->currentRecord
);
1188 $this->currentRecordNumber
=0;
1190 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
1192 // Versioning preview:
1193 $GLOBALS['TSFE']->sys_page
->versionOL($conf['table'],$row);
1195 // Language Overlay:
1196 if (is_array($row) && $GLOBALS['TSFE']->sys_language_contentOL
) {
1197 $row = $GLOBALS['TSFE']->sys_page
->getRecordOverlay($conf['table'],$row,$GLOBALS['TSFE']->sys_language_content
,$GLOBALS['TSFE']->sys_language_contentOL
);
1200 if (is_array($row)) { // Might be unset in the sys_language_contentOL
1201 if (!$GLOBALS['TSFE']->recordRegister
[$conf['table'].':'.$row['uid']]) {
1202 $this->currentRecordNumber++
;
1203 $cObj->parentRecordNumber
= $this->currentRecordNumber
;
1204 $GLOBALS['TSFE']->currentRecord
= $conf['table'].':'.$row['uid'];
1205 $this->lastChanged($row['tstamp']);
1206 $cObj->start($row,$conf['table']);
1207 $tmpValue = $cObj->cObjGetSingle($renderObjName, $renderObjConf, $renderObjKey);
1208 $cobjValue .= $tmpValue;
1209 }# else debug($GLOBALS['TSFE']->recordRegister,'CONTENT');
1213 if ($slideCollectReverse) {
1214 $theValue = $cobjValue.$theValue;
1216 $theValue .= $cobjValue;
1218 if ($slideCollect>0) {
1225 $conf['select.']['pidInList'] = $this->getSlidePids($conf['select.']['pidInList'], $conf['select.']['pidInList.']);
1226 $again = strlen($conf['select.']['pidInList'])?
true:false;
1228 } while ($again&&(($slide&&!strlen($tmpValue)&&$slideCollectFuzzy)||
($slide&&$slideCollect)));
1231 $theValue = $this->wrap($theValue,$conf['wrap']);
1232 if ($conf['stdWrap.']) $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
1234 $GLOBALS['TSFE']->currentRecord
= $originalRec; // Restore
1239 * Rendering the cObject, RECORDS
1241 * @param array Array of TypoScript properties
1242 * @return string Output
1243 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=357&cHash=303e959472
1245 function RECORDS($conf) {
1248 $originalRec = $GLOBALS['TSFE']->currentRecord
;
1249 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!!
1250 $GLOBALS['TSFE']->recordRegister
[$originalRec]++
;
1253 $conf['source'] = $this->stdWrap($conf['source'],$conf['source.']);
1254 if ($conf['tables'] && $conf['source']) {
1255 $allowedTables = $conf['tables'];
1256 if (is_array($conf['conf.'])) {
1257 reset($conf['conf.']);
1258 while(list($k)=each($conf['conf.'])) {
1259 if (substr($k,-1)!='.') $allowedTables.=','.$k;
1263 $loadDB = t3lib_div
::makeInstance('FE_loadDBGroup');
1264 $loadDB->start($conf['source'], $allowedTables);
1265 reset($loadDB->tableArray
);
1266 while(list($table,)=each($loadDB->tableArray
)) {
1267 if (is_array($GLOBALS['TCA'][$table])) {
1268 $loadDB->additionalWhere
[$table]=$this->enableFields($table);
1271 $loadDB->getFromDB();
1273 reset($loadDB->itemArray
);
1274 $data = $loadDB->results
;
1276 $cObj =t3lib_div
::makeInstance('tslib_cObj');
1277 $cObj->setParent($this->data
,$this->currentRecord
);
1278 $this->currentRecordNumber
=0;
1279 $this->currentRecordTotal
= count($loadDB->itemArray
);
1280 reset($loadDB->itemArray
);
1281 while(list(,$val)=each($loadDB->itemArray
)) {
1282 $row = $data[$val['table']][$val['id']];
1284 // Versioning preview:
1285 $GLOBALS['TSFE']->sys_page
->versionOL($val['table'],$row);
1287 // Language Overlay:
1288 if (is_array($row) && $GLOBALS['TSFE']->sys_language_contentOL
) {
1289 $row = $GLOBALS['TSFE']->sys_page
->getRecordOverlay($val['table'],$row,$GLOBALS['TSFE']->sys_language_content
,$GLOBALS['TSFE']->sys_language_contentOL
);
1292 if (is_array($row)) { // Might be unset in the content overlay things...
1293 if (!$conf['dontCheckPid']) {
1294 $row = $this->checkPid($row['pid']) ?
$row : '';
1296 if ($row && !$GLOBALS['TSFE']->recordRegister
[$val['table'].':'.$val['id']]) {
1297 $renderObjName = $conf['conf.'][$val['table']] ?
$conf['conf.'][$val['table']] : '<'.$val['table'];
1298 $renderObjKey = $conf['conf.'][$val['table']] ?
'conf.'.$val['table'] : '';
1299 $renderObjConf = $conf['conf.'][$val['table'].'.'];
1300 $this->currentRecordNumber++
;
1301 $cObj->parentRecordNumber
=$this->currentRecordNumber
;
1302 $GLOBALS['TSFE']->currentRecord
= $val['table'].':'.$val['id'];
1303 $this->lastChanged($row['tstamp']);
1304 $cObj->start($row,$val['table']);
1305 $tmpValue = $cObj->cObjGetSingle($renderObjName, $renderObjConf, $renderObjKey);
1306 $theValue .= $tmpValue;
1307 }# else debug($GLOBALS['TSFE']->recordRegister,'RECORDS');
1311 if ($conf['wrap']) $theValue = $this->wrap($theValue,$conf['wrap']);
1312 if ($conf['stdWrap.']) $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
1314 $GLOBALS['TSFE']->currentRecord
= $originalRec; // Restore
1319 * Rendering the cObject, HMENU
1321 * @param array Array of TypoScript properties
1322 * @return string Output
1323 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=358&cHash=5400c1c06a
1325 function HMENU($conf) {
1327 if ($this->checkIf($conf['if.'])) {
1328 $cls = strtolower($conf[1]);
1329 if (t3lib_div
::inList($GLOBALS['TSFE']->tmpl
->menuclasses
,$cls)) {
1330 if ($conf['special.']['value.']) {
1331 $conf['special.']['value'] = $this->stdWrap($conf['special.']['value'], $conf['special.']['value.']);
1333 $GLOBALS['TSFE']->register
['count_HMENU']++
;
1334 $GLOBALS['TSFE']->register
['count_HMENU_MENUOBJ']=0;
1335 $GLOBALS['TSFE']->applicationData
['GMENU_LAYERS']['WMid']=array();
1336 $GLOBALS['TSFE']->applicationData
['GMENU_LAYERS']['WMparentId']=array();
1338 $menu = t3lib_div
::makeInstance('tslib_'.$cls);
1339 $menu->parent_cObj
= $this;
1340 $menu->start($GLOBALS['TSFE']->tmpl
, $GLOBALS['TSFE']->sys_page
, '', $conf, 1);
1342 $content.=$menu->writeMenu();
1344 if ($conf['wrap']) $content=$this->wrap($content, $conf['wrap']);
1345 if ($conf['stdWrap.']) $content = $this->stdWrap($content, $conf['stdWrap.']);
1351 * Rendering the cObject, CTABLE
1353 * @param array Array of TypoScript properties
1354 * @return string Output
1355 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=359&cHash=2e0065b4e7
1357 function CTABLE ($conf) {
1358 $controlTable = t3lib_div
::makeInstance('tslib_controlTable');
1359 if ($conf['tableParams']) {
1360 $controlTable->tableParams
= $conf['tableParams'];
1362 // loads the pagecontent
1363 $controlTable->contentW
= $conf['cWidth'];
1364 // loads the menues if any
1365 if (is_array($conf['c.'])) {
1366 $controlTable->content
= $this->cObjGet($conf['c.'],'c.');
1367 $controlTable->contentTDparams
= isset($conf['c.']['TDParams']) ?
$conf['c.']['TDParams'] : 'valign="top"';
1369 if (is_array($conf['lm.'])) {
1370 $controlTable->lm
= $this->cObjGet($conf['lm.'],'lm.');
1371 $controlTable->lmTDparams
= isset($conf['lm.']['TDParams']) ?
$conf['lm.']['TDParams'] : 'valign="top"';
1373 if (is_array($conf['tm.'])) {
1374 $controlTable->tm
= $this->cObjGet($conf['tm.'],'tm.');
1375 $controlTable->tmTDparams
= isset($conf['tm.']['TDParams']) ?
$conf['tm.']['TDParams'] : 'valign="top"';
1377 if (is_array($conf['rm.'])) {
1378 $controlTable->rm
= $this->cObjGet($conf['rm.'],'rm.');
1379 $controlTable->rmTDparams
= isset($conf['rm.']['TDParams']) ?
$conf['rm.']['TDParams'] : 'valign="top"';
1381 if (is_array($conf['bm.'])) {
1382 $controlTable->bm
= $this->cObjGet($conf['bm.'],'bm.');
1383 $controlTable->bmTDparams
= isset($conf['bm.']['TDParams']) ?
$conf['bm.']['TDParams'] : 'valign="top"';
1385 return $controlTable->start($conf['offset'],$conf['cMargins']);
1389 * Rendering the cObject, OTABLE
1391 * @param array Array of TypoScript properties
1392 * @return string Output
1393 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=360&cHash=02c9552d38
1395 function OTABLE ($conf) {
1396 $controlTable = t3lib_div
::makeInstance('tslib_tableOffset');
1397 if ($conf['tableParams']) {
1398 $controlTable->tableParams
= $conf['tableParams'];
1400 return $controlTable->start($this->cObjGet($conf),$conf['offset']);
1404 * Rendering the cObject, COLUMNS
1406 * @param array Array of TypoScript properties
1407 * @return string Output
1408 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=361&cHash=7e4e228cad
1410 function COLUMNS ($conf) {
1412 if (is_array($conf) && $this->checkIf($conf['if.'])) {
1414 $tableParams = $conf['tableParams'] ?
' '.$conf['tableParams'] : ' border="0" cellspacing="0" cellpadding="0"';
1415 $TDparams = $conf['TDparams'] ?
' '.$conf['TDparams']:' valign="top"';
1416 $rows = t3lib_div
::intInRange($conf['rows'],2,20);
1417 $totalWidth = intval($conf['totalWidth']);
1422 'gapWidth' => $this->stdWrap($conf['gapWidth'],$conf['gapWidth.']),
1423 'gapBgCol' => $this->stdWrap($conf['gapBgCol'],$conf['gapBgCol.']),
1424 'gapLineThickness' => $this->stdWrap($conf['gapLineThickness'],$conf['gapLineThickness.']),
1425 'gapLineCol' => $this->stdWrap($conf['gapLineCol'],$conf['gapLineCol.'])
1427 $gapData = $GLOBALS['TSFE']->tmpl
->splitConfArray($gapData,$rows-1);
1429 while(list(,$val)=each($gapData)) {
1430 $totalGapWidth+
=intval($val['gapWidth']);
1434 $columnWidth = ceil(($totalWidth-$totalGapWidth)/$rows);
1435 $TDparams.=' width="'.$columnWidth.'"';
1436 $tableParams.=' width="'.$totalWidth.'"';
1438 $TDparams.=' width="'.floor(100/$rows).'%"';
1439 $tableParams.=' width="100%"';
1442 for ($a=1;$a<=$rows;$a++
) {
1444 $content.='<td'.$TDparams.'>';
1445 $content.=$this->cObjGetSingle($conf[$a],$conf[$a.'.'], $a);
1448 $gapConf = $gapData[($a-1)];
1449 $gapWidth = intval($gapConf['gapWidth']);
1451 $tdPar = $gapConf['gapBgCol'] ?
' bgcolor="'.$gapConf['gapBgCol'].'"' : '';
1452 $gapLine = intval($gapConf['gapLineThickness']);
1454 $gapSurround = t3lib_div
::intInRange(($gapWidth-$gapLine)/2, 1, 1000);
1456 $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$gapSurround.'" height="1" alt="" title="" /></td>';
1459 $GtdPar = $gapConf['gapLineCol'] ?
' bgcolor="'.$gapConf['gapLineCol'].'"' : ' bgcolor="black"';
1460 $content.='<td'.$GtdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$gapLine.'" height="1" alt="" title="" /></td>';
1463 $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$gapSurround.'" height="1" alt="" title="" /></td>';
1466 $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$gapWidth.'" height="1" alt="" title="" /></td>';
1472 $content='<tr>'.$content.'</tr>';
1473 $content='<table'.$tableParams.'>'.$content.'</table>';
1474 $content.=$this->cObjGetSingle($conf['after'],$conf['after.'], 'after');
1475 if ($conf['stdWrap.']) {
1476 $content = $this->stdWrap($content,$conf['stdWrap.']);
1483 * Rendering the cObject, HRULER
1485 * @param array Array of TypoScript properties
1486 * @return string Output
1487 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=362&cHash=2a462aa084
1489 function HRULER ($conf) {
1490 $lineThickness = t3lib_div
::intInRange($this->stdWrap($conf['lineThickness'],$conf['lineThickness.']),1,50);
1491 $lineColor = $conf['lineColor'] ?
$conf['lineColor'] : 'black';
1492 $spaceBefore = intval($conf['spaceLeft']);
1493 $spaceAfter = intval($conf['spaceRight']);
1494 $tableWidth = $conf['tableWidth'] ?
$conf['tableWidth'] : '99%';
1497 $content.='<table border="0" cellspacing="0" cellpadding="0" width="'.htmlspecialchars($tableWidth).'"><tr>';
1498 if ($spaceBefore) {$content.='<td width="1"><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$spaceBefore.'" height="1" alt="" title="" /></td>'; }
1499 $content.='<td bgcolor="'.$lineColor.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="1" height="'.$lineThickness.'" alt="" title="" /></td>';
1500 if ($spaceAfter) {$content.='<td width="1"><img src="'.$GLOBALS['TSFE']->absRefPrefix
.'clear.gif" width="'.$spaceAfter.'" height="1" alt="" title="" /></td>'; }
1501 $content.='</tr></table>';
1503 $content = $this->stdWrap($content, $conf['stdWrap.']);
1508 * Rendering the cObject, CASE
1510 * @param array Array of TypoScript properties
1511 * @return string Output
1512 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=364&cHash=cffedd09e3
1514 function CASEFUNC ($conf){
1516 if ($this->checkIf($conf['if.'])) {
1517 if ($conf['setCurrent'] ||
$conf['setCurrent.']){$this->data
[$this->currentValKey
] = $this->stdWrap($conf['setCurrent'], $conf['setCurrent.']);}
1518 $key = $this->stdWrap($conf['key'],$conf['key.']);
1519 $key = strlen($conf[$key]) ?
$key : 'default';
1520 $name = $conf[$key];
1521 $theValue = $this->cObjGetSingle($name,$conf[$key.'.'], $key);
1522 if ($conf['stdWrap.']) {
1523 $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
1530 * Rendering the cObject, LOAD_REGISTER and RESTORE_REGISTER
1531 * NOTICE: This cObject does NOT return any content since it just sets internal data based on the TypoScript properties.
1533 * @param array Array of TypoScript properties
1534 * @param string If "RESTORE_REGISTER" then the cObject rendered is "RESTORE_REGISTER", otherwise "LOAD_REGISTER"
1535 * @return string Empty string (the cObject only sets internal data!)
1536 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=365&cHash=4935524e2e
1537 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=366&cHash=4f9485e8cc
1539 function LOAD_REGISTER($conf,$name) {
1540 if ($name=='RESTORE_REGISTER') {
1541 $GLOBALS['TSFE']->register
= array_pop($GLOBALS['TSFE']->registerStack
);
1543 array_push($GLOBALS['TSFE']->registerStack
,$GLOBALS['TSFE']->register
);
1544 if (is_array($conf)) {
1546 while(list($theKey,$theValue)=each($conf)) {
1547 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
1548 if (strstr($theKey,'.')) {
1549 $theKey = substr($theKey,0,-1);
1551 $GLOBALS['TSFE']->register
[$theKey] = $this->stdWrap($conf[$theKey],$conf[$theKey.'.']);
1560 * Rendering the cObject, FORM
1562 * Note on $formData:
1563 * In the optional $formData array each entry represents a line in the ordinary setup.
1564 * In those entries each entry (0,1,2...) represents a space normally divided by the '|' line.
1566 * $formData [] = array('Name:', 'name=input, 25 ', 'Default value....');
1567 * $formData [] = array('Email:', 'email=input, 25 ', 'Default value for email....');
1569 * - corresponds to the $conf['data'] value being :
1570 * Name:|name=input, 25 |Default value....||Email:|email=input, 25 |Default value for email....
1572 * If $formData is an array the value of $conf['data'] is ignored.
1574 * @param array Array of TypoScript properties
1575 * @param array Alternative formdata overriding whatever comes from TypoScript
1576 * @return string Output
1577 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=367&cHash=bbc518d930
1579 function FORM($conf,$formData='') {
1581 if (is_array($formData)) {
1582 $dataArr = $formData;
1584 $data=$this->stdWrap($conf['data'],$conf['data.']);
1587 // Getting the original config
1589 $data = ereg_replace(chr(10),'||',$data);
1590 $dataArr = explode('||',$data);
1592 // Adding the new dataArray config form:
1593 if (is_array($conf['dataArray.'])) { // dataArray is supplied
1594 $sKeyArray = t3lib_TStemplate
::sortedKeyList($conf['dataArray.'], TRUE);
1595 foreach($sKeyArray as $theKey) {
1596 $dAA = $conf['dataArray.'][$theKey.'.'];
1597 if (is_array($dAA)) {
1599 list($temp[0])= explode('|',$dAA['label.'] ?
$this->stdWrap($dAA['label'],$dAA['label.']) : $dAA['label']);
1600 list($temp[1])= explode('|',$dAA['type']);
1601 if ($dAA['required']) {$temp[1]='*'.$temp[1];}
1602 list($temp[2])= explode('|',$dAA['value.'] ?
$this->stdWrap($dAA['value'],$dAA['value.']) : $dAA['value']);
1603 // If value Array is set, then implode those values.
1604 if (is_array($dAA['valueArray.'])) {
1605 reset($dAA['valueArray.']);
1606 $temp_accum = array();
1607 while(list($dAKey_vA,$dAA_vA)=each($dAA['valueArray.'])) {
1608 if (is_array($dAA_vA) && !strcmp(intval($dAKey_vA).'.',$dAKey_vA)) {
1610 list($temp_vA[0])= explode('=',$dAA_vA['label.'] ?
$this->stdWrap($dAA_vA['label'],$dAA_vA['label.']) : $dAA_vA['label']);
1611 if ($dAA_vA['selected']) {$temp_vA[0]='*'.$temp_vA[0];}
1612 list($temp_vA[1])= explode(',',$dAA_vA['value']);
1614 $temp_accum[] = implode('=',$temp_vA);
1616 $temp[2] = implode(',',$temp_accum);
1618 list($temp[3])= explode('|',$dAA['specialEval.'] ?
$this->stdWrap($dAA['specialEval'],$dAA['specialEval.']) : $dAA['specialEval']);
1620 // adding the form entry to the dataArray
1621 $dataArr[] = implode('|',$temp);
1627 $attachmentCounter = '';
1629 $fieldlist = Array();
1630 $propertyOverride = Array();
1631 $fieldname_hashArray = Array();
1634 $xhtmlStrict = t3lib_div
::inList('xhtml_strict,xhtml_11,xhtml_2',$GLOBALS['TSFE']->xhtmlDoctype
);
1636 if ($conf['formName']) {
1637 $formname = $this->cleanFormName($conf['formName']);
1639 $formname = $GLOBALS['TSFE']->uniqueHash();
1640 $formname = 'a'.$formname; // form name has to start with a letter to reach XHTML compliance
1643 if (isset($conf['fieldPrefix'])) {
1644 if ($conf['fieldPrefix']) {
1645 $prefix = $this->cleanFormName($conf['fieldPrefix']);
1650 $prefix = $formname;
1653 foreach($dataArr as $val) {
1657 if (is_array($formData)) {
1659 $val = 1; // true...
1662 $parts = explode('|',$val);
1664 if ($val && strcspn($val,'#/')) {
1666 $confData['label'] = trim($parts[0]);
1668 $fParts = explode(',',$parts[1]);
1669 $fParts[0]=trim($fParts[0]);
1670 if (substr($fParts[0],0,1)=='*') {
1671 $confData['required']=1;
1672 $fParts[0] = substr($fParts[0],1);
1674 $typeParts = explode('=',$fParts[0]);
1675 $confData['type'] = trim(strtolower(end($typeParts)));
1676 if (count($typeParts)==1) {
1677 $confData['fieldname'] = $this->cleanFormName($parts[0]);
1678 if (strtolower(ereg_replace('[^[:alnum:]]','',$confData['fieldname']))=='email') {$confData['fieldname']='email';}
1679 // Duplicate fieldnames resolved
1680 if (isset($fieldname_hashArray[md5($confData['fieldname'])])) {
1681 $confData['fieldname'].='_'.$cc;
1683 $fieldname_hashArray[md5($confData['fieldname'])]=$confData['fieldname'];
1684 // Attachment names...
1685 if ($confData['type']=='file') {
1686 $confData['fieldname']='attachment'.$attachmentCounter;
1687 $attachmentCounter=intval($attachmentCounter)+
1;
1690 $confData['fieldname'] = str_replace(' ','_',trim($typeParts[0]));
1694 if ($conf['wrapFieldName']) {
1695 $confData['fieldname'] = $this->wrap($confData['fieldname'],$conf['wrapFieldName']);
1698 // Set field name as current:
1699 $this->setCurrentVal($confData['fieldname']);
1701 // Additional parameters
1702 if (trim($confData['type'])) {
1703 $addParams=trim($conf['params']);
1704 if (is_array($conf['params.']) && isset($conf['params.'][$confData['type']])) {
1705 $addParams=trim($conf['params.'][$confData['type']]);
1707 if (strcmp('',$addParams)) $addParams=' '.$addParams;
1708 } else $addParams='';
1710 if ($conf['dontMd5FieldNames']) {
1711 $fName = $confData['fieldname'];
1713 $fName = md5($confData['fieldname']);
1716 // Accessibility: Set id = fieldname attribute:
1717 if ($conf['accessibility'] ||
$xhtmlStrict) {
1718 $elementIdAttribute = ' id="'.$prefix.$fName.'"';
1720 $elementIdAttribute = '';
1723 // Create form field based on configuration/type:
1724 switch($confData['type']) {
1726 $cols=trim($fParts[1]) ?
intval($fParts[1]) : 20;
1727 $compWidth = doubleval($conf['compensateFieldWidth'] ?
$conf['compensateFieldWidth'] : $GLOBALS['TSFE']->compensateFieldWidth
);
1728 $compWidth = $compWidth ?
$compWidth : 1;
1729 $cols = t3lib_div
::intInRange($cols*$compWidth, 1, 120);
1731 $rows=trim($fParts[2]) ? t3lib_div
::intInRange($fParts[2],1,30) : 5;
1732 $wrap=trim($fParts[3]);
1733 if ($conf['noWrapAttr'] ||
$wrap === 'disabled') {
1736 $wrap = $wrap ?
' wrap="'.$wrap.'"' : ' wrap="virtual"';
1738 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], str_replace('\n',chr(10),trim($parts[2])));
1739 $fieldCode=sprintf('<textarea name="%s"%s cols="%s" rows="%s"%s%s>%s</textarea>',
1740 $confData['fieldname'], $elementIdAttribute, $cols, $rows, $wrap, $addParams, t3lib_div
::formatForTextarea($default));
1744 $size=trim($fParts[1]) ?
intval($fParts[1]) : 20;
1745 $compWidth = doubleval($conf['compensateFieldWidth'] ?
$conf['compensateFieldWidth'] : $GLOBALS['TSFE']->compensateFieldWidth
);
1746 $compWidth = $compWidth ?
$compWidth : 1;
1747 $size = t3lib_div
::intInRange($size*$compWidth, 1, 120);
1748 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], trim($parts[2]));
1750 if ($confData['type']=='password') {
1754 $max=trim($fParts[2]) ?
' maxlength="'.t3lib_div
::intInRange($fParts[2],1,1000).'"' : "";
1755 $theType = $confData['type']=='input' ?
'text' : 'password';
1757 $fieldCode=sprintf('<input type="%s" name="%s"%s size="%s"%s value="%s"%s />',
1758 $theType, $confData['fieldname'], $elementIdAttribute, $size, $max, htmlspecialchars($default), $addParams);
1762 $size=trim($fParts[1]) ? t3lib_div
::intInRange($fParts[1],1,60) : 20;
1763 $fieldCode=sprintf('<input type="file" name="%s"%s size="%s"%s />',
1764 $confData['fieldname'], $elementIdAttribute, $size, $addParams);
1767 // alternative default value:
1768 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], trim($parts[2]));
1769 $checked = $default ?
' checked="checked"' : '';
1770 $fieldCode=sprintf('<input type="checkbox" value="%s" name="%s"%s%s%s />',
1771 1, $confData['fieldname'], $elementIdAttribute, $checked, $addParams);
1775 $valueParts = explode(',',$parts[2]);
1777 if (strtolower(trim($fParts[1]))=='auto') {$fParts[1]=count($valueParts);} // Auto size set here. Max 20
1778 $size=trim($fParts[1]) ? t3lib_div
::intInRange($fParts[1],1,20) : 1;
1780 $multiple = strtolower(trim($fParts[2]))=='m' ?
' multiple="multiple"' : '';
1782 $items=array(); // Where the items will be
1783 $defaults=array(); //RTF
1784 $pCount = count($valueParts);
1785 for($a=0;$a<$pCount;$a++
) {
1786 $valueParts[$a]=trim($valueParts[$a]);
1787 if (substr($valueParts[$a],0,1)=='*') { // Finding default value
1789 $valueParts[$a] = substr($valueParts[$a],1);
1792 $subParts=explode('=',$valueParts[$a]);
1793 $subParts[1] = (isset($subParts[1])?
trim($subParts[1]):trim($subParts[0])); // Sets the value
1794 $items[] = $subParts; // Adds the value/label pair to the items-array
1795 if ($sel) {$defaults[]=$subParts[1];} // Sets the default value if value/label pair is marked as default.
1797 // alternative default value:
1798 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], $defaults);
1799 if (!is_array($default)) {
1801 $defaults[] = $default;
1802 } else $defaults=$default;
1803 // Create the select-box:
1804 $iCount = count($items);
1805 for($a=0;$a<$iCount;$a++
) {
1806 $option.='<option value="'.$items[$a][1].'"'.(in_array($items[$a][1],$defaults)?
' selected="selected"':'').'>'.trim($items[$a][0]).'</option>'; //RTF
1809 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.
1810 $fieldCode=sprintf('<select name="%s"%s size="%s"%s%s>%s</select>',
1811 $confData['fieldname'], $elementIdAttribute, $size, $multiple, $addParams, $option); //RTF
1815 if ($conf['accessibility']) {
1816 $option.='<fieldset'.$elementIdAttribute.'><legend>'.$confData['label'].'</legend>';
1818 $valueParts = explode(',',$parts[2]);
1819 $items=array(); // Where the items will be
1821 $pCount = count($valueParts);
1822 for($a=0;$a<$pCount;$a++
) {
1823 $valueParts[$a]=trim($valueParts[$a]);
1824 if (substr($valueParts[$a],0,1)=='*') {
1826 $valueParts[$a] = substr($valueParts[$a],1);
1829 $subParts=explode('=',$valueParts[$a]);
1830 $subParts[1] = (isset($subParts[1])?
trim($subParts[1]):trim($subParts[0])); // Sets the value
1831 $items[] = $subParts; // Adds the value/label pair to the items-array
1832 if ($sel) {$default=$subParts[1];} // Sets the default value if value/label pair is marked as default.
1834 // alternative default value:
1835 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], $default);
1836 // Create the select-box:
1837 $iCount = count($items);
1838 for($a=0;$a<$iCount;$a++
) {
1839 $radioId = $prefix.$fName.$this->cleanFormName($items[$a][0]);
1840 if ($conf['accessibility']) {
1841 $radioLabelIdAttribute = ' id="'.$radioId.'"';
1843 $radioLabelIdAttribute = '';
1845 $option .= '<input type="radio" name="'.$confData['fieldname'].'"'.$radioLabelIdAttribute.' value="'.$items[$a][1].'"'.(!strcmp($items[$a][1],$default)?
' checked="checked"':'').$addParams.' />';
1846 if ($conf['accessibility']) {
1847 $option .= '<label for="'.$radioId.'">' . $this->stdWrap(trim($items[$a][0]), $conf['radioWrap.']) . '</label>';
1849 $option .= $this->stdWrap(trim($items[$a][0]), $conf['radioWrap.']);
1852 if ($conf['accessibility']) {
1853 $option.='</fieldset>';
1855 $fieldCode = $option;
1858 $value = trim($parts[2]);
1859 if(strlen($value) && t3lib_div
::inList('recipient_copy,recipient',$confData['fieldname']) && $GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
1862 if (strlen($value) && t3lib_div
::inList('recipient_copy,recipient',$confData['fieldname'])) {
1863 $value = $GLOBALS['TSFE']->codeString($value);
1865 $hiddenfields.=sprintf('<input type="hidden" name="%s"%s value="%s" />',
1866 $confData['fieldname'], $elementIdAttribute, htmlspecialchars($value));
1869 if (t3lib_div
::inList('type,locationData,goodMess,badMess,emailMess',$confData['fieldname'])) {
1870 $value=trim($parts[2]);
1871 $propertyOverride[$confData['fieldname']] = $value;
1872 $conf[$confData['fieldname']] = $value;
1876 $value=trim($parts[2]);
1877 if ($conf['image.']) {
1878 $this->data
[$this->currentValKey
]=$value;
1879 $image=$this->IMAGE($conf['image.']);
1882 $fieldCode = str_replace('<img','<input type="image"'.$addParams.' name="'.$confData['fieldname'].'"' ,$image);
1884 $fieldCode=sprintf('<input type="submit" name="%s"%s value="%s"%s />',
1885 $confData['fieldname'], $elementIdAttribute, t3lib_div
::deHSCentities(htmlspecialchars($value)), $addParams);
1889 $value=trim($parts[2]);
1890 $fieldCode=sprintf('<input type="reset" name="%s"%s value="%s"%s />',
1891 $confData['fieldname'], $elementIdAttribute, t3lib_div
::deHSCentities(htmlspecialchars($value)), $addParams);
1894 $fieldCode = nl2br(htmlspecialchars(trim($parts[2])));
1897 $confData['type'] = 'comment';
1898 $fieldCode = trim($parts[2]).' ';
1903 // Checking for special evaluation modes:
1904 if (t3lib_div
::inList('textarea,input,password',$confData['type']) && strlen(trim($parts[3]))) {
1905 $modeParameters = t3lib_div
::trimExplode(':',$parts[3]);
1907 $modeParameters = array();
1910 // Adding evaluation based on settings:
1911 switch((string)$modeParameters[0]) {
1913 $fieldlist[] = '_EREG';
1914 $fieldlist[] = rawurlencode($modeParameters[1]);
1915 $fieldlist[] = rawurlencode($modeParameters[2]);
1916 $fieldlist[] = rawurlencode($confData['fieldname']);
1917 $fieldlist[] = rawurlencode($confData['label']);
1918 $confData['required'] = 1; // Setting this so "required" layout is used.
1921 $fieldlist[] = '_EMAIL';
1922 $fieldlist[] = rawurlencode($confData['fieldname']);
1923 $fieldlist[] = rawurlencode($confData['label']);
1924 $confData['required'] = 1; // Setting this so "required" layout is used.
1927 if ($confData['required'] && $confData['type']!='check') {
1928 $fieldlist[] = rawurlencode($confData['fieldname']);
1929 $fieldlist[] = rawurlencode($confData['label']);
1935 $fieldLabel = $confData['label'];
1936 if ($conf['accessibility'] && trim($fieldLabel) && !preg_match('/^(label|hidden|comment)$/',$confData['type'])) {
1937 $fieldLabel = '<label for="'.$prefix.$fName.'">'.$fieldLabel.'</label>';
1940 // Getting template code:
1941 $fieldCode = $this->stdWrap($fieldCode, $conf['fieldWrap.']);
1942 $labelCode = $this->stdWrap($fieldLabel, $conf['labelWrap.']);
1943 $commentCode = $this->stdWrap($confData['label'], $conf['commentWrap.']); // RTF
1944 $result = $conf['layout'];
1945 if ($conf['REQ'] && $confData['required']) {
1946 if (is_array($conf['REQ.']['fieldWrap.']))
1947 $fieldCode = $this->stdWrap($fieldCode, $conf['REQ.']['fieldWrap.']);
1948 if (is_array($conf['REQ.']['labelWrap.']))
1949 $labelCode = $this->stdWrap($fieldLabel, $conf['REQ.']['labelWrap.']);
1950 if ($conf['REQ.']['layout']) {
1951 $result = $conf['REQ.']['layout'];
1954 if ($confData['type']=='comment' && $conf['COMMENT.']['layout']) {
1955 $result = $conf['COMMENT.']['layout'];
1957 if ($confData['type']=='check' && $conf['CHECK.']['layout']) {
1958 $result = $conf['CHECK.']['layout'];
1960 if ($confData['type']=='radio' && $conf['RADIO.']['layout']) {
1961 $result = $conf['RADIO.']['layout'];
1963 if ($confData['type']=='label' && $conf['LABEL.']['layout']) {
1964 $result = $conf['LABEL.']['layout'];
1966 $result = str_replace('###FIELD###',$fieldCode,$result);
1967 $result = str_replace('###LABEL###',$labelCode,$result);
1968 $result = str_replace('###COMMENT###',$commentCode,$result); //RTF
1973 if ($conf['stdWrap.']) $content=$this->stdWrap($content, $conf['stdWrap.']);
1976 // redirect (external: where to go afterwards. internal: where to submit to)
1977 $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)
1978 $page = $GLOBALS['TSFE']->page
;
1979 if (!$theRedirect) { // Internal: Just submit to current page
1980 $LD = $GLOBALS['TSFE']->tmpl
->linkData($page, $conf['target'], $conf['no_cache'],'index.php', '', $this->getClosestMPvalueForPage($page['uid']));
1981 } elseif (t3lib_div
::testInt($theRedirect)) { // Internal: Submit to page with id $theRedirect
1982 $page = $GLOBALS['TSFE']->sys_page
->getPage_noCheck($theRedirect);
1983 $LD = $GLOBALS['TSFE']->tmpl
->linkData($page, $conf['target'], $conf['no_cache'],'index.php', '', $this->getClosestMPvalueForPage($page['uid']));
1984 } else { // External url, redirect-hidden field is rendered!
1985 $LD = $GLOBALS['TSFE']->tmpl
->linkData($page, $conf['target'], $conf['no_cache'],'', '', $this->getClosestMPvalueForPage($page['uid']));
1986 $LD['totalURL'] = $theRedirect;
1987 $hiddenfields.= '<input type="hidden" name="redirect" value="'.htmlspecialchars($LD['totalURL']).'" />'; // 18-09-00 added
1990 // Formtype (where to submit to!):
1991 $formtype = $propertyOverride['type'] ?
$propertyOverride['type'] : $this->stdWrap($conf['type'], $conf['type.']);
1992 if (t3lib_div
::testInt($formtype)) { // Submit to a specific page
1993 $page = $GLOBALS['TSFE']->sys_page
->getPage_noCheck($formtype);
1994 $LD_A = $GLOBALS['TSFE']->tmpl
->linkData($page, $conf['target'], $conf['no_cache'], '', '', $this->getClosestMPvalueForPage($page['uid']));
1995 $action = $LD_A['totalURL'];
1996 } elseif ($formtype){ // Submit to external script
1998 $action = $formtype;
1999 } elseif (t3lib_div
::testInt($theRedirect)) {
2001 $action = $LD_A['totalURL'];
2002 } else { // Submit to 'nothing' - which is current page
2003 $LD_A = $GLOBALS['TSFE']->tmpl
->linkData($GLOBALS['TSFE']->page
, $conf['target'], $conf['no_cache'], '', '', $this->getClosestMPvalueForPage($page['uid']));
2004 $action = $LD_A['totalURL'];
2008 $theEmail = $this->stdWrap($conf['recipient'], $conf['recipient.']);
2009 if ($theEmail && !$GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
2010 $theEmail = $GLOBALS['TSFE']->codeString($theEmail);
2011 $hiddenfields.='<input type="hidden" name="recipient" value="'.htmlspecialchars($theEmail).'" />';
2015 if ($conf['locationData']) {
2016 if ($conf['locationData']=='HTTP_POST_VARS' && isset($_POST['locationData'])) {
2017 $locationData = t3lib_div
::_POST('locationData');
2019 $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.
2021 $hiddenfields.='<input type="hidden" name="locationData" value="'.htmlspecialchars($locationData).'" />';
2025 if (is_array($conf['hiddenFields.'])) {
2026 reset($conf['hiddenFields.']);
2027 while(list($hF_key,$hF_conf) = each($conf['hiddenFields.'])) {
2028 if (substr($hF_key,-1)!='.') {
2029 $hF_value = $this->cObjGetSingle($hF_conf,$conf['hiddenFields.'][$hF_key.'.'],'hiddenfields');
2030 if (strlen($hF_value) && t3lib_div
::inList('recipient_copy,recipient',$hF_key)) {
2031 if($GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
2034 $hF_value = $GLOBALS['TSFE']->codeString($hF_value);
2036 $hiddenfields.='<input type="hidden" name="'.$hF_key.'" value="'.htmlspecialchars($hF_value).'" />';
2041 // Wrap all hidden fields in a div tag (see http://bugs.typo3.org/view.php?id=678)
2042 $hiddenfields = '<div style="display:none;">'.$hiddenfields.'</div>';
2045 $validateForm=' onsubmit="return validateForm(\''.$formname.'\',\''.implode(',',$fieldlist).'\','.t3lib_div
::quoteJSvalue($conf['goodMess']).','.t3lib_div
::quoteJSvalue($conf['badMess']).','.t3lib_div
::quoteJSvalue($conf['emailMess']).')"';
2046 $GLOBALS['TSFE']->additionalHeaderData
['JSFormValidate'] = '<script type="text/javascript" src="'.$GLOBALS['TSFE']->absRefPrefix
.'t3lib/jsfunc.validateform.js"></script>';
2047 } else $validateForm='';
2050 $theTarget = ($theRedirect?
$LD['target']:$LD_A['target']);
2053 ' action="'.htmlspecialchars($action).'"'.
2054 ' id="'.$formname.'"'.($xhtmlStrict ?
'' : ' name="'.$formname.'"').
2055 ' enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'"'.
2056 ' method="'.($conf['method']?
$conf['method']:'post').'"'.
2057 ($theTarget ?
' target="'.$theTarget.'"' : '').
2060 $hiddenfields.$content,
2063 if ($conf['arrayReturnMode']) {
2064 $content['validateForm']=$validateForm;
2065 $content['formname']=$formname;
2068 return implode('',$content);
2073 * Rendering the cObject, SEARCHRESULT
2075 * @param array Array of TypoScript properties
2076 * @return string Output
2077 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=368&cHash=d00731cd7b
2079 function SEARCHRESULT($conf) {
2080 if (t3lib_div
::_GP('sword') && t3lib_div
::_GP('scols')) {
2081 $search = t3lib_div
::makeInstance('tslib_search');
2082 $search->register_and_explode_search_string(t3lib_div
::_GP('sword'));
2083 $search->register_tables_and_columns(t3lib_div
::_GP('scols'),$conf['allowedCols']);
2086 // the startId is found
2088 if (t3lib_div
::testInt(t3lib_div
::_GP('stype'))) {
2089 $temp_theStartId=t3lib_div
::_GP('stype');
2090 $rootLine = $GLOBALS['TSFE']->sys_page
->getRootLine($temp_theStartId);
2091 // The page MUST have a rootline with the Level0-page of the current site inside!!
2092 while(list(,$val)=each($rootLine)) {
2093 if($val['uid']==$GLOBALS['TSFE']->tmpl
->rootLine
[0]['uid']) {
2094 $theStartId=$temp_theStartId;
2097 } else if (t3lib_div
::_GP('stype')) {
2098 if (substr(t3lib_div
::_GP('stype'),0,1)=='L') {
2099 $pointer = intval(substr(t3lib_div
::_GP('stype'),1));
2100 $theRootLine = $GLOBALS['TSFE']->tmpl
->rootLine
;
2102 $locDat_arr = explode(':',t3lib_div
::_POST('locationData'));
2103 $pId = intval($locDat_arr[0]);
2105 $altRootLine = $GLOBALS['TSFE']->sys_page
->getRootLine($pId);
2106 ksort($altRootLine);
2107 if (count($altRootLine)) {
2108 // check if the rootline has the real Level0 in it!!
2109 reset($altRootLine);
2111 $theNewRoot=array();
2112 while(list(,$val)=each($altRootLine)) {
2113 if($hitRoot ||
$val['uid']==$GLOBALS['TSFE']->tmpl
->rootLine
[0]['uid']) {
2119 $theRootLine = $theNewRoot; // Override the real rootline if any thing
2123 $key = $this->getKey($pointer,$theRootLine);
2124 $theStartId = $theRootLine[$key]['uid'];
2128 // If not set, we use current page
2129 $theStartId = $GLOBALS['TSFE']->id
;
2131 // generate page-tree
2132 $search->pageIdList
.= $this->getTreeList(-1*$theStartId,$depth);
2134 $endClause = 'pages.uid IN ('.$search->pageIdList
.')
2135 AND pages.doktype in ('.$GLOBALS['TYPO3_CONF_VARS']['FE']['content_doktypes'].($conf['addExtUrlsAndShortCuts']?
',3,4':'').')
2136 AND pages.no_search=0'.
2137 $this->enableFields($search->fTable
).
2138 $this->enableFields('pages');
2140 if ($conf['languageField.'][$search->fTable
]) {
2141 $endClause.= ' AND '.$search->fTable
.'.'.$conf['languageField.'][$search->fTable
].' = '.intval($GLOBALS['TSFE']->sys_language_uid
); // (using sys_language_uid which is the ACTUAL language of the page. sys_language_content is only for selecting DISPLAY content!)
2145 $search->build_search_query($endClause);
2148 if (t3lib_div
::testInt(t3lib_div
::_GP('scount'))) {
2149 $search->res_count
= t3lib_div
::_GP('scount');
2151 $search->count_query();
2155 $spointer = intval(t3lib_div
::_GP('spointer'));
2156 if (isset($conf['range'])) {
2157 $theRange = intval($conf['range']);
2163 if (!$conf['noOrderBy']) {
2164 $search->queryParts
['ORDERBY'] = 'pages.lastUpdated, pages.tstamp';
2167 $search->queryParts
['LIMIT'] = $spointer.','.$theRange;
2170 $search->execute_query();
2171 if ($GLOBALS['TYPO3_DB']->sql_num_rows($search->result
)) {
2172 $GLOBALS['TSFE']->register
['SWORD_PARAMS'] = $search->get_searchwords();
2174 $total = $search->res_count
;
2175 $rangeLow = t3lib_div
::intInRange($spointer+
1,1,$total);
2176 $rangeHigh = t3lib_div
::intInRange($spointer+
$theRange,1,$total);
2178 $LD = $GLOBALS['TSFE']->tmpl
->linkData($GLOBALS['TSFE']->page
,$conf['target'],1,'', '', $this->getClosestMPvalueForPage($GLOBALS['TSFE']->page
['uid']));
2179 $targetPart = $LD['target'] ?
' target="'.htmlspecialchars($LD['target']).'"' : '';
2180 $urlParams = $this->URLqMark($LD['totalURL'],
2181 '&sword='.rawurlencode(t3lib_div
::_GP('sword')).
2182 '&scols='.rawurlencode(t3lib_div
::_GP('scols')).
2183 '&stype='.rawurlencode(t3lib_div
::_GP('stype')).
2186 $result= $this->cObjGetSingle($conf['layout'],$conf['layout.'], 'layout');
2187 $result = str_replace('###RANGELOW###',$rangeLow,$result);
2188 $result = str_replace('###RANGEHIGH###',$rangeHigh,$result);
2189 $result = str_replace('###TOTAL###',$total,$result);
2191 if ($rangeHigh<$total) {
2192 $next = $this->cObjGetSingle($conf['next'], $conf['next.'], 'next');
2193 $next = '<a href="'.htmlspecialchars($urlParams.'&spointer='.($spointer+
$theRange)).'"'.$targetPart.$GLOBALS['TSFE']->ATagParams
.'>'.$next.'</a>';
2195 $result = str_replace('###NEXT###',$next,$result);
2198 $prev = $this->cObjGetSingle($conf['prev'], $conf['prev.'], 'prev');
2199 $prev = '<a href="'.htmlspecialchars($urlParams.'&spointer='.($spointer-$theRange)).'"'.$targetPart.$GLOBALS['TSFE']->ATagParams
.'>'.$prev.'</a>';
2201 $result = str_replace('###PREV###',$prev,$result);
2204 $theValue = $this->cObjGetSingle($conf['resultObj'], $conf['resultObj.'],'resultObj');
2205 $cObj = t3lib_div
::makeInstance('tslib_cObj');
2206 $cObj->setParent($this->data
,$this->currentRecord
);
2208 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($search->result
)) {
2209 // versionOL() here? This is search result displays, is that possible to preview anyway? Or are records selected here already future versions?
2211 $renderCode.=$cObj->cObjGetSingle($conf['renderObj'], $conf['renderObj.'],'renderObj');
2213 $theValue.=$this->wrap($renderCode,$conf['renderWrap']);
2214 $theValue = str_replace('###RESULT###',$theValue,$result);
2216 $theValue = $this->cObjGetSingle($conf['noResultObj'], $conf['noResultObj.'],'noResultObj');
2219 $GLOBALS['TT']->setTSlogMessage('Search in fields: '.$search->listOfSearchFields
);
2223 if ($conf['wrap']) {
2224 $content=$this->wrap($content, $conf['wrap']);
2226 if ($conf['stdWrap.']) {
2227 $content=$this->stdWrap($content, $conf['stdWrap.']);
2230 $GLOBALS['TSFE']->set_no_cache();
2236 * Rendering the cObject, PHP_SCRIPT, PHP_SCRIPT_INT and PHP_SCRIPT_EXT
2238 * @param array Array of TypoScript properties
2239 * @param string If "INT", then rendering "PHP_SCRIPT_INT"; If "EXT", then rendering "PHP_SCRIPT_EXT"; Default is rendering "PHP_SCRIPT" (cached)
2240 * @return string Output
2241 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=370&cHash=aa107f2ad8
2242 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=371&cHash=53f71d025e
2243 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=372&cHash=91fe391e1c
2245 function PHP_SCRIPT($conf,$ext='') {
2246 $incFile = $GLOBALS['TSFE']->tmpl
->getFileName($conf['file']);
2248 if ($incFile && $GLOBALS['TSFE']->checkFileInclude($incFile)) {
2252 $substKey = $ext.'_SCRIPT.'.$GLOBALS['TSFE']->uniqueHash();
2253 $content.='<!--'.$substKey.'-->';
2254 $GLOBALS['TSFE']->config
[$ext.'incScript'][$substKey] = array(
2260 $GLOBALS['TSFE']->config
[$ext.'incScript'][$substKey]['cObj'] = serialize($this);
2262 $GLOBALS['TSFE']->config
[$ext.'incScript'][$substKey]['data'] = $this->data
;
2266 // Added 31-12-00: Make backup...
2267 $this->oldData
= $this->data
;
2269 include('./'.$incFile);
2270 // Added 31-12-00: restore...
2271 if ($RESTORE_OLD_DATA) {
2272 $this->data
= $this->oldData
;
2281 * Rendering the cObject, TEMPLATE
2283 * @param array Array of TypoScript properties
2284 * @return string Output
2285 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=373&cHash=109a171b1e
2286 * @see substituteMarkerArrayCached()
2288 function TEMPLATE($conf) {
2289 $subparts = Array();
2294 list($PRE,$POST) = explode('|',$conf['markerWrap'] ?
$conf['markerWrap'] : '### | ###');
2295 $POST = trim($POST);
2298 // Getting the content
2299 $content = $this->cObjGetSingle($conf['template'],$conf['template.'],'template');
2300 if ($conf['workOnSubpart']) {
2301 $content = $this->getSubpart($content, $PRE.$conf['workOnSubpart'].$POST);
2304 // Fixing all relative paths found:
2305 if ($conf['relPathPrefix']) {
2306 $htmlParser = t3lib_div
::makeInstance('t3lib_parsehtml');
2307 $content = $htmlParser->prefixResourcePath($conf['relPathPrefix'],$content,$conf['relPathPrefix.']);
2311 if ($conf['nonCachedSubst']) { // NON-CACHED:
2313 if (is_array($conf['marks.'])) {
2314 reset($conf['marks.']);
2315 while(list($theKey,$theValue)=each($conf['marks.'])) {
2316 if (!strstr($theKey,'.')) {
2317 $content = str_replace(
2319 $this->cObjGetSingle($theValue,$conf['marks.'][$theKey.'.'],'marks.'.$theKey),
2325 // Getting subparts.
2326 if (is_array($conf['subparts.'])) {
2327 reset($conf['subparts.']);
2328 while(list($theKey,$theValue)=each($conf['subparts.'])) {
2329 if (!strstr($theKey,'.')) {
2330 $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
2332 $this->setCurrentVal($subpart);
2333 $content = $this->substituteSubpart(
2336 $this->cObjGetSingle($theValue,$conf['subparts.'][$theKey.'.'],'subparts.'.$theKey),
2343 // Getting subpart wraps
2344 if (is_array($conf['wraps.'])) {
2345 reset($conf['wraps.']);
2346 while(list($theKey,$theValue)=each($conf['wraps.'])) {
2347 if (!strstr($theKey,'.')) {
2348 $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
2350 $this->setCurrentVal($subpart);
2351 $content = $this->substituteSubpart(
2354 explode('|',$this->cObjGetSingle($theValue,$conf['wraps.'][$theKey.'.'],'wraps.'.$theKey)),
2362 // Getting subparts.
2363 if (is_array($conf['subparts.'])) {
2364 reset($conf['subparts.']);
2365 while(list($theKey,$theValue)=each($conf['subparts.'])) {
2366 if (!strstr($theKey,'.')) {
2367 $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
2369 $GLOBALS['TSFE']->register
['SUBPART_'.$theKey] = $subpart;
2370 $subparts[$theKey]['name'] = $theValue;
2371 $subparts[$theKey]['conf'] = $conf['subparts.'][$theKey.'.'];
2377 if (is_array($conf['marks.'])) {
2378 reset($conf['marks.']);
2379 while(list($theKey,$theValue)=each($conf['marks.'])) {
2380 if (!strstr($theKey,'.')) {
2381 $marks[$theKey]['name'] = $theValue;
2382 $marks[$theKey]['conf'] = $conf['marks.'][$theKey.'.'];
2386 // Getting subpart wraps
2387 if (is_array($conf['wraps.'])) {
2388 reset($conf['wraps.']);
2389 while(list($theKey,$theValue)=each($conf['wraps.'])) {
2390 if (!strstr($theKey,'.')) {
2391 $wraps[$theKey]['name'] = $theValue;
2392 $wraps[$theKey]['conf'] = $conf['wraps.'][$theKey.'.'];
2397 $subpartArray =array();
2399 while(list($theKey,$theValue)=each($subparts)) {
2400 // Set current with the content of the subpart...
2401 $this->data
[$this->currentValKey
] = $GLOBALS['TSFE']->register
['SUBPART_'.$theKey];
2402 // Get subpart cObject and substitute it!
2403 $subpartArray[$PRE.$theKey.$POST] = $this->cObjGetSingle($theValue['name'],$theValue['conf'],'subparts.'.$theKey);
2405 $this->data
[$this->currentValKey
] = ''; // Reset current to empty
2408 $markerArray =array();
2410 while(list($theKey,$theValue)=each($marks)) {
2411 $markerArray[$PRE.$theKey.$POST] = $this->cObjGetSingle($theValue['name'],$theValue['conf'],'marks.'.$theKey);
2414 $subpartWraps =array();
2416 while(list($theKey,$theValue)=each($wraps)) {
2417 $subpartWraps[$PRE.$theKey.$POST] = explode('|',$this->cObjGetSingle($theValue['name'],$theValue['conf'],'wraps.'.$theKey));
2421 if ($conf['substMarksSeparately']) {
2422 $content = $this->substituteMarkerArrayCached($content,array(),$subpartArray,$subpartWraps);
2423 $content = $this->substituteMarkerArray($content, $markerArray);
2425 $content = $this->substituteMarkerArrayCached($content,$markerArray,$subpartArray,$subpartWraps);
2433 * Rendering the cObject, MULTIMEDIA
2435 * @param array Array of TypoScript properties
2436 * @return string Output
2437 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=374&cHash=efd88ab4a9
2439 function MULTIMEDIA($conf) {
2441 $filename=$this->stdWrap($conf['file'],$conf['file.']);
2442 $incFile = $GLOBALS['TSFE']->tmpl
->getFileName($filename);
2444 $fileinfo = t3lib_div
::split_fileref($incFile);
2445 if (t3lib_div
::inList('txt,html,htm',$fileinfo['fileext'])) {
2446 $content = $GLOBALS['TSFE']->tmpl
->fileContent($incFile);
2448 // default params...
2451 $parArray['src']='src="'.$GLOBALS['TSFE']->absRefPrefix
.$incFile.'"';
2452 if (t3lib_div
::inList('au,wav,mp3',$fileinfo['fileext'])) {
2454 if (t3lib_div
::inList('avi,mov,mpg,asf,wmv',$fileinfo['fileext'])) {
2455 $parArray['width'] = 'width="200"';
2456 $parArray['height'] = 'height="200"';
2458 if (t3lib_div
::inList('swf,swa,dcr',$fileinfo['fileext'])) {
2459 $parArray['quality'] = 'quality="high"';
2461 if (t3lib_div
::inList('class',$fileinfo['fileext'])) {
2462 $parArray['width'] = 'width="200"';
2463 $parArray['height'] = 'height="200"';
2467 $lines = explode(chr(10), $this->stdWrap($conf['params'],$conf['params.']));
2468 while(list(,$l)=each($lines)) {
2469 $parts = explode('=', $l);
2470 $parameter = strtolower(trim($parts[0]));
2471 $value = trim($parts[1]);
2472 if ((string)$value!='') {
2473 $parArray[$parameter] = $parameter.'="'.htmlspecialchars($value).'"';
2475 unset($parArray[$parameter]);
2478 if ($fileinfo['fileext']=='class') {
2479 unset($parArray['src']);
2480 $parArray['code'] = 'code="'.htmlspecialchars($fileinfo['file']).'"';
2481 $parArray['codebase'] = 'codebase="'.htmlspecialchars($fileinfo['path']).'"';
2482 $content='<applet '.implode(' ',$parArray).'></applet>';
2484 $content='<embed '.implode(' ',$parArray).'></embed>';
2489 if ($conf['stdWrap.']) {
2490 $content=$this->stdWrap($content, $conf['stdWrap.']);
2512 /************************************
2514 * Various helper functions for content objects:
2516 ************************************/
2519 * Returns all parents of the given PID (Page UID) list
2521 * @param string A list of page Content-Element PIDs (Page UIDs) / stdWrap
2522 * @param array stdWrap array for the list
2523 * @return string A list of PIDs