Documentation TYPO3 par Ameos |
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->I['val']['additionalParams'].$this->menuArr[$key]['_ADD_GETVARS'], $typeOverride); 01173 } 01174 01175 // Override URL if using "External URL" as doktype with a valid e-mail address: 01176 if ($this->menuArr[$key]['doktype'] == 3 && $this->menuArr[$key]['urltype'] == 3 && t3lib_div::validEmail($this->menuArr[$key]['url'])) { 01177 // Create mailto-link using tslib_cObj::typolink (concerning spamProtectEmailAddresses): 01178 $LD['totalURL'] = $this->parent_cObj->typoLink_URL(array('parameter' => $this->menuArr[$key]['url'])); 01179 $LD['target'] = ''; 01180 } 01181 01182 // Manipulation in case of access restricted pages: 01183 $this->changeLinksForAccessRestrictedPages($LD,$this->menuArr[$key],$mainTarget,$typeOverride); 01184 01185 // Overriding URL / Target if set to do so: 01186 if ($this->menuArr[$key]['_OVERRIDE_HREF']) { 01187 $LD['totalURL'] = $this->menuArr[$key]['_OVERRIDE_HREF']; 01188 if ($this->menuArr[$key]['_OVERRIDE_TARGET']) $LD['target'] = $this->menuArr[$key]['_OVERRIDE_TARGET']; 01189 } 01190 01191 // OnClick open in windows. 01192 $onClick=''; 01193 if ($this->mconf['JSWindow']) { 01194 $conf=$this->mconf['JSWindow.']; 01195 $url=$LD['totalURL']; 01196 $LD['totalURL'] = '#'; 01197 $onClick= 'openPic(\''.$GLOBALS['TSFE']->baseUrlWrap($url).'\',\''.($conf['newWindow']?md5($url):'theNewPage').'\',\''.$conf['params'].'\'); return false;'; 01198 $GLOBALS['TSFE']->setJS('openPic'); 01199 } 01200 01201 // out: 01202 $list = array(); 01203 $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. 01204 $list['TARGET'] = $LD['target']; 01205 $list['onClick'] = $onClick; 01206 01207 return $list; 01208 } 01209 01219 function changeLinksForAccessRestrictedPages(&$LD, $page, $mainTarget, $typeOverride) { 01220 01221 // If access restricted pages should be shown in menus, change the link of such pages to link to a redirection page: 01222 if ($this->mconf['showAccessRestrictedPages'] && $this->mconf['showAccessRestrictedPages']!=='NONE' && !$GLOBALS['TSFE']->checkPageGroupAccess($page)) { 01223 $thePage = $this->sys_page->getPage($this->mconf['showAccessRestrictedPages']); 01224 01225 $addParams = $this->mconf['showAccessRestrictedPages.']['addParams']; 01226 $addParams = str_replace('###RETURN_URL###',rawurlencode($LD['totalURL']),$addParams); 01227 $addParams = str_replace('###PAGE_ID###',$page['uid'],$addParams); 01228 $LD = $this->tmpl->linkData($thePage,$mainTarget,'','','', $addParams, $typeOverride); 01229 } 01230 } 01231 01240 function subMenu($uid, $objSuffix='') { 01241 01242 // Setting alternative menu item array if _SUB_MENU has been defined in the current ->menuArr 01243 $altArray = ''; 01244 if (is_array($this->menuArr[$this->I['key']]['_SUB_MENU']) && count($this->menuArr[$this->I['key']]['_SUB_MENU'])) { 01245 $altArray = $this->menuArr[$this->I['key']]['_SUB_MENU']; 01246 } 01247 01248 // Make submenu if the page is the next active 01249 $cls = strtolower($this->conf[($this->menuNumber+1).$objSuffix]); 01250 $subLevelClass = ($cls && t3lib_div::inList($this->tmpl->menuclasses,$cls)) ? $cls : ''; 01251 01252 if ($subLevelClass && ($this->mconf['expAll'] || $this->isNext($uid, $this->getMPvar($this->I['key'])) || is_array($altArray)) && !$this->mconf['sectionIndex']) { 01253 $submenu = t3lib_div::makeInstance('tslib_'.$subLevelClass); 01254 $submenu->entryLevel = $this->entryLevel+1; 01255 $submenu->rL_uidRegister = $this->rL_uidRegister; 01256 $submenu->MP_array = $this->MP_array; 01257 if ($this->menuArr[$this->I['key']]['_MP_PARAM']) { 01258 $submenu->MP_array[] = $this->menuArr[$this->I['key']]['_MP_PARAM']; 01259 } 01260 01261 // especially scripts that build the submenu needs the parent data 01262 $submenu->parent_cObj = &$this->parent_cObj; 01263 $submenu->parentMenuArr = $this->menuArr; 01264 01265 // Setting alternativeMenuTempArray (will be effective only if an array) 01266 if (is_array($altArray)) { 01267 $submenu->alternativeMenuTempArray = $altArray; 01268 } 01269 01270 if ($submenu->start($this->tmpl, $this->sys_page, $uid, $this->conf, $this->menuNumber+1, $objSuffix)) { 01271 $submenu->makeMenu(); 01272 return $submenu->writeMenu(); 01273 } 01274 } 01275 } 01276 01286 function isNext($uid, $MPvar='') { 01287 01288 // Check for always active PIDs: 01289 if (count($this->alwaysActivePIDlist) && in_array($uid,$this->alwaysActivePIDlist)) { 01290 return TRUE; 01291 } 01292 01293 $testUid = $uid.($MPvar?':'.$MPvar:''); 01294 if ($uid && $testUid==$this->nextActive) { 01295 return TRUE; 01296 } 01297 } 01298 01307 function isActive($uid, $MPvar='') { 01308 01309 // Check for always active PIDs: 01310 if (count($this->alwaysActivePIDlist) && in_array($uid,$this->alwaysActivePIDlist)) { 01311 return TRUE; 01312 } 01313 01314 $testUid = $uid.($MPvar?':'.$MPvar:''); 01315 if ($uid && in_array('ITEM:'.$testUid, $this->rL_uidRegister)) { 01316 return TRUE; 01317 } 01318 } 01319 01328 function isCurrent($uid, $MPvar='') { 01329 $testUid = $uid.($MPvar?':'.$MPvar:''); 01330 if ($uid && !strcmp(end($this->rL_uidRegister),'ITEM:'.$testUid)) { 01331 return TRUE; 01332 } 01333 } 01334 01343 function isSubMenu($uid) { 01344 01345 // 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; 01346 $mount_info = $this->sys_page->getMountPointInfo($uid); 01347 if (is_array($mount_info)) { 01348 $uid = $mount_info['mount_pid']; 01349 } 01350 01351 $recs = $this->sys_page->getMenu($uid,'uid,pid,doktype,mount_pid,mount_pid_ol,nav_hide,shortcut,shortcut_mode'); 01352 foreach($recs as $theRec) { 01353 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!) 01354 return TRUE; 01355 } 01356 } 01357 } 01358 01368 function isItemState($kind,$key) { 01369 $natVal=0; 01370 if ($this->menuArr[$key]['ITEM_STATE']) { // If any value is set for ITEM_STATE the normal evaluation is discarded 01371 if (!strcmp($this->menuArr[$key]['ITEM_STATE'],$kind)) {$natVal=1;} 01372 } else { 01373 switch($kind) { 01374 case 'SPC': 01375 $natVal = $this->menuArr[$key]['isSpacer']; 01376 break; 01377 case 'IFSUB': 01378 $natVal = $this->isSubMenu($this->menuArr[$key]['uid']); 01379 break; 01380 case 'ACT': 01381 $natVal = $this->isActive($this->menuArr[$key]['uid'], $this->getMPvar($key)); 01382 break; 01383 case 'ACTIFSUB': 01384 $natVal = $this->isActive($this->menuArr[$key]['uid'], $this->getMPvar($key)) && $this->isSubMenu($this->menuArr[$key]['uid']); 01385 break; 01386 case 'CUR': 01387 $natVal = $this->isCurrent($this->menuArr[$key]['uid'], $this->getMPvar($key)); 01388 break; 01389 case 'CURIFSUB': 01390 $natVal = $this->isCurrent($this->menuArr[$key]['uid'], $this->getMPvar($key)) && $this->isSubMenu($this->menuArr[$key]['uid']); 01391 break; 01392 case 'USR': 01393 $natVal = $this->menuArr[$key]['fe_group']; 01394 break; 01395 } 01396 } 01397 01398 return $natVal; 01399 } 01400 01408 function accessKey($title) { 01409 // The global array ACCESSKEY is used to globally control if letters are already used!! 01410 $result = Array(); 01411 01412 $titleLen = strlen($title); 01413 for ($a=0;$a<$titleLen;$a++) { 01414 $key = strtoupper(trim(substr($title,$a,1))); 01415 if (preg_match('/[a-zA-Z]/', $key) && !isset($GLOBALS['TSFE']->accessKey[$key])) { 01416 $GLOBALS['TSFE']->accessKey[$key]=1; 01417 $result['code'] = ' accesskey="'.$key.'"'; 01418 $result['alt'] = ' (ALT+'.$key.')'; 01419 break; 01420 } 01421 } 01422 return $result; 01423 } 01424 01434 function userProcess($mConfKey,$passVar) { 01435 if ($this->mconf[$mConfKey]) { 01436 $funcConf = $this->mconf[$mConfKey.'.']; 01437 $funcConf['parentObj']=&$this; 01438 $passVar = $GLOBALS['TSFE']->cObj->callUserFunction($this->mconf[$mConfKey], $funcConf, $passVar); 01439 } 01440 return $passVar; 01441 } 01442 01449 function setATagParts() { 01450 $this->I['A1'] = '<a '.t3lib_div::implodeAttributes($this->I['linkHREF'],1).' '.$this->I['val']['ATagParams'].$this->I['accessKey']['code'].'>'; 01451 $this->I['A2'] = '</a>'; 01452 } 01453 01462 function getPageTitle($title,$nav_title) { 01463 return strcmp(trim($nav_title),'') ? $nav_title : $title; 01464 } 01465 01474 function getMPvar($key) { 01475 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['enable_mount_pids']) { 01476 $localMP_array = $this->MP_array; 01477 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! 01478 $MP_params = count($localMP_array) ? implode(',',$localMP_array) : ''; 01479 return $MP_params; 01480 } 01481 } 01482 01489 function getDoktypeExcludeWhere() { 01490 return $this->doktypeExcludeList ? ' AND pages.doktype NOT IN ('.$this->doktypeExcludeList.')' : ''; 01491 } 01492 01499 function getBannedUids() { 01500 $banUidArray = array(); 01501 01502 if (trim($this->conf['excludeUidList'])) { 01503 $banUidList = str_replace('current', $GLOBALS['TSFE']->page['uid'], $this->conf['excludeUidList']); 01504 $banUidArray = t3lib_div::intExplode(',', $banUidList); 01505 } 01506 01507 return $banUidArray; 01508 } 01509 01510 } 01511 01512 01513 01514 01515 01516 01517 01518 01519 01520 01521 01522 01523 01524 01525 01526 01527 01528 01529 01538 class tslib_tmenu extends tslib_menu { 01539 01547 function generate() { 01548 $splitCount = count($this->menuArr); 01549 if ($splitCount) { 01550 list($NOconf) = $this->procesItemStates($splitCount); 01551 } 01552 if ($this->mconf['debugItemConf']) {echo '<h3>$NOconf:</h3>'; debug($NOconf); } 01553 $this->result = $NOconf; 01554 } 01555 01563 function writeMenu() { 01564 if (is_array($this->result) && count($this->result)) { 01565 $this->WMcObj = t3lib_div::makeInstance('tslib_cObj'); // Create new tslib_cObj for our use 01566 $this->WMresult = ''; 01567 $this->INPfixMD5 = substr(md5(microtime().'tmenu'),0,4); 01568 $this->WMmenuItems = count($this->result); 01569 01570 $this->WMsubmenuObjSuffixes = $this->tmpl->splitConfArray(array('sOSuffix'=>$this->mconf['submenuObjSuffixes']),$this->WMmenuItems); 01571 01572 $this->extProc_init(); 01573 reset($this->result); 01574 while (list($key,$val)=each($this->result)) { 01575 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']++; 01576 $GLOBALS['TSFE']->register['count_MENUOBJ']++; 01577 01578 $this->WMcObj->start($this->menuArr[$key],'pages'); // Initialize the cObj with the page record of the menu item 01579 01580 $this->I = array(); 01581 $this->I['key'] = $key; 01582 $this->I['INPfix'] = $this->imgNameNotRandom?'':'_'.$this->INPfixMD5.'_'.$key; 01583 $this->I['val'] = $val; 01584 $this->I['title'] = $this->WMcObj->stdWrap($this->getPageTitle($this->menuArr[$key]['title'],$this->menuArr[$key]['nav_title']),$this->I['val']['stdWrap.']); 01585 $this->I['uid'] = $this->menuArr[$key]['uid']; 01586 $this->I['mount_pid'] = $this->menuArr[$key]['mount_pid']; 01587 $this->I['pid'] = $this->menuArr[$key]['pid']; 01588 $this->I['spacer'] = $this->menuArr[$key]['isSpacer']; 01589 01590 // Set access key 01591 if ($this->mconf['accessKey']) { 01592 $this->I['accessKey'] = $this->accessKey($this->I['title']); 01593 } else { 01594 $this->I['accessKey'] = Array(); 01595 } 01596 01597 // Make link tag 01598 $this->I['val']['ATagParams'] = $this->WMcObj->getATagParams($this->I['val']); 01599 $this->I['val']['additionalParams'] = $this->WMcObj->stdWrap($this->I['val']['additionalParams'],$this->I['val']['additionalParams.']); 01600 $this->I['linkHREF'] = $this->link($key,$this->I['val']['altTarget'],$this->mconf['forceTypeValue']); 01601 01602 // Title attribute of links: 01603 $titleAttrValue = $this->WMcObj->stdWrap($this->I['val']['ATagTitle'],$this->I['val']['ATagTitle.']).$this->I['accessKey']['alt']; 01604 if (strlen($titleAttrValue)) { 01605 $this->I['linkHREF']['title'] = $titleAttrValue; 01606 } 01607 01608 // Setting "blurlink()" function: 01609 if (!$this->mconf['noBlur']) { 01610 $this->I['linkHREF']['onFocus']='blurLink(this);'; 01611 } 01612 01613 // Make link: 01614 if ($this->I['val']['RO']) { 01615 $this->I['theName'] = $this->imgNamePrefix.$this->I['uid'].$this->I['INPfix']; 01616 $over=''; 01617 $out =''; 01618 if ($this->I['val']['beforeROImg']) { 01619 $over.= $this->WMfreezePrefix."over('".$this->I['theName']."before');"; 01620 $out.= $this->WMfreezePrefix."out('".$this->I['theName']."before');"; 01621 } 01622 if ($this->I['val']['afterROImg']) { 01623 $over.= $this->WMfreezePrefix."over('".$this->I['theName']."after');"; 01624 $out.= $this->WMfreezePrefix."out('".$this->I['theName']."after');"; 01625 } 01626 $this->I['linkHREF']['onMouseover']=$over; 01627 $this->I['linkHREF']['onMouseout']=$out; 01628 if ($over || $out) $GLOBALS['TSFE']->setJS('mouseOver'); 01629 01630 // Change background color: 01631 if ($this->I['val']['RO_chBgColor']) { 01632 $this->addJScolorShiftFunction(); 01633 $chBgP = t3lib_div::trimExplode('|',$this->I['val']['RO_chBgColor']); 01634 $this->I['linkHREF']['onMouseover'].="changeBGcolor('".$chBgP[2].$this->I['uid']."','".$chBgP[0]."');"; 01635 $this->I['linkHREF']['onMouseout'].="changeBGcolor('".$chBgP[2].$this->I['uid']."','".$chBgP[1]."');"; 01636 } 01637 01638 $this->extProc_RO($key); 01639 } 01640 01641 01642 // Calling extra processing function 01643 $this->extProc_beforeLinking($key); 01644 01645 // Compile link tag 01646 if (!$this->I['val']['doNotLinkIt']) {$this->I['val']['doNotLinkIt']=0;} 01647 if (!$this->I['spacer'] && $this->I['val']['doNotLinkIt']!=1) { 01648 $this->setATagParts(); 01649 } else { 01650 $this->I['A1'] = ''; 01651 $this->I['A2'] = ''; 01652 } 01653 01654 // ATagBeforeWrap processing: 01655 if ($this->I['val']['ATagBeforeWrap']) { 01656 $wrapPartsBefore = explode('|',$this->I['val']['linkWrap']); 01657 $wrapPartsAfter = array('',''); 01658 } else { 01659 $wrapPartsBefore = array('',''); 01660 $wrapPartsAfter = explode('|',$this->I['val']['linkWrap']); 01661 } 01662 if ($this->I['val']['stdWrap2'] || isset($this->I['val']['stdWrap2.'])) { 01663 $wrapPartsStdWrap = explode($this->I['val']['stdWrap2']?$this->I['val']['stdWrap2']:'|',$this->WMcObj->stdWrap('|',$this->I['val']['stdWrap2.'])); 01664 } else {$wrapPartsStdWrap = array('','');} 01665 01666 // Make before, middle and after parts 01667 $this->I['parts'] = array(); 01668 $this->I['parts']['before']=$this->getBeforeAfter('before'); 01669 $this->I['parts']['stdWrap2_begin']=$wrapPartsStdWrap[0]; 01670 if (!$this->I['val']['doNotShowLink']) { 01671 $this->I['parts']['notATagBeforeWrap_begin'] = $wrapPartsAfter[0]; 01672 $this->I['parts']['ATag_begin'] = $this->I['A1']; 01673 $this->I['parts']['ATagBeforeWrap_begin'] = $wrapPartsBefore[0]; 01674 $this->I['parts']['title'] = $this->I['title']; 01675 $this->I['parts']['ATagBeforeWrap_end'] = $wrapPartsBefore[1]; 01676 $this->I['parts']['ATag_end'] = $this->I['A2']; 01677 $this->I['parts']['notATagBeforeWrap_end'] = $wrapPartsAfter[1]; 01678 } 01679 $this->I['parts']['stdWrap2_end']=$wrapPartsStdWrap[1]; 01680 $this->I['parts']['after']=$this->getBeforeAfter('after'); 01681 01682 // Passing I to a user function 01683 if ($this->mconf['IProcFunc']) { 01684 $this->I = $this->userProcess('IProcFunc',$this->I); 01685 } 01686 01687 // Merge parts + beforeAllWrap 01688 $this->I['theItem']= implode('',$this->I['parts']); 01689 $this->I['theItem']= $this->extProc_beforeAllWrap($this->I['theItem'],$key); 01690 01691 // allWrap: 01692 $allWrap = $this->WMcObj->stdWrap($this->I['val']['allWrap'],$this->I['val']['allWrap.']); 01693 $this->I['theItem'] = $this->tmpl->wrap($this->I['theItem'],$allWrap); 01694 01695 if ($this->I['val']['subst_elementUid']) $this->I['theItem'] = str_replace('{elementUid}',$this->I['uid'],$this->I['theItem']); 01696 01697 // allStdWrap: 01698 if (is_array($this->I['val']['allStdWrap.'])) { 01699 $this->I['theItem'] = $this->WMcObj->stdWrap($this->I['theItem'],$this->I['val']['allStdWrap.']); 01700 } 01701 01702 // Calling extra processing function 01703 $this->extProc_afterLinking($key); 01704 } 01705 return $this->extProc_finish(); 01706 } 01707 } 01708 01716 function getBeforeAfter($pref) { 01717 $res = ''; 01718 if ($imgInfo = $this->WMcObj->getImgResource($this->I['val'][$pref.'Img'],$this->I['val'][$pref.'Img.'])) { 01719 $imgInfo[3] = t3lib_div::png_to_gif_by_imagemagick($imgInfo[3]); 01720 if ($this->I['val']['RO'] && $this->I['val'][$pref.'ROImg'] && !$this->I['spacer']) { 01721 $imgROInfo = $this->WMcObj->getImgResource($this->I['val'][$pref.'ROImg'],$this->I['val'][$pref.'ROImg.']); 01722 $imgROInfo[3] = t3lib_div::png_to_gif_by_imagemagick($imgROInfo[3]); 01723 if ($imgROInfo) { 01724 $theName = $this->imgNamePrefix.$this->I['uid'].$this->I['INPfix'].$pref; 01725 $name = ' '.$this->nameAttribute.'="'.$theName.'"'; 01726 $GLOBALS['TSFE']->JSImgCode.= chr(10).$theName.'_n=new Image(); '.$theName.'_n.src = "'.$GLOBALS['TSFE']->absRefPrefix.$imgInfo[3].'"; '; 01727 $GLOBALS['TSFE']->JSImgCode.= chr(10).$theName.'_h=new Image(); '.$theName.'_h.src = "'.$GLOBALS['TSFE']->absRefPrefix.$imgROInfo[3].'"; '; 01728 } 01729 } 01730 $GLOBALS['TSFE']->imagesOnPage[]=$imgInfo[3]; 01731 $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"'); 01732 if (!strstr($res,'alt="')) $res.=' alt=""'; // Adding alt attribute if not set. 01733 $res.=' />'; 01734 if ($this->I['val'][$pref.'ImgLink']) {$res=$this->I['A1'].$res.$this->I['A2'];} 01735 } 01736 return $this->tmpl->wrap($res.$this->WMcObj->stdWrap($this->I['val'][$pref],$this->I['val'][$pref.'.']), $this->I['val'][$pref.'Wrap']); 01737 } 01738 01746 function addJScolorShiftFunction() { 01747 $GLOBALS['TSFE']->additionalJavaScript['TMENU:changeBGcolor()']=' 01748 function changeBGcolor(id,color) { // 01749 if (document.getElementById && document.getElementById(id)) { 01750 document.getElementById(id).style.background = color; 01751 return true; 01752 } else if (document.layers && document.layers[id]) { 01753 document.layers[id].bgColor = color; 01754 return true; 01755 } 01756 } 01757 '; 01758 } 01759 01768 function extProc_init() { 01769 } 01770 01779 function extProc_RO($key) { 01780 } 01781 01790 function extProc_beforeLinking($key) { 01791 } 01792 01802 function extProc_afterLinking($key) { 01803 // Add part to the accumulated result + fetch submenus 01804 if (!$this->I['spacer']) { 01805 $this->I['theItem'].= $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']); 01806 } 01807 $this->WMresult.= $this->I['val']['wrapItemAndSub'] ? $this->tmpl->wrap($this->I['theItem'],$this->I['val']['wrapItemAndSub']) : $this->I['theItem']; 01808 } 01809 01819 function extProc_beforeAllWrap($item,$key) { 01820 return $item; 01821 } 01822 01830 function extProc_finish() { 01831 // stdWrap: 01832 if (is_array($this->mconf['stdWrap.'])) { 01833 $this->WMresult = $this->WMcObj->stdWrap($this->WMresult,$this->mconf['stdWrap.']); 01834 } 01835 return $this->tmpl->wrap($this->WMresult,$this->mconf['wrap']).$this->WMextraScript; 01836 } 01837 } 01838 01839 01840 01841 01842 01843 01844 01845 01846 01847 01848 01849 01850 01851 01852 01853 01854 01855 01856 01857 01858 01859 01860 01861 01870 class tslib_gmenu extends tslib_menu { 01871 01879 function generate() { 01880 $splitCount = count($this->menuArr); 01881 if ($splitCount) { 01882 list($NOconf,$ROconf) = $this->procesItemStates($splitCount); 01883 01884 //store initial count value 01885 $temp_HMENU_MENUOBJ = $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']; 01886 $temp_MENUOBJ = $GLOBALS['TSFE']->register['count_MENUOBJ']; 01887 // Now we generate the giffiles: 01888 $this->makeGifs($NOconf,'NO'); 01889 // store count from NO obj 01890 $tempcnt_HMENU_MENUOBJ = $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']; 01891 $tempcnt_MENUOBJ = $GLOBALS['TSFE']->register['count_MENUOBJ']; 01892 01893 if ($this->mconf['debugItemConf']) {echo '<h3>$NOconf:</h3>'; debug($NOconf); } 01894 if ($ROconf) { // RollOver 01895 //start recount for rollover with initial values 01896 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']= $temp_HMENU_MENUOBJ; 01897 $GLOBALS['TSFE']->register['count_MENUOBJ']= $temp_MENUOBJ; 01898 $this->makeGifs($ROconf,'RO'); 01899 if ($this->mconf['debugItemConf']) {echo '<h3>$ROconf:</h3>'; debug($ROconf); } 01900 } 01901 // use count from NO obj 01902 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ'] = $tempcnt_HMENU_MENUOBJ; 01903 $GLOBALS['TSFE']->register['count_MENUOBJ'] = $tempcnt_MENUOBJ; 01904 } 01905 } 01906 01917 function makeGifs($conf, $resKey) { 01918 $isGD = $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']; 01919 01920 if (!is_array($conf)) { 01921 $conf = Array(); 01922 } 01923 01924 $totalWH=array(); 01925 $items = count($conf); 01926 if ($isGD) { 01927 // generate the gif-files. the $menuArr is filled with some values like output_w, output_h, output_file 01928 $Hcounter = 0; 01929 $Wcounter = 0; 01930 $Hobjs = $this->mconf['applyTotalH']; 01931 if ($Hobjs) {$Hobjs = t3lib_div::intExplode(',',$Hobjs);} 01932 $Wobjs = $this->mconf['applyTotalW']; 01933 if ($Wobjs) {$Wobjs = t3lib_div::intExplode(',',$Wobjs);} 01934 $minDim = $this->mconf['min']; 01935 if ($minDim) {$minDim = tslib_cObj::calcIntExplode(',',$minDim.',');} 01936 $maxDim = $this->mconf['max']; 01937 if ($maxDim) {$maxDim = tslib_cObj::calcIntExplode(',',$maxDim.',');} 01938 01939 if ($minDim) { 01940 $conf[$items]=$conf[$items-1]; 01941 $this->menuArr[$items]=Array(); 01942 $items = count($conf); 01943 } 01944 01945 // TOTAL width 01946 if ($this->mconf['useLargestItemX'] || $this->mconf['useLargestItemY'] || $this->mconf['distributeX'] || $this->mconf['distributeY']) { 01947 $totalWH = $this->findLargestDims($conf,$items,$Hobjs,$Wobjs,$minDim,$maxDim); 01948 } 01949 } 01950 01951 $c=0; 01952 $maxFlag=0; 01953 $distributeAccu=array('H'=>0,'W'=>0); 01954 reset($conf); 01955 while (list($key,$val)=each($conf)) { 01956 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']++; 01957 $GLOBALS['TSFE']->register['count_MENUOBJ']++; 01958 01959 if ($items==($c+1) && $minDim) { 01960 $Lobjs = $this->mconf['removeObjectsOfDummy']; 01961 if ($Lobjs) { 01962 $Lobjs = t3lib_div::intExplode(',',$Lobjs); 01963 reset($Lobjs); 01964 while(list(,$remItem)=each($Lobjs)) { 01965 unset($val[$remItem]); 01966 unset($val[$remItem.'.']); 01967 } 01968 } 01969 01970 $flag =0; 01971 $tempXY = explode(',',$val['XY']); 01972 if ($Wcounter<$minDim[0]) {$tempXY[0]=$minDim[0]-$Wcounter; $flag=1;} 01973 if ($Hcounter<$minDim[1]) {$tempXY[1]=$minDim[1]-$Hcounter; $flag=1;} 01974 $val['XY'] = implode(',',$tempXY); 01975 if (!$flag){break;} 01976 } 01977 $c++; 01978 01979 01980 if ($isGD) { 01981 // Pre-working the item 01982 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 01983 $gifCreator->init(); 01984 $gifCreator->start($val,$this->menuArr[$key]); 01985 01986 // If useLargestItemH/W is specified 01987 if (count($totalWH) && ($this->mconf['useLargestItemX'] || $this->mconf['useLargestItemY'])) { 01988 $tempXY = explode(',',$gifCreator->setup['XY']); 01989 if ($this->mconf['useLargestItemX']) {$tempXY[0] = max($totalWH['W']);} 01990 if ($this->mconf['useLargestItemY']) {$tempXY[1] = max($totalWH['H']);} 01991 // regenerate the new values... 01992 $val['XY'] = implode(',',$tempXY); 01993 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 01994 $gifCreator->init(); 01995 $gifCreator->start($val,$this->menuArr[$key]); 01996 } 01997 01998 // If distributeH/W is specified 01999 if (count($totalWH) && ($this->mconf['distributeX'] || $this->mconf['distributeY'])) { 02000 $tempXY = explode(',',$gifCreator->setup['XY']); 02001 02002 if ($this->mconf['distributeX']) { 02003 $diff = $this->mconf['distributeX']-$totalWH['W_total']-$distributeAccu['W']; 02004 $compensate = round($diff /($items-$c+1)); 02005 $distributeAccu['W']+=$compensate; 02006 $tempXY[0] = $totalWH['W'][$key]+$compensate; 02007 } 02008 if ($this->mconf['distributeY']) { 02009 $diff = $this->mconf['distributeY']-$totalWH['H_total']-$distributeAccu['H']; 02010 $compensate = round($diff /($items-$c+1)); 02011 $distributeAccu['H']+=$compensate; 02012 $tempXY[1] = $totalWH['H'][$key]+$compensate; 02013 } 02014 // regenerate the new values... 02015 $val['XY'] = implode(',',$tempXY); 02016 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02017 $gifCreator->init(); 02018 $gifCreator->start($val,$this->menuArr[$key]); 02019 } 02020 02021 // If max dimensions are specified 02022 if ($maxDim) { 02023 $tempXY = explode(',',$val['XY']); 02024 if ($maxDim[0] && $Wcounter+$gifCreator->XY[0]>=$maxDim[0]) {$tempXY[0]==$maxDim[0]-$Wcounter; $maxFlag=1;} 02025 if ($maxDim[1] && $Hcounter+$gifCreator->XY[1]>=$maxDim[1]) {$tempXY[1]=$maxDim[1]-$Hcounter; $maxFlag=1;} 02026 if ($maxFlag) { 02027 $val['XY'] = implode(',',$tempXY); 02028 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02029 $gifCreator->init(); 02030 $gifCreator->start($val,$this->menuArr[$key]); 02031 } 02032 } 02033 02034 02035 02036 02037 // displace 02038 if ($Hobjs) { 02039 reset($Hobjs); 02040 while(list(,$index)=each($Hobjs)) { 02041 if ($gifCreator->setup[$index] && $gifCreator->setup[$index.'.']) { 02042 $oldOffset = explode(',',$gifCreator->setup[$index.'.']['offset']); 02043 $gifCreator->setup[$index.'.']['offset'] = implode(',',$gifCreator->applyOffset($oldOffset,Array(0,-$Hcounter))); 02044 } 02045 } 02046 } 02047 02048 if ($Wobjs) { 02049 reset($Wobjs); 02050 while(list(,$index)=each($Wobjs)) { 02051 if ($gifCreator->setup[$index] && $gifCreator->setup[$index.'.']) { 02052 $oldOffset = explode(',',$gifCreator->setup[$index.'.']['offset']); 02053 $gifCreator->setup[$index.'.']['offset'] = implode(',',$gifCreator->applyOffset($oldOffset,Array(-$Wcounter,0))); 02054 } 02055 } 02056 } 02057 } 02058 02059 // Finding alternative GIF names if any (by altImgResource) 02060 $gifFileName=''; 02061 if ($conf[$key]['altImgResource'] || is_array($conf[$key]['altImgResource.'])) { 02062 if (!is_object($cObj)) {$cObj=t3lib_div::makeInstance('tslib_cObj');} 02063 $cObj->start($this->menuArr[$key],'pages'); 02064 $altImgInfo = $cObj->getImgResource($conf[$key]['altImgResource'],$conf[$key]['altImgResource.']); 02065 $gifFileName=$altImgInfo[3]; 02066 } 02067 02068 // If an alternative name was NOT given, find the GIFBUILDER name. 02069 if (!$gifFileName && $isGD) { 02070 $gifCreator->createTempSubDir('menu/'); 02071 $gifFileName = $gifCreator->fileName('menu/'); 02072 } 02073 02074 $this->result[$resKey][$key] = $conf[$key]; 02075 02076 // Generation of image file: 02077 if (@file_exists($gifFileName)) { // File exists 02078 $info = @getimagesize($gifFileName); 02079 $this->result[$resKey][$key]['output_w']=intval($info[0]); 02080 $this->result[$resKey][$key]['output_h']=intval($info[1]); 02081 $this->result[$resKey][$key]['output_file'] = $gifFileName; 02082 } elseif ($isGD) { // file is generated 02083 $gifCreator->make(); 02084 $this->result[$resKey][$key]['output_w']=$gifCreator->w; 02085 $this->result[$resKey][$key]['output_h']=$gifCreator->h; 02086 $this->result[$resKey][$key]['output_file'] = $gifFileName; 02087 $gifCreator->output($this->result[$resKey][$key]['output_file']); 02088 $gifCreator->destroy(); 02089 } 02090 02091 $this->result[$resKey][$key]['output_file'] = t3lib_div::png_to_gif_by_imagemagick($this->result[$resKey][$key]['output_file']); 02092 02093 $Hcounter+=$this->result[$resKey][$key]['output_h']; // counter is increased 02094 $Wcounter+=$this->result[$resKey][$key]['output_w']; // counter is increased 02095 02096 if ($maxFlag) break; 02097 } 02098 } 02099 02115 function findLargestDims($conf,$items,$Hobjs,$Wobjs,$minDim,$maxDim) { 02116 $totalWH = array( 02117 'W' => array(), 02118 'H' => array(), 02119 'W_total' => 0, 02120 'H_total' => 0 02121 ); 02122 02123 $Hcounter = 0; 02124 $Wcounter = 0; 02125 $c=0; 02126 $maxFlag=0; 02127 reset($conf); 02128 while (list($key,$val)=each($conf)) { 02129 // SAME CODE AS makeGifs()! BEGIN 02130 if ($items==($c+1) && $minDim) { 02131 $Lobjs = $this->mconf['removeObjectsOfDummy']; 02132 if ($Lobjs) { 02133 $Lobjs = t3lib_div::intExplode(',',$Lobjs); 02134 reset($Lobjs); 02135 while(list(,$remItem)=each($Lobjs)) { 02136 unset($val[$remItem]); 02137 unset($val[$remItem.'.']); 02138 } 02139 } 02140 02141 $flag =0; 02142 $tempXY = explode(',',$val['XY']); 02143 if ($Wcounter<$minDim[0]) {$tempXY[0]=$minDim[0]-$Wcounter; $flag=1;} 02144 if ($Hcounter<$minDim[1]) {$tempXY[1]=$minDim[1]-$Hcounter; $flag=1;} 02145 $val['XY'] = implode(',',$tempXY); 02146 if (!$flag){break;} 02147 } 02148 $c++; 02149 02150 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02151 $gifCreator->init(); 02152 $gifCreator->start($val,$this->menuArr[$key]); 02153 if ($maxDim) { 02154 $tempXY = explode(',',$val['XY']); 02155 if ($maxDim[0] && $Wcounter+$gifCreator->XY[0]>=$maxDim[0]) {$tempXY[0]==$maxDim[0]-$Wcounter; $maxFlag=1;} 02156 if ($maxDim[1] && $Hcounter+$gifCreator->XY[1]>=$maxDim[1]) {$tempXY[1]=$maxDim[1]-$Hcounter; $maxFlag=1;} 02157 if ($maxFlag) { 02158 $val['XY'] = implode(',',$tempXY); 02159 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02160 $gifCreator->init(); 02161 $gifCreator->start($val,$this->menuArr[$key]); 02162 } 02163 } 02164 // SAME CODE AS makeGifs()! END 02165 02166 // Setting the width/height 02167 $totalWH['W'][$key]=$gifCreator->XY[0]; 02168 $totalWH['H'][$key]=$gifCreator->XY[1]; 02169 $totalWH['W_total']+=$gifCreator->XY[0]; 02170 $totalWH['H_total']+=$gifCreator->XY[1]; 02171 // ---- // 02172 02173 $Hcounter+=$gifCreator->XY[1]; // counter is increased 02174 $Wcounter+=$gifCreator->XY[0]; // counter is increased 02175 02176 if ($maxFlag){break;} 02177 } 02178 return $totalWH; 02179 } 02180 02187 function writeMenu() { 02188 if (is_array($this->menuArr) && is_array($this->result) && count($this->result) && is_array($this->result['NO'])) { 02189 $this->WMcObj = t3lib_div::makeInstance('tslib_cObj'); // Create new tslib_cObj for our use 02190 $this->WMresult = ''; 02191 $this->INPfixMD5 = substr(md5(microtime().$this->GMENU_fixKey),0,4); 02192 $this->WMmenuItems = count($this->result['NO']); 02193 02194 $this->WMsubmenuObjSuffixes = $this->tmpl->splitConfArray(array('sOSuffix'=>$this->mconf['submenuObjSuffixes']),$this->WMmenuItems); 02195 02196 $this->extProc_init(); 02197 for ($key=0;$key<$this->WMmenuItems;$key++) { 02198 if ($this->result['NO'][$key]['output_file']) { 02199 $this->WMcObj->start($this->menuArr[$key],'pages'); // Initialize the cObj with the page record of the menu item 02200 02201 $this->I = array(); 02202 $this->I['key'] = $key; 02203 $this->I['INPfix']= $this->imgNameNotRandom?'':'_'.$this->INPfixMD5.'_'.$key; 02204 $this->I['val'] = $this->result['NO'][$key]; 02205 $this->I['title'] = $this->getPageTitle($this->menuArr[$key]['title'],$this->menuArr[$key]['nav_title']); 02206 $this->I['uid'] = $this->menuArr[$key]['uid']; 02207 $this->I['mount_pid'] = $this->menuArr[$key]['mount_pid']; 02208 $this->I['pid'] = $this->menuArr[$key]['pid']; 02209 $this->I['spacer'] = $this->menuArr[$key]['isSpacer']; 02210 if (!$this->I['uid'] && !$this->menuArr[$key]['_OVERRIDE_HREF']) {$this->I['spacer']=1;} 02211 $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 02212 $this->I['name'] = ''; 02213 02214 // Set access key 02215 if ($this->mconf['accessKey']) { 02216 $this->I['accessKey'] = $this->accessKey($this->I['title']); 02217 } else { 02218 $this->I['accessKey'] = array(); 02219 } 02220 02221 // Make link tag 02222 $this->I['val']['ATagParams'] = $this->WMcObj->getATagParams($this->I['val']); 02223 $this->I['val']['additionalParams'] = $this->WMcObj->stdWrap($this->I['val']['additionalParams'],$this->I['val']['additionalParams.']); 02224 $this->I['linkHREF'] = $this->link($key,$this->I['val']['altTarget'],$this->mconf['forceTypeValue']); 02225 02226 // Title attribute of links: 02227 $titleAttrValue = $this->WMcObj->stdWrap($this->I['val']['ATagTitle'],$this->I['val']['ATagTitle.']).$this->I['accessKey']['alt']; 02228 if (strlen($titleAttrValue)) { 02229 $this->I['linkHREF']['title'] = $titleAttrValue; 02230 } 02231 // Setting "blurlink()" function: 02232 if (!$this->mconf['noBlur']) { 02233 $this->I['linkHREF']['onFocus']='blurLink(this);'; 02234 } 02235 02236 // Set rollover 02237 if ($this->result['RO'][$key] && !$this->I['noLink']) { 02238 $this->I['theName'] = $this->imgNamePrefix.$this->I['uid'].$this->I['INPfix']; 02239 $this->I['name'] = ' '.$this->nameAttribute.'="'.$this->I["theName"].'"'; 02240 $this->I['linkHREF']['onMouseover']=$this->WMfreezePrefix.'over(\''.$this->I['theName'].'\');'; 02241 $this->I['linkHREF']['onMouseout']=$this->WMfreezePrefix.'out(\''.$this->I['theName'].'\');'; 02242 $GLOBALS['TSFE']->JSImgCode.= chr(10).$this->I['theName'].'_n=new Image(); '.$this->I['theName'].'_n.src = "'.$GLOBALS['TSFE']->absRefPrefix.$this->I['val']['output_file'].'"; '; 02243 $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'].'"; '; 02244 $GLOBALS['TSFE']->imagesOnPage[]=$this->result['RO'][$key]['output_file']; 02245 $GLOBALS['TSFE']->setJS('mouseOver'); 02246 $this->extProc_RO($key); 02247 } 02248 02249 // Set altText 02250 $this->I['altText'] = $this->mconf['disableAltText'] ? '' : $this->I['title'].$this->I['accessKey']['alt']; 02251 02252 // Calling extra processing function 02253 $this->extProc_beforeLinking($key); 02254 02255 // Set linking 02256 if (!$this->I['noLink']) { 02257 $this->setATagParts(); 02258 } else { 02259 $this->I['A1'] = ''; 02260 $this->I['A2'] = ''; 02261 } 02262 $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']:'').' />'; 02263 02264 // Make before, middle and after parts 02265 $this->I['parts'] = array(); 02266 $this->I['parts']['ATag_begin'] = $this->I['A1']; 02267 $this->I['parts']['image'] = $this->I['IMG']; 02268 $this->I['parts']['ATag_end'] = $this->I['A2']; 02269 02270 // Passing I to a user function 02271 if ($this->mconf['IProcFunc']) { 02272 $this->I = $this->userProcess('IProcFunc',$this->I); 02273 } 02274 02275 // Putting the item together. 02276 // Merge parts + beforeAllWrap 02277 $this->I['theItem']= implode('',$this->I['parts']); 02278 $this->I['theItem']= $this->extProc_beforeAllWrap($this->I['theItem'],$key); 02279 02280 // wrap: 02281 $this->I['theItem']= $this->tmpl->wrap($this->I['theItem'],$this->I['val']['wrap']); 02282 02283 // allWrap: 02284 $allWrap = $this->WMcObj->stdWrap($this->I['val']['allWrap'],$this->I['val']['allWrap.']); 02285 $this->I['theItem'] = $this->tmpl->wrap($this->I['theItem'],$allWrap); 02286 02287 if ($this->I['val']['subst_elementUid']) $this->I['theItem'] = str_replace('{elementUid}',$this->I['uid'],$this->I['theItem']); 02288 02289 // allStdWrap: 02290 if (is_array($this->I['val']['allStdWrap.'])) { 02291 $this->I['theItem'] = $this->WMcObj->stdWrap($this->I['theItem'],$this->I['val']['allStdWrap.']); 02292 } 02293 02294 $GLOBALS['TSFE']->imagesOnPage[]=$this->I['val']['output_file']; 02295 02296 $this->extProc_afterLinking($key); 02297 } 02298 } 02299 return $this->extProc_finish(); 02300 } 02301 } 02302 02311 function extProc_init() { 02312 } 02313 02322 function extProc_RO($key) { 02323 } 02324 02333 function extProc_beforeLinking($key) { 02334 } 02335 02346 function extProc_afterLinking($key) { 02347 $this->WMresult.=$this->I['theItem']; 02348 if (!$this->I['spacer']) { 02349 $this->WMresult.= $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']); 02350 } 02351 } 02352 02353 02363 function extProc_beforeAllWrap($item,$key) { 02364 return $item; 02365 } 02366 02374 function extProc_finish() { 02375 // stdWrap: 02376 if (is_array($this->mconf['stdWrap.'])) { 02377 $this->WMresult = $this->WMcObj->stdWrap($this->WMresult,$this->mconf['stdWrap.']); 02378 } 02379 return $this->tmpl->wrap($this->WMresult,$this->mconf['wrap']).$this->WMextraScript; 02380 } 02381 } 02382 02383 02384 02385 02386 02387 02388 02389 02390 02391 02392 02393 02394 02395 02396 02397 02398 02399 02400 02401 02402 02403 02412 class tslib_imgmenu extends tslib_menu { 02413 02421 function generate() { 02422 $splitCount = count($this->menuArr); 02423 if ($splitCount) { 02424 list($NOconf) = $this->procesItemStates($splitCount); 02425 } 02426 if ($this->mconf['debugItemConf']) {echo '<h3>$NOconf:</h3>'; debug($NOconf); } 02427 $this->makeImageMap($NOconf); 02428 } 02429 02439 function makeImageMap($conf) { 02440 if (!is_array($conf)) { 02441 $conf = Array(); 02442 } 02443 if (is_array($this->mconf['main.'])) { 02444 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02445 $gifCreator->init(); 02446 02447 $itemsConf = $conf; 02448 $conf = $this->mconf['main.']; 02449 if (is_array($conf)) { 02450 $gifObjCount = 0; 02451 02452 $sKeyArray=t3lib_TStemplate::sortedKeyList($conf); 02453 $gifObjCount=intval(end($sKeyArray)); 02454 02455 $lastOriginal = $gifObjCount; 02456 02457 // Now we add graphical objects to the gifbuilder-setup 02458 reset($itemsConf); 02459 $waArr = Array(); 02460 while (list($key,$val)=each($itemsConf)) { 02461 if (is_array($val)) { 02462 $gifObjCount++; 02463 $waArr[$key]['free']=$gifObjCount; 02464 02465 $sKeyArray=t3lib_TStemplate::sortedKeyList($val); 02466 02467 foreach($sKeyArray as $theKey) { 02468 $theValue=$val[$theKey]; 02469 02470 02471 if (intval($theKey) && $theValArr=$val[$theKey.'.']) { 02472 $cObjData = $this->menuArr[$key] ? $this->menuArr[$key] : Array(); 02473 02474 $gifObjCount++; 02475 if ($theValue=='TEXT') { 02476 $waArr[$key]['textNum']=$gifObjCount; 02477 02478 $gifCreator->data = $cObjData; 02479 $theValArr = $gifCreator->checkTextObj($theValArr); 02480 unset($theValArr['text.']); // if this is not done it seems that imageMaps will be rendered wrong!! 02481 // check links 02482 02483 $LD = $this->tmpl->linkData($this->menuArr[$key],$this->mconf['target'],'','',array(),'',$this->mconf['forceTypeValue']); 02484 02485 // If access restricted pages should be shown in menus, change the link of such pages to link to a redirection page: 02486 $this->changeLinksForAccessRestrictedPages($LD, $this->menuArr[$key], $this->mconf['target'], $this->mconf['forceTypeValue']); 02487 02488 // Overriding URL / Target if set to do so: 02489 if ($this->menuArr[$key]['_OVERRIDE_HREF']) { 02490 $LD['totalURL'] = $this->menuArr[$key]['_OVERRIDE_HREF']; 02491 if ($this->menuArr[$key]['_OVERRIDE_TARGET']) $LD['target'] = $this->menuArr[$key]['_OVERRIDE_TARGET']; 02492 } 02493 02494 // Setting target/url for Image Map: 02495 if ($theValArr['imgMap.']['url']=='') { 02496 $theValArr['imgMap.']['url'] = $LD['totalURL']; 02497 } 02498 if ($theValArr['imgMap.']['target']=='') { 02499 $theValArr['imgMap.']['target'] = $LD['target']; 02500 } 02501 if ($theValArr['imgMap.']['noBlur']=='') { 02502 $theValArr['imgMap.']['noBlur'] = $this->mconf['noBlur']; 02503 } 02504 if (is_array($theValArr['imgMap.']['altText.'])) { 02505 $cObj =t3lib_div::makeInstance('tslib_cObj'); 02506 $cObj->start($cObjData,'pages'); 02507 $theValArr['imgMap.']['altText'] = $cObj->stdWrap($theValArr['imgMap.']['altText'], $theValArr['imgMap.']['altText.']); 02508 unset($theValArr['imgMap.']['altText.']); 02509 } 02510 if (is_array($theValArr['imgMap.']['titleText.'])) { 02511 $cObj =t3lib_div::makeInstance('tslib_cObj'); 02512 $cObj->start($cObjData,'pages'); 02513 $theValArr['imgMap.']['titleText'] = $cObj->stdWrap($theValArr['imgMap.']['titleText'], $theValArr['imgMap.']['titleText.']); 02514 unset($theValArr['imgMap.']['titleText.']); 02515 } 02516 } 02517 // 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!! 02518 if ($theValue=='IMAGE') { 02519 if ($theValArr['file']=='GIFBUILDER') { 02520 $temp_sKeyArray=t3lib_TStemplate::sortedKeyList($theValArr['file.']); 02521 reset($temp_sKeyArray); 02522 while(list(,$temp_theKey)=each($temp_sKeyArray)) { 02523 if ($theValArr['mask.'][$temp_theKey]=='TEXT') { 02524 $gifCreator->data = $this->menuArr[$key] ? $this->menuArr[$key] : Array(); 02525 $theValArr['mask.'][$temp_theKey.'.'] = $gifCreator->checkTextObj($theValArr['mask.'][$temp_theKey.'.']); 02526 unset($theValArr['mask.'][$temp_theKey.'.']['text.']); // if this is not done it seems that imageMaps will be rendered wrong!! 02527 } 02528 } 02529 } 02530 if ($theValArr['mask']=='GIFBUILDER') { 02531 $temp_sKeyArray=t3lib_TStemplate::sortedKeyList($theValArr['mask.']); 02532 reset($temp_sKeyArray); 02533 while(list(,$temp_theKey)=each($temp_sKeyArray)) { 02534 if ($theValArr['mask.'][$temp_theKey]=='TEXT') { 02535 $gifCreator->data = $this->menuArr[$key] ? $this->menuArr[$key] : Array(); 02536 $theValArr['mask.'][$temp_theKey.'.'] = $gifCreator->checkTextObj($theValArr['mask.'][$temp_theKey.'.']); 02537 unset($theValArr['mask.'][$temp_theKey.'.']['text.']); // if this is not done it seems that imageMaps will be rendered wrong!! 02538 } 02539 } 02540 } 02541 } 02542 02543 // Checks if disabled is set... 02544 $setObjFlag=1; 02545 if ($theValArr['if.']) { 02546 $cObj =t3lib_div::makeInstance('tslib_cObj'); 02547 $cObj->start($cObjData,'pages'); 02548 if (!$cObj->checkIf($theValArr['if.'])) { 02549 $setObjFlag=0; 02550 } 02551 unset($theValArr['if.']); 02552 } 02553 // Set the object! 02554 if ($setObjFlag) { 02555 $conf[$gifObjCount] = $theValue; 02556 $conf[$gifObjCount.'.'] = $theValArr; 02557 } 02558 } 02559 } 02560 } 02561 } 02562 02563 $gifCreator->start($conf,$GLOBALS['TSFE']->page); 02564 // calculations 02565 02566 $sum=Array(0,0,0,0); 02567 reset($waArr); 02568 while (list($key,$val)=each($waArr)) { 02569 if ($dConf[$key] =$itemsConf[$key]['distrib']) { 02570 $textBB = $gifCreator->objBB[$val['textNum']]; 02571 $dConf[$key] = str_replace('textX',$textBB[0],$dConf[$key]); 02572 $dConf[$key] = str_replace('textY',$textBB[1],$dConf[$key]); 02573 $dConf[$key] = t3lib_div::intExplode(',',$gifCreator->calcOffset($dConf[$key])); 02574 } 02575 } 02576 $workArea = t3lib_div::intExplode(',',$gifCreator->calcOffset($this->mconf['dWorkArea'])); 02577 reset($waArr); 02578 while (list($key,$val)=each($waArr)) { 02579 $index = $val['free']; 02580 $gifCreator->setup[$index] = 'WORKAREA'; 02581 $workArea[2] = $dConf[$key][2] ? $dConf[$key][2] : $dConf[$key][0]; 02582 $workArea[3] = $dConf[$key][3] ? $dConf[$key][3] : $dConf[$key][1]; 02583 02584 $gifCreator->setup[$index.'.']['set'] = implode(',',$workArea); 02585 $workArea[0]+=$dConf[$key][0]; 02586 $workArea[1]+=$dConf[$key][1]; 02587 } 02588 02589 if ($this->mconf['debugRenumberedObject']) {echo '<h3>Renumbered GIFBUILDER object:</h3>'; debug($gifCreator->setup);} 02590 02591 $gifCreator->createTempSubDir('menu/'); 02592 $gifFileName = $gifCreator->fileName('menu/'); 02593 02594 // Gets the ImageMap from the cache... 02595 $imgHash = md5($gifFileName); 02596 $imgMap = $this->sys_page->getHash($imgHash, 0); 02597 02598 if ($imgMap && @file_exists($gifFileName)) { // File exists 02599 $info = @getimagesize($gifFileName); 02600 $w=$info[0]; 02601 $h=$info[1]; 02602 } else { // file is generated 02603 $gifCreator->make(); 02604 $w=$gifCreator->w; 02605 $h=$gifCreator->h; 02606 $gifCreator->output($gifFileName); 02607 $gifCreator->destroy(); 02608 $imgMap=$gifCreator->map; 02609 $this->sys_page->storeHash($imgHash, $imgMap, 'MENU IMAGEMAP'); 02610 } 02611 $imgMap.=$this->mconf['imgMapExtras']; 02612 02613 $gifFileName = t3lib_div::png_to_gif_by_imagemagick($gifFileName); 02614 $this->result = Array('output_file'=>$gifFileName, 'output_w'=>$w, 'output_h'=>$h, 'imgMap'=>$imgMap); 02615 } 02616 } 02617 } 02618 02625 function writeMenu() { 02626 if ($this->result) { 02627 $res = &$this->result; 02628 $menuName = 'menu_'.t3lib_div::shortMD5($res['imgMap']); // shortMD5 260900 02629 $result = '<img src="'.$GLOBALS['TSFE']->absRefPrefix.$res['output_file'].'" width="'.$res['output_w'].'" height="'.$res['output_h'].'" usemap="#'.$menuName.'" border="0" '.$this->mconf['params']; 02630 if (!strstr($result,'alt="')) $result.=' alt="Menu Image Map"'; // Adding alt attribute if not set. 02631 $result.= ' /><map name="'.$menuName.'" id="'.$menuName.'">'.$res['imgMap'].'</map>'; 02632 02633 $GLOBALS['TSFE']->imagesOnPage[]=$res['output_file']; 02634 02635 return $this->tmpl->wrap($result,$this->mconf['wrap']); 02636 } 02637 } 02638 } 02639 02640 02641 02642 02643 02644 02645 02646 02647 02648 02649 02650 02651 02652 02653 02654 02655 02656 02657 02658 02659 02668 class tslib_jsmenu extends tslib_menu { 02669 02675 function generate() { 02676 } 02677 02683 function writeMenu() { 02684 if ($this->id) { 02685 // Making levels: 02686 $levels = t3lib_div::intInRange($this->mconf['levels'],1,5); 02687 $this->levels = $levels; 02688 $this->JSVarName='eid'; 02689 $this->JSMenuName= $this->mconf['menuName'] ? $this->mconf['menuName'] : 'JSmenu'; 02690 02691 $JScode="\n var ".$this->JSMenuName." = new JSmenu(".$levels.",'".$this->JSMenuName."Form');"; 02692 02693 for ($a=1;$a<=$levels;$a++) { 02694 $JScode.="\n var ".$this->JSVarName.$a."=0;"; 02695 } 02696 $JScode.= $this->generate_level($levels,1,$this->id,$this->menuArr,$this->MP_array)."\n"; 02697 02698 $GLOBALS['TSFE']->additionalHeaderData['JSMenuCode']='<script type="text/javascript" src="'.$GLOBALS['TSFE']->absRefPrefix.'t3lib/jsfunc.menu.js"></script>'; 02699 $GLOBALS['TSFE']->JSCode.=$JScode; 02700 02701 // Printing: 02702 $allFormCode=""; 02703 for ($a=1;$a<=$this->levels;$a++) { 02704 $formCode=''; 02705 $levelConf = $this->mconf[$a.'.']; 02706 $length = $levelConf['width'] ? $levelConf['width'] : 14; 02707 $lenghtStr=''; 02708 for ($b=0;$b<$length;$b++) { 02709 $lenghtStr.='_'; 02710 } 02711 $height = $levelConf['elements'] ? $levelConf['elements'] : 5; 02712 02713 $formCode.= '<select name="selector'.$a.'" onchange="'.$this->JSMenuName.'.act('.$a.');"'.($levelConf['additionalParams']?' '.$levelConf['additionalParams']:'').'>'; 02714 for ($b=0;$b<$height;$b++) { 02715 $formCode.= '<option value="0">'; 02716 if ($b==0) { 02717 $formCode.= $lenghtStr; 02718 } 02719 $formCode.='</option>'; 02720 } 02721 $formCode.= '</select>'; 02722 $allFormCode.=$this->tmpl->wrap($formCode,$levelConf['wrap']); 02723 } 02724 $formCode = $this->tmpl->wrap($allFormCode,$this->mconf['wrap']); 02725 02726 $formCode= '<form action="" method="post" style="margin: 0 0 0 0;" name="'.$this->JSMenuName.'Form">'.$formCode.'</form>'; 02727 $formCode.='<script type="text/javascript"> /*<![CDATA[*/ '.$this->JSMenuName.'.writeOut(1,'.$this->JSMenuName.'.openID,1); /*]]>*/ </script>'; 02728 return $this->tmpl->wrap($formCode,$this->mconf['wrapAfterTags']); 02729 } 02730 } 02731 02744 function generate_level($levels,$count,$pid,$menuItemArray='',$MP_array=array()) { 02745 $levelConf = $this->mconf[$count.'.']; 02746 02747 // Translate PID to a mount page, if any: 02748 $mount_info = $this->sys_page->getMountPointInfo($pid); 02749 if (is_array($mount_info)) { 02750 $MP_array[] = $mount_info['MPvar']; 02751 $pid = $mount_info['mount_pid']; 02752 } 02753 02754 // Set "&MP=" var: 02755 $MP_var = implode(',',$MP_array); 02756 $MP_params = $MP_var ? '&MP='.rawurlencode($MP_var) : ''; 02757 02758 // UIDs to ban: 02759 $banUidArray = $this->getBannedUids(); 02760 02761 // Initializing variables: 02762 $var = $this->JSVarName; 02763 $menuName = $this->JSMenuName; 02764 $parent = $count==1 ? 0 : $var.($count-1); 02765 $prev=0; 02766 $c=0; 02767 02768 $menuItems = is_array($menuItemArray) ? $menuItemArray : $this->sys_page->getMenu($pid); 02769 foreach($menuItems as $uid => $data) { 02770 $spacer = (t3lib_div::inList($this->spacerIDList,$data['doktype'])?1:0); // if item is a spacer, $spacer is set 02771 if ($this->mconf['SPC'] || !$spacer) { // If the spacer-function is not enabled, spacers will not enter the $menuArr 02772 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 02773 if ($count<$levels) { 02774 $addLines = $this->generate_level($levels,$count+1,$data['uid'],'',$MP_array); 02775 } else { 02776 $addLines = ''; 02777 } 02778 $title=$data['title']; 02779 $url=''; 02780 $target=''; 02781 if ((!$addLines && !$levelConf['noLink']) || $levelConf['alwaysLink']) { 02782 $LD = $this->tmpl->linkData($data,$this->mconf['target'],'','',array(),$MP_params,$this->mconf['forceTypeValue']); 02783 02784 // If access restricted pages should be shown in menus, change the link of such pages to link to a redirection page: 02785 $this->changeLinksForAccessRestrictedPages($LD, $data, $this->mconf['target'], $this->mconf['forceTypeValue']); 02786 02787 $url = $LD['totalURL']; 02788 $target = $LD['target']; 02789 } 02790 $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).");"; 02791 // If the active one should be chosen... 02792 $active = ($levelConf['showActive'] && $data['uid'] == $this->tmpl->rootLine[$count]['uid']); 02793 // If the first item should be shown 02794 $first = (!$c && $levelConf['showFirst']); 02795 // do it... 02796 if ($active || $first) { 02797 if ($count==1) { 02798 $codeLines.="\n".$menuName.".openID = ".$var.$count.";"; 02799 } else { 02800 $codeLines.="\n".$menuName.".entry[".$parent."].openID = ".$var.$count.";"; 02801 } 02802 } 02803 // Add submenu... 02804 $codeLines.=$addLines; 02805 02806 $prev=$var.$count; 02807 $c++; 02808 } 02809 } 02810 } 02811 if ($this->mconf['firstLabelGeneral'] && !$levelConf['firstLabel']) { 02812 $levelConf['firstLabel'] = $this->mconf['firstLabelGeneral']; 02813 } 02814 if ($levelConf['firstLabel'] && $codeLines) { 02815 $codeLines.= chr(10).$menuName.'.defTopTitle['.$count.'] = '.t3lib_div::quoteJSvalue($levelConf['firstLabel'], true).';'; 02816 } 02817 return $codeLines; 02818 } 02819 } 02820 02821 02822 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_menu.php']) { 02823 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_menu.php']); 02824 } 02825 02826 ?>