Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 1999-2004 Kasper Skaarhoj (kasperYYYY@typo3.com) 00006 * All rights reserved 00007 * 00008 * This script is part of the TYPO3 project. The TYPO3 project is 00009 * free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * The GNU General Public License can be found at 00015 * http://www.gnu.org/copyleft/gpl.html. 00016 * A copy is found in the textfile GPL.txt and important notices to the license 00017 * from the author is found in LICENSE.txt distributed with these scripts. 00018 * 00019 * 00020 * This script is distributed in the hope that it will be useful, 00021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00023 * GNU General Public License for more details. 00024 * 00025 * This copyright notice MUST APPEAR in all copies of the script! 00026 ***************************************************************/ 00143 class tslib_menu { 00144 var $menuNumber = 1; // tells you which menu-number this is. This is important when getting data from the setup 00145 var $entryLevel = 0; // 0 = rootFolder 00146 var $subLevelClass = ''; // Points to the menu-class, that should be used for the next level 00147 var $spacerIDList = '199'; // The doktype-number that defines a spacer 00148 var $doktypeExcludeList = '5,6'; // doktypes that define which should not be included in a menu 00149 var $alwaysActivePIDlist=array(); 00150 var $imgNamePrefix = 'img'; 00151 var $imgNameNotRandom=0; 00152 var $debug = 0; 00153 var $parent_cObj =''; // Loaded with the parent cObj-object when a new HMENU is made 00154 var $GMENU_fixKey='gmenu'; 00155 var $MP_array=array(); // accumulation of mount point data 00156 00157 // internal 00158 var $conf = Array(); // HMENU configuration 00159 var $mconf = Array(); // xMENU configuration (TMENU, GMENU etc) 00160 var $tmpl; // template-object 00161 var $sys_page; // sys_page-object 00162 var $id; // The base page-id of the menu. 00163 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. 00164 var $menuArr; // The array of menuItems which is built 00165 var $hash; 00166 var $result = Array(); 00167 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) 00168 var $INPfixMD5; 00169 var $I; 00170 var $WMresult; 00171 var $WMfreezePrefix; 00172 var $WMmenuItems; 00173 var $WMextraScript; 00174 var $alternativeMenuTempArray=''; // Can be set to contain menu item arrays for sub-levels. 00175 00187 function start(&$tmpl,&$sys_page,$id,$conf,$menuNumber) { 00188 00189 // Init: 00190 $this->conf = $conf; 00191 $this->menuNumber = $menuNumber; 00192 $this->mconf = $conf[$this->menuNumber.'.']; 00193 $this->debug=$GLOBALS['TSFE']->debug; 00194 00195 // Sets the internal vars. $tmpl MUST be the template-object. $sys_page MUST be the sys_page object 00196 if ($this->conf[$this->menuNumber] && is_object($tmpl) && is_object($sys_page)) { 00197 $this->tmpl = &$tmpl; 00198 $this->sys_page = &$sys_page; 00199 00200 // alwaysActivePIDlist initialized: 00201 if (trim($this->conf['alwaysActivePIDlist'])) { 00202 $this->alwaysActivePIDlist = t3lib_div::intExplode(',', $this->conf['alwaysActivePIDlist']); 00203 } 00204 00205 // 'not in menu' doktypes 00206 if($this->conf['excludeDoktypes']) { 00207 $this->doktypeExcludeList = $GLOBALS['TYPO3_DB']->cleanIntList($this->conf['excludeDoktypes']); 00208 } 00209 if($this->conf['includeNotInMenu']) { 00210 $exclDoktypeArr = t3lib_div::trimExplode(',',$this->doktypeExcludeList,1); 00211 $exclDoktypeArr = t3lib_div::removeArrayEntryByValue($exclDoktypeArr,'5'); 00212 $this->doktypeExcludeList = implode(',',$exclDoktypeArr); 00213 } 00214 00215 // EntryLevel 00216 $this->entryLevel = tslib_cObj::getKey ($conf['entryLevel'],$this->tmpl->rootLine); 00217 00218 // Set parent page: If $id not stated with start() then the base-id will be found from rootLine[$this->entryLevel] 00219 if ($id) { // Called as the next level in a menu. It is assumed that $this->MP_array is set from parent menu. 00220 $this->id = intval($id); 00221 } else { // This is a BRAND NEW menu, first level. So we take ID from rootline and also find MP_array (mount points) 00222 $this->id = intval($this->tmpl->rootLine[$this->entryLevel]['uid']); 00223 00224 // Traverse rootline to build MP_array of pages BEFORE the entryLevel 00225 // (MP var for ->id is picked up in the next part of the code...) 00226 foreach($this->tmpl->rootLine as $entryLevel => $levelRec) { 00227 // For overlaid mount points, set the variable right now: 00228 if ($levelRec['_MP_PARAM'] && $levelRec['_MOUNT_OL']) { 00229 $this->MP_array[] = $levelRec['_MP_PARAM']; 00230 } 00231 // Break when entry level is reached: 00232 if ($entryLevel>=$this->entryLevel) break; 00233 00234 // For normal mount points, set the variable for next level. 00235 if ($levelRec['_MP_PARAM'] && !$levelRec['_MOUNT_OL']) { 00236 $this->MP_array[] = $levelRec['_MP_PARAM']; 00237 } 00238 } 00239 } 00240 00241 // Return false if no page ID was set (thus no menu of subpages can be made). 00242 if ($this->id<=0) { 00243 return FALSE; 00244 } 00245 00246 // Check if page is a mount point, and if so set id and MP_array 00247 // (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...) 00248 $mount_info = $this->sys_page->getMountPointInfo($this->id); 00249 if (is_array($mount_info)) { 00250 $this->MP_array[] = $mount_info['MPvar']; 00251 $this->id = $mount_info['mount_pid']; 00252 } 00253 00254 // Gather list of page uids in root line (for "isActive" evaluation). Also adds the MP params in the path so Mount Points are respected. 00255 // (List is specific for this rootline, so it may be supplied from parent menus for speed...) 00256 if (!is_array($this->rL_uidRegister)) { 00257 $rl_MParray = array(); 00258 foreach($this->tmpl->rootLine as $v_rl) { 00259 // For overlaid mount points, set the variable right now: 00260 if ($v_rl['_MP_PARAM'] && $v_rl['_MOUNT_OL']) { 00261 $rl_MParray[] = $v_rl['_MP_PARAM']; 00262 } 00263 00264 // Add to register: 00265 $this->rL_uidRegister[] = 'ITEM:'.$v_rl['uid'].(count($rl_MParray) ? ':'.implode(',',$rl_MParray) : ''); 00266 00267 // For normal mount points, set the variable for next level. 00268 if ($v_rl['_MP_PARAM'] && !$v_rl['_MOUNT_OL']) { 00269 $rl_MParray[] = $v_rl['_MP_PARAM']; 00270 } 00271 } 00272 } 00273 00274 // 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 00275 // Notice: The automatic expansion of a menu is designed to work only when no "special" modes are used. 00276 if (is_array($this->tmpl->rootLine[$this->entryLevel+$this->menuNumber])) { 00277 $nextMParray = $this->MP_array; 00278 if ($this->tmpl->rootLine[$this->entryLevel+$this->menuNumber]['_MOUNT_OL']) { // In overlay mode, add next level MPvars as well: 00279 $nextMParray[] = $this->tmpl->rootLine[$this->entryLevel+$this->menuNumber]['_MP_PARAM']; 00280 } 00281 $this->nextActive = $this->tmpl->rootLine[$this->entryLevel+$this->menuNumber]['uid']. 00282 (count($nextMParray)?':'.implode(',',$nextMParray):''); 00283 } else { 00284 $this->nextActive = ''; 00285 } 00286 00287 // imgNamePrefix 00288 if ($this->mconf['imgNamePrefix']) { 00289 $this->imgNamePrefix=$this->mconf['imgNamePrefix']; 00290 } 00291 $this->imgNameNotRandom = $this->mconf['imgNameNotRandom']; 00292 00293 // subLevelClass 00294 $cls = strtolower($this->conf[$this->menuNumber+1]); 00295 if ($cls && t3lib_div::inList($this->tmpl->menuclasses,$cls)) { 00296 $this->subLevelClass = $cls; 00297 } 00298 $retVal = TRUE; 00299 } else { 00300 $GLOBALS['TT']->setTSlogMessage('ERROR in menu',3); 00301 $retVal = FALSE; 00302 } 00303 return $retVal; 00304 } 00305 00313 function makeMenu() { 00314 if ($this->id) { 00315 $temp = array(); 00316 $altSortFieldValue = trim($this->mconf['alternativeSortingField']); 00317 $altSortField = $altSortFieldValue ? $altSortFieldValue : 'sorting'; 00318 if ($this->menuNumber==1 && $this->conf['special']) { // ... only for the FIRST level of a HMENU 00319 $value = $this->conf['special.']['value']; 00320 00321 switch($this->conf['special']) { 00322 case 'userdefined': 00323 $temp = $this->includeMakeMenu($this->conf['special.'],$altSortField); 00324 break; 00325 case 'userfunction': 00326 $temp = $this->parent_cObj->callUserFunction( 00327 $this->conf['special.']['userFunc'], 00328 array_merge($this->conf['special.'],array('_altSortField'=>$altSortField)), 00329 '' 00330 ); 00331 if (!is_array($temp)) $temp=array(); 00332 break; 00333 case 'language': 00334 $temp = array(); 00335 00336 // Getting current page record NOT overlaid by any translation: 00337 $currentPageWithNoOverlay = $this->sys_page->getRawRecord('pages',$GLOBALS['TSFE']->page['uid']); 00338 00339 // Traverse languages set up: 00340 $languageItems = t3lib_div::intExplode(',',$value); 00341 foreach($languageItems as $sUid) { 00342 // Find overlay record: 00343 if ($sUid) { 00344 $lRecs = $this->sys_page->getPageOverlay($GLOBALS['TSFE']->page['uid'],$sUid); 00345 } else $lRecs=array(); 00346 // Checking if the "disabled" state should be set. 00347 if ( 00348 ($GLOBALS['TSFE']->page['l18n_cfg']&2 && $sUid && !count($lRecs)) // Blocking for all translations? 00349 || ($GLOBALS['TSFE']->page['l18n_cfg']&1 && (!$sUid || !count($lRecs))) // Blocking default translation? 00350 || (!$this->conf['special.']['normalWhenNoLanguage'] && $sUid && !count($lRecs)) 00351 ) { 00352 $iState = $GLOBALS['TSFE']->sys_language_uid==$sUid ? 'USERDEF2' : 'USERDEF1'; 00353 } else { 00354 $iState = $GLOBALS['TSFE']->sys_language_uid==$sUid ? 'ACT' : 'NO'; 00355 } 00356 // Adding menu item: 00357 $temp[] = array_merge( 00358 array_merge($currentPageWithNoOverlay, $lRecs), 00359 array( 00360 'ITEM_STATE' => $iState, 00361 '_ADD_GETVARS' => '&L='.$sUid, 00362 '_SAFE' => TRUE 00363 ) 00364 ); 00365 } 00366 break; 00367 case 'directory': 00368 if ($value=='') { 00369 $value=$GLOBALS['TSFE']->page['uid']; 00370 } 00371 $items=t3lib_div::intExplode(',',$value); 00372 00373 foreach($items as $id) { 00374 $MP = $this->tmpl->getFromMPmap($id); 00375 00376 // Checking if a page is a mount page and if so, change the ID and set the MP var properly. 00377 $mount_info = $this->sys_page->getMountPointInfo($id); 00378 if (is_array($mount_info)) { 00379 if ($mount_info['overlay']) { // Overlays should already have their full MPvars calculated: 00380 $MP = $this->tmpl->getFromMPmap($mount_info['mount_pid']); 00381 $MP = $MP ? $MP : $mount_info['MPvar']; 00382 } else { 00383 $MP = ($MP ? $MP.',' : '').$mount_info['MPvar']; 00384 } 00385 $id = $mount_info['mount_pid']; 00386 } 00387 00388 // Get sub-pages: 00389 $res = $GLOBALS['TSFE']->cObj->exec_getQuery('pages',Array('pidInList'=>$id,'orderBy'=>$altSortField)); 00390 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00391 00392 // Keep mount point? 00393 $mount_info = $this->sys_page->getMountPointInfo($row['uid'], $row); 00394 if (is_array($mount_info) && $mount_info['overlay']) { // There is a valid mount point. 00395 $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! 00396 if (count($mp_row)) { 00397 $row = $mp_row; 00398 $row['_MP_PARAM'] = $mount_info['MPvar']; 00399 } 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! 00400 } 00401 00402 // Add external MP params, then the row: 00403 if (is_array($row)) { 00404 if ($MP) $row['_MP_PARAM'] = $MP.($row['_MP_PARAM'] ? ','.$row['_MP_PARAM'] : ''); 00405 $temp[$row['uid']] = $this->sys_page->getPageOverlay($row); 00406 } 00407 } 00408 } 00409 break; 00410 case 'list': 00411 if ($value=='') { 00412 $value=$this->id; 00413 } 00414 $loadDB = t3lib_div::makeInstance('FE_loadDBGroup'); 00415 $loadDB->start($value, 'pages'); 00416 $loadDB->additionalWhere['pages']=tslib_cObj::enableFields('pages'); 00417 $loadDB->getFromDB(); 00418 00419 foreach($loadDB->itemArray as $val) { 00420 $MP = $this->tmpl->getFromMPmap($val['id']); 00421 00422 // Keep mount point? 00423 $mount_info = $this->sys_page->getMountPointInfo($val['id']); 00424 if (is_array($mount_info) && $mount_info['overlay']) { // There is a valid mount point. 00425 $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! 00426 if (count($mp_row)) { 00427 $row = $mp_row; 00428 $row['_MP_PARAM'] = $mount_info['MPvar']; 00429 00430 if ($mount_info['overlay']) { // Overlays should already have their full MPvars calculated: 00431 $MP = $this->tmpl->getFromMPmap($mount_info['mount_pid']); 00432 if ($MP) unset($row['_MP_PARAM']); 00433 } 00434 00435 } 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! 00436 } else { 00437 $row = $loadDB->results['pages'][$val['id']]; 00438 } 00439 00440 // Add external MP params, then the row: 00441 if (is_array($row)) { 00442 if ($MP) $row['_MP_PARAM'] = $MP.($row['_MP_PARAM'] ? ','.$row['_MP_PARAM'] : ''); 00443 $temp[] = $this->sys_page->getPageOverlay($row); 00444 } 00445 } 00446 break; 00447 case 'updated': 00448 if ($value=='') { 00449 $value=$GLOBALS['TSFE']->page['uid']; 00450 } 00451 $items=t3lib_div::intExplode(',',$value); 00452 if (t3lib_div::testInt($this->conf['special.']['depth'])) { 00453 $depth = t3lib_div::intInRange($this->conf['special.']['depth'],1,20); // Tree depth 00454 } else { 00455 $depth=20; 00456 } 00457 $limit = t3lib_div::intInRange($this->conf['special.']['limit'],0,100); // max number of items 00458 $maxAge = intval(tslib_cObj::calc($this->conf['special.']['maxAge'])); 00459 if (!$limit) $limit=10; 00460 $mode = $this->conf['special.']['mode']; // *'auto', 'manual', 'tstamp' 00461 // Get id's 00462 $id_list_arr = Array(); 00463 00464 foreach($items as $id) { 00465 $bA = t3lib_div::intInRange($this->conf['special.']['beginAtLevel'],0,100); 00466 $id_list_arr[] = tslib_cObj::getTreeList(-1*$id,$depth-1+$bA,$bA-1); 00467 } 00468 $id_list = implode(',',$id_list_arr); 00469 // Get sortField (mode) 00470 switch($mode) { 00471 case 'starttime': 00472 $sortField = 'starttime'; 00473 break; 00474 case 'lastUpdated': 00475 case 'manual': 00476 $sortField = 'lastUpdated'; 00477 break; 00478 case 'tstamp': 00479 $sortField = 'tstamp'; 00480 break; 00481 case 'crdate': 00482 $sortField = 'crdate'; 00483 break; 00484 default: 00485 $sortField = 'SYS_LASTCHANGED'; 00486 break; 00487 } 00488 // Get 00489 $extraWhere = ' AND pages.nav_hide=0'.$this->getDoktypeExcludeWhere(); 00490 00491 if ($this->conf['special.']['excludeNoSearchPages']) { 00492 $extraWhere.= ' AND pages.no_search=0'; 00493 } 00494 if ($maxAge>0) { 00495 $extraWhere.=' AND '.$sortField.'>'.($GLOBALS['SIM_EXEC_TIME']-$maxAge); 00496 } 00497 00498 $res = $GLOBALS['TSFE']->cObj->exec_getQuery('pages',Array('pidInList'=>'0', 'uidInList'=>$id_list, 'where'=>$sortField.'>=0'.$extraWhere, 'orderBy'=>($altSortFieldValue ? $altSortFieldValue : $sortField.' desc'),'max'=>$limit)); 00499 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00500 $temp[$row['uid']]=$this->sys_page->getPageOverlay($row); 00501 } 00502 break; 00503 case 'keywords': 00504 list($value)=t3lib_div::intExplode(',',$value); 00505 if (!$value) { 00506 $value=$GLOBALS['TSFE']->page['uid']; 00507 } 00508 if ($this->conf['special.']['setKeywords'] || $this->conf['special.']['setKeywords.']) { 00509 $kw = $this->parent_cObj->stdWrap($this->conf['special.']['setKeywords'], $this->conf['special.']['setKeywords.']); 00510 } else { 00511 $value_rec=$this->sys_page->getPage($value); // The page record of the 'value'. 00512 00513 $kfieldSrc = $this->conf['special.']['keywordsField.']['sourceField'] ? $this->conf['special.']['keywordsField.']['sourceField'] : 'keywords'; 00514 $kw = trim(tslib_cObj::keywords($value_rec[$kfieldSrc])); // keywords. 00515 } 00516 00517 $mode = $this->conf['special.']['mode']; // *'auto', 'manual', 'tstamp' 00518 switch($mode) { 00519 case 'starttime': 00520 $sortField = 'starttime'; 00521 break; 00522 case 'lastUpdated': 00523 case 'manual': 00524 $sortField = 'lastUpdated'; 00525 break; 00526 case 'tstamp': 00527 $sortField = 'tstamp'; 00528 break; 00529 case 'crdate': 00530 $sortField = 'crdate'; 00531 break; 00532 default: 00533 $sortField = 'SYS_LASTCHANGED'; 00534 break; 00535 } 00536 00537 // depth, limit, extra where 00538 if (t3lib_div::testInt($this->conf['special.']['depth'])) { 00539 $depth = t3lib_div::intInRange($this->conf['special.']['depth'],0,20); // Tree depth 00540 } else { 00541 $depth=20; 00542 } 00543 $limit = t3lib_div::intInRange($this->conf['special.']['limit'],0,100); // max number of items 00544 $extraWhere = ' AND pages.uid!='.$value.' AND pages.nav_hide=0'.$this->getDoktypeExcludeWhere(); 00545 if ($this->conf['special.']['excludeNoSearchPages']) { 00546 $extraWhere.= ' AND pages.no_search=0'; 00547 } 00548 // start point 00549 $eLevel = tslib_cObj::getKey (intval($this->conf['special.']['entryLevel']),$this->tmpl->rootLine); 00550 $startUid = intval($this->tmpl->rootLine[$eLevel]['uid']); 00551 00552 // which field is for keywords 00553 $kfield = 'keywords'; 00554 if ( $this->conf['special.']['keywordsField'] ) { 00555 list($kfield) = explode(' ',trim ($this->conf['special.']['keywordsField'])); 00556 } 00557 00558 // If there are keywords and the startuid is present. 00559 if ($kw && $startUid) { 00560 $bA = t3lib_div::intInRange($this->conf['special.']['beginAtLevel'],0,100); 00561 $id_list=tslib_cObj::getTreeList(-1*$startUid,$depth-1+$bA,$bA-1); 00562 00563 $kwArr = explode(',',$kw); 00564 foreach($kwArr as $word) { 00565 $word = trim($word); 00566 if ($word) { 00567 $keyWordsWhereArr[] = $kfield.' LIKE "%'.$GLOBALS['TYPO3_DB']->quoteStr($word, 'pages').'%"'; 00568 } 00569 } 00570 $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)); 00571 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00572 $temp[$row['uid']]=$this->sys_page->getPageOverlay($row); 00573 } 00574 } 00575 break; 00576 case 'rootline': 00577 $begin_end = explode('|',$this->conf['special.']['range']); 00578 if (!t3lib_div::testInt($begin_end[0])) {intval($begin_end[0]);} 00579 if (!t3lib_div::testInt($begin_end[1])) {$begin_end[1]=-1;} 00580 00581 $beginKey = tslib_cObj::getKey ($begin_end[0],$this->tmpl->rootLine); 00582 $endKey = tslib_cObj::getKey ($begin_end[1],$this->tmpl->rootLine); 00583 if ($endKey<$beginKey) {$endKey=$beginKey;} 00584 00585 $rl_MParray = array(); 00586 foreach($this->tmpl->rootLine as $k_rl => $v_rl) { 00587 // For overlaid mount points, set the variable right now: 00588 if ($v_rl['_MP_PARAM'] && $v_rl['_MOUNT_OL']) { 00589 $rl_MParray[] = $v_rl['_MP_PARAM']; 00590 } 00591 // Traverse rootline: 00592 if ($k_rl>=$beginKey && $k_rl<=$endKey) { 00593 $temp_key=$k_rl; 00594 $temp[$temp_key]=$this->sys_page->getPage($v_rl['uid']); 00595 if (count($temp[$temp_key])) { 00596 if (!$temp[$temp_key]['target']) { // If there are no specific target for the page, put the level specific target on. 00597 $temp[$temp_key]['target'] = $this->conf['special.']['targets.'][$k_rl]; 00598 $temp[$temp_key]['_MP_PARAM'] = implode(',',$rl_MParray); 00599 } 00600 } else unset($temp[$temp_key]); 00601 } 00602 // For normal mount points, set the variable for next level. 00603 if ($v_rl['_MP_PARAM'] && !$v_rl['_MOUNT_OL']) { 00604 $rl_MParray[] = $v_rl['_MP_PARAM']; 00605 } 00606 } 00607 break; 00608 case 'browse': 00609 list($value)=t3lib_div::intExplode(',',$value); 00610 if (!$value) { 00611 $value=$GLOBALS['TSFE']->page['uid']; 00612 } 00613 if ($value!=$this->tmpl->rootLine[0]['uid']) { // Will not work out of rootline 00614 $recArr=array(); 00615 $value_rec=$this->sys_page->getPage($value); // The page record of the 'value'. 00616 if ($value_rec['pid']) { // 'up' page cannot be outside rootline 00617 $recArr['up']=$this->sys_page->getPage($value_rec['pid']); // The page record of 'up'. 00618 } 00619 if ($recArr['up']['pid'] && $value_rec['pid']!=$this->tmpl->rootLine[0]['uid']) { // If the 'up' item was NOT level 0 in rootline... 00620 $recArr['index']=$this->sys_page->getPage($recArr['up']['pid']); // The page record of "index". 00621 } 00622 00623 // prev / next is found 00624 $prevnext_menu = $this->sys_page->getMenu($value_rec['pid'],'*',$altSortField); 00625 $lastKey=0; 00626 $nextActive=0; 00627 reset($prevnext_menu); 00628 while(list($k_b,$v_b)=each($prevnext_menu)) { 00629 if ($nextActive) { 00630 $recArr['next']=$v_b; 00631 $nextActive=0; 00632 } 00633 if ($v_b['uid']==$value) { 00634 if ($lastKey) { 00635 $recArr['prev']=$prevnext_menu[$lastKey]; 00636 } 00637 $nextActive=1; 00638 } 00639 $lastKey=$k_b; 00640 } 00641 reset($prevnext_menu); 00642 $recArr['first']=pos($prevnext_menu); 00643 end($prevnext_menu); 00644 $recArr['last']=pos($prevnext_menu); 00645 00646 // prevsection / nextsection is found 00647 if (is_array($recArr['index'])) { // You can only do this, if there is a valid page two levels up! 00648 $prevnextsection_menu = $this->sys_page->getMenu($recArr['index']['uid'],'*',$altSortField); 00649 $lastKey=0; 00650 $nextActive=0; 00651 reset($prevnextsection_menu); 00652 while(list($k_b,$v_b)=each($prevnextsection_menu)) { 00653 if ($nextActive) { 00654 $sectionRec_temp = $this->sys_page->getMenu($v_b['uid'],'*',$altSortField); 00655 if (count($sectionRec_temp)) { 00656 reset($sectionRec_temp); 00657 $recArr['nextsection']=pos($sectionRec_temp); 00658 end ($sectionRec_temp); 00659 $recArr['nextsection_last']=pos($sectionRec_temp); 00660 $nextActive=0; 00661 } 00662 } 00663 if ($v_b['uid']==$value_rec['pid']) { 00664 if ($lastKey) { 00665 $sectionRec_temp = $this->sys_page->getMenu($prevnextsection_menu[$lastKey]['uid'],'*',$altSortField); 00666 if (count($sectionRec_temp)) { 00667 reset($sectionRec_temp); 00668 $recArr['prevsection']=pos($sectionRec_temp); 00669 end ($sectionRec_temp); 00670 $recArr['prevsection_last']=pos($sectionRec_temp); 00671 } 00672 } 00673 $nextActive=1; 00674 } 00675 $lastKey=$k_b; 00676 } 00677 } 00678 if ($this->conf['special.']['items.']['prevnextToSection']) { 00679 if (!is_array($recArr['prev']) && is_array($recArr['prevsection_last'])) { 00680 $recArr['prev']=$recArr['prevsection_last']; 00681 } 00682 if (!is_array($recArr['next']) && is_array($recArr['nextsection'])) { 00683 $recArr['next']=$recArr['nextsection']; 00684 } 00685 } 00686 00687 $items = explode('|',$this->conf['special.']['items']); 00688 $c=0; 00689 while(list($k_b,$v_b)=each($items)) { 00690 $v_b=strtolower(trim($v_b)); 00691 if (intval($this->conf['special.'][$v_b.'.']['uid'])) { 00692 $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 00693 } 00694 if (is_array($recArr[$v_b])) { 00695 $temp[$c]=$recArr[$v_b]; 00696 if ($this->conf['special.'][$v_b.'.']['target']) { 00697 $temp[$c]['target']=$this->conf['special.'][$v_b.'.']['target']; 00698 } 00699 if (is_array($this->conf['special.'][$v_b.'.']['fields.'])) { 00700 reset($this->conf['special.'][$v_b.'.']['fields.']); 00701 while(list($fk,$val)=each($this->conf['special.'][$v_b.'.']['fields.'])) { 00702 $temp[$c][$fk]=$val; 00703 } 00704 } 00705 $c++; 00706 } 00707 } 00708 } 00709 break; 00710 } 00711 } elseif (is_array($this->alternativeMenuTempArray)) { // Setting $temp array if not level 1. 00712 $temp = $this->alternativeMenuTempArray; 00713 } elseif ($this->mconf['sectionIndex']) { 00714 if ($GLOBALS['TSFE']->sys_language_uid && count($this->sys_page->getPageOverlay($this->id))) { 00715 $sys_language_uid = intval($GLOBALS['TSFE']->sys_language_uid); 00716 } else $sys_language_uid=0; 00717 00718 $selectSetup = Array( 00719 'pidInList'=>$this->id, 00720 'orderBy'=>$altSortField, 00721 'where' => 'colPos=0 AND sys_language_uid='.$sys_language_uid, 00722 'andWhere' => 'sectionIndex!=0' 00723 ); 00724 switch($this->mconf['sectionIndex.']['type']) { 00725 case 'all': 00726 unset($selectSetup['andWhere']); 00727 break; 00728 case 'header': 00729 $selectSetup['andWhere']='header_layout!=100 AND header!=""'; 00730 break; 00731 } 00732 $basePageRow=$this->sys_page->getPage($this->id); 00733 if (is_array($basePageRow)) { 00734 $res = $GLOBALS['TSFE']->cObj->exec_getQuery('tt_content', $selectSetup); 00735 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00736 $temp[$row['uid']]=$basePageRow; 00737 $temp[$row['uid']]['title']=$row['header']; 00738 $temp[$row['uid']]['subtitle']=$row['subheader']; 00739 $temp[$row['uid']]['starttime']=$row['starttime']; 00740 $temp[$row['uid']]['endtime']=$row['endtime']; 00741 $temp[$row['uid']]['fe_group']=$row['fe_group']; 00742 $temp[$row['uid']]['media']=$row['media']; 00743 00744 $temp[$row['uid']]['header_layout']=$row['header_layout']; 00745 $temp[$row['uid']]['bodytext']=$row['bodytext']; 00746 $temp[$row['uid']]['image']=$row['image']; 00747 00748 $temp[$row['uid']]['sectionIndex_uid']=$row['uid']; 00749 } 00750 } 00751 } else { // Default: 00752 $temp = $this->sys_page->getMenu($this->id,'*',$altSortField); // gets the menu 00753 } 00754 00755 $c=0; 00756 $c_b=0; 00757 $minItems = intval($this->mconf['minItems'] ? $this->mconf['minItems'] : $this->conf['minItems']); 00758 $maxItems = intval($this->mconf['maxItems'] ? $this->mconf['maxItems'] : $this->conf['maxItems']); 00759 $begin = tslib_cObj::calc($this->mconf['begin'] ? $this->mconf['begin'] : $this->conf['begin']); 00760 00761 $banUidArray=array(); 00762 if (trim($this->conf['excludeUidList'])) { 00763 $banUidArray = t3lib_div::intExplode(',', $this->conf['excludeUidList']); 00764 } 00765 00766 // Fill in the menuArr with elements that should go into the menu: 00767 $this->menuArr = Array(); 00768 foreach($temp as $data) { 00769 $spacer = (t3lib_div::inList($this->spacerIDList,$data['doktype']) || !strcmp($data['ITEM_STATE'],'SPC')) ? 1 : 0; // if item is a spacer, $spacer is set 00770 if ($this->filterMenuPages($data, $banUidArray, $spacer)) { 00771 $c_b++; 00772 if ($begin<=$c_b) { // If the beginning item has been reached. 00773 $this->menuArr[$c] = $data; 00774 $this->menuArr[$c]['isSpacer'] = $spacer; 00775 $c++; 00776 if ($maxItems && $c>=$maxItems) { 00777 break; 00778 } 00779 } 00780 } 00781 } 00782 00783 // Fill in fake items, if min-items is set. 00784 if ($minItems) { 00785 while($c<$minItems) { 00786 $this->menuArr[$c] = Array( 00787 'title' => '...', 00788 'uid' => $GLOBALS['TSFE']->id 00789 ); 00790 $c++; 00791 } 00792 } 00793 // Setting number of menu items 00794 $GLOBALS['TSFE']->register['count_menuItems'] = count($this->menuArr); 00795 // Passing the menuArr through a user defined function: 00796 if ($this->mconf['itemArrayProcFunc']) { 00797 if (!is_array($this->parentMenuArr)) {$this->parentMenuArr=array();} 00798 $this->menuArr = $this->userProcess('itemArrayProcFunc',$this->menuArr); 00799 } 00800 $this->hash = md5(serialize($this->menuArr).serialize($this->mconf).serialize($this->tmpl->rootLine).serialize($this->MP_array)); 00801 00802 $serData = $this->sys_page->getHash($this->hash, 60*60*24); 00803 if (!$serData) { 00804 $this->generate(); 00805 $this->sys_page->storeHash($this->hash, serialize($this->result),'MENUDATA'); 00806 } else { 00807 $this->result=unserialize($serData); 00808 } 00809 } 00810 } 00811 00822 function includeMakeMenu($conf,$altSortField) { 00823 $incFile = $GLOBALS['TSFE']->tmpl->getFileName($conf['file']); 00824 if ($incFile && $GLOBALS['TSFE']->checkFileInclude($incFile)) { 00825 include($incFile); 00826 } 00827 return is_array($menuItemsArray) ? $menuItemsArray : array(); 00828 } 00829 00838 function filterMenuPages(&$data,$banUidArray,$spacer) { 00839 00840 if ($data['_SAFE']) return TRUE; 00841 00842 $uid = $data['uid']; 00843 if ($this->mconf['SPC'] || !$spacer) { // If the spacer-function is not enabled, spacers will not enter the $menuArr 00844 if (!t3lib_div::inList($this->doktypeExcludeList,$data['doktype'])) { // Page may not be 'not_in_menu' or 'Backend User Section' 00845 if (!$data['nav_hide']) { // Not hidden in navigation 00846 if (!t3lib_div::inArray($banUidArray,$uid)) { // not in banned uid's 00847 00848 // Checks if the default language version can be shown: 00849 // Block page is set, if l18n_cfg allows plus: 1) Either default language or 2) another language but NO overlay record set for page! 00850 $blockPage = $data['l18n_cfg']&1 && (!$GLOBALS['TSFE']->sys_language_uid || ($GLOBALS['TSFE']->sys_language_uid && !$data['_PAGES_OVERLAY'])); 00851 if (!$blockPage) { 00852 00853 // Checking if a page should be shown in the menu depending on whether a translation exists: 00854 $tok = TRUE; 00855 if ($GLOBALS['TSFE']->sys_language_uid && $data['l18n_cfg']&2) { // There is an alternative language active AND the current page requires a translation: 00856 if (!$data['_PAGES_OVERLAY']) { 00857 $tok = FALSE; 00858 } 00859 } 00860 00861 // Continue if token is true: 00862 if ($tok) { 00863 00864 // Checking if "&L" should be modified so links to non-accessible pages will not happen. 00865 if ($this->conf['protectLvar']) { 00866 $Lvar = intval(t3lib_div::_GP('L')); 00867 if (($this->conf['protectLvar']=='all' || $data['l18n_cfg']&2) && $Lvar!=$GLOBALS['TSFE']->sys_language_uid) { // page cannot be access in locaization and Lvar is different than sys_language uid - this means we must check! 00868 $olRec = $GLOBALS['TSFE']->sys_page->getPageOverlay($data['uid'], $Lvar); 00869 if (!count($olRec)) { 00870 // 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" 00871 $data['_ADD_GETVARS'].= '&L=0'; 00872 } 00873 } 00874 } 00875 00876 return TRUE; 00877 } 00878 } 00879 } 00880 } 00881 } 00882 } 00883 } 00884 00894 function procesItemStates($splitCount) { 00895 00896 // Prepare normal settings 00897 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. 00898 $NOconf = $this->tmpl->splitConfArray($this->mconf['NO.'],$splitCount); 00899 00900 // Prepare rollOver settings, overriding normal settings 00901 $ROconf=array(); 00902 if ($this->mconf['RO']) { 00903 $ROconf = $this->tmpl->splitConfArray($this->mconf['RO.'],$splitCount); 00904 } 00905 00906 // Prepare IFSUB settings, overriding normal settings 00907 // IFSUB is true if there exist submenu items to the current item 00908 if ($this->mconf['IFSUB']) { 00909 $IFSUBinit = 0; // Flag: If $IFSUB is generated 00910 reset($NOconf); 00911 while (list($key,$val)=each($NOconf)) { 00912 if ($this->isItemState('IFSUB',$key)) { 00913 if (!$IFSUBinit) { // if this is the first IFSUB element, we must generate IFSUB. 00914 $IFSUBconf = $this->tmpl->splitConfArray($this->mconf['IFSUB.'],$splitCount); 00915 if ($this->mconf['IFSUBRO']) { 00916 $IFSUBROconf = $this->tmpl->splitConfArray($this->mconf['IFSUBRO.'],$splitCount); 00917 } 00918 $IFSUBinit = 1; 00919 } 00920 $NOconf[$key] = $IFSUBconf[$key]; // Substitute normal with ifsub 00921 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 00922 $ROconf[$key] = $IFSUBROconf[$key] ? $IFSUBROconf[$key] : $IFSUBconf[$key]; // If RollOver on active then apply this 00923 } 00924 } 00925 } 00926 } 00927 // Prepare active settings, overriding normal settings 00928 if ($this->mconf['ACT']) { 00929 $ACTinit = 0; // Flag: If $ACT is generated 00930 reset($NOconf); 00931 while (list($key,$val)=each($NOconf)) { // Find active 00932 if ($this->isItemState('ACT',$key)) { 00933 if (!$ACTinit) { // if this is the first active, we must generate ACT. 00934 $ACTconf = $this->tmpl->splitConfArray($this->mconf['ACT.'],$splitCount); 00935 // Prepare active rollOver settings, overriding normal active settings 00936 if ($this->mconf['ACTRO']) { 00937 $ACTROconf = $this->tmpl->splitConfArray($this->mconf['ACTRO.'],$splitCount); 00938 } 00939 $ACTinit = 1; 00940 } 00941 $NOconf[$key] = $ACTconf[$key]; // Substitute normal with active 00942 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 00943 $ROconf[$key] = $ACTROconf[$key] ? $ACTROconf[$key] : $ACTconf[$key]; // If RollOver on active then apply this 00944 } 00945 } 00946 } 00947 } 00948 // Prepare active/IFSUB settings, overriding normal settings 00949 // ACTIFSUB is true if there exist submenu items to the current item and the current item is active 00950 if ($this->mconf['ACTIFSUB']) { 00951 $ACTIFSUBinit = 0; // Flag: If $ACTIFSUB is generated 00952 reset($NOconf); 00953 while (list($key,$val)=each($NOconf)) { // Find active 00954 if ($this->isItemState('ACTIFSUB',$key)) { 00955 if (!$ACTIFSUBinit) { // if this is the first active, we must generate ACTIFSUB. 00956 $ACTIFSUBconf = $this->tmpl->splitConfArray($this->mconf['ACTIFSUB.'],$splitCount); 00957 // Prepare active rollOver settings, overriding normal active settings 00958 if ($this->mconf['ACTIFSUBRO']) { 00959 $ACTIFSUBROconf = $this->tmpl->splitConfArray($this->mconf['ACTIFSUBRO.'],$splitCount); 00960 } 00961 $ACTIFSUBinit = 1; 00962 } 00963 $NOconf[$key] = $ACTIFSUBconf[$key]; // Substitute normal with active 00964 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 00965 $ROconf[$key] = $ACTIFSUBROconf[$key] ? $ACTIFSUBROconf[$key] : $ACTIFSUBconf[$key]; // If RollOver on active then apply this 00966 } 00967 } 00968 } 00969 } 00970 // Prepare CUR (current) settings, overriding normal settings 00971 // CUR is true if the current page equals the item here! 00972 if ($this->mconf['CUR']) { 00973 $CURinit = 0; // Flag: If $CUR is generated 00974 reset($NOconf); 00975 while (list($key,$val)=each($NOconf)) { 00976 if ($this->isItemState('CUR',$key)) { 00977 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) 00978 $CURconf = $this->tmpl->splitConfArray($this->mconf['CUR.'],$splitCount); 00979 if ($this->mconf['CURRO']) { 00980 $CURROconf = $this->tmpl->splitConfArray($this->mconf['CURRO.'],$splitCount); 00981 } 00982 $CURinit = 1; 00983 } 00984 $NOconf[$key] = $CURconf[$key]; // Substitute normal with current 00985 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 00986 $ROconf[$key] = $CURROconf[$key] ? $CURROconf[$key] : $CURconf[$key]; // If RollOver on active then apply this 00987 } 00988 } 00989 } 00990 } 00991 // Prepare active settings, overriding normal settings 00992 if ($this->mconf['USR']) { 00993 $USRinit = 0; // Flag: If $USR is generated 00994 reset($NOconf); 00995 while (list($key,$val)=each($NOconf)) { // Find active 00996 if ($this->isItemState('USR',$key)) { 00997 if (!$USRinit) { // if this is the first active, we must generate USR. 00998 $USRconf = $this->tmpl->splitConfArray($this->mconf['USR.'],$splitCount); 00999 // Prepare active rollOver settings, overriding normal active settings 01000 if ($this->mconf['USRRO']) { 01001 $USRROconf = $this->tmpl->splitConfArray($this->mconf['USRRO.'],$splitCount); 01002 } 01003 $USRinit = 1; 01004 } 01005 $NOconf[$key] = $USRconf[$key]; // Substitute normal with active 01006 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 01007 $ROconf[$key] = $USRROconf[$key] ? $USRROconf[$key] : $USRconf[$key]; // If RollOver on active then apply this 01008 } 01009 } 01010 } 01011 } 01012 // Prepare spacer settings, overriding normal settings 01013 if ($this->mconf['SPC']) { 01014 $SPCinit = 0; // Flag: If $SPC is generated 01015 reset($NOconf); 01016 while (list($key,$val)=each($NOconf)) { // Find spacers 01017 if ($this->isItemState('SPC',$key)) { 01018 if (!$SPCinit) { // if this is the first spacer, we must generate SPC. 01019 $SPCconf = $this->tmpl->splitConfArray($this->mconf['SPC.'],$splitCount); 01020 $SPCinit = 1; 01021 } 01022 $NOconf[$key] = $SPCconf[$key]; // Substitute normal with spacer 01023 } 01024 } 01025 } 01026 // Prepare Userdefined settings 01027 if ($this->mconf['USERDEF1']) { 01028 $USERDEF1init = 0; // Flag: If $USERDEF1 is generated 01029 reset($NOconf); 01030 while (list($key,$val)=each($NOconf)) { // Find active 01031 if ($this->isItemState('USERDEF1',$key)) { 01032 if (!$USERDEF1init) { // if this is the first active, we must generate USERDEF1. 01033 $USERDEF1conf = $this->tmpl->splitConfArray($this->mconf['USERDEF1.'],$splitCount); 01034 // Prepare active rollOver settings, overriding normal active settings 01035 if ($this->mconf['USERDEF1RO']) { 01036 $USERDEF1ROconf = $this->tmpl->splitConfArray($this->mconf['USERDEF1RO.'],$splitCount); 01037 } 01038 $USERDEF1init = 1; 01039 } 01040 $NOconf[$key] = $USERDEF1conf[$key]; // Substitute normal with active 01041 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 01042 $ROconf[$key] = $USERDEF1ROconf[$key] ? $USERDEF1ROconf[$key] : $USERDEF1conf[$key]; // If RollOver on active then apply this 01043 } 01044 } 01045 } 01046 } 01047 // Prepare Userdefined settings 01048 if ($this->mconf['USERDEF2']) { 01049 $USERDEF2init = 0; // Flag: If $USERDEF2 is generated 01050 reset($NOconf); 01051 while (list($key,$val)=each($NOconf)) { // Find active 01052 if ($this->isItemState('USERDEF2',$key)) { 01053 if (!$USERDEF2init) { // if this is the first active, we must generate USERDEF2. 01054 $USERDEF2conf = $this->tmpl->splitConfArray($this->mconf['USERDEF2.'],$splitCount); 01055 // Prepare active rollOver settings, overriding normal active settings 01056 if ($this->mconf['USERDEF2RO']) { 01057 $USERDEF2ROconf = $this->tmpl->splitConfArray($this->mconf['USERDEF2RO.'],$splitCount); 01058 } 01059 $USERDEF2init = 1; 01060 } 01061 $NOconf[$key] = $USERDEF2conf[$key]; // Substitute normal with active 01062 if ($ROconf) { // If rollOver on normal, we must apply a state for rollOver on the active 01063 $ROconf[$key] = $USERDEF2ROconf[$key] ? $USERDEF2ROconf[$key] : $USERDEF2conf[$key]; // If RollOver on active then apply this 01064 } 01065 } 01066 } 01067 } 01068 01069 return array($NOconf,$ROconf); 01070 } 01071 01082 function link($key,$altTarget='',$typeOverride='') { 01083 01084 // Mount points: 01085 $MP_var = $this->getMPvar($key); 01086 $MP_params = $MP_var ? '&MP='.rawurlencode($MP_var) : ''; 01087 01088 // Setting override ID 01089 if ($this->mconf['overrideId'] || $this->menuArr[$key]['overrideId']) { 01090 $overrideArray = array(); 01091 // If a user script returned the value overrideId in the menu array we use that as page id 01092 $overrideArray['uid'] = $this->mconf['overrideId']?$this->mconf['overrideId']:$this->menuArr[$key]['overrideId']; 01093 $overrideArray['alias'] = ''; 01094 $MP_params = ''; // clear MP parameters since ID was changed. 01095 } else { 01096 $overrideArray=''; 01097 } 01098 01099 // Setting main target: 01100 $mainTarget = $altTarget ? $altTarget : $this->mconf['target']; 01101 01102 // Creating link: 01103 if ($this->mconf['collapse'] && $this->isActive($this->menuArr[$key]['uid'], $this->getMPvar($key))) { 01104 $thePage = $this->sys_page->getPage($this->menuArr[$key]['pid']); 01105 $LD = $this->tmpl->linkData($thePage,$mainTarget,'','',$overrideArray, $this->mconf['addParams'].$MP_params.$this->menuArr[$key]['_ADD_GETVARS'], $typeOverride); 01106 } else { 01107 $LD = $this->tmpl->linkData($this->menuArr[$key],$mainTarget,'','',$overrideArray, $this->mconf['addParams'].$MP_params.$this->menuArr[$key]['_ADD_GETVARS'], $typeOverride); 01108 } 01109 01110 // Overriding URL / Target if set to do so: 01111 if ($this->menuArr[$key]['_OVERRIDE_HREF']) { 01112 $LD['totalURL'] = $this->menuArr[$key]['_OVERRIDE_HREF']; 01113 if ($this->menuArr[$key]['_OVERRIDE_TARGET']) $LD['target'] = $this->menuArr[$key]['_OVERRIDE_TARGET']; 01114 } 01115 01116 // OnClick open in windows. 01117 $onClick=''; 01118 if ($this->mconf['JSWindow']) { 01119 $conf=$this->mconf['JSWindow.']; 01120 $url=$LD['totalURL']; 01121 $LD['totalURL'] = '#'; 01122 $onClick= 'openPic(\''.$GLOBALS['TSFE']->baseUrlWrap($url).'\',\''.($conf['newWindow']?md5($url):'theNewPage').'\',\''.$conf['params'].'\'); return false;'; 01123 $GLOBALS['TSFE']->setJS('openPic'); 01124 } 01125 01126 // out: 01127 $list = array(); 01128 $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. 01129 $list['TARGET'] = $LD['target']; 01130 $list['onClick'] = $onClick; 01131 01132 return $list; 01133 } 01134 01142 function subMenu($uid) { 01143 01144 // Setting alternative menu item array if _SUB_MENU has been defined in the current ->menuArr 01145 $altArray = ''; 01146 if (is_array($this->menuArr[$this->I['key']]['_SUB_MENU']) && count($this->menuArr[$this->I['key']]['_SUB_MENU'])) { 01147 $altArray = $this->menuArr[$this->I['key']]['_SUB_MENU']; 01148 } 01149 01150 // Make submenu if the page is the next active 01151 if ($this->subLevelClass && ($this->mconf['expAll'] || $this->isNext($uid, $this->getMPvar($this->I['key'])) || is_array($altArray)) && !$this->mconf['sectionIndex']) { 01152 $submenu = t3lib_div::makeInstance('tslib_'.$this->subLevelClass); 01153 $submenu->entryLevel = $this->entryLevel+1; 01154 $submenu->rL_uidRegister = $this->rL_uidRegister; 01155 $submenu->MP_array = $this->MP_array; 01156 if ($this->menuArr[$this->I['key']]['_MP_PARAM']) { 01157 $submenu->MP_array[] = $this->menuArr[$this->I['key']]['_MP_PARAM']; 01158 } 01159 01160 // especially scripts that build the submenu needs the parent data 01161 $submenu->parentMenuArr = $this->menuArr; 01162 01163 // Setting alternativeMenuTempArray (will be effective only if an array) 01164 if (is_array($altArray)) { 01165 $submenu->alternativeMenuTempArray = $altArray; 01166 } 01167 01168 if ($submenu->start($this->tmpl, $this->sys_page, $uid, $this->conf, $this->menuNumber+1)) { 01169 $submenu->makeMenu(); 01170 return $submenu->writeMenu(); 01171 } 01172 } 01173 } 01174 01184 function isNext($uid, $MPvar='') { 01185 01186 // Check for always active PIDs: 01187 if (count($this->alwaysActivePIDlist) && in_array($uid,$this->alwaysActivePIDlist)) { 01188 return TRUE; 01189 } 01190 01191 $testUid = $uid.($MPvar?':'.$MPvar:''); 01192 if ($uid && $testUid==$this->nextActive) { 01193 return TRUE; 01194 } 01195 } 01196 01205 function isActive($uid, $MPvar='') { 01206 01207 // Check for always active PIDs: 01208 if (count($this->alwaysActivePIDlist) && in_array($uid,$this->alwaysActivePIDlist)) { 01209 return TRUE; 01210 } 01211 01212 $testUid = $uid.($MPvar?':'.$MPvar:''); 01213 if ($uid && in_array('ITEM:'.$testUid, $this->rL_uidRegister)) { 01214 return TRUE; 01215 } 01216 } 01217 01226 function isCurrent($uid, $MPvar='') { 01227 $testUid = $uid.($MPvar?':'.$MPvar:''); 01228 if ($uid && !strcmp(end($this->rL_uidRegister),'ITEM:'.$testUid)) { 01229 return TRUE; 01230 } 01231 } 01232 01241 function isSubMenu($uid) { 01242 01243 // 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; 01244 $mount_info = $this->sys_page->getMountPointInfo($uid); 01245 if (is_array($mount_info)) { 01246 $uid = $mount_info['mount_pid']; 01247 } 01248 01249 $recs = $this->sys_page->getMenu($uid,'uid,pid,doktype,mount_pid,mount_pid_ol'); 01250 foreach($recs as $theRec) { 01251 if (!t3lib_div::inList($this->doktypeExcludeList,$theRec['doktype']) && !$theRec['nav_hide']) { // If a menu item seems to be another type than 'Not in menu', then return true (there were items!) 01252 return TRUE; 01253 } 01254 } 01255 } 01256 01266 function isItemState($kind,$key) { 01267 $natVal=0; 01268 if ($this->menuArr[$key]['ITEM_STATE']) { // If any value is set for ITEM_STATE the normal evaluation is discarded 01269 if (!strcmp($this->menuArr[$key]['ITEM_STATE'],$kind)) {$natVal=1;} 01270 } else { 01271 switch($kind) { 01272 case 'SPC': 01273 $natVal = $this->menuArr[$key]['isSpacer']; 01274 break; 01275 case 'IFSUB': 01276 $natVal = $this->isSubMenu($this->menuArr[$key]['uid']); 01277 break; 01278 case 'ACT': 01279 $natVal = $this->isActive($this->menuArr[$key]['uid'], $this->getMPvar($key)); 01280 break; 01281 case 'ACTIFSUB': 01282 $natVal = $this->isActive($this->menuArr[$key]['uid'], $this->getMPvar($key)) && $this->isSubMenu($this->menuArr[$key]['uid']); 01283 break; 01284 case 'CUR': 01285 $natVal = $this->isCurrent($this->menuArr[$key]['uid'], $this->getMPvar($key)); 01286 break; 01287 case 'USR': 01288 $natVal = $this->menuArr[$key]['fe_group']; 01289 break; 01290 } 01291 } 01292 01293 return $natVal; 01294 } 01295 01303 function accessKey($title) { 01304 // The global array ACCESSKEY is used to globally control if letters are already used!! 01305 $result = Array(); 01306 01307 $titleLen = strlen($title); 01308 for ($a=0;$a<$titleLen;$a++) { 01309 $key = strtoupper(trim(substr($title,$a,1))); 01310 if ($key && !isset($GLOBALS['TSFE']->accessKey[$key])) { 01311 $GLOBALS['TSFE']->accessKey[$key]=1; 01312 $result['code'] = ' accesskey="'.$key.'"'; 01313 $result['alt'] = ' (ALT+'.$key.')'; 01314 break; 01315 } 01316 } 01317 return $result; 01318 } 01319 01329 function userProcess($mConfKey,$passVar) { 01330 if ($this->mconf[$mConfKey]) { 01331 $funcConf = $this->mconf[$mConfKey.'.']; 01332 $funcConf['parentObj']=&$this; 01333 $passVar = $GLOBALS['TSFE']->cObj->callUserFunction($this->mconf[$mConfKey], $funcConf, $passVar); 01334 } 01335 return $passVar; 01336 } 01337 01344 function setATagParts() { 01345 $this->I['A1'] = '<a '.t3lib_div::implodeAttributes($this->I['linkHREF'],1).$this->I['val']['ATagParams'].$this->I['addATagParams'].$this->I['accessKey']['code'].'>'; 01346 $this->I['A2'] = '</a>'; 01347 } 01348 01357 function getPageTitle($title,$nav_title) { 01358 return strcmp(trim($nav_title),'') ? $nav_title : $title; 01359 } 01360 01369 function getMPvar($key) { 01370 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['enable_mount_pids']) { 01371 $localMP_array = $this->MP_array; 01372 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! 01373 $MP_params = count($localMP_array) ? implode(',',$localMP_array) : ''; 01374 return $MP_params; 01375 } 01376 } 01377 01384 function getDoktypeExcludeWhere() { 01385 return $this->doktypeExcludeList ? ' AND pages.doktype NOT IN ('.$this->doktypeExcludeList.')' : ''; 01386 } 01387 01388 } 01389 01390 01391 01392 01393 01394 01395 01396 01397 01398 01399 01400 01401 01402 01403 01404 01405 01406 01407 01416 class tslib_tmenu extends tslib_menu { 01417 01425 function generate() { 01426 $splitCount = count($this->menuArr); 01427 if ($splitCount) { 01428 list($NOconf) = $this->procesItemStates($splitCount); 01429 } 01430 if ($this->mconf['debugItemConf']) {echo '<h3>$NOconf:</h3>'; debug($NOconf); } 01431 $this->result = $NOconf; 01432 } 01433 01441 function writeMenu() { 01442 if (is_array($this->result) && count($this->result)) { 01443 $this->WMcObj =t3lib_div::makeInstance('tslib_cObj'); // Create new tslib_cObj for our use 01444 $this->WMresult=''; 01445 $this->INPfixMD5 = substr(md5(microtime().'tmenu'),0,4); 01446 $this->WMmenuItems = count($this->result); 01447 $this->extProc_init(); 01448 reset($this->result); 01449 while (list($key,$val)=each($this->result)) { 01450 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']++; 01451 $GLOBALS['TSFE']->register['count_MENUOBJ']++; 01452 01453 $this->I=array(); 01454 $this->WMcObj->start($this->menuArr[$key],'pages'); // Initialize the cObj with the page record of the menu item 01455 $this->I['key'] = $key; 01456 $this->I['INPfix']= $this->imgNameNotRandom?'':'_'.$this->INPfixMD5.'_'.$key; 01457 $this->I['val'] = $val; 01458 $this->I['title'] = $this->WMcObj->stdWrap($this->getPageTitle($this->menuArr[$key]['title'],$this->menuArr[$key]['nav_title']),$this->I['val']['stdWrap.']); 01459 $this->I['uid'] = $this->menuArr[$key]['uid']; 01460 $this->I['mount_pid'] = $this->menuArr[$key]['mount_pid']; 01461 $this->I['pid'] = $this->menuArr[$key]['pid']; 01462 $this->I['spacer'] = $this->menuArr[$key]['isSpacer']; 01463 01464 // Make link tag 01465 $this->I['val']['ATagParams'] = $this->I['val']['ATagParams'] ? ' '.$this->I['val']['ATagParams'] : ''; 01466 $this->I['linkHREF'] = $this->link($key,$this->I['val']['altTarget'],$this->mconf['forceTypeValue']); 01467 01468 // Title attribute of links: 01469 $titleAttrValue = $this->WMcObj->stdWrap($this->I['val']['ATagTitle'],$this->I['val']['ATagTitle.']); 01470 if (strlen($titleAttrValue)) { 01471 $this->I['linkHREF']['title'] = $titleAttrValue; 01472 } 01473 01474 // Setting "blurlink()" function: 01475 if (!$this->mconf['noBlur']) { 01476 $this->I['linkHREF']['onFocus']='blurLink(this);'; 01477 } 01478 01479 // Make link: 01480 if ($this->I['val']['RO']) { 01481 $this->I['theName'] = $this->imgNamePrefix.$this->I['uid'].$this->I['INPfix']; 01482 $over=''; 01483 $out =''; 01484 if ($this->I['val']['beforeROImg']) { 01485 $over.= $this->WMfreezePrefix."over('".$this->I['theName']."before');"; 01486 $out.= $this->WMfreezePrefix."out('".$this->I['theName']."before');"; 01487 } 01488 if ($this->I['val']['afterROImg']) { 01489 $over.= $this->WMfreezePrefix."over('".$this->I['theName']."after');"; 01490 $out.= $this->WMfreezePrefix."out('".$this->I['theName']."after');"; 01491 } 01492 $this->I['linkHREF']['onMouseover']=$over; 01493 $this->I['linkHREF']['onMouseout']=$out; 01494 if ($over || $out) $GLOBALS['TSFE']->setJS('mouseOver'); 01495 01496 // Change background color: 01497 if ($this->I['val']['RO_chBgColor']) { 01498 $this->addJScolorShiftFunction(); 01499 $chBgP = t3lib_div::trimExplode('|',$this->I['val']['RO_chBgColor']); 01500 $this->I['linkHREF']['onMouseover'].="changeBGcolor('".$chBgP[2].$this->I['uid']."','".$chBgP[0]."');"; 01501 $this->I['linkHREF']['onMouseout'].="changeBGcolor('".$chBgP[2].$this->I['uid']."','".$chBgP[1]."');"; 01502 } 01503 01504 $this->extProc_RO($key); 01505 } 01506 01507 01508 // Calling extra processing function 01509 $this->extProc_beforeLinking($key); 01510 01511 // Compile link tag 01512 if (!$this->I['val']['doNotLinkIt']) {$this->I['val']['doNotLinkIt']=0;} 01513 if (!$this->I['spacer'] && $this->I['val']['doNotLinkIt']!=1) { 01514 $this->setATagParts(); 01515 } else { 01516 $this->I['A1'] = ''; 01517 $this->I['A2'] = ''; 01518 } 01519 01520 // ATAGBeforeWrap processing: 01521 if ($this->I['val']['ATagBeforeWrap']) { 01522 $wrapPartsBefore = explode('|',$this->I['val']['linkWrap']); 01523 $wrapPartsAfter = array('',''); 01524 } else { 01525 $wrapPartsBefore = array('',''); 01526 $wrapPartsAfter = explode('|',$this->I['val']['linkWrap']); 01527 } 01528 if ($this->I['val']['stdWrap2'] || isset($this->I['val']['stdWrap2.'])) { 01529 $wrapPartsStdWrap = explode($this->I['val']['stdWrap2']?$this->I['val']['stdWrap2']:'|',$this->WMcObj->stdWrap('|',$this->I['val']['stdWrap2.'])); 01530 } else {$wrapPartsStdWrap = array('','');} 01531 01532 // Make before, middle and after parts 01533 $this->I['parts'] = array(); 01534 $this->I['parts']['before']=$this->getBeforeAfter('before'); 01535 $this->I['parts']['stdWrap2_begin']=$wrapPartsStdWrap[0]; 01536 if (!$this->I['val']['doNotShowLink']) { 01537 $this->I['parts']['notATagBeforeWrap_begin'] = $wrapPartsAfter[0]; 01538 $this->I['parts']['ATag_begin'] = $this->I['A1']; 01539 $this->I['parts']['ATagBeforeWrap_begin'] = $wrapPartsBefore[0]; 01540 $this->I['parts']['title'] = $this->I['title']; 01541 $this->I['parts']['ATagBeforeWrap_end'] = $wrapPartsBefore[1]; 01542 $this->I['parts']['ATag_end'] = $this->I['A2']; 01543 $this->I['parts']['notATagBeforeWrap_end'] = $wrapPartsAfter[1]; 01544 } 01545 $this->I['parts']['stdWrap2_end']=$wrapPartsStdWrap[1]; 01546 $this->I['parts']['after']=$this->getBeforeAfter('after'); 01547 01548 // Passing I to a user function 01549 if ($this->mconf['IProcFunc']) { 01550 $this->I = $this->userProcess('IProcFunc',$this->I); 01551 } 01552 01553 // Merge parts + beforeAllWrap 01554 $this->I['theItem']= implode('',$this->I['parts']); 01555 $this->I['theItem']= $this->extProc_beforeAllWrap($this->I['theItem'],$key); 01556 01557 // allWrap: 01558 $allWrap = $this->WMcObj->stdWrap($this->I['val']['allWrap'],$this->I['val']['allWrap.']); 01559 $this->I['theItem'] = $this->tmpl->wrap($this->I['theItem'],$allWrap); 01560 01561 if ($this->I['val']['subst_elementUid']) $this->I['theItem'] = str_replace('{elementUid}',$this->I['uid'],$this->I['theItem']); 01562 01563 // allStdWrap: 01564 if (is_array($this->I['val']['allStdWrap.'])) { 01565 $this->I['theItem'] = $this->WMcObj->stdWrap($this->I['theItem'],$this->I['val']['allStdWrap.']); 01566 } 01567 01568 // Calling extra processing function 01569 $this->extProc_afterLinking($key); 01570 } 01571 return $this->extProc_finish(); 01572 } 01573 } 01574 01582 function getBeforeAfter($pref) { 01583 $res = ''; 01584 if ($imgInfo = $this->WMcObj->getImgResource($this->I['val'][$pref.'Img'],$this->I['val'][$pref.'Img.'])) { 01585 $imgInfo[3] = t3lib_div::png_to_gif_by_imagemagick($imgInfo[3]); 01586 if ($this->I['val']['RO'] && $this->I['val'][$pref.'ROImg'] && !$this->I['spacer']) { 01587 $imgROInfo = $this->WMcObj->getImgResource($this->I['val'][$pref.'ROImg'],$this->I['val'][$pref.'ROImg.']); 01588 $imgROInfo[3] = t3lib_div::png_to_gif_by_imagemagick($imgROInfo[3]); 01589 if ($imgROInfo) { 01590 $theName = $this->imgNamePrefix.$this->I['uid'].$this->I['INPfix'].$pref; 01591 $name = ' name="'.$theName.'"'; 01592 $GLOBALS['TSFE']->JSImgCode.= chr(10).$theName.'_n=new Image(); '.$theName.'_n.src = "'.$GLOBALS['TSFE']->absRefPrefix.$imgInfo[3].'"; '; 01593 $GLOBALS['TSFE']->JSImgCode.= chr(10).$theName.'_h=new Image(); '.$theName.'_h.src = "'.$GLOBALS['TSFE']->absRefPrefix.$imgROInfo[3].'"; '; 01594 } 01595 } 01596 $GLOBALS['TSFE']->imagesOnPage[]=$imgInfo[3]; 01597 $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']:'').' border="0"'; 01598 if (!strstr($res,'alt="')) $res.=' alt=""'; // Adding alt attribute if not set. 01599 $res.=' />'; 01600 if ($this->I['val'][$pref.'ImgLink']) {$res=$this->I['A1'].$res.$this->I['A2'];} 01601 } 01602 return $this->tmpl->wrap($res.$this->WMcObj->stdWrap($this->I['val'][$pref],$this->I['val'][$pref.'.']), $this->I['val'][$pref.'Wrap']); 01603 } 01604 01612 function addJScolorShiftFunction() { 01613 $GLOBALS['TSFE']->additionalJavaScript['TMENU:changeBGcolor()']=' 01614 function changeBGcolor(id,color) { // 01615 if (document.getElementById && document.getElementById(id)) { 01616 document.getElementById(id).style.background = color; 01617 return true; 01618 } else if (document.layers && document.layers[id]) { 01619 document.layers[id].bgColor = color; 01620 return true; 01621 } 01622 } 01623 '; 01624 } 01625 01634 function extProc_init() { 01635 } 01636 01645 function extProc_RO($key) { 01646 } 01647 01656 function extProc_beforeLinking($key) { 01657 } 01658 01668 function extProc_afterLinking($key) { 01669 // Add part to the accumulated result + fetch submenus 01670 if (!$this->I['spacer']) { 01671 $this->I['theItem'].= $this->subMenu($this->I['uid']); 01672 } 01673 $this->WMresult.= $this->I['val']['wrapItemAndSub'] ? $this->tmpl->wrap($this->I['theItem'],$this->I['val']['wrapItemAndSub']) : $this->I['theItem']; 01674 } 01675 01685 function extProc_beforeAllWrap($item,$key) { 01686 return $item; 01687 } 01688 01696 function extProc_finish() { 01697 return $this->tmpl->wrap($this->WMresult,$this->mconf['wrap']).$this->WMextraScript; 01698 } 01699 } 01700 01701 01702 01703 01704 01705 01706 01707 01708 01709 01710 01711 01712 01713 01714 01715 01716 01717 01718 01719 01720 01721 01722 01723 01732 class tslib_gmenu extends tslib_menu { 01733 01741 function generate() { 01742 $splitCount = count($this->menuArr); 01743 if ($splitCount) { 01744 list($NOconf,$ROconf) = $this->procesItemStates($splitCount); 01745 01746 //store initial count value 01747 $temp_HMENU_MENUOBJ = $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']; 01748 $temp_MENUOBJ = $GLOBALS['TSFE']->register['count_MENUOBJ']; 01749 // Now we generate the giffiles: 01750 $this->makeGifs($NOconf,'NO'); 01751 // store count from NO obj 01752 $tempcnt_HMENU_MENUOBJ = $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']; 01753 $tempcnt_MENUOBJ = $GLOBALS['TSFE']->register['count_MENUOBJ']; 01754 01755 if ($this->mconf['debugItemConf']) {echo '<h3>$NOconf:</h3>'; debug($NOconf); } 01756 if ($ROconf) { // RollOver 01757 //start recount for rollover with initial values 01758 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']= $temp_HMENU_MENUOBJ; 01759 $GLOBALS['TSFE']->register['count_MENUOBJ']= $temp_MENUOBJ; 01760 $this->makeGifs($ROconf,'RO'); 01761 if ($this->mconf['debugItemConf']) {echo '<h3>$ROconf:</h3>'; debug($ROconf); } 01762 } 01763 // use count from NO obj 01764 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ'] = $tempcnt_HMENU_MENUOBJ; 01765 $GLOBALS['TSFE']->register['count_MENUOBJ'] = $tempcnt_MENUOBJ; 01766 } 01767 } 01768 01779 function makeGifs($conf, $resKey) { 01780 $isGD = $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']; 01781 01782 if (!is_array($conf)) { 01783 $conf = Array(); 01784 } 01785 01786 $totalWH=array(); 01787 $items = count($conf); 01788 if ($isGD) { 01789 // generate the gif-files. the $menuArr is filled with some values like output_w, output_h, output_file 01790 $Hcounter = 0; 01791 $Wcounter = 0; 01792 $Hobjs = $this->mconf['applyTotalH']; 01793 if ($Hobjs) {$Hobjs = t3lib_div::intExplode(',',$Hobjs);} 01794 $Wobjs = $this->mconf['applyTotalW']; 01795 if ($Wobjs) {$Wobjs = t3lib_div::intExplode(',',$Wobjs);} 01796 $minDim = $this->mconf['min']; 01797 if ($minDim) {$minDim = tslib_cObj::calcIntExplode(',',$minDim.',');} 01798 $maxDim = $this->mconf['max']; 01799 if ($maxDim) {$maxDim = tslib_cObj::calcIntExplode(',',$maxDim.',');} 01800 01801 if ($minDim) { 01802 $conf[$items]=$conf[$items-1]; 01803 $this->menuArr[$items]=Array(); 01804 $items = count($conf); 01805 } 01806 01807 // TOTAL width 01808 if ($this->mconf['useLargestItemX'] || $this->mconf['useLargestItemY'] || $this->mconf['distributeX'] || $this->mconf['distributeY']) { 01809 $totalWH = $this->findLargestDims($conf,$items,$Hobjs,$Wobjs,$minDim,$maxDim); 01810 } 01811 } 01812 01813 $c=0; 01814 $maxFlag=0; 01815 $distributeAccu=array('H'=>0,'W'=>0); 01816 reset($conf); 01817 while (list($key,$val)=each($conf)) { 01818 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']++; 01819 $GLOBALS['TSFE']->register['count_MENUOBJ']++; 01820 01821 if ($items==($c+1) && $minDim) { 01822 $Lobjs = $this->mconf['removeObjectsOfDummy']; 01823 if ($Lobjs) { 01824 $Lobjs = t3lib_div::intExplode(',',$Lobjs); 01825 reset($Lobjs); 01826 while(list(,$remItem)=each($Lobjs)) { 01827 unset($val[$remItem]); 01828 unset($val[$remItem.'.']); 01829 } 01830 } 01831 01832 $flag =0; 01833 $tempXY = explode(',',$val['XY']); 01834 if ($Wcounter<$minDim[0]) {$tempXY[0]=$minDim[0]-$Wcounter; $flag=1;} 01835 if ($Hcounter<$minDim[1]) {$tempXY[1]=$minDim[1]-$Hcounter; $flag=1;} 01836 $val['XY'] = implode(',',$tempXY); 01837 if (!$flag){break;} 01838 } 01839 $c++; 01840 01841 01842 if ($isGD) { 01843 // Pre-working the item 01844 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 01845 $gifCreator->init(); 01846 $gifCreator->start($val,$this->menuArr[$key]); 01847 01848 // If useLargestItemH/W is specified 01849 if (count($totalWH) && ($this->mconf['useLargestItemX'] || $this->mconf['useLargestItemY'])) { 01850 $tempXY = explode(',',$gifCreator->setup['XY']); 01851 if ($this->mconf['useLargestItemX']) {$tempXY[0] = max($totalWH['W']);} 01852 if ($this->mconf['useLargestItemY']) {$tempXY[1] = max($totalWH['H']);} 01853 // regenerate the new values... 01854 $val['XY'] = implode(',',$tempXY); 01855 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 01856 $gifCreator->init(); 01857 $gifCreator->start($val,$this->menuArr[$key]); 01858 } 01859 01860 // If distributeH/W is specified 01861 if (count($totalWH) && ($this->mconf['distributeX'] || $this->mconf['distributeY'])) { 01862 $tempXY = explode(',',$gifCreator->setup['XY']); 01863 01864 if ($this->mconf['distributeX']) { 01865 $diff = $this->mconf['distributeX']-$totalWH['W_total']-$distributeAccu['W']; 01866 $compensate = round($diff /($items-$c+1)); 01867 $distributeAccu['W']+=$compensate; 01868 $tempXY[0] = $totalWH['W'][$key]+$compensate; 01869 } 01870 if ($this->mconf['distributeY']) { 01871 $diff = $this->mconf['distributeY']-$totalWH['H_total']-$distributeAccu['H']; 01872 $compensate = round($diff /($items-$c+1)); 01873 $distributeAccu['H']+=$compensate; 01874 $tempXY[1] = $totalWH['H'][$key]+$compensate; 01875 } 01876 // regenerate the new values... 01877 $val['XY'] = implode(',',$tempXY); 01878 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 01879 $gifCreator->init(); 01880 $gifCreator->start($val,$this->menuArr[$key]); 01881 } 01882 01883 // If max dimensions are specified 01884 if ($maxDim) { 01885 $tempXY = explode(',',$val['XY']); 01886 if ($maxDim[0] && $Wcounter+$gifCreator->XY[0]>=$maxDim[0]) {$tempXY[0]==$maxDim[0]-$Wcounter; $maxFlag=1;} 01887 if ($maxDim[1] && $Hcounter+$gifCreator->XY[1]>=$maxDim[1]) {$tempXY[1]=$maxDim[1]-$Hcounter; $maxFlag=1;} 01888 if ($maxFlag) { 01889 $val['XY'] = implode(',',$tempXY); 01890 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 01891 $gifCreator->init(); 01892 $gifCreator->start($val,$this->menuArr[$key]); 01893 } 01894 } 01895 01896 01897 01898 01899 // displace 01900 if ($Hobjs) { 01901 reset($Hobjs); 01902 while(list(,$index)=each($Hobjs)) { 01903 if ($gifCreator->setup[$index] && $gifCreator->setup[$index.'.']) { 01904 $oldOffset = explode(',',$gifCreator->setup[$index.'.']['offset']); 01905 $gifCreator->setup[$index.'.']['offset'] = implode(',',$gifCreator->applyOffset($oldOffset,Array(0,-$Hcounter))); 01906 } 01907 } 01908 } 01909 01910 if ($Wobjs) { 01911 reset($Wobjs); 01912 while(list(,$index)=each($Wobjs)) { 01913 if ($gifCreator->setup[$index] && $gifCreator->setup[$index.'.']) { 01914 $oldOffset = explode(',',$gifCreator->setup[$index.'.']['offset']); 01915 $gifCreator->setup[$index.'.']['offset'] = implode(',',$gifCreator->applyOffset($oldOffset,Array(-$Wcounter,0))); 01916 } 01917 } 01918 } 01919 } 01920 01921 // Finding alternative GIF names if any (by altImgResource) 01922 $gifFileName=''; 01923 if ($conf[$key]['altImgResource'] || is_array($conf[$key]['altImgResource.'])) { 01924 if (!is_object($cObj)) {$cObj=t3lib_div::makeInstance('tslib_cObj');} 01925 $cObj->start($this->menuArr[$key],'pages'); 01926 $altImgInfo = $cObj->getImgResource($conf[$key]['altImgResource'],$conf[$key]['altImgResource.']); 01927 $gifFileName=$altImgInfo[3]; 01928 } 01929 01930 // If an alternative name was NOT given, find the GIFBUILDER name. 01931 if (!$gifFileName && $isGD) { 01932 $gifCreator->createTempSubDir('menu/'); 01933 $gifFileName = $gifCreator->fileName('menu/'); 01934 } 01935 01936 // Generation of image file: 01937 if (@file_exists($gifFileName)) { // File exists 01938 $info = @getimagesize($gifFileName); 01939 $this->result[$resKey][$key]['output_w']=intval($info[0]); 01940 $this->result[$resKey][$key]['output_h']=intval($info[1]); 01941 $this->result[$resKey][$key]['output_file']=$gifFileName; 01942 } elseif ($isGD) { // file is generated 01943 $gifCreator->make(); 01944 $this->result[$resKey][$key]['output_w']=$gifCreator->w; 01945 $this->result[$resKey][$key]['output_h']=$gifCreator->h; 01946 $this->result[$resKey][$key]['output_file'] = $gifFileName; 01947 $gifCreator->output($this->result[$resKey][$key]['output_file']); 01948 $gifCreator->destroy(); 01949 } 01950 $this->result[$resKey][$key]['output_file'] = t3lib_div::png_to_gif_by_imagemagick($this->result[$resKey][$key]['output_file']); 01951 $this->result[$resKey][$key]['noLink']=$conf[$key]['noLink']; 01952 $this->result[$resKey][$key]['altTarget']=$conf[$key]['altTarget']; 01953 $this->result[$resKey][$key]['imgParams']=$conf[$key]['imgParams']; 01954 $this->result[$resKey][$key]['ATagTitle'] = $conf[$key]['ATagTitle']; 01955 $this->result[$resKey][$key]['ATagTitle.'] = $conf[$key]['ATagTitle.']; 01956 $this->result[$resKey][$key]['wrap'] = $conf[$key]['wrap']; 01957 $this->result[$resKey][$key]['allWrap'] = $conf[$key]['allWrap']; 01958 $this->result[$resKey][$key]['allWrap.'] = $conf[$key]['allWrap.']; 01959 $this->result[$resKey][$key]['subst_elementUid'] = $conf[$key]['subst_elementUid']; 01960 $this->result[$resKey][$key]['allStdWrap.'] = $conf[$key]['allStdWrap.']; 01961 01962 $Hcounter+=$this->result[$resKey][$key]['output_h']; // counter is increased 01963 $Wcounter+=$this->result[$resKey][$key]['output_w']; // counter is increased 01964 01965 if ($maxFlag){break;} 01966 } 01967 } 01968 01984 function findLargestDims($conf,$items,$Hobjs,$Wobjs,$minDim,$maxDim) { 01985 $totalWH = array( 01986 'W' => array(), 01987 'H' => array(), 01988 'W_total' => 0, 01989 'H_total' => 0 01990 ); 01991 01992 $Hcounter = 0; 01993 $Wcounter = 0; 01994 $c=0; 01995 $maxFlag=0; 01996 reset($conf); 01997 while (list($key,$val)=each($conf)) { 01998 // SAME CODE AS makeGifs()! BEGIN 01999 if ($items==($c+1) && $minDim) { 02000 $Lobjs = $this->mconf['removeObjectsOfDummy']; 02001 if ($Lobjs) { 02002 $Lobjs = t3lib_div::intExplode(',',$Lobjs); 02003 reset($Lobjs); 02004 while(list(,$remItem)=each($Lobjs)) { 02005 unset($val[$remItem]); 02006 unset($val[$remItem.'.']); 02007 } 02008 } 02009 02010 $flag =0; 02011 $tempXY = explode(',',$val['XY']); 02012 if ($Wcounter<$minDim[0]) {$tempXY[0]=$minDim[0]-$Wcounter; $flag=1;} 02013 if ($Hcounter<$minDim[1]) {$tempXY[1]=$minDim[1]-$Hcounter; $flag=1;} 02014 $val['XY'] = implode(',',$tempXY); 02015 if (!$flag){break;} 02016 } 02017 $c++; 02018 02019 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02020 $gifCreator->init(); 02021 $gifCreator->start($val,$this->menuArr[$key]); 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 // SAME CODE AS makeGifs()! END 02034 02035 // Setting the width/height 02036 $totalWH['W'][$key]=$gifCreator->XY[0]; 02037 $totalWH['H'][$key]=$gifCreator->XY[1]; 02038 $totalWH['W_total']+=$gifCreator->XY[0]; 02039 $totalWH['H_total']+=$gifCreator->XY[1]; 02040 // ---- // 02041 02042 $Hcounter+=$gifCreator->XY[1]; // counter is increased 02043 $Wcounter+=$gifCreator->XY[0]; // counter is increased 02044 02045 if ($maxFlag){break;} 02046 } 02047 return $totalWH; 02048 } 02049 02056 function writeMenu() { 02057 if (is_array($this->menuArr) && is_array($this->result) && count($this->result) && is_array($this->result['NO'])) { 02058 $this->WMcObj = t3lib_div::makeInstance('tslib_cObj'); // Create new tslib_cObj for our use 02059 $this->WMresult=''; 02060 $this->INPfixMD5 = substr(md5(microtime().$this->GMENU_fixKey),0,4); 02061 $this->WMmenuItems = count($this->result['NO']); 02062 $this->extProc_init(); 02063 for ($key=0;$key<$this->WMmenuItems;$key++) { 02064 if ($this->result['NO'][$key]['output_file']) { 02065 $this->WMcObj->start($this->menuArr[$key],'pages'); // Initialize the cObj with the page record of the menu item 02066 02067 $this->I =array(); 02068 $this->I['key'] = $key; 02069 $this->I['INPfix']= $this->imgNameNotRandom?'':'_'.$this->INPfixMD5.'_'.$key; 02070 $this->I['val'] = $this->result['NO'][$key]; 02071 $this->I['title'] = $this->getPageTitle($this->menuArr[$key]['title'],$this->menuArr[$key]['nav_title']); 02072 $this->I['uid'] = $this->menuArr[$key]['uid']; 02073 $this->I['mount_pid'] = $this->menuArr[$key]['mount_pid']; 02074 $this->I['pid'] = $this->menuArr[$key]['pid']; 02075 $this->I['spacer'] = $this->menuArr[$key]['isSpacer']; 02076 if (!$this->I['uid'] && !$this->menuArr[$key]['_OVERRIDE_HREF']) {$this->I['spacer']=1;} 02077 $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 02078 $this->I['name']=''; 02079 02080 // Get link. 02081 $this->I['linkHREF'] = $this->link($key,$this->I['val']['altTarget'],$this->mconf['forceTypeValue']); 02082 // Title attribute of links: 02083 $titleAttrValue = $this->WMcObj->stdWrap($this->I['val']['ATagTitle'],$this->I['val']['ATagTitle.']); 02084 if (strlen($titleAttrValue)) { 02085 $this->I['linkHREF']['title'] = $titleAttrValue; 02086 } 02087 // Setting "blurlink()" function: 02088 if (!$this->mconf['noBlur']) { 02089 $this->I['linkHREF']['onFocus']='blurLink(this);'; 02090 } 02091 02092 // Set rollover 02093 if ($this->result['RO'][$key] && !$this->I['noLink']) { 02094 $this->I['theName'] = $this->imgNamePrefix.$this->I['uid'].$this->I['INPfix']; 02095 $this->I['name'] = ' name="'.$this->I["theName"].'"'; 02096 $this->I['linkHREF']['onMouseover']=$this->WMfreezePrefix.'over(\''.$this->I['theName'].'\');'; 02097 $this->I['linkHREF']['onMouseout']=$this->WMfreezePrefix.'out(\''.$this->I['theName'].'\');'; 02098 $GLOBALS['TSFE']->JSImgCode.= chr(10).$this->I['theName'].'_n=new Image(); '.$this->I['theName'].'_n.src = "'.$GLOBALS['TSFE']->absRefPrefix.$this->I['val']['output_file'].'"; '; 02099 $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'].'"; '; 02100 $GLOBALS['TSFE']->imagesOnPage[]=$this->result['RO'][$key]['output_file']; 02101 $GLOBALS['TSFE']->setJS('mouseOver'); 02102 $this->extProc_RO($key); 02103 } 02104 // Set access key 02105 if ($this->mconf['accessKey']) { 02106 $this->I['accessKey'] = $this->accessKey($this->I['title']); 02107 } else { 02108 $this->I['accessKey']=Array(); 02109 } 02110 02111 // Set altText 02112 $this->I['altText'] = $this->mconf['disableAltText'] ? '' : $this->I['title'].$this->I['accessKey']['alt']; 02113 02114 // Calling extra processing function 02115 $this->extProc_beforeLinking($key); 02116 02117 // Set linking 02118 if (!$this->I['noLink']) { 02119 $this->setATagParts(); 02120 } else { 02121 $this->I['A1'] = ''; 02122 $this->I['A2'] = ''; 02123 } 02124 $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'].'" border="0" alt="'.htmlspecialchars($this->I['altText']).'"'.$this->I['name'].($this->I['val']['imgParams']?' '.$this->I['val']['imgParams']:'').' />'; 02125 02126 // Make before, middle and after parts 02127 $this->I['parts'] = array(); 02128 $this->I['parts']['ATag_begin'] = $this->I['A1']; 02129 $this->I['parts']['image'] = $this->I['IMG']; 02130 $this->I['parts']['ATag_end'] = $this->I['A2']; 02131 02132 // Passing I to a user function 02133 if ($this->mconf['IProcFunc']) { 02134 $this->I = $this->userProcess('IProcFunc',$this->I); 02135 } 02136 02137 // Putting the item together. 02138 // Merge parts + beforeAllWrap 02139 $this->I['theItem']= implode('',$this->I['parts']); 02140 $this->I['theItem']= $this->extProc_beforeAllWrap($this->I['theItem'],$key); 02141 02142 // wrap: 02143 $this->I['theItem']= $this->tmpl->wrap($this->I['theItem'],$this->I['val']['wrap']); 02144 02145 // allWrap: 02146 $allWrap = $this->WMcObj->stdWrap($this->I['val']['allWrap'],$this->I['val']['allWrap.']); 02147 $this->I['theItem'] = $this->tmpl->wrap($this->I['theItem'],$allWrap); 02148 02149 if ($this->I['val']['subst_elementUid']) $this->I['theItem'] = str_replace('{elementUid}',$this->I['uid'],$this->I['theItem']); 02150 02151 // allStdWrap: 02152 if (is_array($this->I['val']['allStdWrap.'])) { 02153 $this->I['theItem'] = $this->WMcObj->stdWrap($this->I['theItem'],$this->I['val']['allStdWrap.']); 02154 } 02155 02156 $GLOBALS['TSFE']->imagesOnPage[]=$this->I['val']['output_file']; 02157 02158 $this->extProc_afterLinking($key); 02159 } 02160 } 02161 return $this->extProc_finish(); 02162 } 02163 } 02164 02173 function extProc_init() { 02174 } 02175 02184 function extProc_RO($key) { 02185 } 02186 02195 function extProc_beforeLinking($key) { 02196 } 02197 02208 function extProc_afterLinking($key) { 02209 $this->WMresult.=$this->I['theItem']; 02210 if (!$this->I['spacer']) { 02211 $this->WMresult.= $this->subMenu($this->I['uid']); 02212 } 02213 } 02214 02215 02225 function extProc_beforeAllWrap($item,$key) { 02226 return $item; 02227 } 02228 02236 function extProc_finish() { 02237 return $this->tmpl->wrap($this->WMresult,$this->mconf['wrap']).$this->WMextraScript; 02238 } 02239 } 02240 02241 02242 02243 02244 02245 02246 02247 02248 02249 02250 02251 02252 02253 02254 02255 02256 02257 02258 02259 02260 02261 02270 class tslib_imgmenu extends tslib_menu { 02271 02279 function generate() { 02280 $splitCount = count($this->menuArr); 02281 if ($splitCount) { 02282 list($NOconf) = $this->procesItemStates($splitCount); 02283 } 02284 if ($this->mconf['debugItemConf']) {echo '<h3>$NOconf:</h3>'; debug($NOconf); } 02285 $this->makeImageMap($NOconf); 02286 } 02287 02297 function makeImageMap($conf) { 02298 if (!is_array($conf)) { 02299 $conf = Array(); 02300 } 02301 if (is_array($this->mconf['main.'])) { 02302 $gifCreator = t3lib_div::makeInstance('tslib_gifBuilder'); 02303 $gifCreator->init(); 02304 02305 $itemsConf = $conf; 02306 $conf = $this->mconf['main.']; 02307 if (is_array($conf)) { 02308 $gifObjCount = 0; 02309 02310 $sKeyArray=t3lib_TStemplate::sortedKeyList($conf); 02311 $gifObjCount=intval(end($sKeyArray)); 02312 02313 $lastOriginal = $gifObjCount; 02314 02315 // Now we add graphical objects to the gifbuilder-setup 02316 reset($itemsConf); 02317 $waArr = Array(); 02318 while (list($key,$val)=each($itemsConf)) { 02319 if (is_array($val)) { 02320 $gifObjCount++; 02321 $waArr[$key]['free']=$gifObjCount; 02322 02323 $sKeyArray=t3lib_TStemplate::sortedKeyList($val); 02324 02325 foreach($sKeyArray as $theKey) { 02326 $theValue=$val[$theKey]; 02327 02328 02329 if (intval($theKey) && $theValArr=$val[$theKey.'.']) { 02330 $cObjData = $this->menuArr[$key] ? $this->menuArr[$key] : Array(); 02331 02332 $gifObjCount++; 02333 if ($theValue=='TEXT') { 02334 $waArr[$key]['textNum']=$gifObjCount; 02335 02336 $gifCreator->data = $cObjData; 02337 $theValArr = $gifCreator->checkTextObj($theValArr); 02338 unset($theValArr['text.']); // if this is not done it seems that imageMaps will be rendered wrong!! 02339 // check links 02340 02341 $LD = $this->tmpl->linkData($this->menuArr[$key],$this->mconf['target'],'','',array(),'',$this->mconf['forceTypeValue']); 02342 02343 // Overriding URL / Target if set to do so: 02344 if ($this->menuArr[$key]['_OVERRIDE_HREF']) { 02345 $LD['totalURL'] = $this->menuArr[$key]['_OVERRIDE_HREF']; 02346 if ($this->menuArr[$key]['_OVERRIDE_TARGET']) $LD['target'] = $this->menuArr[$key]['_OVERRIDE_TARGET']; 02347 } 02348 02349 // Setting target/url for Image Map: 02350 if ($theValArr['imgMap.']['url']=='') { 02351 $theValArr['imgMap.']['url'] = $LD['totalURL']; 02352 } 02353 if ($theValArr['imgMap.']['target']=='') { 02354 $theValArr['imgMap.']['target'] = $LD['target']; 02355 } 02356 if ($theValArr['imgMap.']['noBlur']=='') { 02357 $theValArr['imgMap.']['noBlur'] = $this->mconf['noBlur']; 02358 } 02359 if (is_array($theValArr['imgMap.']['altText.'])) { 02360 $cObj =t3lib_div::makeInstance('tslib_cObj'); 02361 $cObj->start($cObjData,'pages'); 02362 $theValArr['imgMap.']['altText'] = $cObj->stdWrap($theValArr['imgMap.']['altText'], $theValArr['imgMap.']['altText.']); 02363 unset($theValArr['imgMap.']['altText.']); 02364 } 02365 if (is_array($theValArr['imgMap.']['titleText.'])) { 02366 $cObj =t3lib_div::makeInstance('tslib_cObj'); 02367 $cObj->start($cObjData,'pages'); 02368 $theValArr['imgMap.']['titleText'] = $cObj->stdWrap($theValArr['imgMap.']['titleText'], $theValArr['imgMap.']['titleText.']); 02369 unset($theValArr['imgMap.']['titleText.']); 02370 } 02371 } 02372 // 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!! 02373 if ($theValue=='IMAGE') { 02374 if ($theValArr['file']=='GIFBUILDER') { 02375 $temp_sKeyArray=t3lib_TStemplate::sortedKeyList($theValArr['file.']); 02376 reset($temp_sKeyArray); 02377 while(list(,$temp_theKey)=each($temp_sKeyArray)) { 02378 if ($theValArr['mask.'][$temp_theKey]=='TEXT') { 02379 $gifCreator->data = $this->menuArr[$key] ? $this->menuArr[$key] : Array(); 02380 $theValArr['mask.'][$temp_theKey.'.'] = $gifCreator->checkTextObj($theValArr['mask.'][$temp_theKey.'.']); 02381 unset($theValArr['mask.'][$temp_theKey.'.']['text.']); // if this is not done it seems that imageMaps will be rendered wrong!! 02382 } 02383 } 02384 } 02385 if ($theValArr['mask']=='GIFBUILDER') { 02386 $temp_sKeyArray=t3lib_TStemplate::sortedKeyList($theValArr['mask.']); 02387 reset($temp_sKeyArray); 02388 while(list(,$temp_theKey)=each($temp_sKeyArray)) { 02389 if ($theValArr['mask.'][$temp_theKey]=='TEXT') { 02390 $gifCreator->data = $this->menuArr[$key] ? $this->menuArr[$key] : Array(); 02391 $theValArr['mask.'][$temp_theKey.'.'] = $gifCreator->checkTextObj($theValArr['mask.'][$temp_theKey.'.']); 02392 unset($theValArr['mask.'][$temp_theKey.'.']['text.']); // if this is not done it seems that imageMaps will be rendered wrong!! 02393 } 02394 } 02395 } 02396 } 02397 02398 // Checks if disabled is set... 02399 $setObjFlag=1; 02400 if ($theValArr['if.']) { 02401 $cObj =t3lib_div::makeInstance('tslib_cObj'); 02402 $cObj->start($cObjData,'pages'); 02403 if (!$cObj->checkIf($theValArr['if.'])) { 02404 $setObjFlag=0; 02405 } 02406 unset($theValArr['if.']); 02407 } 02408 // Set the object! 02409 if ($setObjFlag) { 02410 $conf[$gifObjCount] = $theValue; 02411 $conf[$gifObjCount.'.'] = $theValArr; 02412 } 02413 } 02414 } 02415 } 02416 } 02417 02418 $gifCreator->start($conf,$GLOBALS['TSFE']->page); 02419 // calculations 02420 02421 $sum=Array(0,0,0,0); 02422 reset($waArr); 02423 while (list($key,$val)=each($waArr)) { 02424 if ($dConf[$key] =$itemsConf[$key]['distrib']) { 02425 $textBB = $gifCreator->objBB[$val['textNum']]; 02426 $dConf[$key] = str_replace('textX',$textBB[0],$dConf[$key]); 02427 $dConf[$key] = str_replace('textY',$textBB[1],$dConf[$key]); 02428 $dConf[$key] = t3lib_div::intExplode(',',$gifCreator->calcOffset($dConf[$key])); 02429 } 02430 } 02431 $workArea = t3lib_div::intExplode(',',$gifCreator->calcOffset($this->mconf['dWorkArea'])); 02432 reset($waArr); 02433 while (list($key,$val)=each($waArr)) { 02434 $index = $val['free']; 02435 $gifCreator->setup[$index] = 'WORKAREA'; 02436 $workArea[2] = $dConf[$key][2] ? $dConf[$key][2] : $dConf[$key][0]; 02437 $workArea[3] = $dConf[$key][3] ? $dConf[$key][3] : $dConf[$key][1]; 02438 02439 $gifCreator->setup[$index.'.']['set'] = implode(',',$workArea); 02440 $workArea[0]+=$dConf[$key][0]; 02441 $workArea[1]+=$dConf[$key][1]; 02442 } 02443 02444 if ($this->mconf['debugRenumberedObject']) {echo '<h3>Renumbered GIFBUILDER object:</h3>'; debug($gifCreator->setup);} 02445 02446 $gifCreator->createTempSubDir('menu/'); 02447 $gifFileName = $gifCreator->fileName('menu/'); 02448 02449 // Gets the ImageMap from the cache... 02450 $imgHash = md5($gifFileName); 02451 $imgMap = $this->sys_page->getHash($imgHash, 0); 02452 02453 if ($imgMap && @file_exists($gifFileName)) { // File exists 02454 $info = @getimagesize($gifFileName); 02455 $w=$info[0]; 02456 $h=$info[1]; 02457 } else { // file is generated 02458 $gifCreator->make(); 02459 $w=$gifCreator->w; 02460 $h=$gifCreator->h; 02461 $gifCreator->output($gifFileName); 02462 $gifCreator->destroy(); 02463 $imgMap=$gifCreator->map; 02464 $this->sys_page->storeHash($imgHash, $imgMap, 'MENU IMAGEMAP'); 02465 } 02466 $imgMap.=$this->mconf['imgMapExtras']; 02467 02468 $gifFileName = t3lib_div::png_to_gif_by_imagemagick($gifFileName); 02469 $this->result = Array('output_file'=>$gifFileName, 'output_w'=>$w, 'output_h'=>$h, 'imgMap'=>$imgMap); 02470 } 02471 } 02472 } 02473 02480 function writeMenu() { 02481 if ($this->result) { 02482 $res = $this->result; 02483 $menuName = 'menu_'.t3lib_div::shortMD5($res['imgMap']); // shortMD5 260900 02484 $result = '<img src="'.$GLOBALS['TSFE']->absRefPrefix.$res['output_file'].'" width="'.$res['output_w'].'" height="'.$res['output_h'].'" usemap="#'.$menuName.'" border="0" '.$this->mconf['params']; 02485 if (!strstr($result,'alt="')) $result.=' alt="Menu Image Map"'; // Adding alt attribute if not set. 02486 $result.= ' /><map name="'.$menuName.'" id="'.$menuName.'">'.$res['imgMap'].'</map>'; 02487 02488 $GLOBALS['TSFE']->imagesOnPage[]=$res['output_file']; 02489 02490 return $this->tmpl->wrap($result,$this->mconf['wrap']); 02491 } 02492 } 02493 } 02494 02495 02496 02497 02498 02499 02500 02501 02502 02503 02504 02505 02506 02507 02508 02509 02510 02511 02512 02513 02514 02523 class tslib_jsmenu extends tslib_menu { 02524 02530 function generate() { 02531 } 02532 02538 function writeMenu() { 02539 if ($this->id) { 02540 // Making levels: 02541 $levels = t3lib_div::intInRange($this->mconf['levels'],1,5); 02542 $this->levels = $levels; 02543 $this->JSVarName='eid'; 02544 $this->JSMenuName= $this->mconf['menuName'] ? $this->mconf['menuName'] : 'JSmenu'; 02545 02546 $JScode="\n var ".$this->JSMenuName." = new JSmenu(".$levels.",'".$this->JSMenuName."Form');"; 02547 02548 for ($a=1;$a<=$levels;$a++) { 02549 $JScode.="\n var ".$this->JSVarName.$a."=0;"; 02550 } 02551 $JScode.= $this->generate_level($levels,1,$this->id,$this->menuArr,$this->MP_array)."\n"; 02552 02553 $GLOBALS['TSFE']->additionalHeaderData['JSMenuCode']='<script type="text/javascript" src="'.$GLOBALS['TSFE']->absRefPrefix.'t3lib/jsfunc.menu.js"></script>'; 02554 $GLOBALS['TSFE']->JSCode.=$JScode; 02555 02556 // Printing: 02557 $allFormCode=""; 02558 for ($a=1;$a<=$this->levels;$a++) { 02559 $formCode=''; 02560 $levelConf = $this->mconf[$a.'.']; 02561 $length = $levelConf['width'] ? $levelConf['width'] : 14; 02562 $lenghtStr=''; 02563 for ($b=0;$b<$length;$b++) { 02564 $lenghtStr.='_'; 02565 } 02566 $height = $levelConf['elements'] ? $levelConf['elements'] : 5; 02567 02568 $formCode.= '<select name="selector'.$a.'" onchange="'.$this->JSMenuName.'.act('.$a.');"'.($levelConf['additionalParams']?' '.$levelConf['additionalParams']:'').'>'; 02569 for ($b=0;$b<$height;$b++) { 02570 $formCode.= '<option value="0">'; 02571 if ($b==0) { 02572 $formCode.= $lenghtStr; 02573 } 02574 $formCode.='</option>'; 02575 } 02576 $formCode.= '</select>'; 02577 $allFormCode.=$this->tmpl->wrap($formCode,$levelConf['wrap']); 02578 } 02579 $formCode = $this->tmpl->wrap($allFormCode,$this->mconf['wrap']); 02580 02581 $formCode= '<form action="" method="post" style="margin: 0 0 0 0;" name="'.$this->JSMenuName.'Form">'.$formCode.'</form>'; 02582 $formCode.='<script type="text/javascript"> /*<![CDATA[*/ '.$this->JSMenuName.'.writeOut(1,'.$this->JSMenuName.'.openID,1); /*]]>*/ </script>'; 02583 return $this->tmpl->wrap($formCode,$this->mconf['wrapAfterTags']); 02584 } 02585 } 02586 02599 function generate_level($levels,$count,$pid,$menuItemArray='',$MP_array=array()) { 02600 $levelConf = $this->mconf[$count.'.']; 02601 02602 // Translate PID to a mount page, if any: 02603 $mount_info = $this->sys_page->getMountPointInfo($pid); 02604 if (is_array($mount_info)) { 02605 $MP_array[] = $mount_info['MPvar']; 02606 $pid = $mount_info['mount_pid']; 02607 } 02608 02609 // Set "&MP=" var: 02610 $MP_var = implode(',',$MP_array); 02611 $MP_params = $MP_var ? '&MP='.rawurlencode($MP_var) : ''; 02612 02613 // UIDs to ban: 02614 $banUidArray=array(); 02615 if (trim($this->conf['excludeUidList'])) { 02616 $banUidArray = t3lib_div::intExplode(',', $this->conf['excludeUidList']); 02617 } 02618 02619 // Initializing variables: 02620 $var = $this->JSVarName; 02621 $menuName = $this->JSMenuName; 02622 $parent = $count==1 ? 0 : $var.($count-1); 02623 $prev=0; 02624 $c=0; 02625 02626 $menuItems = is_array($menuItemArray) ? $menuItemArray : $this->sys_page->getMenu($pid); 02627 foreach($menuItems as $uid => $data) { 02628 $spacer = (t3lib_div::inList($this->spacerIDList,$data['doktype'])?1:0); // if item is a spacer, $spacer is set 02629 if ($this->mconf['SPC'] || !$spacer) { // If the spacer-function is not enabled, spacers will not enter the $menuArr 02630 if (!t3lib_div::inList($this->doktypeExcludeList,$data['doktype']) && !$data['nav_hide'] && !t3lib_div::inArray($banUidArray,$uid)) { // Page may not be 'not_in_menu' or 'Backend User Section' + not in banned uid's 02631 if ($count<$levels) { 02632 $addLines = $this->generate_level($levels,$count+1,$data['uid'],'',$MP_array); 02633 } else { 02634 $addLines = ''; 02635 } 02636 $title=rawurlencode($data['title']); 02637 $url=''; 02638 $target=''; 02639 if ((!$addLines && !$levelConf['noLink']) || $levelConf['alwaysLink']) { 02640 $LD = $this->tmpl->linkData($data,$this->mconf['target'],'','',array(),$MP_params,$this->mconf['forceTypeValue']); 02641 $url = rawurlencode($LD['totalURL']); 02642 $target = rawurlencode($LD['target']); 02643 } 02644 $codeLines.="\n".$var.$count."=".$menuName.".add(".$parent.",".$prev.",0,'".$title."','".$GLOBALS['TSFE']->baseUrlWrap($url)."','".$target."');"; 02645 // If the active one should be chosen... 02646 $active = ($levelConf['showActive'] && $data['uid'] == $this->tmpl->rootLine[$count]['uid']); 02647 // If the first item should be shown 02648 $first = (!$c && $levelConf['showFirst']); 02649 // do it... 02650 if ($active || $first) { 02651 if ($count==1) { 02652 $codeLines.="\n".$menuName.".openID = ".$var.$count.";"; 02653 } else { 02654 $codeLines.="\n".$menuName.".entry[".$parent."].openID = ".$var.$count.";"; 02655 } 02656 } 02657 // Add submenu... 02658 $codeLines.=$addLines; 02659 02660 $prev=$var.$count; 02661 $c++; 02662 } 02663 } 02664 } 02665 if ($this->mconf['firstLabelGeneral'] && !$levelConf['firstLabel']) { 02666 $levelConf['firstLabel'] = $this->mconf['firstLabelGeneral']; 02667 } 02668 if ($levelConf['firstLabel'] && $codeLines) { 02669 $codeLines.="\n".$menuName.".defTopTitle[".$count."] = unescape('".rawurlencode($levelConf['firstLabel'])."');"; 02670 } 02671 return $codeLines; 02672 } 02673 } 02674 02675 02676 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_menu.php']) { 02677 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_menu.php']); 02678 } 02679 02680 ?>