"TYPO3 4.0.1: typo3_src-4.0.1/typo3/sysext/cms/tslib/class.tslib_menu.php Source File", "datetime" => "Sat Dec 2 19:22:28 2006", "date" => "2 Dec 2006", "doxygenversion" => "1.4.6", "projectname" => "TYPO3 4.0.1", "projectnumber" => "4.0.1" ); get_header($doxygen_vars); ?>
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 1999-2005 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 ***************************************************************/ 00145 class tslib_menu { 00146 var $menuNumber = 1; // tells you which menu-number this is. This is important when getting data from the setup 00147 var $entryLevel = 0; // 0 = rootFolder 00148 var $spacerIDList = '199'; // The doktype-number that defines a spacer 00149 var $doktypeExcludeList = '5,6'; // doktypes that define which should not be included in a menu 00150 var $alwaysActivePIDlist=array(); 00151 var $imgNamePrefix = 'img'; 00152 var $imgNameNotRandom=0; 00153 var $debug = 0; 00154 var $parent_cObj =''; // Loaded with the parent cObj-object when a new HMENU is made 00155 var $GMENU_fixKey='gmenu'; 00156 var $MP_array=array(); // accumulation of mount point data 00157 00158 // internal 00159 var $conf = Array(); // HMENU configuration 00160 var $mconf = Array(); // xMENU configuration (TMENU, GMENU etc) 00161 var $tmpl; // template-object 00162 var $sys_page; // sys_page-object 00163 var $id; // The base page-id of the menu. 00164 var $nextActive; // Holds the page uid of the NEXT page in the root line from the page pointed to by entryLevel; Used to expand the menu automatically if in a certain root line. 00165 var $menuArr; // The array of menuItems which is built 00166 var $hash; 00167 var $result = Array(); 00168 var $rL_uidRegister = ''; // Array: Is filled with an array of page uid numbers + RL parameters which are in the current root line (used to evaluate whether a menu item is in active state) 00169 var $INPfixMD5; 00170 var $I; 00171 var $WMresult; 00172 var $WMfreezePrefix; 00173 var $WMmenuItems; 00174 var $WMsubmenuObjSuffixes; 00175 var $WMextraScript; 00176 var $alternativeMenuTempArray=''; // Can be set to contain menu item arrays for sub-levels. 00177 var $nameAttribute = 'name'; // Will be 'id' in XHTML-mode 00178 00191 function start(&$tmpl,&$sys_page,$id,$conf,$menuNumber,$objSuffix='') { 00192 00193 // Init: 00194 $this->conf = $conf; 00195 $this->menuNumber = $menuNumber; 00196 $this->mconf = $conf[$this->menuNumber.$objSuffix.'.']; 00197 $this->debug=$GLOBALS['TSFE']->debug; 00198 00199 // In XHTML there is no "name" attribute anymore 00200 switch ($GLOBALS['TSFE']->xhtmlDoctype) { 00201 case 'xhtml_strict': 00202 case 'xhtml_11': 00203 case 'xhtml_2': 00204 $this->nameAttribute = 'id'; 00205 break; 00206 default: 00207 $this->nameAttribute = 'name'; 00208 break; 00209 } 00210 00211 // Sets the internal vars. $tmpl MUST be the template-object. $sys_page MUST be the sys_page object 00212 if ($this->conf[$this->menuNumber.$objSuffix] && is_object($tmpl) && is_object($sys_page)) { 00213 $this->tmpl = &$tmpl; 00214 $this->sys_page = &$sys_page; 00215 00216 // alwaysActivePIDlist initialized: 00217 if (trim($this->conf['alwaysActivePIDlist'])) { 00218 $this->alwaysActivePIDlist = t3lib_div::intExplode(',', $this->conf['alwaysActivePIDlist']); 00219 } 00220 00221 // 'not in menu' doktypes 00222 if($this->conf['excludeDoktypes']) { 00223 $this->doktypeExcludeList = $GLOBALS['TYPO3_DB']->cleanIntList($this->conf['excludeDoktypes']); 00224 } 00225 if($this->conf['includeNotInMenu']) { 00226 $exclDoktypeArr = t3lib_div::trimExplode(',',$this->doktypeExcludeList,1); 00227 $exclDoktypeArr = t3lib_div::removeArrayEntryByValue($exclDoktypeArr,'5'); 00228 $this->doktypeExcludeList = implode(',',$exclDoktypeArr); 00229 } 00230 00231 // EntryLevel 00232 $this->entryLevel = tslib_cObj::getKey ($conf['entryLevel'],$this->tmpl->rootLine); 00233 00234 // Set parent page: If $id not stated with start() then the base-id will be found from rootLine[$this->entryLevel] 00235 if ($id) { // Called as the next level in a menu. It is assumed that $this->MP_array is set from parent menu. 00236 $this->id = intval($id); 00237 } else { // This is a BRAND NEW menu, first level. So we take ID from rootline and also find MP_array (mount points) 00238 $this->id = intval($this->tmpl->rootLine[$this->entryLevel]['uid']); 00239 00240 // Traverse rootline to build MP_array of pages BEFORE the entryLevel 00241 // (MP var for ->id is picked up in the next part of the code...) 00242 foreach($this->tmpl->rootLine as $entryLevel => $levelRec) { 00243 // For overlaid mount points, set the variable right now: 00244 if ($levelRec['_MP_PARAM'] && $levelRec['_MOUNT_OL']) { 00245 $this->MP_array[] = $levelRec['_MP_PARAM']; 00246 } 00247 // Break when entry level is reached: 00248 if ($entryLevel>=$this->entryLevel) break; 00249 00250 // For normal mount points, set the variable for next level. 00251 if ($levelRec['_MP_PARAM'] && !$levelRec['_MOUNT_OL']) { 00252 $this->MP_array[] = $levelRec['_MP_PARAM']; 00253 } 00254 } 00255 } 00256 00257 // Return false if no page ID was set (thus no menu of subpages can be made). 00258 if ($this->id<=0) { 00259 return FALSE; 00260 } 00261 00262 // Check if page is a mount point, and if so set id and MP_array 00263 // (basically this is ONLY for non-overlay mode, but in overlay mode an ID with a mount point should never reach this point anyways, so no harm done...) 00264 $mount_info = $this->sys_page->getMountPointInfo($this->id); 00265 if (is_array($mount_info)) { 00266 $this->MP_array[] = $mount_info['MPvar']; 00267 $this->id = $mount_info['mount_pid']; 00268 } 00269 00270 // Gather list of page uids in root line (for "isActive" evaluation). Also adds the MP params in the path so Mount Points are respected. 00271 // (List is specific for this rootline, so it may be supplied from parent menus for speed...) 00272 if (!is_array($this->rL_uidRegister)) { 00273 $rl_MParray = array(); 00274 foreach($this->tmpl->rootLine as $v_rl) { 00275 // For overlaid mount points, set the variable right now: 00276 if ($v_rl['_MP_PARAM'] && $v_rl['_MOUNT_OL']) { 00277 $rl_MParray[] = $v_rl['_MP_PARAM']; 00278 } 00279 00280 // Add to register: 00281 $this->rL_uidRegister[] = 'ITEM:'.$v_rl['uid'].(count($rl_MParray) ? ':'.implode(',',$rl_MParray) : ''); 00282 00283 // For normal mount points, set the variable for next level. 00284 if ($v_rl['_MP_PARAM'] && !$v_rl['_MOUNT_OL']) { 00285 $rl_MParray[] = $v_rl['_MP_PARAM']; 00286 } 00287 } 00288 } 00289 00290 // Setting "nextActive": This is the page uid + MPvar of the NEXT page in rootline. Used to expand the menu if we are in the right branch of the tree 00291 // Notice: The automatic expansion of a menu is designed to work only when no "special" modes are used. 00292 if (is_array($this->tmpl->rootLine[$this->entryLevel+$this->menuNumber])) { 00293 $nextMParray = $this->MP_array; 00294 if ($this->tmpl->rootLine[$this->entryLevel+$this->menuNumber]['_MOUNT_OL']) { // In overlay mode, add next level MPvars as well: 00295 $nextMParray[] = $this->tmpl->rootLine[$this->entryLevel+$this->menuNumber]['_MP_PARAM']; 00296 } 00297 $this->nextActive = $this->tmpl->rootLine[$this->entryLevel+$this->menuNumber]['uid']. 00298 (count($nextMParray)?':'.implode(',',$nextMParray):''); 00299 } else { 00300 $this->nextActive = ''; 00301 } 00302 00303 // imgNamePrefix 00304 if ($this->mconf['imgNamePrefix']) { 00305 $this->imgNamePrefix=$this->mconf['imgNamePrefix']; 00306 } 00307 $this->imgNameNotRandom = $this->mconf['imgNameNotRandom']; 00308 00309 $retVal = TRUE; 00310 } else { 00311 $GLOBALS['TT']->setTSlogMessage('ERROR in menu',3); 00312 $retVal = FALSE; 00313 } 00314 return $retVal; 00315 } 00316 00324 function makeMenu() { 00325 if ($this->id) { 00326 00327 // Initializing showAccessRestrictedPages 00328 if ($this->mconf['showAccessRestrictedPages']) { 00329 // SAVING where_groupAccess 00330 $SAVED_where_groupAccess = $this->sys_page->where_groupAccess; 00331 $this->sys_page->where_groupAccess = ''; // Temporarily removing fe_group checking! 00332 } 00333 00334 // Begin production of menu: 00335 $temp = array(); 00336 $altSortFieldValue = trim($this->mconf['alternativeSortingField']); 00337 $altSortField = $altSortFieldValue ? $altSortFieldValue : 'sorting'; 00338 if ($this->menuNumber==1 && $this->conf['special']) { // ... only for the FIRST level of a HMENU 00339 $value = $this->conf['special.']['value']; 00340 00341 switch($this->conf['special']) { 00342 case 'userdefined': 00343 $temp = $this->includeMakeMenu($this->conf['special.'],$altSortField); 00344 break; 00345 case 'userfunction': 00346 $temp = $this->parent_cObj->callUserFunction( 00347 $this->conf['special.']['userFunc'], 00348 array_merge($this->conf['special.'],array('_altSortField'=>$altSortField)), 00349 '' 00350 ); 00351 if (!is_array($temp)) $temp=array(); 00352 break; 00353 case 'language': 00354 $temp = array(); 00355 00356 // Getting current page record NOT overlaid by any translation: 00357 $currentPageWithNoOverlay = $this->sys_page->getRawRecord('pages',$GLOBALS['TSFE']->page['uid']); 00358 00359 // Traverse languages set up: 00360 $languageItems = t3lib_div::intExplode(',',$value); 00361 foreach($languageItems as $sUid) { 00362 // Find overlay record: 00363 if ($sUid) { 00364 $lRecs = $this->sys_page->getPageOverlay($GLOBALS['TSFE']->page['uid'],$sUid); 00365 } else $lRecs=array(); 00366 // Checking if the "disabled" state should be set. 00367 if ( 00368 (t3lib_div::hideIfNotTranslated($GLOBALS['TSFE']->page['l18n_cfg']) && $sUid && !count($lRecs)) // Blocking for all translations? 00369 || ($GLOBALS['TSFE']->page['l18n_cfg']&1 && (!$sUid || !count($lRecs))) // Blocking default translation? 00370 || (!$this->conf['special.']['normalWhenNoLanguage'] && $sUid && !count($lRecs)) 00371 ) { 00372 $iState = $GLOBALS['TSFE']->sys_language_uid==$sUid ? 'USERDEF2' : 'USERDEF1'; 00373 } else { 00374 $iState = $GLOBALS['TSFE']->sys_language_uid==$sUid ? 'ACT' : 'NO'; 00375 } 00376 00377 if ($this->conf['addQueryString']) { 00378 $getVars = $this->parent_cObj->getQueryArguments($this->conf['addQueryString.'],array('L'=>$sUid),true); 00379 } else { 00380 $getVars = '&L='.$sUid; 00381 } 00382 00383 // Adding menu item: 00384 $temp[] = array_merge( 00385 array_merge($currentPageWithNoOverlay, $lRecs), 00386 array( 00387 'ITEM_STATE' => $iState, 00388 '_ADD_GETVARS' => $getVars, 00389 '_SAFE' => TRUE 00390 ) 00391 ); 00392 } 00393 break; 00394 case 'directory': 00395 if ($value=='') { 00396 $value=$GLOBALS['TSFE']->page['uid']; 00397 } 00398 $items=t3lib_div::intExplode(',',$value); 00399 00400 foreach($items as $id) { 00401 $MP = $this->tmpl->getFromMPmap($id); 00402 00403 // Checking if a page is a mount page and if so, change the ID and set the MP var properly. 00404 $mount_info = $this->sys_page->getMountPointInfo($id); 00405 if (is_array($mount_info)) { 00406 if ($mount_info['overlay']) { // Overlays should already have their full MPvars calculated: 00407 $MP = $this->tmpl->getFromMPmap($mount_info['mount_pid']); 00408 $MP = $MP ? $MP : $mount_info['MPvar']; 00409 } else { 00410 $MP = ($MP ? $MP.',' : '').$mount_info['MPvar']; 00411 } 00412 $id = $mount_info['mount_pid']; 00413 } 00414 00415 // Get sub-pages: 00416 $res = $GLOBALS['TSFE']->cObj->exec_getQuery('pages',Array('pidInList'=>$id,'orderBy'=>$altSortField)); 00417 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00418 $GLOBALS['TSFE']->sys_page->versionOL('pages',$row); 00419 00420 if (is_array($row)) { 00421 // Keep mount point? 00422 $mount_info = $this->sys_page->getMountPointInfo($row['uid'], $row); 00423 if (is_array($mount_info) && $mount_info['overlay']) { // There is a valid mount point. 00424 $mp_row = $this->sys_page->getPage($mount_info['mount_pid']); // Using "getPage" is OK since we need the check for enableFields AND for type 2 of mount pids we DO require a doktype < 200! 00425 if (count($mp_row)) { 00426 $row = $mp_row; 00427 $row['_MP_PARAM'] = $mount_info['MPvar']; 00428 } else unset($row); // If the mount point could not be fetched with respect to enableFields, unset the row so it does not become a part of the menu! 00429 } 00430 00431 // Add external MP params, then the row: 00432 if (is_array($row)) { 00433 if ($MP) $row['_MP_PARAM'] = $MP.($row['_MP_PARAM'] ? ','.$row['_MP_PARAM'] : ''); 00434 $temp[$row['uid']] = $this->sys_page->getPageOverlay($row); 00435 } 00436 } 00437 } 00438 } 00439 break; 00440 case 'list': 00441 if ($value=='') { 00442 $value=$this->id; 00443 } 00444 $loadDB = t3lib_div::makeInstance('FE_loadDBGroup'); 00445 $loadDB->start($value, 'pages'); 00446 $loadDB->additionalWhere['pages']=tslib_cObj::enableFields('pages'); 00447 $loadDB->getFromDB(); 00448 00449 foreach($loadDB->itemArray as $val) { 00450 $MP = $this->tmpl->getFromMPmap($val['id']); 00451 00452 // Keep mount point? 00453 $mount_info = $this->sys_page->getMountPointInfo($val['id']); 00454 if (is_array($mount_info) && $mount_info['overlay']) { // There is a valid mount point. 00455 $mp_row = $this->sys_page->getPage($mount_info['mount_pid']); // Using "getPage" is OK since we need the check for enableFields AND for type 2 of mount pids we DO require a doktype < 200! 00456 if (count($mp_row)) { 00457 $row = $mp_row; 00458 $row['_MP_PARAM'] = $mount_info['MPvar']; 00459 00460 if ($mount_info['overlay']) { // Overlays should already have their full MPvars calculated: 00461 $MP = $this->tmpl->getFromMPmap($mount_info['mount_pid']); 00462 if ($MP) unset($row['_MP_PARAM']); 00463 } 00464 } else unset($row); // If the mount point could not be fetched with respect to enableFields, unset the row so it does not become a part of the menu! 00465 } else { 00466 $row = $loadDB->results['pages'][$val['id']]; 00467 } 00468 00469 // Add external MP params, then the row: 00470 if (is_array($row)) { 00471 if ($MP) $row['_MP_PARAM'] = $MP.($row['_MP_PARAM'] ? ','.$row['_MP_PARAM'] : ''); 00472 $temp[] = $this->sys_page->getPageOverlay($row); 00473 } 00474 } 00475 break; 00476 case 'updated': 00477 if ($value=='') { 00478 $value=$GLOBALS['TSFE']->page['uid']; 00479 } 00480 $items=t3lib_div::intExplode(',',$value); 00481 if (t3lib_div::testInt($this->conf['special.']['depth'])) { 00482 $depth = t3lib_div::intInRange($this->conf['special.']['depth'],1,20); // Tree depth 00483 } else { 00484 $depth=20; 00485 } 00486 $limit = t3lib_div::intInRange($this->conf['special.']['limit'],0,100); // max number of items 00487 $maxAge = intval(tslib_cObj::calc($this->conf['special.']['maxAge'])); 00488 if (!$limit) $limit=10; 00489 $mode = $this->conf['special.']['mode']; // *'auto', 'manual', 'tstamp' 00490 // Get id's 00491 $id_list_arr = Array(); 00492 00493 foreach($items as $id) { 00494 $bA = t3lib_div::intInRange($this->conf['special.']['beginAtLevel'],0,100); 00495 $id_list_arr[] = tslib_cObj::getTreeList(-1*$id,$depth-1+$bA,$bA-1); 00496 } 00497 $id_list = implode(',',$id_list_arr); 00498 // Get sortField (mode) 00499 switch($mode) { 00500 case 'starttime': 00501 $sortField = 'starttime'; 00502 break; 00503 case 'lastUpdated': 00504 case 'manual': 00505 $sortField = 'lastUpdated'; 00506 break; 00507 case 'tstamp': 00508 $sortField = 'tstamp'; 00509 break; 00510 case 'crdate': 00511 $sortField = 'crdate'; 00512 break; 00513 default: 00514 $sortField = 'SYS_LASTCHANGED'; 00515 break; 00516 } 00517 // Get 00518 $extraWhere = ($this->conf['includeNotInMenu'] ? '' : ' AND pages.nav_hide=0').$this->getDoktypeExcludeWhere(); 00519 00520 if ($this->conf['special.']['excludeNoSearchPages']) { 00521 $extraWhere.= ' AND pages.no_search=0'; 00522 } 00523 if ($maxAge>0) { 00524 $extraWhere.=' AND '.$sortField.'>'.($GLOBALS['SIM_EXEC_TIME']-$maxAge); 00525 } 00526 00527 $res = $GLOBALS['TSFE']->cObj->exec_getQuery('pages',Array('pidInList'=>'0', 'uidInList'=>$id_list, 'where'=>$sortField.'>=0'.$extraWhere, 'orderBy'=>($altSortFieldValue ? $altSortFieldValue : $sortField.' desc'),'max'=>$limit)); 00528 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00529 $GLOBALS['TSFE']->sys_page->versionOL('pages',$row); 00530 if (is_array($row)) { 00531 $temp[$row['uid']]=$this->sys_page->getPageOverlay($row); 00532 } 00533 } 00534 break; 00535 case 'keywords': 00536 list($value)=t3lib_div::intExplode(',',$value); 00537 if (!$value) { 00538 $value=$GLOBALS['TSFE']->page['uid']; 00539 } 00540 if ($this->conf['special.']['setKeywords'] || $this->conf['special.']['setKeywords.']) { 00541 $kw = $this->parent_cObj->stdWrap($this->conf['special.']['setKeywords'], $this->conf['special.']['setKeywords.']); 00542 } else { 00543 $value_rec=$this->sys_page->getPage($value); // The page record of the 'value'. 00544 00545 $kfieldSrc = $this->conf['special.']['keywordsField.']['sourceField'] ? $this->conf['special.']['keywordsField.']['sourceField'] : 'keywords'; 00546 $kw = trim(tslib_cObj::keywords($value_rec[$kfieldSrc])); // keywords. 00547 } 00548 00549 $mode = $this->conf['special.']['mode']; // *'auto', 'manual', 'tstamp' 00550 switch($mode) { 00551 case 'starttime': 00552 $sortField = 'starttime'; 00553 break; 00554 case 'lastUpdated': 00555 case 'manual': 00556 $sortField = 'lastUpdated'; 00557 break; 00558 case 'tstamp': 00559 $sortField = 'tstamp'; 00560 break; 00561 case 'crdate': 00562 $sortField = 'crdate'; 00563 break; 00564 default: 00565 $sortField = 'SYS_LASTCHANGED'; 00566 break; 00567 } 00568 00569 // depth, limit, extra where 00570 if (t3lib_div::testInt($this->conf['special.']['depth'])) { 00571 $depth = t3lib_div::intInRange($this->conf['special.']['depth'],0,20); // Tree depth 00572 } else { 00573 $depth=20; 00574 } 00575 $limit = t3lib_div::intInRange($this->conf['special.']['limit'],0,100); // max number of items 00576 $extraWhere = ' AND pages.uid!='.$value.($this->conf['includeNotInMenu'] ? '' : ' AND pages.nav_hide=0').$this->getDoktypeExcludeWhere(); 00577 if ($this->conf['special.']['excludeNoSearchPages']) { 00578 $extraWhere.= ' AND pages.no_search=0'; 00579 } 00580 // start point 00581 $eLevel = tslib_cObj::getKey (intval($this->conf['special.']['entryLevel']),$this->tmpl->rootLine); 00582 $startUid = intval($this->tmpl->rootLine[$eLevel]['uid']); 00583 00584 // which field is for keywords 00585 $kfield = 'keywords'; 00586 if ( $this->conf['special.']['keywordsField'] ) { 00587 list($kfield) = explode(' ',trim ($this->conf['special.']['keywordsField'])); 00588 } 00589 00590 // If there are keywords and the startuid is present. 00591 if ($kw && $startUid) { 00592 $bA = t3lib_div::intInRange($this->conf['special.']['beginAtLevel'],0,100); 00593 $id_list=tslib_cObj::getTreeList(-1*$startUid,$depth-1+$bA,$bA-1); 00594 00595 $kwArr = explode(',',$kw); 00596 foreach($kwArr as $word) { 00597 $word = trim($word); 00598 if ($word) { 00599 $keyWordsWhereArr[] = $kfield.' LIKE \'%'.$GLOBALS['TYPO3_DB']->quoteStr($word, 'pages').'%\''; 00600 } 00601 } 00602 $res = $GLOBALS['TSFE']->cObj->exec_getQuery('pages',Array('pidInList'=>'0', 'uidInList'=>$id_list, 'where'=>'('.implode(' OR ',$keyWordsWhereArr).')'.$extraWhere, 'orderBy'=>($altSortFieldValue ? $altSortFieldValue : $sortField.' desc'),'max'=>$limit)); 00603 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00604 $GLOBALS['TSFE']->sys_page->versionOL('pages',$row); 00605 if (is_array($row)) { 00606 $temp[$row['uid']]=$this->sys_page->getPageOverlay($row); 00607 } 00608 } 00609 } 00610 break; 00611 case 'rootline': 00612 $begin_end = explode('|',$this->conf['special.']['range']); 00613 if (!t3lib_div::testInt($begin_end[0])) {intval($begin_end[0]);} 00614 if (!t3lib_div::testInt($begin_end[1])) {$begin_end[1]=-1;} 00615 00616 $beginKey = tslib_cObj::getKey ($begin_end[0],$this->tmpl->rootLine); 00617 $endKey = tslib_cObj::getKey ($begin_end[1],$this->tmpl->rootLine); 00618 if ($endKey<$beginKey) {$endKey=$beginKey;} 00619 00620 $rl_MParray = array(); 00621 foreach($this->tmpl->rootLine as $k_rl => $v_rl) { 00622 // For overlaid mount points, set the variable right now: 00623 if ($v_rl['_MP_PARAM'] && $v_rl['_MOUNT_OL']) { 00624 $rl_MParray[] = $v_rl['_MP_PARAM']; 00625 } 00626 // Traverse rootline: 00627 if ($k_rl>=$beginKey && $k_rl<=$endKey) { 00628 $temp_key=$k_rl; 00629 $temp[$temp_key]=$this->sys_page->getPage($v_rl['uid']); 00630 if (count($temp[$temp_key])) { 00631 if (!$temp[$temp_key]['target']) { // If there are no specific target for the page, put the level specific target on. 00632 $temp[$temp_key]['target'] = $this->conf['special.']['targets.'][$k_rl]; 00633 $temp[$temp_key]['_MP_PARAM'] = implode(',',$rl_MParray); 00634 } 00635 } else unset($temp[$temp_key]); 00636 } 00637 // For normal mount points, set the variable for next level. 00638 if ($v_rl['_MP_PARAM'] && !$v_rl['_MOUNT_OL']) { 00639 $rl_MParray[] = $v_rl['_MP_PARAM']; 00640 } 00641 } 00642 break; 00643 case 'browse': 00644 list($value)=t3lib_div::intExplode(',',$value); 00645 if (!$value) { 00646 $value=$GLOBALS['TSFE']->page['uid']; 00647 } 00648 if ($value!=$this->tmpl->rootLine[0]['uid']) { // Will not work out of rootline 00649 $recArr=array(); 00650 $value_rec=$this->sys_page->getPage($value); // The page record of the 'value'. 00651 if ($value_rec['pid']) { // 'up' page cannot be outside rootline 00652 $recArr['up']=$this->sys_page->getPage($value_rec['pid']); // The page record of 'up'. 00653 } 00654 if ($recArr['up']['pid'] && $value_rec['pid']!=$this->tmpl->rootLine[0]['uid']) { // If the 'up' item was NOT level 0 in rootline... 00655 $recArr['index']=$this->sys_page->getPage($recArr['up']['pid']); // The page record of "index". 00656 } 00657 00658 // prev / next is found 00659 $prevnext_menu = $this->sys_page->getMenu($value_rec['pid'],'*',$altSortField); 00660 $lastKey=0; 00661 $nextActive=0; 00662 reset($prevnext_menu); 00663 while(list($k_b,$v_b)=each($prevnext_menu)) { 00664 if ($nextActive) { 00665 $recArr['next']=$v_b; 00666 $nextActive=0; 00667 } 00668 if ($v_b['uid']==$value) { 00669 if ($lastKey) { 00670 $recArr['prev']=$prevnext_menu[$lastKey]; 00671 } 00672 $nextActive=1; 00673 } 00674 $lastKey=$k_b; 00675 } 00676 reset($prevnext_menu); 00677 $recArr['first']=pos($prevnext_menu); 00678 end($prevnext_menu); 00679 $recArr['last']=pos($prevnext_menu); 00680 00681 // prevsection / nextsection is found 00682 if (is_array($recArr['index'])) { // You can only do this, if there is a valid page two levels up! 00683 $prevnextsection_menu = $this->sys_page->getMenu($recArr['index']['uid'],'*',$altSortField); 00684 $lastKey=0; 00685 $nextActive=0; 00686 reset($prevnextsection_menu); 00687 while(list($k_b,$v_b)=each($prevnextsection_menu)) { 00688 if ($nextActive) { 00689 $sectionRec_temp = $this->sys_page->getMenu($v_b['uid'],'*',$altSortField); 00690 if (count($sectionRec_temp)) { 00691 reset($sectionRec_temp); 00692 $recArr['nextsection']=pos($sectionRec_temp); 00693 end ($sectionRec_temp); 00694 $recArr['nextsection_last']=pos($sectionRec_temp); 00695 $nextActive=0; 00696 } 00697 } 00698 if ($v_b['uid']==$value_rec['pid']) { 00699 if ($lastKey) { 00700 $sectionRec_temp = $this->sys_page->getMenu($prevnextsection_menu[$lastKey]['uid'],'*',$altSortField); 00701 if (count($sectionRec_temp)) { 00702 reset($sectionRec_temp); 00703 $recArr['prevsection']=pos($sectionRec_temp); 00704 end ($sectionRec_temp); 00705 $recArr['prevsection_last']=pos($sectionRec_temp); 00706 } 00707 } 00708 $nextActive=1; 00709 } 00710 $lastKey=$k_b; 00711 } 00712 } 00713 if ($this->conf['special.']['items.']['prevnextToSection']) { 00714 if (!is_array($recArr['prev']) && is_array($recArr['prevsection_last'])) { 00715 $recArr['prev']=$recArr['prevsection_last']; 00716 } 00717 if (!is_array($recArr['next']) && is_array($recArr['nextsection'])) { 00718 $recArr['next']=$recArr['nextsection']; 00719 } 00720 } 00721 00722 $items = explode('|',$this->conf['special.']['items']); 00723 $c=0; 00724 while(list($k_b,$v_b)=each($items)) { 00725 $v_b=strtolower(trim($v_b)); 00726 if (intval($this->conf['special.'][$v_b.'.']['uid'])) { 00727 $recArr[$v_b] = $this->sys_page->getPage(intval($this->conf['special.'][$v_b.'.']['uid'])); // fetches the page in case of a hardcoded pid in template 00728 } 00729 if (is_array($recArr[$v_b])) { 00730 $temp[$c]=$recArr[$v_b]; 00731 if ($this->conf['special.'][$v_b.'.']['target']) { 00732 $temp[$c]['target']=$this->conf['special.'][$v_b.'.']['target']; 00733 } 00734 if (is_array($this->conf['special.'][$v_b.'.']['fields.'])) { 00735 reset($this->conf['special.'][$v_b.'.']['fields.']); 00736 while(list($fk,$val)=each($this->conf['special.'][$v_b.'.']['fields.'])) { 00737 $temp[$c][$fk]=$val; 00738 } 00739 } 00740 $c++; 00741 } 00742 } 00743 } 00744 break; 00745 } 00746 } elseif (is_array($this->alternativeMenuTempArray)) { // Setting $temp array if not level 1. 00747 $temp = $this->alternativeMenuTempArray; 00748 } elseif ($this->mconf['sectionIndex']) { 00749 if ($GLOBALS['TSFE']->sys_language_uid && count($this->sys_page->getPageOverlay($this->id))) { 00750 $sys_language_uid = intval($GLOBALS['TSFE']->sys_language_uid); 00751 } else $sys_language_uid=0; 00752 00753 $selectSetup = Array( 00754 'pidInList'=>$this->id, 00755 'orderBy'=>$altSortField, 00756 'where' => 'colPos=0 AND sys_language_uid='.$sys_language_uid, 00757 'andWhere' => 'sectionIndex!=0' 00758 ); 00759 switch($this->mconf['sectionIndex.']['type']) { 00760 case 'all': 00761 unset($selectSetup['andWhere']); 00762 break; 00763 case 'header': 00764 $selectSetup['andWhere']='header_layout!=100 AND header!=""'; 00765 break; 00766 } 00767 $basePageRow=$this->sys_page->getPage($this->id); 00768 if (is_array($basePageRow)) { 00769 $res = $GLOBALS['TSFE']->cObj->exec_getQuery('tt_content', $selectSetup); 00770 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00771 $GLOBALS['TSFE']->sys_page->versionOL('tt_content',$row); 00772 00773 if (is_array($row)) { 00774 $temp[$row['uid']]=$basePageRow; 00775 $temp[$row['uid']]['title']=$row['header']; 00776 $temp[$row['uid']]['nav_title']=$row['header']; 00777 $temp[$row['uid']]['subtitle']=$row['subheader']; 00778 $temp[$row['uid']]['starttime']=$row['starttime']; 00779 $temp[$row['uid']]['endtime']=$row['endtime']; 00780 $temp[$row['uid']]['fe_group']=$row['fe_group']; 00781 $temp[$row['uid']]['media']=$row['media']; 00782 00783 $temp[$row['uid']]['header_layout']=$row['header_layout']; 00784 $temp[$row['uid']]['bodytext']=$row['bodytext']; 00785 $temp[$row['uid']]['image']=$row['image']; 00786 00787 $temp[$row['uid']]['sectionIndex_uid']=$row['uid']; 00788 } 00789 } 00790 } 00791 } else { // Default: 00792 $temp = $this->sys_page->getMenu($this->id,'*',$altSortField); // gets the menu 00793 } 00794 00795 $c=0; 00796 $c_b=0; 00797 $minItems = intval($this->mconf['minItems'] ? $this->mconf['minItems'] : $this->conf['minItems']); 00798 $maxItems = intval($this->mconf['maxItems'] ? $this->mconf['maxItems'] : $this->conf['maxItems']); 00799 $begin = tslib_cObj::calc($this->mconf['begin'] ? $this->mconf['begin'] : $this->conf['begin']); 00800 00801 $banUidArray = $this->getBannedUids(); 00802 00803 // Fill in the menuArr with elements that should go into the menu: 00804 $this->menuArr = Array(); 00805 foreach($temp as $data) { 00806 $spacer = (t3lib_div::inList($this->spacerIDList,$data['doktype']) || !strcmp($data['ITEM_STATE'],'SPC')) ? 1 : 0; // if item is a spacer, $spacer is set 00807 if ($this->filterMenuPages($data, $banUidArray, $spacer)) { 00808 $c_b++; 00809 if ($begin<=$c_b) { // If the beginning item has been reached. 00810 $this->menuArr[$c] = $data; 00811 $this->menuArr[$c]['isSpacer'] = $spacer; 00812 $c++; 00813 if ($maxItems && $c>=$maxItems) { 00814 break; 00815 } 00816 } 00817 } 00818 } 00819 00820 // Fill in fake items, if min-items is set. 00821 if ($minItems) { 00822 while($c<$minItems) { 00823 $this->menuArr[$c] = Array( 00824 'title' => '...', 00825 'uid' => $GLOBALS['TSFE']->id 00826 ); 00827 $c++; 00828 } 00829 } 00830 // Setting number of menu items 00831 $GLOBALS['TSFE']->register['count_menuItems'] = count($this->menuArr); 00832 // Passing the menuArr through a user defined function: 00833 if ($this->mconf['itemArrayProcFunc']) { 00834 if (!is_array($this->parentMenuArr)) {$this->parentMenuArr=array();} 00835 $this->menuArr = $this->userProcess('itemArrayProcFunc',$this->menuArr); 00836 } 00837 $this->hash = md5(serialize($this->menuArr).serialize($this->mconf).serialize($this->tmpl->rootLine).serialize($this->MP_array)); 00838 00839 $serData = $this->sys_page->getHash($this->hash, 60*60*24); 00840 if (!$serData) { 00841 $this->generate(); 00842 $this->sys_page->storeHash($this->hash, serialize($this->result),'MENUDATA'); 00843 } else { 00844 $this->result=unserialize($serData); 00845 } 00846 00847 // End showAccessRestrictedPages 00848 if ($this->mconf['showAccessRestrictedPages']) { 00849 // RESTORING where_groupAccess 00850 $this->sys_page->where_groupAccess = $SAVED_where_groupAccess; 00851 } 00852 } 00853 } 00854 00865 function includeMakeMenu($conf,$altSortField) { 00866 $incFile = $GLOBALS['TSFE']->tmpl->getFileName($conf['file']); 00867 if ($incFile && $GLOBALS['TSFE']->checkFileInclude($incFile)) { 00868 include($incFile); 00869 } 00870 return is_array($menuItemsArray) ? $menuItemsArray : array(); 00871 } 00872 00881 function filterMenuPages(&$data,$banUidArray,$spacer) { 00882 00883 if ($data['_SAFE']) return TRUE; 00884 00885 $uid = $data['uid']; 00886 if ($this->mconf['SPC'] || !$spacer) { // If the spacer-function is not enabled, spacers will not enter the $menuArr 00887 if (!t3lib_div::inList($this->doktypeExcludeList,$data['doktype'])) { // Page may not be 'not_in_menu' or 'Backend User Section' 00888 if (!$data['nav_hide'] || $this->conf['includeNotInMenu']) { // Not hidden in navigation 00889 if (!t3lib_div::inArray($banUidArray,$uid)) { // not in banned uid's 00890 00891 // Checks if the default language version can be shown: 00892 // Block page is set, if l18n_cfg allows plus: 1) Either default language or 2) another language but NO overlay record set for page! 00893 $blockPage = $data['l18n_cfg']&1 && (!$GLOBALS['TSFE']->sys_language_uid || ($GLOBALS['TSFE']->sys_language_uid && !$data['_PAGES_OVERLAY'])); 00894 if (!$blockPage) { 00895 00896 // Checking if a page should be shown in the menu depending on whether a translation exists: 00897 $tok = TRUE; 00898 if ($GLOBALS['TSFE']->sys_language_uid && t3lib_div::hideIfNotTranslated($data['l18n_cfg'])) { // There is an alternative language active AND the current page requires a translation: 00899 if (!$data['_PAGES_OVERLAY']) { 00900 $tok = FALSE; 00901 } 00902 } 00903 00904 // Continue if token is true: 00905 if ($tok) { 00906 00907 // Checking if "&L" should be modified so links to non-accessible pages will not happen. 00908 if ($this->conf['protectLvar']) { 00909 $languageUid = intval($GLOBALS['TSFE']->config['config']['sys_language_uid']); 00910 if ($languageUid && ($this->conf['protectLvar']=='all' || t3lib_div::hideIfNotTranslated($data['l18n_cfg']))) { 00911 $olRec = $GLOBALS['TSFE']->sys_page->getPageOverlay($data['uid'], $languageUid); 00912 if (!count($olRec)) { 00913 // If no pages_language_overlay record then page can NOT be accessed in the language pointed to by "&L" and therefore we protect the link by setting "&L=0" 00914 $data['_ADD_GETVARS'].= '&L=0'; 00915 } 00916 } 00917 } 00918 00919 return TRUE; 00920 } 00921 } 00922 } 00923 } 00924 } 00925 } 00926 } 00927 00937 function procesItemStates($splitCount) { 00938 00939 // Prepare normal settings 00940 if (!is_array($this->mconf['NO.']) && $this->mconf['NO']) $this->mconf['NO.']=array(); // Setting a blank array if NO=1 and there are no properties. 00941 $NOconf = $this->tmpl->splitConfArray($this->mconf['NO.'],$splitCount); 00942 00943 // Prepare rollOver settings, overriding normal settings 00944 $ROconf=array(); 00945 if ($this->mconf['RO']) { 00946 $ROconf = $this->tmpl->splitConfArray($this->mconf['RO.'],$splitCount); 00947 } 00948 00949 // Prepare IFSUB settings, overriding normal settings 00950 // IFSUB is true if there exist submenu items to the current item 00951 if ($this->mconf['IFSUB']) { 00952 $IFSUBinit = 0; // Flag: If $IFSUB is generated 00953 reset($NOconf); 00954 while (list($key,$val)=each($NOconf)) { 00955 if ($this->isItemState('IFSUB',$key)) { 00956 if (!$IFSUBinit) { // if this is the first IFSUB element, we must generate IFSUB. 00957 $IFSUBconf = $this->tmpl->splitConfArray($this->mconf['IFSUB.'],$splitCount); 00958 if ($this->mconf['IFSUBRO']) { 00959 $IFSUBROconf = $this->tmpl->splitConfArray($this->mconf['IFSUBRO.'],$splitCount); 00960 } 00961 $IFSUBinit = 1; 00962 } 00963 $NOconf[$key] = $IFSUBconf[$key]; // Substitute normal with ifsub 00964 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 00965 $ROconf[$key] = $IFSUBROconf[$key] ? $IFSUBROconf[$key] : $IFSUBconf[$key]; // If RollOver on active then apply this 00966 } 00967 } 00968 } 00969 } 00970 // Prepare active settings, overriding normal settings 00971 if ($this->mconf['ACT']) { 00972 $ACTinit = 0; // Flag: If $ACT is generated 00973 reset($NOconf); 00974 while (list($key,$val)=each($NOconf)) { // Find active 00975 if ($this->isItemState('ACT',$key)) { 00976 if (!$ACTinit) { // if this is the first 'active', we must generate ACT. 00977 $ACTconf = $this->tmpl->splitConfArray($this->mconf['ACT.'],$splitCount); 00978 // Prepare active rollOver settings, overriding normal active settings 00979 if ($this->mconf['ACTRO']) { 00980 $ACTROconf = $this->tmpl->splitConfArray($this->mconf['ACTRO.'],$splitCount); 00981 } 00982 $ACTinit = 1; 00983 } 00984 $NOconf[$key] = $ACTconf[$key]; // Substitute normal with active 00985 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 00986 $ROconf[$key] = $ACTROconf[$key] ? $ACTROconf[$key] : $ACTconf[$key]; // If RollOver on active then apply this 00987 } 00988 } 00989 } 00990 } 00991 // Prepare ACT (active)/IFSUB settings, overriding normal settings 00992 // ACTIFSUB is true if there exist submenu items to the current item and the current item is active 00993 if ($this->mconf['ACTIFSUB']) { 00994 $ACTIFSUBinit = 0; // Flag: If $ACTIFSUB is generated 00995 reset($NOconf); 00996 while (list($key,$val)=each($NOconf)) { // Find active 00997 if ($this->isItemState('ACTIFSUB',$key)) { 00998 if (!$ACTIFSUBinit) { // if this is the first 'active', we must generate ACTIFSUB. 00999 $ACTIFSUBconf = $this->tmpl->splitConfArray($this->mconf['ACTIFSUB.'],$splitCount); 01000 // Prepare active rollOver settings, overriding normal active settings 01001 if ($this->mconf['ACTIFSUBRO']) { 01002 $ACTIFSUBROconf = $this->tmpl->splitConfArray($this->mconf['ACTIFSUBRO.'],$splitCount); 01003 } 01004 $ACTIFSUBinit = 1; 01005 } 01006 $NOconf[$key] = $ACTIFSUBconf[$key]; // Substitute normal with active 01007 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 01008 $ROconf[$key] = $ACTIFSUBROconf[$key] ? $ACTIFSUBROconf[$key] : $ACTIFSUBconf[$key]; // If RollOver on active then apply this 01009 } 01010 } 01011 } 01012 } 01013 // Prepare CUR (current) settings, overriding normal settings 01014 // CUR is true if the current page equals the item here! 01015 if ($this->mconf['CUR']) { 01016 $CURinit = 0; // Flag: If $CUR is generated 01017 reset($NOconf); 01018 while (list($key,$val)=each($NOconf)) { 01019 if ($this->isItemState('CUR',$key)) { 01020 if (!$CURinit) { // if this is the first 'current', we must generate CUR. Basically this control is just inherited from the other implementations as current would only exist one time and thats it (unless you use special-features of HMENU) 01021 $CURconf = $this->tmpl->splitConfArray($this->mconf['CUR.'],$splitCount); 01022 if ($this->mconf['CURRO']) { 01023 $CURROconf = $this->tmpl->splitConfArray($this->mconf['CURRO.'],$splitCount); 01024 } 01025 $CURinit = 1; 01026 } 01027 $NOconf[$key] = $CURconf[$key]; // Substitute normal with current 01028 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 01029 $ROconf[$key] = $CURROconf[$key] ? $CURROconf[$key] : $CURconf[$key]; // If RollOver on active then apply this 01030 } 01031 } 01032 } 01033 } 01034 // Prepare CUR (current)/IFSUB settings, overriding normal settings 01035 // CURIFSUB is true if there exist submenu items to the current item and the current page equals the item here! 01036 if ($this->mconf['CURIFSUB']) { 01037 $CURIFSUBinit = 0; // Flag: If $CURIFSUB is generated 01038 reset($NOconf); 01039 while (list($key,$val)=each($NOconf)) { 01040 if ($this->isItemState('CURIFSUB',$key)) { 01041 if (!$CURIFSUBinit) { // if this is the first 'current', we must generate CURIFSUB. 01042 $CURIFSUBconf = $this->tmpl->splitConfArray($this->mconf['CURIFSUB.'],$splitCount); 01043 // Prepare current rollOver settings, overriding normal current settings 01044 if ($this->mconf['CURIFSUBRO']) { 01045 $CURIFSUBROconf = $this->tmpl->splitConfArray($this->mconf['CURIFSUBRO.'],$splitCount); 01046 } 01047 $CURIFSUBinit = 1; 01048 } 01049 $NOconf[$key] = $CURIFSUBconf[$key]; // Substitute normal with active 01050 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the current 01051 $ROconf[$key] = $CURIFSUBROconf[$key] ? $CURIFSUBROconf[$key] : $CURIFSUBconf[$key]; // If RollOver on current then apply this 01052 } 01053 } 01054 } 01055 } 01056 // Prepare active settings, overriding normal settings 01057 if ($this->mconf['USR']) { 01058 $USRinit = 0; // Flag: If $USR is generated 01059 reset($NOconf); 01060 while (list($key,$val)=each($NOconf)) { // Find active 01061 if ($this->isItemState('USR',$key)) { 01062 if (!$USRinit) { // if this is the first active, we must generate USR. 01063 $USRconf = $this->tmpl->splitConfArray($this->mconf['USR.'],$splitCount); 01064 // Prepare active rollOver settings, overriding normal active settings 01065 if ($this->mconf['USRRO']) { 01066 $USRROconf = $this->tmpl->splitConfArray($this->mconf['USRRO.'],$splitCount); 01067 } 01068 $USRinit = 1; 01069 } 01070 $NOconf[$key] = $USRconf[$key]; // Substitute normal with active 01071 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 01072 $ROconf[$key] = $USRROconf[$key] ? $USRROconf[$key] : $USRconf[$key]; // If RollOver on active then apply this 01073 } 01074 } 01075 } 01076 } 01077 // Prepare spacer settings, overriding normal settings 01078 if ($this->mconf['SPC']) { 01079 $SPCinit = 0; // Flag: If $SPC is generated 01080 reset($NOconf); 01081 while (list($key,$val)=each($NOconf)) { // Find spacers 01082 if ($this->isItemState('SPC',$key)) { 01083 if (!$SPCinit) { // if this is the first spacer, we must generate SPC. 01084 $SPCconf = $this->tmpl->splitConfArray($this->mconf['SPC.'],$splitCount); 01085 $SPCinit = 1; 01086 } 01087 $NOconf[$key] = $SPCconf[$key]; // Substitute normal with spacer 01088 } 01089 } 01090 } 01091 // Prepare Userdefined settings 01092 if ($this->mconf['USERDEF1']) { 01093 $USERDEF1init = 0; // Flag: If $USERDEF1 is generated 01094 reset($NOconf); 01095 while (list($key,$val)=each($NOconf)) { // Find active 01096 if ($this->isItemState('USERDEF1',$key)) { 01097 if (!$USERDEF1init) { // if this is the first active, we must generate USERDEF1. 01098 $USERDEF1conf = $this->tmpl->splitConfArray($this->mconf['USERDEF1.'],$splitCount); 01099 // Prepare active rollOver settings, overriding normal active settings 01100 if ($this->mconf['USERDEF1RO']) { 01101 $USERDEF1ROconf = $this->tmpl->splitConfArray($this->mconf['USERDEF1RO.'],$splitCount); 01102 } 01103 $USERDEF1init = 1; 01104 } 01105 $NOconf[$key] = $USERDEF1conf[$key]; // Substitute normal with active 01106 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 01107 $ROconf[$key] = $USERDEF1ROconf[$key] ? $USERDEF1ROconf[$key] : $USERDEF1conf[$key]; // If RollOver on active then apply this 01108 } 01109 } 01110 } 01111 } 01112 // Prepare Userdefined settings 01113 if ($this->mconf['USERDEF2']) { 01114 $USERDEF2init = 0; // Flag: If $USERDEF2 is generated 01115 reset($NOconf); 01116 while (list($key,$val)=each($NOconf)) { // Find active 01117 if ($this->isItemState('USERDEF2',$key)) { 01118 if (!$USERDEF2init) { // if this is the first active, we must generate USERDEF2. 01119 $USERDEF2conf = $this->tmpl->splitConfArray($this->mconf['USERDEF2.'],$splitCount); 01120 // Prepare active rollOver settings, overriding normal active settings 01121 if ($this->mconf['USERDEF2RO']) { 01122 $USERDEF2ROconf = $this->tmpl->splitConfArray($this->mconf['USERDEF2RO.'],$splitCount); 01123 } 01124 $USERDEF2init = 1; 01125 } 01126 $NOconf[$key] = $USERDEF2conf[$key]; // Substitute normal with active 01127 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 01128 $ROconf[$key] = $USERDEF2ROconf[$key] ? $USERDEF2ROconf[$key] : $USERDEF2conf[$key]; // If RollOver on active then apply this 01129 } 01130 } 01131 } 01132 } 01133 01134 return array($NOconf,$ROconf); 01135 } 01136 01147 function link($key,$altTarget='',$typeOverride='') { 01148 01149 // Mount points: 01150 $MP_var = $this->getMPvar($key); 01151 $MP_params = $MP_var ? '&MP='.rawurlencode($MP_var) : ''; 01152 01153 // Setting override ID 01154 if ($this->mconf['overrideId'] || $this->menuArr[$key]['overrideId']) { 01155 $overrideArray = array(); 01156 // If a user script returned the value overrideId in the menu array we use that as page id 01157 $overrideArray['uid'] = $this->mconf['overrideId']?$this->mconf['overrideId']:$this->menuArr[$key]['overrideId']; 01158 $overrideArray['alias'] = ''; 01159 $MP_params = ''; // clear MP parameters since ID was changed. 01160 } else { 01161 $overrideArray=''; 01162 } 01163 01164 // Setting main target: 01165 $mainTarget = $altTarget ? $altTarget : $this->mconf['target']; 01166 01167 // Creating link: 01168 if ($this->mconf['collapse'] && $this->isActive($this->menuArr[$key]['uid'], $this->getMPvar($key))) { 01169 $thePage = $this->sys_page->getPage($this->menuArr[$key]['pid']); 01170 $LD = $this->tmpl->linkData($thePage,$mainTarget,'','',$overrideArray, $this->mconf['addParams'].$MP_params.$this->menuArr[$key]['_ADD_GETVARS'], $typeOverride); 01171 } else { 01172 $LD = $this->tmpl->linkData($this->menuArr[$key],$mainTarget,'','',$overrideArray, $this->mconf['addParams'].$MP_params.$this->menuArr[$key]['_ADD_GETVARS'], $typeOverride); 01173 } 01174 01175 // Manipulation in case of access restricted pages: 01176 $this->changeLinksForAccessRestrictedPages($LD,$this->menuArr[$key],$mainTarget,$typeOverride); 01177 01178 // Overriding URL / Target if set to do so: 01179 if ($this->menuArr[$key]['_OVERRIDE_HREF']) { 01180 $LD['totalURL'] = $this->menuArr[$key]['_OVERRIDE_HREF']; 01181 if ($this->menuArr[$key]['_OVERRIDE_TARGET']) $LD['target'] = $this->menuArr[$key]['_OVERRIDE_TARGET']; 01182 } 01183 01184 // OnClick open in windows. 01185 $onClick=''; 01186 if ($this->mconf['JSWindow']) { 01187 $conf=$this->mconf['JSWindow.']; 01188 $url=$LD['totalURL']; 01189 $LD['totalURL'] = '#'; 01190 $onClick= 'openPic(\''.$GLOBALS['TSFE']->baseUrlWrap($url).'\',\''.($conf['newWindow']?md5($url):'theNewPage').'\',\''.$conf['params'].'\'); return false;'; 01191 $GLOBALS['TSFE']->setJS('openPic'); 01192 } 01193 01194 // out: 01195 $list = array(); 01196 $list['HREF'] = strlen($LD['totalURL']) ? $LD['totalURL'] : $GLOBALS['TSFE']->baseUrl; // Added this check: What it does is to enter the baseUrl (if set, which it should for "realurl" based sites) as URL if the calculated value is empty. The problem is that no link is generated with a blank URL and blank URLs might appear when the realurl encoding is used and a link to the frontpage is generated. 01197 $list['TARGET'] = $LD['target']; 01198 $list['onClick'] = $onClick; 01199 01200 return $list; 01201 } 01202 01212 function changeLinksForAccessRestrictedPages(&$LD, $page, $mainTarget, $typeOverride) { 01213 01214 // If access restricted pages should be shown in menus, change the link of such pages to link to a redirection page: 01215 if ($this->mconf['showAccessRestrictedPages'] && $this->mconf['showAccessRestrictedPages']!=='NONE' && !$GLOBALS['TSFE']->checkPageGroupAccess($page)) { 01216 $thePage = $this->sys_page->getPage($this->mconf['showAccessRestrictedPages']); 01217 01218 $addParams = $this->mconf['showAccessRestrictedPages.']['addParams']; 01219 $addParams = str_replace('###RETURN_URL###',rawurlencode($LD['totalURL']),$addParams); 01220 $addParams = str_replace('###PAGE_ID###',$page['uid'],$addParams); 01221 $LD = $this->tmpl->linkData($thePage,$mainTarget,'','','', $addParams, $typeOverride); 01222 } 01223 } 01224 01233 function subMenu($uid, $objSuffix='') { 01234 01235 // Setting alternative menu item array if _SUB_MENU has been defined in the current ->menuArr 01236 $altArray = ''; 01237 if (is_array($this->menuArr[$this->I['key']]['_SUB_MENU']) && count($this->menuArr[$this->I['key']]['_SUB_MENU'])) { 01238 $altArray = $this->menuArr[$this->I['key']]['_SUB_MENU']; 01239 } 01240 01241 // Make submenu if the page is the next active 01242 $cls = strtolower($this->conf[($this->menuNumber+1).$objSuffix]); 01243 $subLevelClass = ($cls && t3lib_div::inList($this->tmpl->menuclasses,$cls)) ? $cls : ''; 01244 01245 if ($subLevelClass && ($this->mconf['expAll'] || $this->isNext($uid, $this->getMPvar($this->I['key'])) || is_array($altArray)) && !$this->mconf['sectionIndex']) { 01246 $submenu = t3lib_div::makeInstance('tslib_'.$subLevelClass); 01247 $submenu->entryLevel = $this->entryLevel+1; 01248 $submenu->rL_uidRegister = $this->rL_uidRegister; 01249 $submenu->MP_array = $this->MP_array; 01250 if ($this->menuArr[$this->I['key']]['_MP_PARAM']) { 01251 $submenu->MP_array[] = $this->menuArr[$this->I['key']]['_MP_PARAM']; 01252 } 01253 01254 // especially scripts that build the submenu needs the parent data 01255 $submenu->parentMenuArr = $this->menuArr; 01256 01257 // Setting alternativeMenuTempArray (will be effective only if an array) 01258 if (is_array($altArray)) { 01259 $submenu->alternativeMenuTempArray = $altArray; 01260 } 01261 01262 if ($submenu->start($this->tmpl, $this->sys_page, $uid, $this->conf, $this->menuNumber+1, $objSuffix)) { 01263 $submenu->makeMenu(); 01264 return $submenu->writeMenu(); 01265 } 01266 } 01267 } 01268 01278 function isNext($uid, $MPvar='') { 01279 01280 // Check for always active PIDs: 01281 if (count($this->alwaysActivePIDlist) && in_array($uid,$this->alwaysActivePIDlist)) { 01282 return TRUE; 01283 } 01284 01285 $testUid = $uid.($MPvar?':'.$MPvar:''); 01286 if ($uid && $testUid==$this->nextActive) { 01287 return TRUE; 01288 } 01289 } 01290 01299 function isActive($uid, $MPvar='') { 01300 01301 // Check for always active PIDs: 01302 if (count($this->alwaysActivePIDlist) && in_array($uid,$this->alwaysActivePIDlist)) { 01303 return TRUE; 01304 } 01305 01306 $testUid = $uid.($MPvar?':'.$MPvar:''); 01307 if ($uid && in_array('ITEM:'.$testUid, $this->rL_uidRegister)) { 01308 return TRUE; 01309 } 01310 } 01311 01320 function isCurrent($uid, $MPvar='') { 01321 $testUid = $uid.($MPvar?':'.$MPvar:''); 01322 if ($uid && !strcmp(end($this->rL_uidRegister),'ITEM:'.$testUid)) { 01323 return TRUE; 01324 } 01325 } 01326 01335 function isSubMenu($uid) { 01336 01337 // Looking for a mount-pid for this UID since if that exists we should look for a subpages THERE and not in the input $uid; 01338 $mount_info = $this->sys_page->getMountPointInfo($uid); 01339 if (is_array($mount_info)) { 01340 $uid = $mount_info['mount_pid']; 01341 } 01342 01343 $recs = $this->sys_page->getMenu($uid,'uid,pid,doktype,mount_pid,mount_pid_ol,nav_hide'); 01344 foreach($recs as $theRec) { 01345 if (!t3lib_div::inList($this->doktypeExcludeList,$theRec['doktype']) && (!$theRec['nav_hide'] || $this->conf['includeNotInMenu'])) { // If a menu item seems to be another type than 'Not in menu', then return true (there were items!) 01346 return TRUE; 01347 } 01348 } 01349 } 01350 01360 function isItemState($kind,$key) { 01361 $natVal=0; 01362 if ($this->menuArr[$key]['ITEM_STATE']) { // If any value is set for ITEM_STATE the normal evaluation is discarded 01363 if (!strcmp($this->menuArr[$key]['ITEM_STATE'],$kind)) {$natVal=1;} 01364 } else { 01365 switch($kind) { 01366 case 'SPC': 01367 $natVal = $this->menuArr[$key]['isSpacer']; 01368 break; 01369 case 'IFSUB': 01370 $natVal = $this->isSubMenu($this->menuArr[$key]['uid']); 01371 break; 01372 case 'ACT': 01373 $natVal = $this->isActive($this->menuArr[$key]['uid'], $this->getMPvar($key)); 01374 break; 01375 case 'ACTIFSUB': 01376 $natVal = $this->isActive($this->menuArr[$key]['uid'], $this->getMPvar($key)) && $this->isSubMenu($this->menuArr[$key]['uid']); 01377 break; 01378 case 'CUR': 01379 $natVal = $this->isCurrent($this->menuArr[$key]['uid'], $this->getMPvar($key)); 01380 break; 01381 case 'CURIFSUB': 01382 $natVal = $this->isCurrent($this->menuArr[$key]['uid'], $this->getMPvar($key)) && $this->isSubMenu($this->menuArr[$key]['uid']); 01383 break; 01384 case 'USR': 01385 $natVal = $this->menuArr[$key]['fe_group']; 01386 break; 01387 } 01388 } 01389 01390 return $natVal; 01391 } 01392 01400 function accessKey($title) { 01401 // The global array ACCESSKEY is used to globally control if letters are already used!! 01402 $result = Array(); 01403 01404 $titleLen = strlen($title); 01405 for ($a=0;$a<$titleLen;$a++) { 01406 $key = strtoupper(trim(substr($title,$a,1))); 01407 if (preg_match('/[a-zA-Z]/', $key) && !isset($GLOBALS['TSFE']->accessKey[$key])) { 01408 $GLOBALS['TSFE']->accessKey[$key]=1; 01409 $result['code'] = ' accesskey="'.$key.'"'; 01410 $result['alt'] = ' (ALT+'.$key.')'; 01411 break; 01412 } 01413 } 01414 return $result; 01415 } 01416 01426 function userProcess($mConfKey,$passVar) { 01427 if ($this->mconf[$mConfKey]) { 01428 $funcConf = $this->mconf[$mConfKey.'.']; 01429 $funcConf['parentObj']=&$this; 01430 $passVar = $GLOBALS['TSFE']->cObj->callUserFunction($this->mconf[$mConfKey], $funcConf, $passVar); 01431 } 01432 return $passVar; 01433 } 01434 01441 function setATagParts() { 01442 $this->I['A1'] = '<a '.t3lib_div::implodeAttributes($this->I['linkHREF'],1).$this->I['val']['ATagParams'].$this->I['addATagParams'].$this->I['accessKey']['code'].'>'; 01443 $this->I['A2'] = '</a>'; 01444 } 01445 01454 function getPageTitle($title,$nav_title) { 01455 return strcmp(trim($nav_title),'') ? $nav_title : $title; 01456 } 01457 01466 function getMPvar($key) { 01467 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['enable_mount_pids']) { 01468 $localMP_array = $this->MP_array; 01469 if ($this->menuArr[$key]['_MP_PARAM']) $localMP_array[] = $this->menuArr[$key]['_MP_PARAM']; // NOTICE: "_MP_PARAM" is allowed to be a commalist of PID pairs! 01470 $MP_params = count($localMP_array) ? implode(',',$localMP_array) : ''; 01471 return $MP_params; 01472 } 01473 } 01474 01481 function getDoktypeExcludeWhere() { 01482 return $this->doktypeExcludeList ? ' AND pages.doktype NOT IN ('.$this->doktypeExcludeList.')' : ''; 01483 } 01484 01491 function getBannedUids() { 01492 $banUidArray = array(); 01493 01494 if (trim($this->conf['excludeUidList'])) { 01495 $banUidList = str_replace('current', $GLOBALS['TSFE']->page['uid'], $this->conf['excludeUidList']); 01496 $banUidArray = t3lib_div::intExplode(',', $banUidList); 01497 } 01498 01499 return $banUidArray; 01500 } 01501 01502 } 01503 01504 01505 01506 01507 01508 01509 01510 01511 01512 01513 01514 01515 01516 01517 01518 01519 01520 01521 01530 class tslib_tmenu extends tslib_menu { 01531 01539 function generate() { 01540 $splitCount = count($this->menuArr); 01541 if ($splitCount) { 01542 list($NOconf) = $this->procesItemStates($splitCount); 01543 } 01544 if ($this->mconf['debugItemConf']) {echo '<h3>$NOconf:</h3>'; debug($NOconf); } 01545 $this->result = $NOconf; 01546 } 01547 01555 function writeMenu() { 01556 if (is_array($this->result) && count($this->result)) { 01557 $this->WMcObj =t3lib_div::makeInstance('tslib_cObj'); // Create new tslib_cObj for our use 01558 $this->WMresult=''; 01559 $this->INPfixMD5 = substr(md5(microtime().'tmenu'),0,4); 01560 $this->WMmenuItems = count($this->result); 01561 01562 $this->WMsubmenuObjSuffixes = $this->tmpl->splitConfArray(array('sOSuffix'=>$this->mconf['submenuObjSuffixes']),$this->WMmenuItems); 01563 01564 $this->extProc_init(); 01565 reset($this->result); 01566 while (list($key,$val)=each($this->result)) { 01567 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']++; 01568 $GLOBALS['TSFE']->register['count_MENUOBJ']++; 01569 01570 $this->I=array(); 01571 $this->WMcObj->start($this->menuArr[$key],'pages'); // Initialize the cObj with the page record of the menu item 01572 $this->I['key'] = $key; 01573 $this->I['INPfix']= $this->imgNameNotRandom?'':'_'.$this->INPfixMD5.'_'.$key; 01574 $this->I['val'] = $val; 01575 $this->I['title'] = $this->WMcObj->stdWrap($this->getPageTitle($this->menuArr[$key]['title'],$this->menuArr[$key]['nav_title']),$this->I['val']['stdWrap.']); 01576 $this->I['uid'] = $this->menuArr[$key]['uid']; 01577 $this->I['mount_pid'] = $this->menuArr[$key]['mount_pid']; 01578 $this->I['pid'] = $this->menuArr[$key]['pid']; 01579 $this->I['spacer'] = $this->menuArr[$key]['isSpacer']; 01580 01581 // Make link tag 01582 $this->I['val']['ATagParams'] = $this->WMcObj->getATagParams($this->I['val'], 0); 01583 $this->I['linkHREF'] = $this->link($key,$this->I['val']['altTarget'],$this->mconf['forceTypeValue']); 01584 01585 // Title attribute of links: 01586 $titleAttrValue = $this->WMcObj->stdWrap($this->I['val']['ATagTitle'],$this->I['val']['ATagTitle.']); 01587 if (strlen($titleAttrValue)) { 01588 $this->I['linkHREF']['title'] = $titleAttrValue; 01589 } 01590 01591 // Setting "blurlink()" function: 01592 if (!$this->mconf['noBlur']) { 01593 $this->I['linkHREF']['onFocus']='blurLink(this);'; 01594 } 01595 01596 // Make link: 01597 if ($this->I['val']['RO']) { 01598 $this->I['theName'] = $this->imgNamePrefix.$this->I['uid'].$this->I['INPfix']; 01599 $over=''; 01600 $out =''; 01601 if ($this->I['val']['beforeROImg']) { 01602 $over.= $this->WMfreezePrefix."over('".$this->I['theName']."before');"; 01603 $out.= $this->WMfreezePrefix."out('".$this->I['theName']."before');"; 01604 } 01605 if ($this->I['val']['afterROImg']) { 01606 $over.= $this->WMfreezePrefix."over('".$this->I['theName']."after');"; 01607 $out.= $this->WMfreezePrefix."out('".$this->I['theName']."after');"; 01608 } 01609 $this->I['linkHREF']['onMouseover']=$over; 01610 $this->I['linkHREF']['onMouseout']=$out; 01611 if ($over || $out) $GLOBALS['TSFE']->setJS('mouseOver'); 01612 01613 // Change background color: 01614 if ($this->I['val']['RO_chBgColor']) { 01615 $this->addJScolorShiftFunction(); 01616 $chBgP = t3lib_div::trimExplode('|',$this->I['val']['RO_chBgColor']); 01617 $this->I['linkHREF']['onMouseover'].="changeBGcolor('".$chBgP[2].$this->I['uid']."','".$chBgP[0]."');"; 01618 $this->I['linkHREF']['onMouseout'].="changeBGcolor('".$chBgP[2].$this->I['uid']."','".$chBgP[1]."');"; 01619 } 01620 01621 $this->extProc_RO($key); 01622 } 01623 01624 01625 // Calling extra processing function 01626 $this->extProc_beforeLinking($key); 01627 01628 // Compile link tag 01629 if (!$this->I['val']['doNotLinkIt']) {$this->I['val']['doNotLinkIt']=0;} 01630 if (!$this->I['spacer'] && $this->I['val']['doNotLinkIt']!=1) { 01631 $this->setATagParts(); 01632 } else { 01633 $this->I['A1'] = ''; 01634 $this->I['A2'] = ''; 01635 } 01636 01637 // ATagBeforeWrap processing: 01638 if ($this->I['val']['ATagBeforeWrap']) { 01639 $wrapPartsBefore = explode('|',$this->I['val']['linkWrap']); 01640 $wrapPartsAfter = array('',''); 01641 } else { 01642 $wrapPartsBefore = array('',''); 01643 $wrapPartsAfter = explode('|',$this->I['val']['linkWrap']); 01644 } 01645 if ($this->I['val']['stdWrap2'] || isset($this->I['val']['stdWrap2.'])) { 01646 $wrapPartsStdWrap = explode($this->I['val']['stdWrap2']?$this->I['val']['stdWrap2']:'|',$this->WMcObj->stdWrap('|',$this->I['val']['stdWrap2.'])); 01647 } else {$wrapPartsStdWrap = array('','');} 01648 01649 // Make before, middle and after parts 01650 $this->I['parts'] = array(); 01651 $this->I['parts']['before']=$this->getBeforeAfter('before'); 01652 $this->I['parts']['stdWrap2_begin']=$wrapPartsStdWrap[0]; 01653 if (!$this->I['val']['doNotShowLink']) { 01654 $this->I['parts']['notATagBeforeWrap_begin'] = $wrapPartsAfter[0]; 01655 $this->I['parts']['ATag_begin'] = $this->I['A1']; 01656 $this->I['parts']['ATagBeforeWrap_begin'] = $wrapPartsBefore[0]; 01657 $this->I['parts']['title'] = $this->I['title']; 01658 $this->I['parts']['ATagBeforeWrap_end'] = $wrapPartsBefore[1]; 01659 $this->I['parts']['ATag_end'] = $this->I['A2']; 01660 $this->I['parts']['notATagBeforeWrap_end'] = $wrapPartsAfter[1]; 01661 } 01662 $this->I['parts']['stdWrap2_end']=$wrapPartsStdWrap[1]; 01663 $this->I['parts']['after']=$this->getBeforeAfter('after'); 01664 01665 // Passing I to a user function 01666 if ($this->mconf['IProcFunc']) { 01667 $this->I = $this->userProcess('IProcFunc',$this->I); 01668 } 01669 01670 // Merge parts + beforeAllWrap 01671 $this->I['theItem']= implode('',$this->I['parts']); 01672 $this->I['theItem']= $this->extProc_beforeAllWrap($this->I['theItem'],$key); 01673 01674 // allWrap: 01675 $allWrap = $this->WMcObj->stdWrap($this->I['val']['allWrap'],$this->I['val']['allWrap.']); 01676 $this->I['theItem'] = $this->tmpl->wrap($this->I['theItem'],$allWrap); 01677 01678 if ($this->I['val']['subst_elementUid']) $this->I['theItem'] = str_replace('{elementUid}',$this->I['uid'],$this->I['theItem']); 01679 01680 // allStdWrap: 01681 if (is_array($this->I['val']['allStdWrap.'])) { 01682 $this->I['theItem'] = $this->WMcObj->stdWrap($this->I['theItem'],$this->I['val']['allStdWrap.']); 01683 } 01684 01685 // Calling extra processing function 01686 $this->extProc_afterLinking($key); 01687 } 01688 return $this->extProc_finish(); 01689 } 01690 } 01691 01699 function getBeforeAfter($pref) { 01700 $res = ''; 01701 if ($imgInfo = $this->WMcObj->getImgResource($this->I['val'][$pref.'Img'],$this->I['val'][$pref.'Img.'])) { 01702 $imgInfo[3] = t3lib_div::png_to_gif_by_imagemagick($imgInfo[3]); 01703 if ($this->I['val']['RO'] && $this->I['val'][$pref.'ROImg'] && !$this->I['spacer']) { 01704 $imgROInfo = $this->WMcObj->getImgResource($this->I['val'][$pref.'ROImg'],$this->I['val'][$pref.'ROImg.']); 01705 $imgROInfo[3] = t3lib_div::png_to_gif_by_imagemagick($imgROInfo[3]); 01706 if ($imgROInfo) { 01707 $theName = $this->imgNamePrefix.$this->I['uid'].$this->I['INPfix'].$pref; 01708 $name = ' '.$this->nameAttribute.'="'.$theName.'"'; 01709 $GLOBALS['TSFE']->JSImgCode.= chr(10).$theName.'_n=new Image(); '.$theName.'_n.src = "'.$GLOBALS['TSFE']->absRefPrefix.$imgInfo[3].'"; '; 01710 $GLOBALS['TSFE']->JSImgCode.= chr(10).$theName.'_h=new Image(); '.$theName.'_h.src = "'.$GLOBALS['TSFE']->absRefPrefix.$imgROInfo[3].'"; '; 01711 } 01712 } 01713 $GLOBALS['TSFE']->imagesOnPage[]=$imgInfo[3]; 01714 $res='<img src="'.$GLOBALS['TSFE']->absRefPrefix.$imgInfo[3].'" width="'.$imgInfo[0].'" height="'.$imgInfo[1].'"'.$name.($this->I['val'][$pref.'ImgTagParams']?" ".$this->I['val'][$pref.'ImgTagParams']:'').tslib_cObj::getBorderAttr('border="0"'); 01715 if (!strstr($res,'alt="')) $res.=' alt=""'; // Adding alt attribute if not set. 01716 $res.=' />'; 01717 if ($this->I['val'][$pref.'ImgLink']) {$res=$this->I['A1'].$res.$this->I['A2'];} 01718 } 01719 return $this->tmpl->wrap($res.$this->WMcObj->stdWrap($this->I['val'][$pref],$this->I['val'][$pref.'.']), $this->I['val'][$pref.'Wrap']); 01720 } 01721 01729 function addJScolorShiftFunction() { 01730 $GLOBALS['TSFE']->additionalJavaScript['TMENU:changeBGcolor()']=' 01731 function changeBGcolor(id,color) { // 01732 if (document.getElementById && document.getElementById(id)) { 01733 document.getElementById(id).style.background = color; 01734 return true; 01735 } else if (document.layers && document.layers[id]) { 01736 document.layers[id].bgColor = color; 01737 return true; 01738 } 01739 } 01740 '; 01741 } 01742 01751 function extProc_init() { 01752 } 01753 01762 function extProc_RO($key) { 01763 } 01764 01773 function extProc_beforeLinking($key) { 01774 } 01775 01785 function extProc_afterLinking($key) { 01786 // Add part to the accumulated result + fetch submenus 01787 if (!$this->I['spacer']) { 01788 $this->I['theItem'].= $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']); 01789 } 01790 $this->WMresult.= $this->I['val']['wrapItemAndSub'] ? $this->tmpl->wrap($this->I['theItem'],$this->I['val']['wrapItemAndSub']) : $this->I['theItem']; 01791 } 01792 01802 function extProc_beforeAllWrap($item,$key) { 01803 return $item; 01804 } 01805 01813 function extProc_finish() { 01814 return $this->tmpl->wrap($this->WMresult,$this->mconf['wrap']).$this->WMextraScript; 01815 } 01816 } 01817 01818 01819 01820 01821 01822 01823 01824 01825 01826 01827 01828 01829 01830 01831 01832 01833 01834 01835 01836 01837 01838 01839 01840 01849 class tslib_gmenu extends tslib_menu { 01850 01858 function generate() { 01859 $splitCount = count($this->menuArr); 01860 if ($splitCount) { 01861 list($NOconf,$ROconf) = $this->procesItemStates($splitCount); 01862 01863 //store initial count value 01864 $temp_HMENU_MENUOBJ = $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']; 01865 $temp_MENUOBJ = $GLOBALS['TSFE']->register['count_MENUOBJ']; 01866 // Now we generate the giffiles: 01867 $this->makeGifs($NOconf,'NO'); 01868 // store count from NO obj 01869 $tempcnt_HMENU_MENUOBJ = $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']; 01870 $tempcnt_MENUOBJ = $GLOBALS['TSFE']->register['count_MENUOBJ']; 01871 01872 if ($this->mconf['debugItemConf']) {echo '<h3>$NOconf:</h3>'; debug($NOconf); } 01873 if ($ROconf) { // RollOver 01874 //start recount for rollover with initial values 01875 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']= $temp_HMENU_MENUOBJ; 01876 $GLOBALS['TSFE']->register['count_MENUOBJ']= $temp_MENUOBJ; 01877 $this->makeGifs($ROconf,'RO'); 01878 if ($this->mconf['debugItemConf']) {echo '<h3>$ROconf:</h3>'; debug($ROconf); } 01879 } 01880 // use count from NO obj 01881 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ'] = $tempcnt_HMENU_MENUOBJ; 01882 $GLOBALS['TSFE']->register['count_MENUOBJ'] = $tempcnt_MENUOBJ; 01883 } 01884 } 01885 01896 function makeGifs($conf, $resKey) { 01897 $isGD = $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']; 01898 01899 if (!is_array($conf)) { 01900 $conf = Array(); 01901 } 01902 01903 $totalWH=array(); 01904 $items = count($conf); 01905 if ($isGD) { 01906 // generate the gif-files. the $menuArr is filled with some values like output_w, output_h, output_file 01907 $Hcounter = 0; 01908 $Wcounter = 0; 01909 $Hobjs = $this->mconf['applyTotalH']; 01910 if ($Hobjs) {$Hobjs = t3lib_div::intExplode(',',$Hobjs);} 01911 $Wobjs = $this->mconf['applyTotalW']; 01912 if ($Wobjs) {$Wobjs = t3lib_div::intExplode(',',$Wobjs);} 01913 $minDim = $this->mconf['min']; 01914 if ($minDim) {$minDim = tslib_cObj::calcIntExplode(',',$minDim.',');} 01915 $maxDim = $this->mconf['max']; 01916 if ($maxDim) {$maxDim = tslib_cObj::calcIntExplode(',',$maxDim.',');} 01917 01918 if ($minDim) { 01919 $conf[$items]=$conf[$items-1]; 01920 $this->menuArr[$items]=Array(); 01921 $items = count($conf); 01922 } 01923 01924 // TOTAL width 01925 if ($this->mconf['useLargestItemX'] || $this->mconf['useLargestItemY'] || $this->mconf['distributeX'] || $this->mconf['distributeY']) { 01926 $totalWH = $this->findLargestDims($conf,$items,$Hobjs,$Wobjs,$minDim,$maxDim); 01927 } 01928 } 01929 01930 $c=0; 01931 $maxFlag=0; 01932 $distributeAccu=array('H'=>0,'W'=>0); 01933 reset($conf); 01934 while (list($key,$val)=each($conf)) { 01935 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']++; 01936 $GLOBALS['TSFE']->register['count_MENUOBJ']++; 01937 01938 if ($items==($c+1) && $minDim) { 01939 $Lobjs = $this->mconf['removeObjectsOfDummy']; 01940 if ($Lobjs) { 01941 $Lobjs = t3lib_div::intExplode(',',$Lobjs); 01942 reset($Lobjs); 01943 while(list(,$remItem)=each($Lobjs)) { 01944 unset($val[$remItem]); 01945 unset($val[$remItem.'.']); 01946 } 01947 } 01948 01949 $flag =0; 01950 $tempXY = explode(',',$val['XY']); 01951 if ($Wcounter<$minDim[0]) {$tempXY[0]=$minDim[0]-$Wcounter; $flag=1;} 01952 if ($Hcounter<$minDim[1]) {$tempXY[1]=$minDim[1]-$Hcounter; $flag=1;} 01953 $val['XY'] = implode(',',$tempXY); 01954 if (!$flag){break;} 01955 } 01956 $c++; 01957 01958 01959 if ($isGD) { 01960 // Pre-working the item 01961 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 01962 $gifCreator->init(); 01963 $gifCreator->start($val,$this->menuArr[$key]); 01964 01965 // If useLargestItemH/W is specified 01966 if (count($totalWH) && ($this->mconf['useLargestItemX'] || $this->mconf['useLargestItemY'])) { 01967 $tempXY = explode(',',$gifCreator->setup['XY']); 01968 if ($this->mconf['useLargestItemX']) {$tempXY[0] = max($totalWH['W']);} 01969 if ($this->mconf['useLargestItemY']) {$tempXY[1] = max($totalWH['H']);} 01970 // regenerate the new values... 01971 $val['XY'] = implode(',',$tempXY); 01972 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 01973 $gifCreator->init(); 01974 $gifCreator->start($val,$this->menuArr[$key]); 01975 } 01976 01977 // If distributeH/W is specified 01978 if (count($totalWH) && ($this->mconf['distributeX'] || $this->mconf['distributeY'])) { 01979 $tempXY = explode(',',$gifCreator->setup['XY']); 01980 01981 if ($this->mconf['distributeX']) { 01982 $diff = $this->mconf['distributeX']-$totalWH['W_total']-$distributeAccu['W']; 01983 $compensate = round($diff /($items-$c+1)); 01984 $distributeAccu['W']+=$compensate; 01985 $tempXY[0] = $totalWH['W'][$key]+$compensate; 01986 } 01987 if ($this->mconf['distributeY']) { 01988 $diff = $this->mconf['distributeY']-$totalWH['H_total']-$distributeAccu['H']; 01989 $compensate = round($diff /($items-$c+1)); 01990 $distributeAccu['H']+=$compensate; 01991 $tempXY[1] = $totalWH['H'][$key]+$compensate; 01992 } 01993 // regenerate the new values... 01994 $val['XY'] = implode(',',$tempXY); 01995 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 01996 $gifCreator->init(); 01997 $gifCreator->start($val,$this->menuArr[$key]); 01998 } 01999 02000 // If max dimensions are specified 02001 if ($maxDim) { 02002 $tempXY = explode(',',$val['XY']); 02003 if ($maxDim[0] && $Wcounter+$gifCreator->XY[0]>=$maxDim[0]) {$tempXY[0]==$maxDim[0]-$Wcounter; $maxFlag=1;} 02004 if ($maxDim[1] && $Hcounter+$gifCreator->XY[1]>=$maxDim[1]) {$tempXY[1]=$maxDim[1]-$Hcounter; $maxFlag=1;} 02005 if ($maxFlag) { 02006 $val['XY'] = implode(',',$tempXY); 02007 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02008 $gifCreator->init(); 02009 $gifCreator->start($val,$this->menuArr[$key]); 02010 } 02011 } 02012 02013 02014 02015 02016 // displace 02017 if ($Hobjs) { 02018 reset($Hobjs); 02019 while(list(,$index)=each($Hobjs)) { 02020 if ($gifCreator->setup[$index] && $gifCreator->setup[$index.'.']) { 02021 $oldOffset = explode(',',$gifCreator->setup[$index.'.']['offset']); 02022 $gifCreator->setup[$index.'.']['offset'] = implode(',',$gifCreator->applyOffset($oldOffset,Array(0,-$Hcounter))); 02023 } 02024 } 02025 } 02026 02027 if ($Wobjs) { 02028 reset($Wobjs); 02029 while(list(,$index)=each($Wobjs)) { 02030 if ($gifCreator->setup[$index] && $gifCreator->setup[$index.'.']) { 02031 $oldOffset = explode(',',$gifCreator->setup[$index.'.']['offset']); 02032 $gifCreator->setup[$index.'.']['offset'] = implode(',',$gifCreator->applyOffset($oldOffset,Array(-$Wcounter,0))); 02033 } 02034 } 02035 } 02036 } 02037 02038 // Finding alternative GIF names if any (by altImgResource) 02039 $gifFileName=''; 02040 if ($conf[$key]['altImgResource'] || is_array($conf[$key]['altImgResource.'])) { 02041 if (!is_object($cObj)) {$cObj=t3lib_div::makeInstance('tslib_cObj');} 02042 $cObj->start($this->menuArr[$key],'pages'); 02043 $altImgInfo = $cObj->getImgResource($conf[$key]['altImgResource'],$conf[$key]['altImgResource.']); 02044 $gifFileName=$altImgInfo[3]; 02045 } 02046 02047 // If an alternative name was NOT given, find the GIFBUILDER name. 02048 if (!$gifFileName && $isGD) { 02049 $gifCreator->createTempSubDir('menu/'); 02050 $gifFileName = $gifCreator->fileName('menu/'); 02051 } 02052 02053 // Generation of image file: 02054 if (@file_exists($gifFileName)) { // File exists 02055 $info = @getimagesize($gifFileName); 02056 $this->result[$resKey][$key]['output_w']=intval($info[0]); 02057 $this->result[$resKey][$key]['output_h']=intval($info[1]); 02058 $this->result[$resKey][$key]['output_file']=$gifFileName; 02059 } elseif ($isGD) { // file is generated 02060 $gifCreator->make(); 02061 $this->result[$resKey][$key]['output_w']=$gifCreator->w; 02062 $this->result[$resKey][$key]['output_h']=$gifCreator->h; 02063 $this->result[$resKey][$key]['output_file'] = $gifFileName; 02064 $gifCreator->output($this->result[$resKey][$key]['output_file']); 02065 $gifCreator->destroy(); 02066 } 02067 $this->result[$resKey][$key]['output_file'] = t3lib_div::png_to_gif_by_imagemagick($this->result[$resKey][$key]['output_file']); 02068 $this->result[$resKey][$key]['noLink']=$conf[$key]['noLink']; 02069 $this->result[$resKey][$key]['altTarget']=$conf[$key]['altTarget']; 02070 $this->result[$resKey][$key]['imgParams']=$conf[$key]['imgParams']; 02071 $this->result[$resKey][$key]['ATagTitle'] = $conf[$key]['ATagTitle']; 02072 $this->result[$resKey][$key]['ATagTitle.'] = $conf[$key]['ATagTitle.']; 02073 $this->result[$resKey][$key]['ATagParams'] = $conf[$key]['ATagParams']; 02074 $this->result[$resKey][$key]['wrap'] = $conf[$key]['wrap']; 02075 $this->result[$resKey][$key]['allWrap'] = $conf[$key]['allWrap']; 02076 $this->result[$resKey][$key]['allWrap.'] = $conf[$key]['allWrap.']; 02077 $this->result[$resKey][$key]['subst_elementUid'] = $conf[$key]['subst_elementUid']; 02078 $this->result[$resKey][$key]['allStdWrap.'] = $conf[$key]['allStdWrap.']; 02079 02080 $Hcounter+=$this->result[$resKey][$key]['output_h']; // counter is increased 02081 $Wcounter+=$this->result[$resKey][$key]['output_w']; // counter is increased 02082 02083 if ($maxFlag){break;} 02084 } 02085 } 02086 02102 function findLargestDims($conf,$items,$Hobjs,$Wobjs,$minDim,$maxDim) { 02103 $totalWH = array( 02104 'W' => array(), 02105 'H' => array(), 02106 'W_total' => 0, 02107 'H_total' => 0 02108 ); 02109 02110 $Hcounter = 0; 02111 $Wcounter = 0; 02112 $c=0; 02113 $maxFlag=0; 02114 reset($conf); 02115 while (list($key,$val)=each($conf)) { 02116 // SAME CODE AS makeGifs()! BEGIN 02117 if ($items==($c+1) && $minDim) { 02118 $Lobjs = $this->mconf['removeObjectsOfDummy']; 02119 if ($Lobjs) { 02120 $Lobjs = t3lib_div::intExplode(',',$Lobjs); 02121 reset($Lobjs); 02122 while(list(,$remItem)=each($Lobjs)) { 02123 unset($val[$remItem]); 02124 unset($val[$remItem.'.']); 02125 } 02126 } 02127 02128 $flag =0; 02129 $tempXY = explode(',',$val['XY']); 02130 if ($Wcounter<$minDim[0]) {$tempXY[0]=$minDim[0]-$Wcounter; $flag=1;} 02131 if ($Hcounter<$minDim[1]) {$tempXY[1]=$minDim[1]-$Hcounter; $flag=1;} 02132 $val['XY'] = implode(',',$tempXY); 02133 if (!$flag){break;} 02134 } 02135 $c++; 02136 02137 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02138 $gifCreator->init(); 02139 $gifCreator->start($val,$this->menuArr[$key]); 02140 if ($maxDim) { 02141 $tempXY = explode(',',$val['XY']); 02142 if ($maxDim[0] && $Wcounter+$gifCreator->XY[0]>=$maxDim[0]) {$tempXY[0]==$maxDim[0]-$Wcounter; $maxFlag=1;} 02143 if ($maxDim[1] && $Hcounter+$gifCreator->XY[1]>=$maxDim[1]) {$tempXY[1]=$maxDim[1]-$Hcounter; $maxFlag=1;} 02144 if ($maxFlag) { 02145 $val['XY'] = implode(',',$tempXY); 02146 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02147 $gifCreator->init(); 02148 $gifCreator->start($val,$this->menuArr[$key]); 02149 } 02150 } 02151 // SAME CODE AS makeGifs()! END 02152 02153 // Setting the width/height 02154 $totalWH['W'][$key]=$gifCreator->XY[0]; 02155 $totalWH['H'][$key]=$gifCreator->XY[1]; 02156 $totalWH['W_total']+=$gifCreator->XY[0]; 02157 $totalWH['H_total']+=$gifCreator->XY[1]; 02158 // ---- // 02159 02160 $Hcounter+=$gifCreator->XY[1]; // counter is increased 02161 $Wcounter+=$gifCreator->XY[0]; // counter is increased 02162 02163 if ($maxFlag){break;} 02164 } 02165 return $totalWH; 02166 } 02167 02174 function writeMenu() { 02175 if (is_array($this->menuArr) && is_array($this->result) && count($this->result) && is_array($this->result['NO'])) { 02176 $this->WMcObj = t3lib_div::makeInstance('tslib_cObj'); // Create new tslib_cObj for our use 02177 $this->WMresult=''; 02178 $this->INPfixMD5 = substr(md5(microtime().$this->GMENU_fixKey),0,4); 02179 $this->WMmenuItems = count($this->result['NO']); 02180 02181 $this->WMsubmenuObjSuffixes = $this->tmpl->splitConfArray(array('sOSuffix'=>$this->mconf['submenuObjSuffixes']),$this->WMmenuItems); 02182 02183 $this->extProc_init(); 02184 for ($key=0;$key<$this->WMmenuItems;$key++) { 02185 if ($this->result['NO'][$key]['output_file']) { 02186 $this->WMcObj->start($this->menuArr[$key],'pages'); // Initialize the cObj with the page record of the menu item 02187 02188 $this->I =array(); 02189 $this->I['key'] = $key; 02190 $this->I['INPfix']= $this->imgNameNotRandom?'':'_'.$this->INPfixMD5.'_'.$key; 02191 $this->I['val'] = $this->result['NO'][$key]; 02192 $this->I['title'] = $this->getPageTitle($this->menuArr[$key]['title'],$this->menuArr[$key]['nav_title']); 02193 $this->I['uid'] = $this->menuArr[$key]['uid']; 02194 $this->I['mount_pid'] = $this->menuArr[$key]['mount_pid']; 02195 $this->I['pid'] = $this->menuArr[$key]['pid']; 02196 $this->I['spacer'] = $this->menuArr[$key]['isSpacer']; 02197 if (!$this->I['uid'] && !$this->menuArr[$key]['_OVERRIDE_HREF']) {$this->I['spacer']=1;} 02198 $this->I['noLink'] = ($this->I['spacer'] || $this->I['val']['noLink'] || !count($this->menuArr[$key])); // !count($this->menuArr[$key]) means that this item is a dummyItem 02199 $this->I['name']=''; 02200 02201 // Set access key 02202 if ($this->mconf['accessKey']) { 02203 $this->I['accessKey'] = $this->accessKey($this->I['title']); 02204 } else { 02205 $this->I['accessKey']=Array(); 02206 } 02207 02208 // Get link. 02209 $this->I['linkHREF'] = $this->link($key,$this->I['val']['altTarget'],$this->mconf['forceTypeValue']); 02210 // Title attribute of links: 02211 $titleAttrValue = $this->WMcObj->stdWrap($this->I['val']['ATagTitle'],$this->I['val']['ATagTitle.']).$this->I['accessKey']['alt']; 02212 if (strlen($titleAttrValue)) { 02213 $this->I['linkHREF']['title'] = $titleAttrValue; 02214 } 02215 // Setting "blurlink()" function: 02216 if (!$this->mconf['noBlur']) { 02217 $this->I['linkHREF']['onFocus']='blurLink(this);'; 02218 } 02219 02220 // Set rollover 02221 if ($this->result['RO'][$key] && !$this->I['noLink']) { 02222 $this->I['theName'] = $this->imgNamePrefix.$this->I['uid'].$this->I['INPfix']; 02223 $this->I['name'] = ' '.$this->nameAttribute.'="'.$this->I["theName"].'"'; 02224 $this->I['linkHREF']['onMouseover']=$this->WMfreezePrefix.'over(\''.$this->I['theName'].'\');'; 02225 $this->I['linkHREF']['onMouseout']=$this->WMfreezePrefix.'out(\''.$this->I['theName'].'\');'; 02226 $GLOBALS['TSFE']->JSImgCode.= chr(10).$this->I['theName'].'_n=new Image(); '.$this->I['theName'].'_n.src = "'.$GLOBALS['TSFE']->absRefPrefix.$this->I['val']['output_file'].'"; '; 02227 $GLOBALS['TSFE']->JSImgCode.= chr(10).$this->I['theName'].'_h=new Image(); '.$this->I['theName'].'_h.src = "'.$GLOBALS['TSFE']->absRefPrefix.$this->result['RO'][$key]['output_file'].'"; '; 02228 $GLOBALS['TSFE']->imagesOnPage[]=$this->result['RO'][$key]['output_file']; 02229 $GLOBALS['TSFE']->setJS('mouseOver'); 02230 $this->extProc_RO($key); 02231 } 02232 02233 // Set altText 02234 $this->I['altText'] = $this->mconf['disableAltText'] ? '' : $this->I['title'].$this->I['accessKey']['alt']; 02235 02236 // Calling extra processing function 02237 $this->extProc_beforeLinking($key); 02238 02239 // Set linking 02240 if (!$this->I['noLink']) { 02241 $this->setATagParts(); 02242 } else { 02243 $this->I['A1'] = ''; 02244 $this->I['A2'] = ''; 02245 } 02246 $this->I['IMG'] = '<img src="'.$GLOBALS['TSFE']->absRefPrefix.$this->I['val']['output_file'].'" width="'.$this->I['val']['output_w'].'" height="'.$this->I['val']['output_h'].'" '.tslib_cObj::getBorderAttr('border="0"').' alt="'.htmlspecialchars($this->I['altText']).'"'.$this->I['name'].($this->I['val']['imgParams']?' '.$this->I['val']['imgParams']:'').' />'; 02247 02248 // Make before, middle and after parts 02249 $this->I['parts'] = array(); 02250 $this->I['parts']['ATag_begin'] = $this->I['A1']; 02251 $this->I['parts']['image'] = $this->I['IMG']; 02252 $this->I['parts']['ATag_end'] = $this->I['A2']; 02253 02254 // Passing I to a user function 02255 if ($this->mconf['IProcFunc']) { 02256 $this->I = $this->userProcess('IProcFunc',$this->I); 02257 } 02258 02259 // Putting the item together. 02260 // Merge parts + beforeAllWrap 02261 $this->I['theItem']= implode('',$this->I['parts']); 02262 $this->I['theItem']= $this->extProc_beforeAllWrap($this->I['theItem'],$key); 02263 02264 // wrap: 02265 $this->I['theItem']= $this->tmpl->wrap($this->I['theItem'],$this->I['val']['wrap']); 02266 02267 // allWrap: 02268 $allWrap = $this->WMcObj->stdWrap($this->I['val']['allWrap'],$this->I['val']['allWrap.']); 02269 $this->I['theItem'] = $this->tmpl->wrap($this->I['theItem'],$allWrap); 02270 02271 if ($this->I['val']['subst_elementUid']) $this->I['theItem'] = str_replace('{elementUid}',$this->I['uid'],$this->I['theItem']); 02272 02273 // allStdWrap: 02274 if (is_array($this->I['val']['allStdWrap.'])) { 02275 $this->I['theItem'] = $this->WMcObj->stdWrap($this->I['theItem'],$this->I['val']['allStdWrap.']); 02276 } 02277 02278 $GLOBALS['TSFE']->imagesOnPage[]=$this->I['val']['output_file']; 02279 02280 $this->extProc_afterLinking($key); 02281 } 02282 } 02283 return $this->extProc_finish(); 02284 } 02285 } 02286 02295 function extProc_init() { 02296 } 02297 02306 function extProc_RO($key) { 02307 } 02308 02317 function extProc_beforeLinking($key) { 02318 } 02319 02330 function extProc_afterLinking($key) { 02331 $this->WMresult.=$this->I['theItem']; 02332 if (!$this->I['spacer']) { 02333 $this->WMresult.= $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']); 02334 } 02335 } 02336 02337 02347 function extProc_beforeAllWrap($item,$key) { 02348 return $item; 02349 } 02350 02358 function extProc_finish() { 02359 return $this->tmpl->wrap($this->WMresult,$this->mconf['wrap']).$this->WMextraScript; 02360 } 02361 } 02362 02363 02364 02365 02366 02367 02368 02369 02370 02371 02372 02373 02374 02375 02376 02377 02378 02379 02380 02381 02382 02383 02392 class tslib_imgmenu extends tslib_menu { 02393 02401 function generate() { 02402 $splitCount = count($this->menuArr); 02403 if ($splitCount) { 02404 list($NOconf) = $this->procesItemStates($splitCount); 02405 } 02406 if ($this->mconf['debugItemConf']) {echo '<h3>$NOconf:</h3>'; debug($NOconf); } 02407 $this->makeImageMap($NOconf); 02408 } 02409 02419 function makeImageMap($conf) { 02420 if (!is_array($conf)) { 02421 $conf = Array(); 02422 } 02423 if (is_array($this->mconf['main.'])) { 02424 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02425 $gifCreator->init(); 02426 02427 $itemsConf = $conf; 02428 $conf = $this->mconf['main.']; 02429 if (is_array($conf)) { 02430 $gifObjCount = 0; 02431 02432 $sKeyArray=t3lib_TStemplate::sortedKeyList($conf); 02433 $gifObjCount=intval(end($sKeyArray)); 02434 02435 $lastOriginal = $gifObjCount; 02436 02437 // Now we add graphical objects to the gifbuilder-setup 02438 reset($itemsConf); 02439 $waArr = Array(); 02440 while (list($key,$val)=each($itemsConf)) { 02441 if (is_array($val)) { 02442 $gifObjCount++; 02443 $waArr[$key]['free']=$gifObjCount; 02444 02445 $sKeyArray=t3lib_TStemplate::sortedKeyList($val); 02446 02447 foreach($sKeyArray as $theKey) { 02448 $theValue=$val[$theKey]; 02449 02450 02451 if (intval($theKey) && $theValArr=$val[$theKey.'.']) { 02452 $cObjData = $this->menuArr[$key] ? $this->menuArr[$key] : Array(); 02453 02454 $gifObjCount++; 02455 if ($theValue=='TEXT') { 02456 $waArr[$key]['textNum']=$gifObjCount; 02457 02458 $gifCreator->data = $cObjData; 02459 $theValArr = $gifCreator->checkTextObj($theValArr); 02460 unset($theValArr['text.']); // if this is not done it seems that imageMaps will be rendered wrong!! 02461 // check links 02462 02463 $LD = $this->tmpl->linkData($this->menuArr[$key],$this->mconf['target'],'','',array(),'',$this->mconf['forceTypeValue']); 02464 02465 // If access restricted pages should be shown in menus, change the link of such pages to link to a redirection page: 02466 $this->changeLinksForAccessRestrictedPages($LD, $this->menuArr[$key], $this->mconf['target'], $this->mconf['forceTypeValue']); 02467 02468 // Overriding URL / Target if set to do so: 02469 if ($this->menuArr[$key]['_OVERRIDE_HREF']) { 02470 $LD['totalURL'] = $this->menuArr[$key]['_OVERRIDE_HREF']; 02471 if ($this->menuArr[$key]['_OVERRIDE_TARGET']) $LD['target'] = $this->menuArr[$key]['_OVERRIDE_TARGET']; 02472 } 02473 02474 // Setting target/url for Image Map: 02475 if ($theValArr['imgMap.']['url']=='') { 02476 $theValArr['imgMap.']['url'] = $LD['totalURL']; 02477 } 02478 if ($theValArr['imgMap.']['target']=='') { 02479 $theValArr['imgMap.']['target'] = $LD['target']; 02480 } 02481 if ($theValArr['imgMap.']['noBlur']=='') { 02482 $theValArr['imgMap.']['noBlur'] = $this->mconf['noBlur']; 02483 } 02484 if (is_array($theValArr['imgMap.']['altText.'])) { 02485 $cObj =t3lib_div::makeInstance('tslib_cObj'); 02486 $cObj->start($cObjData,'pages'); 02487 $theValArr['imgMap.']['altText'] = $cObj->stdWrap($theValArr['imgMap.']['altText'], $theValArr['imgMap.']['altText.']); 02488 unset($theValArr['imgMap.']['altText.']); 02489 } 02490 if (is_array($theValArr['imgMap.']['titleText.'])) { 02491 $cObj =t3lib_div::makeInstance('tslib_cObj'); 02492 $cObj->start($cObjData,'pages'); 02493 $theValArr['imgMap.']['titleText'] = $cObj->stdWrap($theValArr['imgMap.']['titleText'], $theValArr['imgMap.']['titleText.']); 02494 unset($theValArr['imgMap.']['titleText.']); 02495 } 02496 } 02497 // This code goes one level in if the object is an image. If 'file' and/or 'mask' appears to be GIFBUILDER-objects, they are both searched for TEXT objects, and if a textobj is found, it's checked with the currently loaded record!! 02498 if ($theValue=='IMAGE') { 02499 if ($theValArr['file']=='GIFBUILDER') { 02500 $temp_sKeyArray=t3lib_TStemplate::sortedKeyList($theValArr['file.']); 02501 reset($temp_sKeyArray); 02502 while(list(,$temp_theKey)=each($temp_sKeyArray)) { 02503 if ($theValArr['mask.'][$temp_theKey]=='TEXT') { 02504 $gifCreator->data = $this->menuArr[$key] ? $this->menuArr[$key] : Array(); 02505 $theValArr['mask.'][$temp_theKey.'.'] = $gifCreator->checkTextObj($theValArr['mask.'][$temp_theKey.'.']); 02506 unset($theValArr['mask.'][$temp_theKey.'.']['text.']); // if this is not done it seems that imageMaps will be rendered wrong!! 02507 } 02508 } 02509 } 02510 if ($theValArr['mask']=='GIFBUILDER') { 02511 $temp_sKeyArray=t3lib_TStemplate::sortedKeyList($theValArr['mask.']); 02512 reset($temp_sKeyArray); 02513 while(list(,$temp_theKey)=each($temp_sKeyArray)) { 02514 if ($theValArr['mask.'][$temp_theKey]=='TEXT') { 02515 $gifCreator->data = $this->menuArr[$key] ? $this->menuArr[$key] : Array(); 02516 $theValArr['mask.'][$temp_theKey.'.'] = $gifCreator->checkTextObj($theValArr['mask.'][$temp_theKey.'.']); 02517 unset($theValArr['mask.'][$temp_theKey.'.']['text.']); // if this is not done it seems that imageMaps will be rendered wrong!! 02518 } 02519 } 02520 } 02521 } 02522 02523 // Checks if disabled is set... 02524 $setObjFlag=1; 02525 if ($theValArr['if.']) { 02526 $cObj =t3lib_div::makeInstance('tslib_cObj'); 02527 $cObj->start($cObjData,'pages'); 02528 if (!$cObj->checkIf($theValArr['if.'])) { 02529 $setObjFlag=0; 02530 } 02531 unset($theValArr['if.']); 02532 } 02533 // Set the object! 02534 if ($setObjFlag) { 02535 $conf[$gifObjCount] = $theValue; 02536 $conf[$gifObjCount.'.'] = $theValArr; 02537 } 02538 } 02539 } 02540 } 02541 } 02542 02543 $gifCreator->start($conf,$GLOBALS['TSFE']->page); 02544 // calculations 02545 02546 $sum=Array(0,0,0,0); 02547 reset($waArr); 02548 while (list($key,$val)=each($waArr)) { 02549 if ($dConf[$key] =$itemsConf[$key]['distrib']) { 02550 $textBB = $gifCreator->objBB[$val['textNum']]; 02551 $dConf[$key] = str_replace('textX',$textBB[0],$dConf[$key]); 02552 $dConf[$key] = str_replace('textY',$textBB[1],$dConf[$key]); 02553 $dConf[$key] = t3lib_div::intExplode(',',$gifCreator->calcOffset($dConf[$key])); 02554 } 02555 } 02556 $workArea = t3lib_div::intExplode(',',$gifCreator->calcOffset($this->mconf['dWorkArea'])); 02557 reset($waArr); 02558 while (list($key,$val)=each($waArr)) { 02559 $index = $val['free']; 02560 $gifCreator->setup[$index] = 'WORKAREA'; 02561 $workArea[2] = $dConf[$key][2] ? $dConf[$key][2] : $dConf[$key][0]; 02562 $workArea[3] = $dConf[$key][3] ? $dConf[$key][3] : $dConf[$key][1]; 02563 02564 $gifCreator->setup[$index.'.']['set'] = implode(',',$workArea); 02565 $workArea[0]+=$dConf[$key][0]; 02566 $workArea[1]+=$dConf[$key][1]; 02567 } 02568 02569 if ($this->mconf['debugRenumberedObject']) {echo '<h3>Renumbered GIFBUILDER object:</h3>'; debug($gifCreator->setup);} 02570 02571 $gifCreator->createTempSubDir('menu/'); 02572 $gifFileName = $gifCreator->fileName('menu/'); 02573 02574 // Gets the ImageMap from the cache... 02575 $imgHash = md5($gifFileName); 02576 $imgMap = $this->sys_page->getHash($imgHash, 0); 02577 02578 if ($imgMap && @file_exists($gifFileName)) { // File exists 02579 $info = @getimagesize($gifFileName); 02580 $w=$info[0]; 02581 $h=$info[1]; 02582 } else { // file is generated 02583 $gifCreator->make(); 02584 $w=$gifCreator->w; 02585 $h=$gifCreator->h; 02586 $gifCreator->output($gifFileName); 02587 $gifCreator->destroy(); 02588 $imgMap=$gifCreator->map; 02589 $this->sys_page->storeHash($imgHash, $imgMap, 'MENU IMAGEMAP'); 02590 } 02591 $imgMap.=$this->mconf['imgMapExtras']; 02592 02593 $gifFileName = t3lib_div::png_to_gif_by_imagemagick($gifFileName); 02594 $this->result = Array('output_file'=>$gifFileName, 'output_w'=>$w, 'output_h'=>$h, 'imgMap'=>$imgMap); 02595 } 02596 } 02597 } 02598 02605 function writeMenu() { 02606 if ($this->result) { 02607 $res = $this->result; 02608 $menuName = 'menu_'.t3lib_div::shortMD5($res['imgMap']); // shortMD5 260900 02609 $result = '<img src="'.$GLOBALS['TSFE']->absRefPrefix.$res['output_file'].'" width="'.$res['output_w'].'" height="'.$res['output_h'].'" usemap="#'.$menuName.'" border="0" '.$this->mconf['params']; 02610 if (!strstr($result,'alt="')) $result.=' alt="Menu Image Map"'; // Adding alt attribute if not set. 02611 $result.= ' /><map name="'.$menuName.'" id="'.$menuName.'">'.$res['imgMap'].'</map>'; 02612 02613 $GLOBALS['TSFE']->imagesOnPage[]=$res['output_file']; 02614 02615 return $this->tmpl->wrap($result,$this->mconf['wrap']); 02616 } 02617 } 02618 } 02619 02620 02621 02622 02623 02624 02625 02626 02627 02628 02629 02630 02631 02632 02633 02634 02635 02636 02637 02638 02639 02648 class tslib_jsmenu extends tslib_menu { 02649 02655 function generate() { 02656 } 02657 02663 function writeMenu() { 02664 if ($this->id) { 02665 // Making levels: 02666 $levels = t3lib_div::intInRange($this->mconf['levels'],1,5); 02667 $this->levels = $levels; 02668 $this->JSVarName='eid'; 02669 $this->JSMenuName= $this->mconf['menuName'] ? $this->mconf['menuName'] : 'JSmenu'; 02670 02671 $JScode="\n var ".$this->JSMenuName." = new JSmenu(".$levels.",'".$this->JSMenuName."Form');"; 02672 02673 for ($a=1;$a<=$levels;$a++) { 02674 $JScode.="\n var ".$this->JSVarName.$a."=0;"; 02675 } 02676 $JScode.= $this->generate_level($levels,1,$this->id,$this->menuArr,$this->MP_array)."\n"; 02677 02678 $GLOBALS['TSFE']->additionalHeaderData['JSMenuCode']='<script type="text/javascript" src="'.$GLOBALS['TSFE']->absRefPrefix.'t3lib/jsfunc.menu.js"></script>'; 02679 $GLOBALS['TSFE']->JSCode.=$JScode; 02680 02681 // Printing: 02682 $allFormCode=""; 02683 for ($a=1;$a<=$this->levels;$a++) { 02684 $formCode=''; 02685 $levelConf = $this->mconf[$a.'.']; 02686 $length = $levelConf['width'] ? $levelConf['width'] : 14; 02687 $lenghtStr=''; 02688 for ($b=0;$b<$length;$b++) { 02689 $lenghtStr.='_'; 02690 } 02691 $height = $levelConf['elements'] ? $levelConf['elements'] : 5; 02692 02693 $formCode.= '<select name="selector'.$a.'" onchange="'.$this->JSMenuName.'.act('.$a.');"'.($levelConf['additionalParams']?' '.$levelConf['additionalParams']:'').'>'; 02694 for ($b=0;$b<$height;$b++) { 02695 $formCode.= '<option value="0">'; 02696 if ($b==0) { 02697 $formCode.= $lenghtStr; 02698 } 02699 $formCode.='</option>'; 02700 } 02701 $formCode.= '</select>'; 02702 $allFormCode.=$this->tmpl->wrap($formCode,$levelConf['wrap']); 02703 } 02704 $formCode = $this->tmpl->wrap($allFormCode,$this->mconf['wrap']); 02705 02706 $formCode= '<form action="" method="post" style="margin: 0 0 0 0;" name="'.$this->JSMenuName.'Form">'.$formCode.'</form>'; 02707 $formCode.='<script type="text/javascript"> /*<![CDATA[*/ '.$this->JSMenuName.'.writeOut(1,'.$this->JSMenuName.'.openID,1); /*]]>*/ </script>'; 02708 return $this->tmpl->wrap($formCode,$this->mconf['wrapAfterTags']); 02709 } 02710 } 02711 02724 function generate_level($levels,$count,$pid,$menuItemArray='',$MP_array=array()) { 02725 $levelConf = $this->mconf[$count.'.']; 02726 02727 // Translate PID to a mount page, if any: 02728 $mount_info = $this->sys_page->getMountPointInfo($pid); 02729 if (is_array($mount_info)) { 02730 $MP_array[] = $mount_info['MPvar']; 02731 $pid = $mount_info['mount_pid']; 02732 } 02733 02734 // Set "&MP=" var: 02735 $MP_var = implode(',',$MP_array); 02736 $MP_params = $MP_var ? '&MP='.rawurlencode($MP_var) : ''; 02737 02738 // UIDs to ban: 02739 $banUidArray = $this->getBannedUids(); 02740 02741 // Initializing variables: 02742 $var = $this->JSVarName; 02743 $menuName = $this->JSMenuName; 02744 $parent = $count==1 ? 0 : $var.($count-1); 02745 $prev=0; 02746 $c=0; 02747 02748 $menuItems = is_array($menuItemArray) ? $menuItemArray : $this->sys_page->getMenu($pid); 02749 foreach($menuItems as $uid => $data) { 02750 $spacer = (t3lib_div::inList($this->spacerIDList,$data['doktype'])?1:0); // if item is a spacer, $spacer is set 02751 if ($this->mconf['SPC'] || !$spacer) { // If the spacer-function is not enabled, spacers will not enter the $menuArr 02752 if (!t3lib_div::inList($this->doktypeExcludeList,$data['doktype']) && (!$data['nav_hide'] || $this->conf['includeNotInMenu']) && !t3lib_div::inArray($banUidArray,$uid)) { // Page may not be 'not_in_menu' or 'Backend User Section' + not in banned uid's 02753 if ($count<$levels) { 02754 $addLines = $this->generate_level($levels,$count+1,$data['uid'],'',$MP_array); 02755 } else { 02756 $addLines = ''; 02757 } 02758 $title=$data['title']; 02759 $url=''; 02760 $target=''; 02761 if ((!$addLines && !$levelConf['noLink']) || $levelConf['alwaysLink']) { 02762 $LD = $this->tmpl->linkData($data,$this->mconf['target'],'','',array(),$MP_params,$this->mconf['forceTypeValue']); 02763 02764 // If access restricted pages should be shown in menus, change the link of such pages to link to a redirection page: 02765 $this->changeLinksForAccessRestrictedPages($LD, $data, $this->mconf['target'], $this->mconf['forceTypeValue']); 02766 02767 $url = $LD['totalURL']; 02768 $target = $LD['target']; 02769 } 02770 $codeLines.="\n".$var.$count."=".$menuName.".add(".$parent.",".$prev.",0,".t3lib_div::quoteJSvalue($title, true).",".t3lib_div::quoteJSvalue($GLOBALS['TSFE']->baseUrlWrap($url), true).",".t3lib_div::quoteJSvalue($target, true).");"; 02771 // If the active one should be chosen... 02772 $active = ($levelConf['showActive'] && $data['uid'] == $this->tmpl->rootLine[$count]['uid']); 02773 // If the first item should be shown 02774 $first = (!$c && $levelConf['showFirst']); 02775 // do it... 02776 if ($active || $first) { 02777 if ($count==1) { 02778 $codeLines.="\n".$menuName.".openID = ".$var.$count.";"; 02779 } else { 02780 $codeLines.="\n".$menuName.".entry[".$parent."].openID = ".$var.$count.";"; 02781 } 02782 } 02783 // Add submenu... 02784 $codeLines.=$addLines; 02785 02786 $prev=$var.$count; 02787 $c++; 02788 } 02789 } 02790 } 02791 if ($this->mconf['firstLabelGeneral'] && !$levelConf['firstLabel']) { 02792 $levelConf['firstLabel'] = $this->mconf['firstLabelGeneral']; 02793 } 02794 if ($levelConf['firstLabel'] && $codeLines) { 02795 $codeLines.= chr(10).$menuName.'.defTopTitle['.$count.'] = '.t3lib_div::quoteJSvalue($levelConf['firstLabel'], true).';'; 02796 } 02797 return $codeLines; 02798 } 02799 } 02800 02801 02802 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_menu.php']) { 02803 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_menu.php']); 02804 } 02805 02806 ?>