/** * Determines original shortcut destination in page overlays. * * Since the pages records used for menu rendering are overlaid by default, * the original 'shortcut' value is lost, if a translation did not define one. * The behaviour in TSFE can be compared to the 'mergeIfNotBlank' feature, but * it's hardcoded there and not related to the mentioned setting at all. * * @param array $page * @return array * @todo Once the page_language_overlay behaviour was removed, this method can be removed again */ protected function determineOriginalShortcutPage(array $page) { // Check if modification is required if ($GLOBALS['TSFE']->sys_language_uid > 0 && empty($page['shortcut']) && !empty($page['uid']) && !empty($page['_PAGES_OVERLAY']) && !empty($page['_PAGES_OVERLAY_UID'])) { // Using raw record since the record was overlaid and is correct already: $originalPage = $this->sys_page->getRawRecord('pages', $page['uid']); if ($originalPage['shortcut_mode'] === $page['shortcut_mode'] && !empty($originalPage['shortcut'])) { $page['shortcut'] = $originalPage['shortcut']; } } return $page; }
/** * Creates the menu in the internal variables, ready for output. * Basically this will read the page records needed and fill in the internal $this->menuArr * Based on a hash of this array and some other variables the $this->result variable will be loaded either from cache OR by calling the generate() method of the class to create the menu for real. * * @return void * @todo Define visibility */ public function makeMenu() { if ($this->id) { // Initializing showAccessRestrictedPages if ($this->mconf['showAccessRestrictedPages']) { // SAVING where_groupAccess $SAVED_where_groupAccess = $this->sys_page->where_groupAccess; // Temporarily removing fe_group checking! $this->sys_page->where_groupAccess = ''; } // Begin production of menu: $temp = array(); $altSortFieldValue = trim($this->mconf['alternativeSortingField']); $altSortField = $altSortFieldValue ? $altSortFieldValue : 'sorting'; // ... only for the FIRST level of a HMENU if ($this->menuNumber == 1 && $this->conf['special']) { $value = isset($this->conf['special.']['value.']) ? $this->parent_cObj->stdWrap($this->conf['special.']['value'], $this->conf['special.']['value.']) : $this->conf['special.']['value']; switch ($this->conf['special']) { case 'userfunction': $temp = $this->parent_cObj->callUserFunction($this->conf['special.']['userFunc'], array_merge($this->conf['special.'], array('_altSortField' => $altSortField)), ''); if (!is_array($temp)) { $temp = array(); } break; case 'language': $temp = array(); // Getting current page record NOT overlaid by any translation: $currentPageWithNoOverlay = $this->sys_page->getRawRecord('pages', $GLOBALS['TSFE']->page['uid']); // Traverse languages set up: $languageItems = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $value); foreach ($languageItems as $sUid) { // Find overlay record: if ($sUid) { $lRecs = $this->sys_page->getPageOverlay($GLOBALS['TSFE']->page['uid'], $sUid); } else { $lRecs = array(); } // Checking if the "disabled" state should be set. if (\TYPO3\CMS\Core\Utility\GeneralUtility::hideIfNotTranslated($GLOBALS['TSFE']->page['l18n_cfg']) && $sUid && !count($lRecs) || $GLOBALS['TSFE']->page['l18n_cfg'] & 1 && (!$sUid || !count($lRecs)) || !$this->conf['special.']['normalWhenNoLanguage'] && $sUid && !count($lRecs)) { $iState = $GLOBALS['TSFE']->sys_language_uid == $sUid ? 'USERDEF2' : 'USERDEF1'; } else { $iState = $GLOBALS['TSFE']->sys_language_uid == $sUid ? 'ACT' : 'NO'; } if ($this->conf['addQueryString']) { $getVars = $this->parent_cObj->getQueryArguments($this->conf['addQueryString.'], array('L' => $sUid), TRUE); } else { $getVars = '&L=' . $sUid; } // Adding menu item: $temp[] = array_merge(array_merge($currentPageWithNoOverlay, $lRecs), array('ITEM_STATE' => $iState, '_ADD_GETVARS' => $getVars, '_SAFE' => TRUE)); } break; case 'directory': if ($value == '') { $value = $GLOBALS['TSFE']->page['uid']; } $items = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $value); foreach ($items as $id) { $MP = $this->tmpl->getFromMPmap($id); // Checking if a page is a mount page and if so, change the ID and set the MP var properly. $mount_info = $this->sys_page->getMountPointInfo($id); if (is_array($mount_info)) { if ($mount_info['overlay']) { // Overlays should already have their full MPvars calculated: $MP = $this->tmpl->getFromMPmap($mount_info['mount_pid']); $MP = $MP ? $MP : $mount_info['MPvar']; } else { $MP = ($MP ? $MP . ',' : '') . $mount_info['MPvar']; } $id = $mount_info['mount_pid']; } // Get sub-pages: $res = $this->parent_cObj->exec_getQuery('pages', array('pidInList' => $id, 'orderBy' => $altSortField)); while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { $GLOBALS['TSFE']->sys_page->versionOL('pages', $row); if (is_array($row)) { // Keep mount point? $mount_info = $this->sys_page->getMountPointInfo($row['uid'], $row); // There is a valid mount point. if (is_array($mount_info) && $mount_info['overlay']) { // Using "getPage" is OK since we need the check for enableFields // AND for type 2 of mount pids we DO require a doktype < 200! $mp_row = $this->sys_page->getPage($mount_info['mount_pid']); if (count($mp_row)) { $row = $mp_row; $row['_MP_PARAM'] = $mount_info['MPvar']; } else { // 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! unset($row); } } // Add external MP params, then the row: if (is_array($row)) { if ($MP) { $row['_MP_PARAM'] = $MP . ($row['_MP_PARAM'] ? ',' . $row['_MP_PARAM'] : ''); } $temp[$row['uid']] = $this->sys_page->getPageOverlay($row); } } } } break; case 'list': if ($value == '') { $value = $this->id; } $loadDB = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('FE_loadDBGroup'); $loadDB->start($value, 'pages'); $loadDB->additionalWhere['pages'] = \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::enableFields('pages'); $loadDB->getFromDB(); foreach ($loadDB->itemArray as $val) { $MP = $this->tmpl->getFromMPmap($val['id']); // Keep mount point? $mount_info = $this->sys_page->getMountPointInfo($val['id']); // There is a valid mount point. if (is_array($mount_info) && $mount_info['overlay']) { // Using "getPage" is OK since we need the check for enableFields // AND for type 2 of mount pids we DO require a doktype < 200! $mp_row = $this->sys_page->getPage($mount_info['mount_pid']); if (count($mp_row)) { $row = $mp_row; $row['_MP_PARAM'] = $mount_info['MPvar']; // Overlays should already have their full MPvars calculated if ($mount_info['overlay']) { $MP = $this->tmpl->getFromMPmap($mount_info['mount_pid']); if ($MP) { unset($row['_MP_PARAM']); } } } else { // 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! unset($row); } } else { $row = $loadDB->results['pages'][$val['id']]; } //Add versioning overlay for current page (to respect workspaces) if (is_array($row)) { $this->sys_page->versionOL('pages', $row, TRUE); } // Add external MP params, then the row: if (is_array($row)) { if ($MP) { $row['_MP_PARAM'] = $MP . ($row['_MP_PARAM'] ? ',' . $row['_MP_PARAM'] : ''); } $temp[] = $this->sys_page->getPageOverlay($row); } } break; case 'updated': if ($value == '') { $value = $GLOBALS['TSFE']->page['uid']; } $items = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $value); if (\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($this->conf['special.']['depth'])) { $depth = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->conf['special.']['depth'], 1, 20); } else { $depth = 20; } // Max number of items $limit = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->conf['special.']['limit'], 0, 100); $maxAge = intval(\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::calc($this->conf['special.']['maxAge'])); if (!$limit) { $limit = 10; } // *'auto', 'manual', 'tstamp' $mode = $this->conf['special.']['mode']; // Get id's $id_list_arr = array(); foreach ($items as $id) { $bA = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->conf['special.']['beginAtLevel'], 0, 100); $id_list_arr[] = \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::getTreeList(-1 * $id, $depth - 1 + $bA, $bA - 1); } $id_list = implode(',', $id_list_arr); // Get sortField (mode) switch ($mode) { case 'starttime': $sortField = 'starttime'; break; case 'lastUpdated': case 'manual': $sortField = 'lastUpdated'; break; case 'tstamp': $sortField = 'tstamp'; break; case 'crdate': $sortField = 'crdate'; break; default: $sortField = 'SYS_LASTCHANGED'; break; } // Get $extraWhere = ($this->conf['includeNotInMenu'] ? '' : ' AND pages.nav_hide=0') . $this->getDoktypeExcludeWhere(); if ($this->conf['special.']['excludeNoSearchPages']) { $extraWhere .= ' AND pages.no_search=0'; } if ($maxAge > 0) { $extraWhere .= ' AND ' . $sortField . '>' . ($GLOBALS['SIM_ACCESS_TIME'] - $maxAge); } $res = $this->parent_cObj->exec_getQuery('pages', array('pidInList' => '0', 'uidInList' => $id_list, 'where' => $sortField . '>=0' . $extraWhere, 'orderBy' => $altSortFieldValue ? $altSortFieldValue : $sortField . ' desc', 'max' => $limit)); while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { $GLOBALS['TSFE']->sys_page->versionOL('pages', $row); if (is_array($row)) { $temp[$row['uid']] = $this->sys_page->getPageOverlay($row); } } break; case 'keywords': list($value) = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $value); if (!$value) { $value = $GLOBALS['TSFE']->page['uid']; } if ($this->conf['special.']['setKeywords'] || $this->conf['special.']['setKeywords.']) { $kw = isset($this->conf['special.']['setKeywords.']) ? $this->parent_cObj->stdWrap($this->conf['special.']['setKeywords'], $this->conf['special.']['setKeywords.']) : $this->conf['special.']['setKeywords']; } else { // The page record of the 'value'. $value_rec = $this->sys_page->getPage($value); $kfieldSrc = $this->conf['special.']['keywordsField.']['sourceField'] ? $this->conf['special.']['keywordsField.']['sourceField'] : 'keywords'; // keywords. $kw = trim(\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::keywords($value_rec[$kfieldSrc])); } // *'auto', 'manual', 'tstamp' $mode = $this->conf['special.']['mode']; switch ($mode) { case 'starttime': $sortField = 'starttime'; break; case 'lastUpdated': case 'manual': $sortField = 'lastUpdated'; break; case 'tstamp': $sortField = 'tstamp'; break; case 'crdate': $sortField = 'crdate'; break; default: $sortField = 'SYS_LASTCHANGED'; break; } // Depth, limit, extra where if (\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($this->conf['special.']['depth'])) { $depth = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->conf['special.']['depth'], 0, 20); } else { $depth = 20; } // Max number of items $limit = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->conf['special.']['limit'], 0, 100); $extraWhere = ' AND pages.uid<>' . $value . ($this->conf['includeNotInMenu'] ? '' : ' AND pages.nav_hide=0') . $this->getDoktypeExcludeWhere(); if ($this->conf['special.']['excludeNoSearchPages']) { $extraWhere .= ' AND pages.no_search=0'; } // Start point $eLevel = \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::getKey(isset($this->conf['special.']['entryLevel.']) ? $this->parent_cObj->stdWrap($this->conf['special.']['entryLevel'], $this->conf['special.']['entryLevel.']) : $this->conf['special.']['entryLevel'], $this->tmpl->rootLine); $startUid = intval($this->tmpl->rootLine[$eLevel]['uid']); // Which field is for keywords $kfield = 'keywords'; if ($this->conf['special.']['keywordsField']) { list($kfield) = explode(' ', trim($this->conf['special.']['keywordsField'])); } // If there are keywords and the startuid is present. if ($kw && $startUid) { $bA = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->conf['special.']['beginAtLevel'], 0, 100); $id_list = \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::getTreeList(-1 * $startUid, $depth - 1 + $bA, $bA - 1); $kwArr = explode(',', $kw); foreach ($kwArr as $word) { $word = trim($word); if ($word) { $keyWordsWhereArr[] = $kfield . ' LIKE \'%' . $GLOBALS['TYPO3_DB']->quoteStr($word, 'pages') . '%\''; } } $res = $this->parent_cObj->exec_getQuery('pages', array('pidInList' => '0', 'uidInList' => $id_list, 'where' => '(' . implode(' OR ', $keyWordsWhereArr) . ')' . $extraWhere, 'orderBy' => $altSortFieldValue ? $altSortFieldValue : $sortField . ' desc', 'max' => $limit)); while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { $GLOBALS['TSFE']->sys_page->versionOL('pages', $row); if (is_array($row)) { $temp[$row['uid']] = $this->sys_page->getPageOverlay($row); } } } break; case 'rootline': $range = isset($this->conf['special.']['range.']) ? $this->parent_cObj->stdWrap($this->conf['special.']['range'], $this->conf['special.']['range.']) : $this->conf['special.']['range']; $begin_end = explode('|', $range); $begin_end[0] = intval($begin_end[0]); if (!\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($begin_end[1])) { $begin_end[1] = -1; } $beginKey = \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::getKey($begin_end[0], $this->tmpl->rootLine); $endKey = \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::getKey($begin_end[1], $this->tmpl->rootLine); if ($endKey < $beginKey) { $endKey = $beginKey; } $rl_MParray = array(); foreach ($this->tmpl->rootLine as $k_rl => $v_rl) { // For overlaid mount points, set the variable right now: if ($v_rl['_MP_PARAM'] && $v_rl['_MOUNT_OL']) { $rl_MParray[] = $v_rl['_MP_PARAM']; } // Traverse rootline: if ($k_rl >= $beginKey && $k_rl <= $endKey) { $temp_key = $k_rl; $temp[$temp_key] = $this->sys_page->getPage($v_rl['uid']); if (count($temp[$temp_key])) { // If there are no specific target for the page, put the level specific target on. if (!$temp[$temp_key]['target']) { $temp[$temp_key]['target'] = $this->conf['special.']['targets.'][$k_rl]; $temp[$temp_key]['_MP_PARAM'] = implode(',', $rl_MParray); } } else { unset($temp[$temp_key]); } } // For normal mount points, set the variable for next level. if ($v_rl['_MP_PARAM'] && !$v_rl['_MOUNT_OL']) { $rl_MParray[] = $v_rl['_MP_PARAM']; } } // Reverse order of elements (e.g. "1,2,3,4" gets "4,3,2,1"): if (isset($this->conf['special.']['reverseOrder']) && $this->conf['special.']['reverseOrder']) { $temp = array_reverse($temp); $rl_MParray = array_reverse($rl_MParray); } break; case 'browse': list($value) = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $value); if (!$value) { $value = $GLOBALS['TSFE']->page['uid']; } // Will not work out of rootline if ($value != $this->tmpl->rootLine[0]['uid']) { $recArr = array(); // The page record of the 'value'. $value_rec = $this->sys_page->getPage($value); // 'up' page cannot be outside rootline if ($value_rec['pid']) { // The page record of 'up'. $recArr['up'] = $this->sys_page->getPage($value_rec['pid']); } // If the 'up' item was NOT level 0 in rootline... if ($recArr['up']['pid'] && $value_rec['pid'] != $this->tmpl->rootLine[0]['uid']) { // The page record of "index". $recArr['index'] = $this->sys_page->getPage($recArr['up']['pid']); } // prev / next is found $prevnext_menu = $this->sys_page->getMenu($value_rec['pid'], '*', $altSortField); $lastKey = 0; $nextActive = 0; foreach ($prevnext_menu as $k_b => $v_b) { if ($nextActive) { $recArr['next'] = $v_b; $nextActive = 0; } if ($v_b['uid'] == $value) { if ($lastKey) { $recArr['prev'] = $prevnext_menu[$lastKey]; } $nextActive = 1; } $lastKey = $k_b; } reset($prevnext_menu); $recArr['first'] = pos($prevnext_menu); end($prevnext_menu); $recArr['last'] = pos($prevnext_menu); // prevsection / nextsection is found // You can only do this, if there is a valid page two levels up! if (is_array($recArr['index'])) { $prevnextsection_menu = $this->sys_page->getMenu($recArr['index']['uid'], '*', $altSortField); $lastKey = 0; $nextActive = 0; foreach ($prevnextsection_menu as $k_b => $v_b) { if ($nextActive) { $sectionRec_temp = $this->sys_page->getMenu($v_b['uid'], '*', $altSortField); if (count($sectionRec_temp)) { reset($sectionRec_temp); $recArr['nextsection'] = pos($sectionRec_temp); end($sectionRec_temp); $recArr['nextsection_last'] = pos($sectionRec_temp); $nextActive = 0; } } if ($v_b['uid'] == $value_rec['pid']) { if ($lastKey) { $sectionRec_temp = $this->sys_page->getMenu($prevnextsection_menu[$lastKey]['uid'], '*', $altSortField); if (count($sectionRec_temp)) { reset($sectionRec_temp); $recArr['prevsection'] = pos($sectionRec_temp); end($sectionRec_temp); $recArr['prevsection_last'] = pos($sectionRec_temp); } } $nextActive = 1; } $lastKey = $k_b; } } if ($this->conf['special.']['items.']['prevnextToSection']) { if (!is_array($recArr['prev']) && is_array($recArr['prevsection_last'])) { $recArr['prev'] = $recArr['prevsection_last']; } if (!is_array($recArr['next']) && is_array($recArr['nextsection'])) { $recArr['next'] = $recArr['nextsection']; } } $items = explode('|', $this->conf['special.']['items']); $c = 0; foreach ($items as $k_b => $v_b) { $v_b = strtolower(trim($v_b)); if (intval($this->conf['special.'][$v_b . '.']['uid'])) { $recArr[$v_b] = $this->sys_page->getPage(intval($this->conf['special.'][$v_b . '.']['uid'])); } if (is_array($recArr[$v_b])) { $temp[$c] = $recArr[$v_b]; if ($this->conf['special.'][$v_b . '.']['target']) { $temp[$c]['target'] = $this->conf['special.'][$v_b . '.']['target']; } $tmpSpecialFields = $this->conf['special.'][$v_b . '.']['fields.']; if (is_array($tmpSpecialFields)) { foreach ($tmpSpecialFields as $fk => $val) { $temp[$c][$fk] = $val; } } $c++; } } } break; } if ($this->mconf['sectionIndex']) { $sectionIndexes = array(); foreach ($temp as $page) { $sectionIndexes = $sectionIndexes + $this->sectionIndex($altSortField, $page['uid']); } $temp = $sectionIndexes; } } elseif (is_array($this->alternativeMenuTempArray)) { // Setting $temp array if not level 1. $temp = $this->alternativeMenuTempArray; } elseif ($this->mconf['sectionIndex']) { $temp = $this->sectionIndex($altSortField); } else { // Default: // gets the menu $temp = $this->sys_page->getMenu($this->id, '*', $altSortField); } $c = 0; $c_b = 0; $minItems = intval($this->mconf['minItems'] ? $this->mconf['minItems'] : $this->conf['minItems']); $maxItems = intval($this->mconf['maxItems'] ? $this->mconf['maxItems'] : $this->conf['maxItems']); $begin = \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::calc($this->mconf['begin'] ? $this->mconf['begin'] : $this->conf['begin']); $minItemsConf = isset($this->mconf['minItems.']) ? $this->mconf['minItems.'] : (isset($this->conf['minItems.']) ? $this->conf['minItems.'] : NULL); $minItems = is_array($minItemsConf) ? $this->parent_cObj->stdWrap($minItems, $minItemsConf) : $minItems; $maxItemsConf = isset($this->mconf['maxItems.']) ? $this->mconf['maxItems.'] : (isset($this->conf['maxItems.']) ? $this->conf['maxItems.'] : NULL); $maxItems = is_array($maxItemsConf) ? $this->parent_cObj->stdWrap($maxItems, $maxItemsConf) : $maxItems; $beginConf = isset($this->mconf['begin.']) ? $this->mconf['begin.'] : (isset($this->conf['begin.']) ? $this->conf['begin.'] : NULL); $begin = is_array($beginConf) ? $this->parent_cObj->stdWrap($begin, $beginConf) : $begin; $banUidArray = $this->getBannedUids(); // Fill in the menuArr with elements that should go into the menu: $this->menuArr = array(); foreach ($temp as $data) { $spacer = \TYPO3\CMS\Core\Utility\GeneralUtility::inList($this->spacerIDList, $data['doktype']) || !strcmp($data['ITEM_STATE'], 'SPC') ? 1 : 0; // if item is a spacer, $spacer is set if ($this->filterMenuPages($data, $banUidArray, $spacer)) { $c_b++; // If the beginning item has been reached. if ($begin <= $c_b) { $this->menuArr[$c] = $data; $this->menuArr[$c]['isSpacer'] = $spacer; $c++; if ($maxItems && $c >= $maxItems) { break; } } } } // Fill in fake items, if min-items is set. if ($minItems) { while ($c < $minItems) { $this->menuArr[$c] = array('title' => '...', 'uid' => $GLOBALS['TSFE']->id); $c++; } } // Passing the menuArr through a user defined function: if ($this->mconf['itemArrayProcFunc']) { if (!is_array($this->parentMenuArr)) { $this->parentMenuArr = array(); } $this->menuArr = $this->userProcess('itemArrayProcFunc', $this->menuArr); } // Setting number of menu items $GLOBALS['TSFE']->register['count_menuItems'] = count($this->menuArr); $this->hash = md5(serialize($this->menuArr) . serialize($this->mconf) . serialize($this->tmpl->rootLine) . serialize($this->MP_array)); // Get the cache timeout: if ($this->conf['cache_period']) { $cacheTimeout = $this->conf['cache_period']; } else { $cacheTimeout = $GLOBALS['TSFE']->get_cache_timeout(); } $serData = $this->sys_page->getHash($this->hash); if (!$serData) { $this->generate(); $this->sys_page->storeHash($this->hash, serialize($this->result), 'MENUDATA', $cacheTimeout); } else { $this->result = unserialize($serData); } // End showAccessRestrictedPages if ($this->mconf['showAccessRestrictedPages']) { // RESTORING where_groupAccess $this->sys_page->where_groupAccess = $SAVED_where_groupAccess; } } }
/** * Setting the language key that will be used by the current page. * In this function it should be checked, 1) that this language exists, 2) that a page_overlay_record exists, .. and if not the default language, 0 (zero), should be set. * * @return void * @access private * @todo Define visibility */ public function settingLanguage() { if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_preProcess'])) { $_params = array(); foreach ($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_preProcess'] as $_funcRef) { \TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction($_funcRef, $_params, $this); } } // Get values from TypoScript: $this->sys_language_uid = $this->sys_language_content = intval($this->config['config']['sys_language_uid']); list($this->sys_language_mode, $sys_language_content) = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(';', $this->config['config']['sys_language_mode']); $this->sys_language_contentOL = $this->config['config']['sys_language_overlay']; // If sys_language_uid is set to another language than default: if ($this->sys_language_uid > 0) { // check whether a shortcut is overwritten by a translated page // we can only do this now, as this is the place where we get // to know about translations $this->checkTranslatedShortcut(); // Request the overlay record for the sys_language_uid: $olRec = $this->sys_page->getPageOverlay($this->id, $this->sys_language_uid); if (!count($olRec)) { // If no OL record exists and a foreign language is asked for... if ($this->sys_language_uid) { // If requested translation is not available: if (\TYPO3\CMS\Core\Utility\GeneralUtility::hideIfNotTranslated($this->page['l18n_cfg'])) { $this->pageNotFoundAndExit('Page is not available in the requested language.'); } else { switch ((string) $this->sys_language_mode) { case 'strict': $this->pageNotFoundAndExit('Page is not available in the requested language (strict).'); break; case 'content_fallback': $fallBackOrder = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $sys_language_content); foreach ($fallBackOrder as $orderValue) { if (!strcmp($orderValue, '0') || count($this->sys_page->getPageOverlay($this->id, $orderValue))) { $this->sys_language_content = $orderValue; // Setting content uid (but leaving the sys_language_uid) break; } } break; case 'ignore': $this->sys_language_content = $this->sys_language_uid; break; default: // Default is that everything defaults to the default language... $this->sys_language_uid = $this->sys_language_content = 0; break; } } } } else { // Setting sys_language if an overlay record was found (which it is only if a language is used) $this->page = $this->sys_page->getPageOverlay($this->page, $this->sys_language_uid); } } // Setting sys_language_uid inside sys-page: $this->sys_page->sys_language_uid = $this->sys_language_uid; // If default translation is not available: if ((!$this->sys_language_uid || !$this->sys_language_content) && $this->page['l18n_cfg'] & 1) { $message = 'Page is not available in default language.'; \TYPO3\CMS\Core\Utility\GeneralUtility::sysLog($message, 'cms', \TYPO3\CMS\Core\Utility\GeneralUtility::SYSLOG_SEVERITY_ERROR); $this->pageNotFoundAndExit($message); } // Updating content of the two rootLines IF the language key is set! if ($this->sys_language_uid && is_array($this->tmpl->rootLine)) { $this->tmpl->rootLine = $this->sys_page->getRootLine($this->id, $this->MP); } if ($this->sys_language_uid && is_array($this->rootLine)) { $this->rootLine = $this->sys_page->getRootLine($this->id, $this->MP); } // Finding the ISO code: if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('static_info_tables') && $this->sys_language_content) { // using sys_language_content because the ISO code only (currently) affect content selection from FlexForms - which should follow "sys_language_content" $sys_language_row = $this->sys_page->getRawRecord('sys_language', $this->sys_language_content, 'static_lang_isocode'); if (is_array($sys_language_row) && $sys_language_row['static_lang_isocode']) { $stLrow = $this->sys_page->getRawRecord('static_languages', $sys_language_row['static_lang_isocode'], 'lg_iso_2'); $this->sys_language_isocode = $stLrow['lg_iso_2']; } } // Setting softMergeIfNotBlank: $table_fields = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $this->config['config']['sys_language_softMergeIfNotBlank'], 1); foreach ($table_fields as $TF) { list($tN, $fN) = explode(':', $TF); $this->TCAcachedExtras[$tN]['l10n_mode'][$fN] = 'mergeIfNotBlank'; } // Setting softExclude: $table_fields = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $this->config['config']['sys_language_softExclude'], 1); foreach ($table_fields as $TF) { list($tN, $fN) = explode(':', $TF); $this->TCAcachedExtras[$tN]['l10n_mode'][$fN] = 'exclude'; } if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_postProcess'])) { $_params = array(); foreach ($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_postProcess'] as $_funcRef) { \TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction($_funcRef, $_params, $this); } } }
/** * Setting the language key that will be used by the current page. * In this function it should be checked, 1) that this language exists, 2) that a page_overlay_record exists, .. and if not the default language, 0 (zero), should be set. * * @return void * @access private */ public function settingLanguage() { if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_preProcess'])) { $_params = array(); foreach ($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_preProcess'] as $_funcRef) { GeneralUtility::callUserFunction($_funcRef, $_params, $this); } } // Initialize charset settings etc. $this->initLLvars(); // Get values from TypoScript: $this->sys_language_uid = $this->sys_language_content = (int) $this->config['config']['sys_language_uid']; list($this->sys_language_mode, $sys_language_content) = GeneralUtility::trimExplode(';', $this->config['config']['sys_language_mode']); $this->sys_language_contentOL = $this->config['config']['sys_language_overlay']; // If sys_language_uid is set to another language than default: if ($this->sys_language_uid > 0) { // check whether a shortcut is overwritten by a translated page // we can only do this now, as this is the place where we get // to know about translations $this->checkTranslatedShortcut(); // Request the overlay record for the sys_language_uid: $olRec = $this->sys_page->getPageOverlay($this->id, $this->sys_language_uid); if (empty($olRec)) { // If no OL record exists and a foreign language is asked for... if ($this->sys_language_uid) { // If requested translation is not available: if (GeneralUtility::hideIfNotTranslated($this->page['l18n_cfg'])) { $this->pageNotFoundAndExit('Page is not available in the requested language.'); } else { switch ((string) $this->sys_language_mode) { case 'strict': $this->pageNotFoundAndExit('Page is not available in the requested language (strict).'); break; case 'content_fallback': $fallBackOrder = GeneralUtility::intExplode(',', $sys_language_content); foreach ($fallBackOrder as $orderValue) { if ((string) $orderValue === '0' || !empty($this->sys_page->getPageOverlay($this->id, $orderValue))) { $this->sys_language_content = $orderValue; // Setting content uid (but leaving the sys_language_uid) break; } } break; case 'ignore': $this->sys_language_content = $this->sys_language_uid; break; default: // Default is that everything defaults to the default language... $this->sys_language_uid = $this->sys_language_content = 0; } } } } else { // Setting sys_language if an overlay record was found (which it is only if a language is used) $this->page = $this->sys_page->getPageOverlay($this->page, $this->sys_language_uid); } } // Setting sys_language_uid inside sys-page: $this->sys_page->sys_language_uid = $this->sys_language_uid; // If default translation is not available: if ((!$this->sys_language_uid || !$this->sys_language_content) && $this->page['l18n_cfg'] & 1) { $message = 'Page is not available in default language.'; GeneralUtility::sysLog($message, 'cms', GeneralUtility::SYSLOG_SEVERITY_ERROR); $this->pageNotFoundAndExit($message); } $this->updateRootLinesWithTranslations(); // Finding the ISO code for the currently selected language // fetched by the sys_language record when not fetching content from the default language if ($this->sys_language_content > 0) { // using sys_language_content because the ISO code only (currently) affect content selection from FlexForms - which should follow "sys_language_content" // Set the fourth parameter to TRUE in the next two getRawRecord() calls to // avoid versioning overlay to be applied as it generates an SQL error $sys_language_row = $this->sys_page->getRawRecord('sys_language', $this->sys_language_content, 'language_isocode,static_lang_isocode', true); if (is_array($sys_language_row)) { if (!empty($sys_language_row['language_isocode'])) { $this->sys_language_isocode = $sys_language_row['language_isocode']; } elseif ($sys_language_row['static_lang_isocode'] && ExtensionManagementUtility::isLoaded('static_info_tables')) { GeneralUtility::deprecationLog('Usage of the field "static_lang_isocode" is discouraged, and will stop working with CMS 8. Use the built-in language field "language_isocode" in your sys_language records.'); $stLrow = $this->sys_page->getRawRecord('static_languages', $sys_language_row['static_lang_isocode'], 'lg_iso_2', true); $this->sys_language_isocode = $stLrow['lg_iso_2']; } } // the DB value is overriden by TypoScript if (!empty($this->config['config']['sys_language_isocode'])) { $this->sys_language_isocode = $this->config['config']['sys_language_isocode']; } } else { // fallback to the TypoScript option when rendering with sys_language_uid=0 // also: use "en" by default if (!empty($this->config['config']['sys_language_isocode_default'])) { $this->sys_language_isocode = $this->config['config']['sys_language_isocode_default']; } else { $this->sys_language_isocode = $this->lang != 'default' ? $this->lang : 'en'; } } // Setting softMergeIfNotBlank: $table_fields = GeneralUtility::trimExplode(',', $this->config['config']['sys_language_softMergeIfNotBlank'], true); foreach ($table_fields as $TF) { list($tN, $fN) = explode(':', $TF); $GLOBALS['TCA'][$tN]['columns'][$fN]['l10n_mode'] = 'mergeIfNotBlank'; } // Setting softExclude: $table_fields = GeneralUtility::trimExplode(',', $this->config['config']['sys_language_softExclude'], true); foreach ($table_fields as $TF) { list($tN, $fN) = explode(':', $TF); $GLOBALS['TCA'][$tN]['columns'][$fN]['l10n_mode'] = 'exclude'; } if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_postProcess'])) { $_params = array(); foreach ($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['settingLanguage_postProcess'] as $_funcRef) { GeneralUtility::callUserFunction($_funcRef, $_params, $this); } } }