Documentation TYPO3 par Ameos

class.t3lib_tstemplate.php

00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2004 Kasper Skaarhoj (kasperYYYY@typo3.com)
00006 *  All rights reserved
00007 *
00008 *  This script is part of the TYPO3 project. The TYPO3 project is
00009 *  free software; you can redistribute it and/or modify
00010 *  it under the terms of the GNU General Public License as published by
00011 *  the Free Software Foundation; either version 2 of the License, or
00012 *  (at your option) any later version.
00013 *
00014 *  The GNU General Public License can be found at
00015 *  http://www.gnu.org/copyleft/gpl.html.
00016 *  A copy is found in the textfile GPL.txt and important notices to the license
00017 *  from the author is found in LICENSE.txt distributed with these scripts.
00018 *
00019 *
00020 *  This script is distributed in the hope that it will be useful,
00021 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00022 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023 *  GNU General Public License for more details.
00024 *
00025 *  This copyright notice MUST APPEAR in all copies of the script!
00026 ***************************************************************/
00081 require_once (PATH_t3lib.'class.t3lib_tsparser.php');
00082 require_once (PATH_t3lib.'class.t3lib_matchcondition.php');
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00107 class t3lib_TStemplate  {
00108 
00109                 // Debugging, analysis:
00110         var $tt_track = 1;                                      // If set, the global tt-timeobject is used to log the performance.
00111         var $forceTemplateParsing=0;            // If set, the template is always rendered. Used from Admin Panel.
00112 
00113                 // Backend Analysis modules settings:
00114         var $matchAlternative=array();          // This array is passed on to matchObj by generateConfig(). If it holds elements, they are used for matching instead. See commment at the match-class. Used for backend modules only. Never frontend!
00115         var $matchAll=0;                                        // If set, the match-class matches everything! Used for backend modules only. Never frontend!
00116         var $parseEditorCfgField=0;                     // If set, the Backend Editor Configuration TypoScript is also parsed (this is not needed for the frontend)
00117         var $backend_info = 0;
00118         var $getFileName_backPath='';           // Set from the backend - used to set an absolute path (PATH_site) so that relative resources are properly found with getFileName()
00119 
00120                 // Externally set breakpoints (used by Backend Modules)
00121         var $ext_constants_BRP=0;
00122         var $ext_config_BRP=0;
00123         var $ext_editorcfg_BRP=0;
00124         var $ext_regLinenumbers=FALSE;
00125 
00126                 // Constants:
00127         var $uplPath = 'uploads/tf/';
00128         var $tempPath = 'typo3temp/';
00129         var $menuclasses = 'gmenu,tmenu,imgmenu,jsmenu';
00130 
00131                 // Set Internally:
00132         var $whereClause = '';                          // This MUST be initialized by the init() function
00133         var $debug = 0;
00134         var $allowedPaths = array();            // This is the only paths (relative!!) that are allowed for resources in TypoScript. Should all be appended with '/'. You can extend these by the global array TYPO3_CONF_VARS. See init() function.
00135         var $currentPageData = '';                      // Contains "currentPageData" when rendered/fetched from cache. See getCurrentPageData()
00136         var $simulationHiddenOrTime=0;          // See init(); Set if preview of some kind is enabled.
00137 
00138         var $loaded = 0;                                        // Set, if the TypoScript template structure is loaded and OK, see ->start()
00139         var $setup = Array(                                     // Default TypoScript Setup code
00140                 'styles.' => Array (
00141                         'insertContent' => 'CONTENT',
00142                         'insertContent.' => Array (
00143                                 'table' => 'tt_content',
00144                                 'select.' => Array (
00145                                         'orderBy' => 'sorting',
00146                                         'where' => 'colPos=0',
00147                                         'languageField' => 'sys_language_uid'
00148                                 )
00149                         )
00150                 ),
00151                 'config.' => Array (
00152                         'extTarget' => '_top',
00153                         'stat' => 1,
00154                         'stat_typeNumList' => '0,1'
00155                 )
00156         );
00157         var $flatSetup = Array (
00158         );
00159         var $const = Array (    // Default TypoScript Constants code:
00160                 '_clear' => '<img src="clear.gif" width="1" height="1" alt="" />',
00161                 '_blackBorderWrap' => '<table border="0" bgcolor="black" cellspacing="0" cellpadding="1"><tr><td> | </td></tr></table>',
00162                 '_tableWrap' => '<table border="0" cellspacing="0" cellpadding="0"> | </table>',
00163                 '_tableWrap_DEBUG' => '<table border="1" cellspacing="0" cellpadding="0"> | </table>',
00164                 '_stdFrameParams' => 'frameborder="no" marginheight="0" marginwidth="0" noresize="noresize"',
00165                 '_stdFramesetParams' => 'border="0" framespacing="0" frameborder="no"'
00166         );
00167 
00168 
00169                 // For fetching TypoScript code from template hierarchy before parsing it. Each array contains code field values from template records/files:
00170         var $config = array();                          // Setup field
00171         var $constants = array();                       // Constant field
00172         var $editorcfg = array();                       // Backend Editor Configuration field
00173 
00174         var $hierarchyInfo = array();           // For Template Analyser in backend
00175         var $hierarchyInfoToRoot = array();             // For Template Analyser in backend (setup content only)
00176         var $nextLevel=0;                                       // Next-level flag (see runThroughTemplates())
00177         var $rootId;                                            // The Page UID of the root page
00178         var $rootLine;                                          // The rootline from current page to the root page
00179         var $absoluteRootLine;                          // Rootline all the way to the root. Set but runThroughTemplates
00180         var $outermostRootlineIndexWithTemplate=0;      // A pointer to the last entry in the rootline where a template was found.
00181         var $rowSum;                                            // Array of arrays with title/uid of templates in hierarchy
00182         var $resources='';                                      // Resources for the template hierarchy in a comma list
00183         var $sitetitle='';                                      // The current site title field.
00184         var $sections;                                          // Tracking all conditions found during parsing of TypoScript. Used for the "all" key in currentPageData
00185         var $sectionsMatch;                                     // Tracking all matching conditions found
00186 
00187                 // Backend: ts_analyzer
00188         var $clearList_const=array();
00189         var $clearList_setup=array();
00190         var $clearList_editorcfg=array();
00191         var $parserErrors=array();
00192         var $setup_constants = array();
00193 
00194                 // Other:
00195         var $fileCache = Array();                       // Used by getFileName for caching of references to file resources
00196         var $frames = Array();                          // Keys are frame names and values are type-values, which must be used to refer correctly to the content of the frames.
00197         var $MPmap = '';                                        // Contains mapping of Page id numbers to MP variables.
00198 
00199 
00200 
00201 
00209         function init() {
00210                         // $this->whereClause is used only to select templates from sys_template.
00211                         // $GLOBALS['SIM_EXEC_TIME'] is used so that we're able to simulate a later time as a test...
00212                 $this->whereClause='AND deleted=0 ';
00213                 if (!$GLOBALS['TSFE']->showHiddenRecords)       {
00214                         $this->whereClause.='AND hidden=0 ';
00215                 }
00216                 if ($GLOBALS['TSFE']->showHiddenRecords || $GLOBALS['SIM_EXEC_TIME']!=$GLOBALS['EXEC_TIME'])    {       // Set the simulation flag, if simulation is detected!
00217                         $this->simulationHiddenOrTime=1;
00218                 }
00219                 $this->whereClause.= 'AND (starttime<='.$GLOBALS['SIM_EXEC_TIME'].') AND (endtime=0 OR endtime>'.$GLOBALS['SIM_EXEC_TIME'].')';
00220                 if (!$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib'])       {
00221                         $this->menuclasses='tmenu,jsmenu,gmenu';
00222                 }
00223 
00224                         // Sets the paths from where TypoScript resources are allowed to be used:
00225                 $this->allowedPaths = Array ('media/','fileadmin/','uploads/','typo3temp/','t3lib/fonts/',TYPO3_mainDir.'ext/',TYPO3_mainDir.'sysext/','typo3conf/ext/');
00226                 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['addAllowedPaths'])       {
00227                         $pathArr = t3lib_div::trimExplode(',',$GLOBALS['TYPO3_CONF_VARS']['FE']['addAllowedPaths'],1);
00228                         while(list(,$p)=each($pathArr)) {
00229                                         // Once checked for path, but as this may run from typo3/mod/web/ts/ dir, that'll not work!! So the paths ar uncritically included here.
00230                                 $this->allowedPaths[] = $p;
00231                         }
00232                 }
00233         }
00234 
00247         function getCurrentPageData()   {
00248                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('content', 'cache_pagesection', 'page_id='.intval($GLOBALS['TSFE']->id).' AND mpvar_hash='.t3lib_div::md5int($GLOBALS['TSFE']->MP));
00249                 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00250                         $this->currentPageData = unserialize($row['content']);
00251                 } else {
00252                         $this->currentPageData = 'none';
00253                 }
00254                 return $this->currentPageData;
00255         }
00256 
00264         function matching($cc)  {
00265                 if (is_array($cc['all']))       {
00266                         reset($cc['all']);
00267                         $matchObj = t3lib_div::makeInstance('t3lib_matchCondition');
00268                         $matchObj->altRootLine=$cc['rootLine'];
00269                         while(list($key,$pre)=each($cc['all'])) {
00270                                 if ($matchObj->match($pre))     {
00271                                         $sectionsMatch[$key]=$pre;
00272                                 }
00273                         }
00274                         $cc['match']=$sectionsMatch;
00275                 }
00276                 return $cc;
00277         }
00278 
00288         function start($theRootLine)    {
00289                 if (is_array($theRootLine))     {
00290                         $setupData='';
00291                         $cc=Array();
00292                         $hash='';
00293                         $this->runThroughTemplates($theRootLine);
00294 
00295                                 // Getting the currentPageData if not already found
00296                         if (!$this->currentPageData)    {
00297                                 $this->getCurrentPageData();
00298                         }
00299 
00300                                 // This is about getting the hash string which is used to fetch the cached TypoScript template.
00301                                 // If there was some cached currentPageData that's good (it gives us the hash),
00302                                 // However if the actual rowSum and the rowSum of currentPageData is different from each other, thats a problem, and we should re-make the current page data.
00303                         if (is_array($this->currentPageData) &&
00304                                 !strcmp(serialize($this->rowSum), serialize($this->currentPageData['rowSum']))  // The two ROWsums must NOT be different from each other - which they will be if start/endtime or hidden has changed!
00305                         )       {
00306                                         // If currentPageData was actually there, we match the result...
00307                                 $cc['all'] = $this->currentPageData['all'];
00308                                 $cc['rowSum'] = $this->currentPageData['rowSum'];
00309                                 $cc = $this->matching($cc);
00310                                 $hash = md5(serialize($cc));
00311                         } else {
00312                                         // If currentPageData was not there, we first find $rowSum (freshly generated). After that we try to see, if rowSum is stored with a list of all matching-parameters. If so we match the result
00313                                 $rowSumHash = md5('ROWSUM:'.serialize($this->rowSum));
00314                                 $result = t3lib_pageSelect::getHash($rowSumHash, 0);
00315                                 if ($result)    {
00316                                         $cc['all'] = unserialize($result);
00317                                         $cc['rowSum'] = $this->rowSum;
00318                                         $cc = $this->matching($cc);
00319                                         $hash = md5(serialize($cc));
00320                                 }
00321                         }
00322 
00323                         if ($hash)      {
00324                                         // Get TypoScript setup array
00325                                 $setupData = t3lib_pageSelect::getHash($hash, 0);
00326                         }
00327 
00328                         if ($hash && $setupData && !$this->forceTemplateParsing)                {
00329                                         // If TypoScript setup structure was cached we unserialize it here:
00330                                 $this->setup = unserialize($setupData);
00331                         } else {
00332                                         // Make configuration
00333                                 $this->generateConfig();
00334 
00335                                         // This stores the template hash thing
00336                                 $cc=Array();
00337                                 $cc['all']=$this->sections;     // All sections in the template at this point is found
00338                                 $cc['rowSum']=$this->rowSum;    // The line of templates is collected
00339                                 $cc = $this->matching($cc);
00340 
00341                                 $hash = md5(serialize($cc));
00342 
00343                                         // This stores the data.
00344                                 t3lib_pageSelect::storeHash($hash, serialize($this->setup), 'TS TEMPLATE');
00345 
00346                                 if ($this->tt_track)    $GLOBALS['TT']->setTSlogMessage('TS template size, serialized: '.strlen(serialize($this->setup)).' bytes');
00347 
00348                                 $rowSumHash = md5('ROWSUM:'.serialize($this->rowSum));
00349                                 t3lib_pageSelect::storeHash($rowSumHash, serialize($cc['all']), 'TMPL CONDITIONS - ALL');
00350                         }
00351                                 // Add rootLine
00352                         $cc['rootLine'] = $this->rootLine;
00353                                 // Make global and save.
00354                         $GLOBALS['TSFE']->all=$cc;
00355 
00356                         if (!$this->simulationHiddenOrTime)     {       // Only save currentPageData, if we're not simulating by hidden/starttime/endtime
00357                                 $insertFields = array(
00358                                         'page_id' => intval($GLOBALS['TSFE']->id),
00359                                         'mpvar_hash' => t3lib_div::md5int($GLOBALS['TSFE']->MP),
00360                                         'content' => serialize($cc),
00361                                         'tstamp' => $GLOBALS['EXEC_TIME']
00362                                 );
00363                                 $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pagesection', 'page_id='.intval($GLOBALS['TSFE']->id).' AND mpvar_hash='.t3lib_div::md5int($GLOBALS['TSFE']->MP));
00364                                 $GLOBALS['TYPO3_DB']->exec_INSERTquery('cache_pagesection', $insertFields);
00365                         }
00366                                 // If everything OK.
00367                         if ($this->rootId && $this->rootLine && $this->setup)   {
00368                                 $this->loaded = 1;
00369                         }
00370                 }
00371         }
00372 
00373 
00374 
00375 
00376 
00377 
00378 
00379 
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00387         /*******************************************************************
00388          *
00389          * Fetching TypoScript code text for the Template Hierarchy
00390          *
00391          *******************************************************************/
00392 
00403         function runThroughTemplates($theRootLine,$start_template_uid=0)        {
00404                 $this->constants = Array();
00405                 $this->config = Array();
00406                 $this->editorcfg = Array();
00407                 $this->rowSum = Array();
00408                 $this->hierarchyInfoToRoot = Array();
00409                 $this->absoluteRootLine=$theRootLine;   // Is the TOTAL rootline
00410 
00411                 reset ($this->absoluteRootLine);
00412                 $c=count($this->absoluteRootLine);
00413                 for ($a=0;$a<$c;$a++)   {
00414                         if ($this->nextLevel)   {       // If some template loaded before has set a template-id for the next level, then load this template first!
00415                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'sys_template', 'uid='.intval($this->nextLevel).' '.$this->whereClause);
00416                                 $this->nextLevel = 0;
00417                                 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00418                                         $this->processTemplate($row,'sys_'.$row['uid'],$this->absoluteRootLine[$a]['uid'],'sys_'.$row['uid']);
00419                                         $this->outermostRootlineIndexWithTemplate=$a;
00420                                 }
00421                                 $GLOBALS['TYPO3_DB']->sql_free_result($res);
00422                         }
00423                         $addC='';
00424                         if ($a==($c-1) && $start_template_uid)  {       // If first loop AND there is set an alternative template uid, use that
00425                                 $addC=' AND uid='.intval($start_template_uid);
00426                         }
00427 
00428                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'sys_template', 'pid='.intval($this->absoluteRootLine[$a]['uid']).$addC.' '.$this->whereClause,'','sorting',1);
00429                         if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00430                                 $this->processTemplate($row,'sys_'.$row['uid'],$this->absoluteRootLine[$a]['uid'],'sys_'.$row['uid']);
00431                                 $this->outermostRootlineIndexWithTemplate=$a;
00432                         }
00433                         $GLOBALS['TYPO3_DB']->sql_free_result($res);
00434                         $this->rootLine[] = $this->absoluteRootLine[$a];
00435                 }
00436         }
00437 
00450         function processTemplate($row, $idList,$pid,$templateID='',$templateParent='')  {
00451                         // Adding basic template record information to rowSum array
00452                 $this->rowSum[]=Array($row['uid'],$row['title'],$row['tstamp']);
00453 
00454                         // Processing "Clear"-flags
00455                 if ($row['clear'])      {
00456                         $clConst = $row['clear']&1;
00457                         $clConf = $row['clear']&2;
00458                         if ($clConst)   {
00459                                 $this->constants = Array();
00460                                 $this->clearList_const=array();
00461                         }
00462                         if ($clConf)    {
00463                                 $this->config = Array();
00464                                 $this->hierarchyInfoToRoot = Array();
00465                                 $this->clearList_setup=array();
00466 
00467                                 $this->editorcfg = Array();
00468                                 $this->clearList_editorcfg=array();
00469                         }
00470                 }
00471 
00472                         // Include static records (static_template) or files (from extensions) (#1/2)
00473                 if (!$row['includeStaticAfterBasedOn'])         {               // NORMAL inclusion, The EXACT same code is found below the basedOn inclusion!!!
00474                         $this->includeStaticTypoScriptSources($idList,$templateID,$pid,$row);
00475                 }
00476 
00477                         // Include "Based On" sys_templates:
00478                 if (trim($row['basedOn']))      {               // 'basedOn' is a list of templates to include
00479                                 // Manually you can put this value in the field and then the based_on ID will be taken from the $_GET var defined by '=....'.
00480                                 // Example: If $row['basedOn'] is 'EXTERNAL_BASED_ON_TEMPLATE_ID=based_on_uid', then the global var, based_on_uid - given by the URL like '&based_on_uid=999' - is included instead!
00481                                 // This feature allows us a hack to test/demonstrate various included templates on the same set of content bearing pages. Used by the "freesite" extension.
00482                         $basedOn_hackFeature = explode('=',$row['basedOn']);
00483                         if ($basedOn_hackFeature[0]=='EXTERNAL_BASED_ON_TEMPLATE_ID' && $basedOn_hackFeature[1])                {
00484                                 $id = intval(t3lib_div::_GET($basedOn_hackFeature[1]));
00485                                 if ($id && !t3lib_div::inList($idList,'sys_'.$id))      {       // if $id is not allready included ...
00486                                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'sys_template', 'uid='.$id.' '.$this->whereClause);
00487                                         if ($subrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))      {       // there was a template, then we fetch that
00488                                                 $this->processTemplate($subrow,$idList.',sys_'.$id,$pid, 'sys_'.$id,$templateID);
00489                                         }
00490                                         $GLOBALS['TYPO3_DB']->sql_free_result($res);
00491                                 }
00492                         } else {        // NORMAL OPERATION:
00493                                 $basedOnArr = t3lib_div::intExplode(',',$row['basedOn']);
00494                                 while(list(,$id)=each($basedOnArr))     {       // traversing list
00495                                         if (!t3lib_div::inList($idList,'sys_'.$id))     {       // if $id is not allready included ...
00496                                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'sys_template', 'uid='.intval($id).' '.$this->whereClause);
00497                                                 if ($subrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))      {       // there was a template, then we fetch that
00498                                                         $this->processTemplate($subrow,$idList.',sys_'.$id,$pid, 'sys_'.$id,$templateID);
00499                                                 }
00500                                                 $GLOBALS['TYPO3_DB']->sql_free_result($res);
00501                                         }
00502                                 }
00503                         }
00504                 }
00505 
00506                         // Include static records (static_template) or files (from extensions) (#2/2)
00507                 if ($row['includeStaticAfterBasedOn'])          {
00508                         $this->includeStaticTypoScriptSources($idList,$templateID,$pid,$row);
00509                 }
00510 
00511                         // Creating hierarchy information; Used by backend analysis tools
00512                 $this->hierarchyInfo[] = $this->hierarchyInfoToRoot[] = array(
00513                         'root'=>trim($row['root']),
00514                         'next'=>$row['nextLevel'],
00515                         'clConst'=>$clConst,
00516                         'clConf'=>$clConf,
00517                         'templateID'=>$templateID,
00518                         'templateParent'=>$templateParent,
00519                         'title'=>$row['title'],
00520                         'uid'=>$row['uid'],
00521                         'pid'=>$row['pid'],
00522                         'configLines' => substr_count($row['config'], chr(10))+1
00523                 );
00524 
00525                         // Adding the content of the fields constants (Constants), config (Setup) and editorcfg (Backend Editor Configuration) to the internal arrays.
00526                 $this->constants[] = $row['constants'];
00527                 $this->config[] = $row['config'];
00528                 if ($this->parseEditorCfgField)         $this->editorcfg[] = $row['editorcfg'];
00529 
00530                         // For backend analysis (Template Analyser) provide the order of added constants/config/editorcfg template IDs
00531                 $this->clearList_const[]=$templateID;
00532                 $this->clearList_setup[]=$templateID;
00533                 if ($this->parseEditorCfgField)         $this->clearList_editorcfg[]=$templateID;
00534 
00535                         // Add resources and sitetitle if found:
00536                 if (trim($row['resources']))    {
00537                         $this->resources = $row['resources'].','.$this->resources;
00538                 }
00539                 if (trim($row['sitetitle']))    {
00540                         $this->sitetitle = $row['sitetitle'];
00541                 }
00542                         // If the template record is a Rootlevel record, set the flag and clear the template rootLine (so it starts over from this point)
00543                 if (trim($row['root'])) {
00544                         $this->rootId = $pid;
00545                         $this->rootLine = Array();
00546                 }
00547                         // If a template is set to be active on the next level set this internal value to point to this UID. (See runThroughTemplates())
00548                 if ($row['nextLevel'])  {
00549                         $this->nextLevel = $row['nextLevel'];
00550                 } else {
00551                         $this->nextLevel = 0;
00552                 }
00553         }
00554 
00565         function includeStaticTypoScriptSources($idList,$templateID,$pid,$row)  {
00566                         // Static Template Records (static_template): include_static is a list of static templates to include
00567                 if (trim($row['include_static']))       {
00568                         $include_staticArr = t3lib_div::intExplode(',',$row['include_static']);
00569                         reset($include_staticArr);
00570                         while(list(,$id)=each($include_staticArr))      {       // traversing list
00571                                 if (!t3lib_div::inList($idList,'static_'.$id))  {       // if $id is not allready included ...
00572                                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'static_template', 'uid='.intval($id));
00573                                         if ($subrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))      {       // there was a template, then we fetch that
00574                                                 $subrow = $this->prependStaticExtra($subrow);
00575                                                 $this->processTemplate($subrow,$idList.',static_'.$id,$pid,'static_'.$id,$templateID);
00576                                         }
00577                                         $GLOBALS['TYPO3_DB']->sql_free_result($res);
00578                                 }
00579                         }
00580                 }
00581 
00582                         // Static Template Files (Text files from extensions): include_static_file is a list of static files to include (from extensions)
00583                 if (trim($row['include_static_file']))  {
00584                         $include_static_fileArr = t3lib_div::trimExplode(',',$row['include_static_file'],1);
00585                         reset($include_static_fileArr);
00586                         while(list(,$ISF_file)=each($include_static_fileArr))   {       // traversing list
00587                                 $ISF_file = trim($ISF_file);
00588                                 if (substr($ISF_file,0,4)=='EXT:')      {
00589                                         list($ISF_extKey,$ISF_localPath) = explode('/',substr($ISF_file,4),2);
00590                                         if (strcmp($ISF_extKey,'') && t3lib_extMgm::isLoaded($ISF_extKey) && strcmp($ISF_localPath,'')) {
00591                                                 $ISF_localPath = ereg_replace('\/$','',$ISF_localPath).'/';
00592                                                 $ISF_filePath = t3lib_extMgm::extPath($ISF_extKey).$ISF_localPath;
00593                                                 if (@is_dir($ISF_filePath))     {
00594                                                         $mExtKey = str_replace('_','',$ISF_extKey.'/'.$ISF_localPath);
00595                                                         $subrow=array(
00596                                                                 'constants'=>   @is_file($ISF_filePath.'constants.txt') ?t3lib_div::getUrl($ISF_filePath.'constants.txt'):'',
00597                                                                 'config'=>              @is_file($ISF_filePath.'setup.txt')             ?t3lib_div::getUrl($ISF_filePath.'setup.txt'):'',
00598                                                                 'editorcfg'=>   @is_file($ISF_filePath.'editorcfg.txt') ?t3lib_div::getUrl($ISF_filePath.'editorcfg.txt'):'',
00599                                                                 'include_static'=>      @is_file($ISF_filePath.'include_static.txt')?implode(',',array_unique(t3lib_div::intExplode(',',t3lib_div::getUrl($ISF_filePath.'include_static.txt')))):'',
00600                                                                 'title' =>              $ISF_file,
00601                                                                 'uid' =>                $mExtKey
00602                                                         );
00603                                                         $subrow = $this->prependStaticExtra($subrow);
00604 
00605                                                         $this->processTemplate($subrow,$idList.',ext_'.$mExtKey,$pid, 'ext_'.$mExtKey,$templateID);
00606                                                 }
00607                                         }
00608                                 }
00609                         }
00610                 }
00611 
00612                 $this->addExtensionStatics($idList,$templateID,$pid,$row);
00613         }
00614 
00626         function addExtensionStatics($idList,$templateID,$pid,$row) {
00627                 global $TYPO3_LOADED_EXT;
00628 
00629                 if ($row['static_file_mode']==1 || ($row['static_file_mode']==0 && substr($templateID,0,4)=='sys_' && $row['root']))    {
00630                         reset($TYPO3_LOADED_EXT);
00631                         while(list($extKey,$files)=each($TYPO3_LOADED_EXT))     {
00632                                 if (is_array($files) && ($files['ext_typoscript_constants.txt'] || $files['ext_typoscript_setup.txt'] || $files['ext_typoscript_editorcfg.txt']))       {
00633                                         $mExtKey = str_replace('_','',$extKey);
00634                                         $subrow=array(
00635                                                 'constants'=>   $files['ext_typoscript_constants.txt']?t3lib_div::getUrl($files['ext_typoscript_constants.txt']):'',
00636                                                 'config'=>              $files['ext_typoscript_setup.txt']?t3lib_div::getUrl($files['ext_typoscript_setup.txt']):'',
00637                                                 'editorcfg'=>           $files['ext_typoscript_editorcfg.txt']?t3lib_div::getUrl($files['ext_typoscript_editorcfg.txt']):'',
00638                                                 'title' =>              $extKey,
00639                                                 'uid' =>                $mExtKey
00640                                         );
00641                                         $subrow = $this->prependStaticExtra($subrow);
00642 
00643                                         $this->processTemplate($subrow,$idList.',ext_'.$mExtKey,$pid, 'ext_'.$mExtKey,$templateID);
00644                                 }
00645                         }
00646                 }
00647         }
00648 
00659         function prependStaticExtra($subrow)    {
00660                 $subrow['config'].=$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'][$subrow['uid']];
00661                 $subrow['editorcfg'].=$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_editorcfg.'][$subrow['uid']];
00662                 $subrow['constants'].=$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_constants.'][$subrow['uid']];
00663                 return $subrow;
00664         }
00665 
00666 
00667 
00668 
00669 
00670 
00671 
00672 
00673 
00674 
00675 
00676 
00677 
00678 
00679 
00680 
00681 
00682         /*******************************************************************
00683          *
00684          * Parsing TypoScript code text from Template Records into PHP array
00685          *
00686          *******************************************************************/
00687 
00695         function generateConfig()       {
00696                         // Add default TS for all three code types:
00697                 array_unshift($this->constants,''.$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_constants']);    // Adding default TS/constants
00698                 array_unshift($this->config,''.$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup']);   // Adding default TS/setup
00699                 array_unshift($this->editorcfg,''.$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_editorcfg']);    // Adding default TS/editorcfg
00700 
00701                         // Parse the TypoScript code text for include-instructions!
00702                 $this->procesIncludes();
00703 
00704                         // These vars are also set lateron...
00705                 $this->setup['resources']= $this->resources;
00706                 $this->setup['sitetitle']= $this->sitetitle;
00707 
00708 
00709 
00710                 // ****************************
00711                 // Parse TypoScript Constants
00712                 // ****************************
00713 
00714                         // Initialize parser and match-condition classes:
00715                 $constants = t3lib_div::makeInstance('t3lib_TSparser');
00716                 $constants->breakPointLN=intval($this->ext_constants_BRP);
00717                 $constants->setup = $this->const;
00718                 $constants->setup = $this->mergeConstantsFromPageTSconfig($constants->setup);
00719                 $matchObj = t3lib_div::makeInstance('t3lib_matchCondition');
00720                 $matchObj->matchAlternative = $this->matchAlternative;
00721                 $matchObj->matchAll = $this->matchAll;          // Matches ALL conditions in TypoScript
00722 
00723                         // Traverse constants text fields and parse them
00724                 foreach($this->constants as $str)       {
00725                         $constants->parse($str,$matchObj);
00726                 }
00727 
00728                         // Read out parse errors if any
00729                 $this->parserErrors['constants']=$constants->errors;
00730 
00731                         // Then flatten the structure from a multi-dim array to a single dim array with all constants listed as key/value pairs (ready for substitution)
00732                 $this->flatSetup = Array();
00733                 $this->flattenSetup($constants->setup,'','');
00734 
00735 
00736 
00737                 // ***********************************************
00738                 // Parse TypoScript Setup (here called "config")
00739                 // ***********************************************
00740                         // Initialize parser and match-condition classes:
00741                 $config = t3lib_div::makeInstance('t3lib_TSparser');
00742                 $config->breakPointLN = intval($this->ext_config_BRP);
00743                 $config->regLinenumbers = $this->ext_regLinenumbers;
00744                 $config->setup = $this->setup;
00745 
00746                         // Transfer information about conditions found in "Constants" and which of them returned true.
00747                 $config->sections = $constants->sections;
00748                 $config->sectionsMatch = $constants->sectionsMatch;
00749 
00750                         // Traverse setup text fields and concatenate them into one, single string separated by a [GLOBAL] condition
00751                 $all='';
00752                 foreach($this->config as $str)  {
00753                         $all.="\n[GLOBAL]\n".$str;
00754                 }
00755 
00756                         // Substitute constants in the Setup code:
00757                 if ($this->tt_track)    $GLOBALS['TT']->push('Substitute Constants ('.count($this->flatSetup).')');
00758                 $all = $this->substituteConstants($all);
00759                 if ($this->tt_track)    $GLOBALS['TT']->pull();
00760 
00761                         // Searching for possible unsubstituted constants left (only for information)
00762                 if (strstr($all,'{$'))  {
00763                         $findConst = explode('{$',$all);
00764                         $theConstList=Array();
00765                         next($findConst);
00766                         while(list(,$constVal)=each($findConst))        {
00767                                 $constLen=t3lib_div::intInRange(strcspn($constVal,'}'),0,50);
00768                                 $theConstList[]='{$'.substr($constVal,0,$constLen+1);
00769                         }
00770                         if ($this->tt_track)    $GLOBALS['TT']->setTSlogMessage(implode(',',$theConstList).': Constants may remain un-substituted!!',2);
00771                 }
00772 
00773                         // Logging the textual size of the TypoScript Setup field text with all constants substituted:
00774                 if ($this->tt_track)    $GLOBALS['TT']->setTSlogMessage('TypoScript template size as textfile: '.strlen($all).' bytes');
00775 
00776                         // Finally parse the Setup field TypoScript code (where constants are now substituted)
00777                 $config->parse($all,$matchObj);
00778 
00779                         // Read out parse errors if any
00780                 $this->parserErrors['config']=$config->errors;
00781 
00782                         // Transfer the TypoScript array from the parser object to the internal $this->setup array:
00783                 $this->setup = $config->setup;
00784                 if ($this->backend_info)        {
00785                         $this->setup_constants = $constants->setup;             // Used for backend purposes only
00786                 }
00787 
00788 
00789 
00790 
00791                 // **************************************************
00792                 // Parse Backend Editor Configuration (backend only)
00793                 // **************************************************
00794                 if ($this->parseEditorCfgField) {
00795                         $editorcfg = t3lib_div::makeInstance('t3lib_TSparser');
00796                         $editorcfg->breakPointLN=intval($this->ext_editorcfg_BRP);
00797                         $editorcfg->setup = array();    // Empty as a start...
00798 
00799                         $all = implode("\n[GLOBAL]\n",$this->editorcfg);
00800 
00801                                 // substitute constants in config
00802                         $all = $this->substituteConstants($all);
00803 
00804                                 // parse Config
00805                         $matchObj->matchAll=1;  // This should make sure that conditions are disabled. For now they are NOT active for the backend.
00806                         $editorcfg->parse($all,$matchObj);
00807                         $this->parserErrors['editorcfg']=$editorcfg->errors;
00808                         $this->setup_editorcfg = $editorcfg->setup;
00809                 }
00810 
00811 
00812 
00813 
00814 
00815                 // ****************************************************************
00816                 // Final processing of the $this->setup TypoScript Template array
00817                 // Basically: This is unsetting/setting of certain reserved keys.
00818                 // ****************************************************************
00819 
00820                         // These vars are allready set after 'processTemplate', but because $config->setup overrides them (in the line above!), we set them again. They are not changed compared to the value they had in the top of the page!
00821                 unset($this->setup['resources']);
00822                 unset($this->setup['resources.']);
00823                 $this->setup['resources']= implode(',',t3lib_div::trimExplode(',',$this->resources,1));
00824 
00825                 unset($this->setup['sitetitle']);
00826                 unset($this->setup['sitetitle.']);
00827                 $this->setup['sitetitle']= $this->sitetitle;
00828 
00829                         // Unsetting some vars...
00830                 unset($this->setup['types.']);
00831                 unset($this->setup['types']);
00832                 if (is_array($this->setup)) {
00833                         reset ($this->setup);
00834                         while(list($theKey,)=each($this->setup))        {
00835                                 if ($this->setup[$theKey]=='PAGE')      {
00836                                         $tN = $this->setup[$theKey.'.']['typeNum'];
00837                                         if (isset($tN)) {
00838                                                 $this->setup['types.'][$tN] = $theKey;
00839                                         }
00840                                 }
00841                         }
00842                 }
00843                 unset($this->setup['styles.']);
00844                 unset($this->setup['temp.']);
00845                 unset($constants);
00846 
00847                         // Storing the conditions found/matched information:
00848                 $this->sections = $config->sections;
00849                 $this->sectionsMatch = $config->sectionsMatch;
00850         }
00851 
00859         function procesIncludes()       {
00860                 reset($this->constants);
00861                 while(list($k)=each($this->constants))  {
00862                         $this->constants[$k]=t3lib_TSparser::checkIncludeLines($this->constants[$k]);
00863                 }
00864 
00865                 reset($this->config);
00866                 while(list($k)=each($this->config))     {
00867                         $this->config[$k]=t3lib_TSparser::checkIncludeLines($this->config[$k]);
00868                 }
00869 
00870                 reset($this->editorcfg);
00871                 while(list($k)=each($this->editorcfg))  {
00872                         $this->editorcfg[$k]=t3lib_TSparser::checkIncludeLines($this->editorcfg[$k]);
00873                 }
00874         }
00875 
00883         function mergeConstantsFromPageTSconfig($constArray)    {
00884                 $TSdataArray = array();
00885                 $TSdataArray[]=$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'];        // Setting default configuration:
00886 
00887                 for ($a=0;$a<=$this->outermostRootlineIndexWithTemplate;$a++)   {
00888                         $TSdataArray[]=$this->absoluteRootLine[$a]['TSconfig'];
00889                 }
00890                         // Parsing the user TS (or getting from cache)
00891                 $TSdataArray = t3lib_TSparser::checkIncludeLines_array($TSdataArray);
00892                 $userTS = implode(chr(10).'[GLOBAL]'.chr(10),$TSdataArray);
00893 
00894                 $parseObj = t3lib_div::makeInstance('t3lib_TSparser');
00895                 $parseObj->parse($userTS);
00896 
00897                 if (is_array($parseObj->setup['TSFE.']['constants.']))  {
00898                         $constArray = t3lib_div::array_merge_recursive_overrule($constArray,$parseObj->setup['TSFE.']['constants.']);
00899                 }
00900                 return $constArray;
00901         }
00902 
00912         function flattenSetup($setupArray, $prefix, $resourceFlag)      {
00913                 if (is_array($setupArray))      {
00914                         reset($setupArray);
00915                         while(list($key,$val)=each($setupArray))        {
00916                                 if ($prefix || substr($key,0,16)!='TSConstantEditor')   {               // We don't want 'TSConstantEditor' in the flattend setup on the first level (190201)
00917                                         if (is_array($val))     {
00918                                                 $this->flattenSetup($val,$prefix.$key, ($key=='file.'));
00919                                         } elseif ($resourceFlag) {
00920                                                 $this->flatSetup[$prefix.$key] = $this->getFileName($val);
00921                                         } else {
00922                                                 $this->flatSetup[$prefix.$key] = $val;
00923                                         }
00924                                 }
00925                         }
00926                 }
00927         }
00928 
00936         function substituteConstants($all)      {
00937                 if ($this->tt_track)    $GLOBALS['TT']->setTSlogMessage('Constants to substitute: '.count($this->flatSetup));
00938                 reset($this->flatSetup);
00939                 while (list($const,$val)=each($this->flatSetup))        {
00940                         if (!is_array($val))    {
00941                                 $all = str_replace('{$'.$const.'}',$val,$all);
00942                         }
00943                 }
00944                 return $all;
00945         }
00946 
00947 
00948 
00949 
00950 
00951 
00952 
00953 
00954 
00955 
00956 
00957         /*******************************************************************
00958          *
00959          * Various API functions, used from elsewhere in the frontend classes
00960          *
00961          *******************************************************************/
00962 
00974         function splitConfArray($conf,$splitCount)      {
00975 
00976                         // Initialize variables:
00977                 $splitCount = intval($splitCount);
00978                 $conf2 = Array();
00979 
00980                 if ($splitCount && is_array($conf))     {
00981 
00982                                 // Initialize output to carry at least the keys:
00983                         for ($aKey=0;$aKey<$splitCount;$aKey++) {
00984                                 $conf2[$aKey] = array();
00985                         }
00986 
00987                                 // Recursive processing of array keys:
00988                         foreach($conf as $cKey => $val) {
00989                                 if (is_array($val))     {
00990                                         $tempConf = $this->splitConfArray($val,$splitCount);
00991                                         foreach($tempConf as $aKey => $val)     {
00992                                                 $conf2[$aKey][$cKey] = $val;
00993                                         }
00994                                 }
00995                         }
00996 
00997                                 // Splitting of all values on this level of the TypoScript object tree:
00998                         foreach($conf as $cKey => $val) {
00999                                 if (!is_array($val))    {
01000                                         if (!strstr($val,'|*|') && !strstr($val,'||'))  {
01001                                                 for ($aKey=0;$aKey<$splitCount;$aKey++) {
01002                                                         $conf2[$aKey][$cKey] = $val;
01003                                                 }
01004                                         } else {
01005                                                 $main = explode ('|*|',$val);
01006                                                 $mainCount = count($main);
01007 
01008                                                 $lastC = 0;
01009                                                 $middleC = 0;
01010                                                 $firstC = 0;
01011 
01012                                                 if ($main[0])   {
01013                                                         $first = explode('||',$main[0]);
01014                                                         $firstC = count($first);
01015                                                 }
01016                                                 if ($main[1])   {
01017                                                         $middle = explode('||',$main[1]);
01018                                                         $middleC = count($middle);
01019                                                 }
01020                                                 if ($main[2])   {
01021                                                         $last = explode('||',$main[2]);
01022                                                         $lastC = count($last);
01023                                                         $value = $last[0];
01024                                                 }
01025 
01026                                                 for ($aKey=0;$aKey<$splitCount;$aKey++) {
01027                                                         if ($firstC && isset($first[$aKey])) {
01028                                                                 $value = $first[$aKey];
01029                                                         } elseif ($middleC) {
01030                                                                 $value = $middle[($aKey-$firstC)%$middleC];
01031                                                         }
01032                                                         if ($lastC && $lastC>=($splitCount-$aKey))      {
01033                                                                 $value = $last[$lastC-($splitCount-$aKey)];
01034                                                         }
01035                                                         $conf2[$aKey][$cKey] = trim($value);
01036                                                 }
01037                                         }
01038                                 }
01039                         }
01040                 }
01041                 return $conf2;
01042         }
01043 
01051         function getFileName($fileFromSetup)    {
01052                 $file = trim($fileFromSetup);
01053                 if (!$file)     return;
01054                         // cache
01055                 $hash = md5($file);
01056                 if (isset($this->fileCache[$hash]))     {
01057                         return $this->fileCache[$hash];
01058                 }
01059 
01060                 if (!strcmp(substr($file,0,4),'EXT:'))  {
01061                         $newFile='';
01062                         list($extKey,$script)=explode('/',substr($file,4),2);
01063                         if ($extKey && t3lib_extMgm::isLoaded($extKey)) {
01064                                 $extPath=t3lib_extMgm::extPath($extKey);
01065                                 $newFile=substr($extPath,strlen(PATH_site)).$script;
01066                         }
01067                         if (!@is_file(PATH_site.$newFile))      {
01068                                 if ($this->tt_track) $GLOBALS['TT']->setTSlogMessage('Extension media file "'.$newFile.'" was not found!',3);
01069                                 return;
01070                         } else $file=$newFile;
01071                 }
01072 
01073                         // find
01074                 if (strstr($file,'/')) {        // here it is manual media
01075                         if (@is_file($this->getFileName_backPath.$file))        {
01076                                 $outFile = $file;
01077                                 $fileInfo = t3lib_div::split_fileref($outFile);
01078                                 reset($this->allowedPaths);
01079                                 $OK=0;
01080                                 while(list(,$val)=each($this->allowedPaths))    {
01081                                         if (substr($fileInfo['path'],0,strlen($val))==$val){$OK=1; break;}
01082                                 }
01083                                 if ($OK)        {
01084                                         $this->fileCache[$hash]=$outFile;
01085                                         return $outFile;
01086                                 } elseif ($this->tt_track) $GLOBALS['TT']->setTSlogMessage('"'.$file.'" was not located in the allowed paths: ('.implode(',',$this->allowedPaths).')',3);
01087                         } elseif ($this->tt_track) $GLOBALS['TT']->setTSlogMessage('"'.$this->getFileName_backPath.$file.'" is not a file (non-uploads/.. resource, did not exist).',3);
01088                 } else {                // Here it is uploaded media:
01089                         $outFile = $this->extractFromResources($this->setup['resources'],$file);
01090                         if ($outFile)   {
01091                                 if (@is_file($this->uplPath.$outFile))  {
01092                                         $this->fileCache[$hash] = $this->uplPath.$outFile;
01093                                         return $this->uplPath.$outFile;
01094                                 } elseif ($this->tt_track) $GLOBALS['TT']->setTSlogMessage('"'.$this->uplPath.$outFile.'" is not a file (did not exist).',3);
01095                         } elseif ($this->tt_track) $GLOBALS['TT']->setTSlogMessage('"'.$file.'" is not a file (uploads/.. resource).',3);
01096                 }
01097         }
01098 
01108         function extractFromResources($res,$file)       {
01109                 if (t3lib_div::inList($res,$file))      {
01110                         $outFile = $file;
01111                 } elseif (strstr($file,'*')) {
01112                         $fileparts=explode('*',$file);
01113                         $c=count($fileparts);
01114                         $files = explode(',',$res);
01115                         while(list(,$val)=each($files)) {
01116                                 $test = trim($val);
01117                                 if (ereg('^'.quotemeta($fileparts[0]).'.*'.quotemeta($fileparts[$c-1]).'$', $test))     {
01118                                         $outFile = $test;
01119                                         break;
01120                                 }
01121                         }
01122                 }
01123                 return $outFile;
01124         }
01125 
01136         function checkFile($name,$menuArr)      {
01137                 reset ($menuArr);
01138                 while (list($aKey,)=each($menuArr))     {
01139                         $menuArr[$aKey][$name] = $this->getFileName($menuArr[$aKey][$name]);
01140                 }
01141                 return $menuArr;
01142         }
01143 
01153         function printTitle($title,$no_title=0,$titleFirst=0)   {
01154                 $st = trim($this->setup['sitetitle']) ? $this->setup['sitetitle']:'';
01155                 $title = $no_title ? '' : $title;
01156                 if ($titleFirst)        {
01157                         $temp=$st;
01158                         $st=$title;
01159                         $title=$temp;
01160                 }
01161                 if ($title && $st)      {
01162                         return $st.': '.$title;
01163                 } else {
01164                         return $st.$title;
01165                 }
01166         }
01167 
01176         function fileContent($fName)    {
01177                 $incFile = $this->getFileName($fName);
01178                 if ($incFile && $fd=fopen($incFile,'rb'))       {
01179                         $content = '';
01180                         while (!feof($fd))      {
01181                                 $content.=fread($fd, 5000);
01182                         }
01183                         fclose( $fd );
01184                         return $content;
01185                 }
01186         }
01187 
01196         function wrap($content,$wrap)   {
01197                 if ($wrap)      {
01198                         $wrapArr = explode('|', $wrap);
01199                         return trim($wrapArr[0]).$content.trim($wrapArr[1]);
01200                 } else return $content;
01201         }
01202 
01210         function removeQueryString($url)        {
01211                 if (substr($url,-1)=='?')       {
01212                         return substr($url,0,-1);
01213                 } else {
01214                         return $url;
01215                 }
01216         }
01217 
01227         function sortedKeyList($setupArr, $acceptOnlyProperties=FALSE)  {
01228                 $keyArr = Array();
01229 
01230                 reset($setupArr);
01231                 while(list($key,)=each($setupArr))      {
01232                         $ikey = intval($key);
01233                         if (!strcmp($ikey,$key) || $acceptOnlyProperties)       {
01234                                 $keyArr[] = $ikey;
01235                         }
01236                 }
01237 
01238                 $keyArr = array_unique($keyArr);
01239                 sort($keyArr);
01240                 return $keyArr;
01241         }
01242 
01243 
01244 
01245 
01246 
01247 
01248 
01249 
01250 
01251 
01252         /*******************************************************************
01253          *
01254          * Functions for creating links
01255          *
01256          *******************************************************************/
01257 
01274         function linkData($page,$oTarget,$no_cache,$script,$overrideArray='',$addParams='',$typeOverride='')    {
01275                 global $TYPO3_CONF_VARS;
01276 
01277                 $LD = Array();
01278 
01279                         // Overriding some fields in the page record and still preserves the values by adding them as parameters. Little strange function.
01280                 if (is_array($overrideArray))   {
01281                         foreach($overrideArray as $theKey => $theNewVal)        {
01282                                 $addParams.= '&real_'.$theKey.'='.rawurlencode($page[$theKey]);
01283                                 $page[$theKey] = $theNewVal;
01284                         }
01285                 }
01286 
01287                         // Adding Mount Points, "&MP=", parameter for the current page if any is set:
01288                 if (!strstr($addParams,'&MP=')) {
01289                         if (trim($GLOBALS['TSFE']->MP_defaults[$page['uid']]))  {       // Looking for hardcoded defaults:
01290                                 $addParams.= '&MP='.rawurlencode(trim($GLOBALS['TSFE']->MP_defaults[$page['uid']]));
01291                         } elseif ($GLOBALS['TSFE']->config['config']['MP_mapRootPoints']) {             // Else look in automatically created map:
01292                                 $m = $this->getFromMPmap($page['uid']);
01293                                 if ($m) {
01294                                         $addParams.= '&MP='.rawurlencode($m);
01295                                 }
01296                         }
01297                 }
01298 
01299                         // Setting ID/alias:
01300                 if (!$script)   {$script = $GLOBALS['TSFE']->config['mainScript'];}
01301                 if ($page['alias'])     {
01302                         $LD['url'] = $script.'?id='.rawurlencode($page['alias']);
01303                 } else {
01304                         $LD['url'] = $script.'?id='.$page['uid'];
01305                 }
01306                         // Setting target
01307                 $LD['target'] = trim($page['target']) ? trim($page['target']) : $oTarget;
01308 
01309                         // typeNum
01310                 $typeNum = $this->setup[$LD['target'].'.']['typeNum'];
01311                 if (!$typeOverride && intval($GLOBALS['TSFE']->config['config']['forceTypeValue']))     {
01312                         $typeOverride = intval($GLOBALS['TSFE']->config['config']['forceTypeValue']);
01313                 }
01314                 if (strcmp($typeOverride,''))   { $typeNum = $typeOverride; }   // Override...
01315                 if ($typeNum)   {
01316                         $LD['type'] = '&type='.intval($typeNum);
01317                 } else {
01318                         $LD['type'] = '';
01319                 }
01320                 $LD['orig_type'] = $LD['type'];         // Preserving the type number. Will not be cleared if simulateStaticDocuments.
01321 
01322                         // noCache
01323                 $LD['no_cache'] = (trim($page['no_cache']) || $no_cache) ? '&no_cache=1' : '';
01324 
01325                         // linkVars
01326                 $LD['linkVars'] = $GLOBALS['TSFE']->linkVars.$addParams;
01327 
01328                         // If simulateStaticDocuments is enabled:
01329                 if ($GLOBALS['TSFE']->config['config']['simulateStaticDocuments'])      {
01330                         $LD['type'] = '';
01331                         $LD['url'] = '';
01332 
01333                                 // MD5/base64 method limitation:
01334                         $remainLinkVars='';
01335                         $flag_simulateStaticDocuments_pEnc = t3lib_div::inList('md5,base64',$GLOBALS['TSFE']->config['config']['simulateStaticDocuments_pEnc']) && !$LD['no_cache'];
01336                         if ($flag_simulateStaticDocuments_pEnc) {
01337                                 list($LD['linkVars'], $remainLinkVars) = $GLOBALS['TSFE']->simulateStaticDocuments_pEnc_onlyP_proc($LD['linkVars']);
01338                         }
01339 
01340                         $LD['url'].=$GLOBALS['TSFE']->makeSimulFileName(
01341                                                         $page['title'],
01342                                                         $page['alias'] ? $page['alias'] : $page['uid'],
01343                                                         intval($typeNum),
01344                                                         $LD['linkVars'],
01345                                                         $LD['no_cache']?1:0
01346                                                 );
01347 
01348                         if ($flag_simulateStaticDocuments_pEnc) {
01349                                 $LD['linkVars']=$remainLinkVars;
01350                         }
01351                         if ($GLOBALS['TSFE']->config['config']['simulateStaticDocuments']=='PATH_INFO') {
01352                                 $LD['url'] = str_replace('.','/',$LD['url']);
01353                                 $LD['url'] = 'index.php/'.$LD['url'].'/?';
01354                         } else {
01355                                 $LD['url'].= '.html?';
01356                         }
01357                 }
01358 
01359                         // Add absRefPrefix if exists.
01360                 $LD['url'] = $GLOBALS['TSFE']->absRefPrefix.$LD['url'];
01361 
01362                         // If the special key 'sectionIndex_uid' (added 'manually' in tslib/menu.php to the page-record) is set, then the link jumps directly to a section on the page.
01363                 $LD['sectionIndex'] = $page['sectionIndex_uid'] ? '#'.$page['sectionIndex_uid'] : '';
01364 
01365                         // Compile the normal total url
01366                 $LD['totalURL']= $this->removeQueryString($LD['url'].$LD['type'].$LD['no_cache'].$LD['linkVars'].$GLOBALS['TSFE']->getMethodUrlIdToken).$LD['sectionIndex'];
01367 
01368                         // Call post processing function for link rendering:
01369                 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tstemplate.php']['linkData-PostProc']))  {
01370                         $_params = array(
01371                                                         'LD' => &$LD,
01372                                                         'args' => array('page'=>$page, 'oTarget'=>$oTarget, 'no_cache'=>$no_cache, 'script'=>$script, 'overrideArray'=>$overrideArray, 'addParams'=>$addParams, 'typeOverride'=>$typeOverride),
01373                                                         'typeNum' => $typeNum
01374                                                 );
01375                         foreach($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tstemplate.php']['linkData-PostProc'] as $_funcRef)   {
01376                                 t3lib_div::callUserFunction($_funcRef,$_params,$this);
01377                         }
01378                 }
01379 
01380                         // Return the LD-array
01381                 return $LD;
01382         }
01383 
01393         function getFromMPmap($pageId=0)        {
01394 
01395                         // Create map if not found already:
01396                 if (!is_array($this->MPmap))    {
01397                         $this->MPmap = array();
01398 
01399                         $rootPoints = t3lib_div::trimExplode(',', strtolower($GLOBALS['TSFE']->config['config']['MP_mapRootPoints']),1);
01400                         foreach($rootPoints as $p)      {       // Traverse rootpoints:
01401                                 if ($p == 'root')       {
01402                                         $p = $this->rootLine[0]['uid'];
01403                                         $initMParray = array();
01404                                         if ($this->rootLine[0]['_MOUNT_OL'] && $this->rootLine[0]['_MP_PARAM']) {
01405                                                 $initMParray[] = $this->rootLine[0]['_MP_PARAM'];
01406                                         }
01407                                 }
01408                                 $this->initMPmap_create($p,$initMParray);
01409                         }
01410                 }
01411 
01412                         // Finding MP var for Page ID:
01413                 if ($pageId)    {
01414                         if (is_array($this->MPmap[$pageId]) && count($this->MPmap[$pageId]))    {
01415                                 return implode(',',$this->MPmap[$pageId]);
01416                         }
01417                 }
01418         }
01419 
01429         function initMPmap_create($id,$MP_array=array(),$level=0)       {
01430 
01431                 $id = intval($id);
01432                 if($id<=0)      return;
01433 
01434                         // First level, check id
01435                 if (!$level)    {
01436 
01437                                 // Find mount point if any:
01438                         $mount_info = $GLOBALS['TSFE']->sys_page->getMountPointInfo($id);
01439 
01440                                 // Overlay mode:
01441                         if (is_array($mount_info) && $mount_info['overlay'])    {
01442                                 $MP_array[] = $mount_info['MPvar'];
01443                                 $id = $mount_info['mount_pid'];
01444                         }
01445 
01446                                 // Set mapping information for this level:
01447                         $this->MPmap[$id] = $MP_array;
01448 
01449                                 // Normal mode:
01450                         if (is_array($mount_info) && !$mount_info['overlay'])   {
01451                                 $MP_array[] = $mount_info['MPvar'];
01452                                 $id = $mount_info['mount_pid'];
01453                         }
01454                 }
01455 
01456                 if ($id && $level<20)   {
01457 
01458                         $nextLevelAcc = array();
01459 
01460                                 // Select and traverse current level pages:
01461                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
01462                                                 'uid,pid,doktype,mount_pid,mount_pid_ol',
01463                                                 'pages',
01464                                                 'pid='.intval($id).' AND deleted=0 AND doktype!=255 AND doktype!=6'     // 255 = Garbage bin, 6 = Backend User Section
01465                                         );
01466                         while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))      {
01467 
01468                                         // Find mount point if any:
01469                                 $next_id = $row['uid'];
01470                                 $next_MP_array = $MP_array;
01471                                 $mount_info = $GLOBALS['TSFE']->sys_page->getMountPointInfo($next_id, $row);
01472 
01473                                         // Overlay mode:
01474                                 if (is_array($mount_info) && $mount_info['overlay'])    {
01475                                         $next_MP_array[] = $mount_info['MPvar'];
01476                                         $next_id = $mount_info['mount_pid'];
01477                                 }
01478 
01479                                 if (!isset($this->MPmap[$next_id]))     {
01480 
01481                                                 // Set mapping information for this level:
01482                                         $this->MPmap[$next_id] = $next_MP_array;
01483 
01484                                                 // Normal mode:
01485                                         if (is_array($mount_info) && !$mount_info['overlay'])   {
01486                                                 $next_MP_array[] = $mount_info['MPvar'];
01487                                                 $next_id = $mount_info['mount_pid'];
01488                                         }
01489 
01490                                                 // Register recursive call
01491                                                 // (have to do it this way since ALL of the current level should be registered BEFORE the sublevel at any time)
01492                                         $nextLevelAcc[] = array($next_id,$next_MP_array);
01493                                 }
01494                         }
01495 
01496                                 // Call recursively, if any:
01497                         foreach($nextLevelAcc as $pSet) {
01498                                 $this->initMPmap_create($pSet[0],$pSet[1],$level+1);
01499                         }
01500                 }
01501         }
01502 }
01503 
01504 
01505 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tstemplate.php'])        {
01506         include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tstemplate.php']);
01507 }
01508 ?>


Généré par L'expert TYPO3 avec  doxygen 1.4.6