2 /***************************************************************
5 * (c) 2007-2011 Ingo Renner <ingo@typo3.org>
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
28 require_once('init.php');
29 require_once('template.php');
30 require_once(PATH_typo3
. 'interfaces/interface.backend_toolbaritem.php');
32 require('classes/class.typo3logo.php');
33 require('classes/class.modulemenu.php');
36 require('classes/class.clearcachemenu.php');
37 require('classes/class.shortcutmenu.php');
38 require('classes/class.livesearch.php');
40 $GLOBALS['LANG']->includeLLFile('EXT:lang/locallang_misc.xml');
44 * Class for rendering the TYPO3 backend version 4.2+
46 * @author Ingo Renner <ingo@typo3.org>
57 protected $jsFilesAfterInline;
58 protected $toolbarItems;
59 private $menuWidthDefault = 190; // intentionally private as nobody should modify defaults
64 * Object for loading backend modules
66 * @var t3lib_loadModules
68 protected $moduleLoader;
71 * module menu generating object
75 protected $moduleMenu;
80 * @var t3lib_PageRenderer
82 protected $pageRenderer;
89 public function __construct() {
90 // set debug flag for BE development only
91 $this->debug
= intval($GLOBALS['TYPO3_CONF_VARS']['BE']['debug']) === 1;
93 // Initializes the backend modules structure for use later.
94 $this->moduleLoader
= t3lib_div
::makeInstance('t3lib_loadModules');
95 $this->moduleLoader
->load($GLOBALS['TBE_MODULES']);
97 $this->moduleMenu
= t3lib_div
::makeInstance('ModuleMenu');
99 $this->pageRenderer
= $GLOBALS['TBE_TEMPLATE']->getPageRenderer();
100 $this->pageRenderer
->loadScriptaculous('builder,effects,controls,dragdrop');
101 $this->pageRenderer
->loadExtJS();
102 $this->pageRenderer
->enableExtJSQuickTips();
105 $this->pageRenderer
->addJsInlineCode(
106 'consoleOverrideWithDebugPanel',
110 $this->pageRenderer
->addExtDirectCode();
112 // add default BE javascript
114 $this->jsFiles
= array(
115 'common' => 'js/common.js',
116 'locallang' => $this->getLocalLangFileName(),
117 'modernizr' => 'contrib/modernizr/modernizr.min.js',
118 'swfupload' => 'contrib/swfupload/swfupload.js',
119 'swfupload.swfobject' => 'contrib/swfupload/plugins/swfupload.swfobject.js',
120 'swfupload.cookies' => 'contrib/swfupload/plugins/swfupload.cookies.js',
121 'swfupload.queue' => 'contrib/swfupload/plugins/swfupload.queue.js',
123 'toolbarmanager' => 'js/toolbarmanager.js',
124 'modulemenu' => 'js/modulemenu.js',
125 'iecompatibility' => 'js/iecompatibility.js',
126 'flashupload' => 'js/flashupload.js',
127 'evalfield' => '../t3lib/jsfunc.evalfield.js',
128 'flashmessages' => '../t3lib/js/extjs/ux/flashmessages.js',
129 'tabclosemenu' => '../t3lib/js/extjs/ux/ext.ux.tabclosemenu.js',
130 'notifications' => '../t3lib/js/extjs/notifications.js',
131 'backend' => 'js/backend.js',
132 'loginrefresh' => 'js/loginrefresh.js',
133 'debugPanel' => 'js/extjs/debugPanel.js',
134 'viewport' => 'js/extjs/viewport.js',
135 'iframepanel' => 'js/extjs/iframepanel.js',
136 'modulepanel' => 'js/extjs/modulepanel.js',
137 'viewportConfiguration' => 'js/extjs/viewportConfiguration.js',
138 'util' => '../t3lib/js/extjs/util.js',
142 unset($this->jsFiles
['loginrefresh']);
145 // add default BE css
147 $this->cssFiles
= array();
149 $this->toolbarItems
= array();
150 $this->initializeCoreToolbarItems();
152 $this->menuWidth
= $this->menuWidthDefault
;
153 if (isset($GLOBALS['TBE_STYLES']['dims']['leftMenuFrameW']) && (int) $GLOBALS['TBE_STYLES']['dims']['leftMenuFrameW'] != (int) $this->menuWidth
) {
154 $this->menuWidth
= (int) $GLOBALS['TBE_STYLES']['dims']['leftMenuFrameW'];
157 $this->executeHook('constructPostProcess');
161 * initializes the core toolbar items
165 protected function initializeCoreToolbarItems() {
167 $coreToolbarItems = array(
168 'shortcuts' => 'ShortcutMenu',
169 'clearCacheActions' => 'ClearCacheMenu',
170 'liveSearch' => 'LiveSearch'
173 foreach($coreToolbarItems as $toolbarItemName => $toolbarItemClassName) {
174 $toolbarItem = t3lib_div
::makeInstance($toolbarItemClassName, $this);
176 if(!($toolbarItem instanceof backend_toolbarItem
)) {
177 throw new UnexpectedValueException('$toolbarItem "'.$toolbarItemName.'" must implement interface backend_toolbarItem', 1195126772);
180 if($toolbarItem->checkAccess()) {
181 $this->toolbarItems
[$toolbarItemName] = $toolbarItem;
189 * main function generating the BE scaffolding
193 public function render() {
194 $this->executeHook('renderPreProcess');
196 // prepare the scaffolding, at this point extension may still add javascript and css
197 $logo = t3lib_div
::makeInstance('TYPO3Logo');
198 $logo->setLogo('gfx/typo3logo_mini.png');
202 // create backend scaffolding
203 $backendScaffolding = '
204 <div id="typo3-top-container" class="x-hide-display">
205 <div id="typo3-logo">'.$logo->render().'</div>
206 <div id="typo3-top" class="typo3-top-toolbar">' .
207 $this->renderToolbar() .
213 /******************************************************
214 * now put the complete backend document together
215 ******************************************************/
217 foreach($this->cssFiles
as $cssFileName => $cssFile) {
218 $this->pageRenderer
->addCssFile($cssFile);
220 // load addditional css files to overwrite existing core styles
221 if(!empty($GLOBALS['TBE_STYLES']['stylesheets'][$cssFileName])) {
222 $this->pageRenderer
->addCssFile($GLOBALS['TBE_STYLES']['stylesheets'][$cssFileName]);
226 if(!empty($this->css
)) {
227 $this->pageRenderer
->addCssInlineBlock('BackendInlineCSS', $this->css
);
230 foreach ($this->jsFiles
as $jsFile) {
231 $this->pageRenderer
->addJsFile($jsFile);
235 $this->generateJavascript();
236 $this->pageRenderer
->addJsInlineCode('BackendInlineJavascript', $this->js
, FALSE);
238 $this->loadResourcesForRegisteredNavigationComponents();
240 // add state provider
241 $GLOBALS['TBE_TEMPLATE']->setExtDirectStateProvider();
242 $states = $GLOBALS['BE_USER']->uc
['BackendComponents']['States'];
243 //save states in BE_USER->uc
245 Ext.state.Manager.setProvider(new TYPO3.state.ExtDirectProvider({
246 key: "BackendComponents.States",
251 $extOnReadyCode .= 'Ext.state.Manager.getProvider().initState(' . json_encode($states) . ');';
254 TYPO3.Backend = new TYPO3.Viewport(TYPO3.Viewport.configuration);
255 if (typeof console === "undefined") {
256 console = TYPO3.Backend.DebugConsole;
258 TYPO3.ContextHelpWindow.init();';
259 $this->pageRenderer
->addExtOnReadyCode($extOnReadyCode);
262 // set document title:
263 $title = ($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']
264 ?
$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'].' [TYPO3 '.TYPO3_version
.']'
265 : 'TYPO3 '.TYPO3_version
268 $this->content
= $backendScaffolding;
269 // Renders the module page
270 $this->content
= $GLOBALS['TBE_TEMPLATE']->render(
275 $hookConfiguration = array('content' => &$this->content
);
276 $this->executeHook('renderPostProcess', $hookConfiguration);
282 * Loads the css and javascript files of all registered navigation widgets
286 protected function loadResourcesForRegisteredNavigationComponents() {
287 if (!is_array($GLOBALS['TBE_MODULES']['_navigationComponents'])) {
291 $loadedComponents = array();
292 foreach ($GLOBALS['TBE_MODULES']['_navigationComponents'] as $module => $info) {
293 if (in_array($info['componentId'], $loadedComponents)) {
296 $loadedComponents[] = $info['componentId'];
298 $component = strtolower(substr($info['componentId'], strrpos($info['componentId'], '-') +
1));
299 $componentDirectory = 'components/' . $component . '/';
301 if ($info['isCoreComponent']) {
302 $absoluteComponentPath = PATH_t3lib
. 'js/extjs/' . $componentDirectory;
303 $relativeComponentPath = '../' . str_replace(PATH_site
, '', $absoluteComponentPath);
305 $absoluteComponentPath = t3lib_extMgm
::extPath($info['extKey']) . $componentDirectory;
306 $relativeComponentPath = t3lib_extMgm
::extRelPath($info['extKey']) . $componentDirectory;
309 $cssFiles = t3lib_div
::getFilesInDir($absoluteComponentPath . 'css/', 'css');
310 if (file_exists($absoluteComponentPath . 'css/loadorder.txt')) {
311 //don't allow inclusion outside directory
312 $loadOrder = str_replace('../', '', t3lib_div
::getUrl($absoluteComponentPath . 'css/loadorder.txt'));
313 $cssFilesOrdered = t3lib_div
::trimExplode(LF
, $loadOrder, TRUE);
314 $cssFiles = array_merge($cssFilesOrdered, $cssFiles);
316 foreach ($cssFiles as $cssFile) {
317 $this->pageRenderer
->addCssFile($relativeComponentPath . 'css/' . $cssFile);
320 $jsFiles = t3lib_div
::getFilesInDir($absoluteComponentPath . 'javascript/', 'js');
321 if (file_exists($absoluteComponentPath . 'javascript/loadorder.txt')) {
322 //don't allow inclusion outside directory
323 $loadOrder = str_replace('../', '', t3lib_div
::getUrl($absoluteComponentPath . 'javascript/loadorder.txt'));
324 $jsFilesOrdered = t3lib_div
::trimExplode(LF
, $loadOrder, TRUE);
325 $jsFiles = array_merge($jsFilesOrdered, $jsFiles);
328 foreach ($jsFiles as $jsFile) {
329 $this->pageRenderer
->addJsFile($relativeComponentPath . 'javascript/' . $jsFile);
335 * renders the items in the top toolbar
337 * @return string top toolbar elements as HTML
339 protected function renderToolbar() {
341 // move search to last position
342 if (array_key_exists('liveSearch', $this->toolbarItems
)) {
343 $search = $this->toolbarItems
['liveSearch'];
344 unset($this->toolbarItems
['liveSearch']);
345 $this->toolbarItems
['liveSearch'] = $search;
348 $toolbar = '<ul id="typo3-toolbar">';
349 $toolbar.= '<li>'.$this->getLoggedInUserLabel().'</li>
350 <li><div id="logout-button" class="toolbar-item no-separator">'.$this->moduleMenu
->renderLogoutButton().'</div></li>';
352 foreach($this->toolbarItems
as $toolbarItem) {
353 $menu = $toolbarItem->render();
355 $additionalAttributes = $toolbarItem->getAdditionalAttributes();
356 $toolbar .= '<li' . $additionalAttributes . '>' .$menu. '</li>';
360 return $toolbar.'</ul>';
364 * Gets the label of the BE user currently logged in
366 * @return string html code snippet displaying the currently logged in user
368 protected function getLoggedInUserLabel() {
369 $icon = t3lib_iconWorks
::getSpriteIcon('status-user-' . ($GLOBALS['BE_USER']->isAdmin() ?
'admin' : 'backend'));
371 $label = $GLOBALS['BE_USER']->user
['realName'] ?
372 $GLOBALS['BE_USER']->user
['realName'] . ' (' . $GLOBALS['BE_USER']->user
['username'] . ')' :
373 $GLOBALS['BE_USER']->user
['username'];
375 // Link to user setup if it's loaded and user has access
377 if (t3lib_extMgm
::isLoaded('setup') && $GLOBALS['BE_USER']->check('modules','user_setup')) {
378 $link = '<a href="#" onclick="top.goToModule(\'user_setup\');this.blur();return false;">';
381 $username = '">'.$link.$icon.'<span>'.htmlspecialchars($label).'</span>'.($link?
'</a>':'');
384 if ($GLOBALS['BE_USER']->user
['ses_backuserid']) {
385 $username = ' su-user">'.$icon.
386 '<span title="' . $GLOBALS['LANG']->getLL('switchtouser') . '">' .
387 $GLOBALS['LANG']->getLL('switchtousershort') . ' </span>' .
388 '<span>' . htmlspecialchars($label) . '</span>';
391 return '<div id="username" class="toolbar-item no-separator'.$username.'</div>';
395 * Returns the file name to the LLL JavaScript, containing the localized labels,
396 * which can be used in JavaScript code.
398 * @return string File name of the JS file, relative to TYPO3_mainDir
400 protected function getLocalLangFileName() {
401 $code = $this->generateLocalLang();
402 $filePath = 'typo3temp/locallang-BE-' . sha1($code) . '.js';
403 if (!file_exists(PATH_site
. $filePath)) {
404 // writeFileToTypo3tempDir() returns NULL on success (please double-read!)
405 if (t3lib_div
::writeFileToTypo3tempDir(PATH_site
. $filePath, $code) !== NULL) {
406 throw new RuntimeException('LocalLangFile could not be written to ' . $filePath, 1295193026);
409 return '../' . $filePath;
413 * Reads labels required in JavaScript code from the localization system and returns them as JSON
414 * array in TYPO3.LLL.
416 * @return string JavaScript code containing the LLL labels in TYPO3.LLL
418 protected function generateLocalLang() {
420 'waitTitle' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_logging_in') ,
421 'refresh_login_failed' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_failed'),
422 'refresh_login_failed_message' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_failed_message'),
423 'refresh_login_title' => sprintf($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_title'), htmlspecialchars($GLOBALS['BE_USER']->user
['username'])),
424 'login_expired' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.login_expired'),
425 'refresh_login_username' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_username'),
426 'refresh_login_password' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_password'),
427 'refresh_login_emptyPassword' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_emptyPassword'),
428 'refresh_login_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_button'),
429 'refresh_logout_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_logout_button'),
430 'please_wait' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.please_wait'),
431 'loadingIndicator' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:loadingIndicator'),
432 'be_locked' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.be_locked'),
433 'refresh_login_countdown_singular' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_countdown_singular'),
434 'refresh_login_countdown' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_countdown'),
435 'login_about_to_expire' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.login_about_to_expire'),
436 'login_about_to_expire_title' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.login_about_to_expire_title'),
437 'refresh_login_refresh_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_refresh_button'),
438 'refresh_direct_logout_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_direct_logout_button'),
439 'tabs_closeAll' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeAll'),
440 'tabs_closeOther' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeOther'),
441 'tabs_close' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.close'),
442 'tabs_openInBrowserWindow' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.openInBrowserWindow'),
443 'csh_tooltip_loading' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:csh_tooltip_loading'),
447 'fileUpload' => array(
451 'infoComponentMaxFileSize',
452 'infoComponentFileUploadLimit',
453 'infoComponentFileTypeLimit',
454 'infoComponentOverrideFiles',
460 'errorQueueLimitExceeded',
461 'errorQueueFileSizeLimit',
462 'errorQueueZeroByteFile',
463 'errorQueueInvalidFiletype',
465 'errorUploadMissingUrl',
467 'errorUploadSecurityError',
470 'errorUploadFileIDNotFound',
471 'errorUploadFileValidation',
472 'errorUploadFileCancelled',
473 'errorUploadStopped',
474 'allErrorMessageTitle',
475 'allErrorMessageText',
479 'liveSearch' => array(
487 'helpDescriptionPages',
488 'helpDescriptionContent',
491 'tooltipModuleMenuSplit',
492 'tooltipNavigationContainerSplitDrag',
493 'tooltipDebugPanelSplitDrag',
497 $generatedLabels = array();
498 $generatedLabels['core'] = $coreLabels;
500 // first loop over all categories (fileUpload, liveSearch, ..)
501 foreach ($labels as $categoryName => $categoryLabels) {
502 // then loop over every single label
503 foreach ($categoryLabels as $label) {
504 // LLL identifier must be called $categoryName_$label, e.g. liveSearch_loadingText
505 $generatedLabels[$categoryName][$label] = $GLOBALS['LANG']->getLL($categoryName . '_' . $label);
509 // Convert labels/settings back to UTF-8 since json_encode() only works with UTF-8:
510 if ($GLOBALS['LANG']->charSet
!== 'utf-8') {
511 $GLOBALS['LANG']->csConvObj
->convArray($generatedLabels, $GLOBALS['LANG']->charSet
, 'utf-8');
514 return 'TYPO3.LLL = ' . json_encode($generatedLabels) . ';';
518 * Generates the JavaScript code for the backend.
522 protected function generateJavascript() {
524 $pathTYPO3 = t3lib_div
::dirname(t3lib_div
::getIndpEnv('SCRIPT_NAME')).'/';
526 // If another page module was specified, replace the default Page module with the new one
527 $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
528 $pageModule = t3lib_BEfunc
::isModuleSetInTBE_MODULES($newPageModule) ?
$newPageModule : 'web_layout';
529 if (!$GLOBALS['BE_USER']->check('modules', $pageModule)) {
533 $menuFrameName = 'menu';
534 if($GLOBALS['BE_USER']->uc
['noMenuMode'] === 'icons') {
535 $menuFrameName = 'topmenuFrame';
538 // determine security level from conf vars and default to super challenged
539 if ($GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel']) {
540 $this->loginSecurityLevel
= $GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel'];
542 $this->loginSecurityLevel
= 'superchallenged';
545 $t3Configuration = array(
546 'siteUrl' => t3lib_div
::getIndpEnv('TYPO3_SITE_URL'),
547 'PATH_typo3' => $pathTYPO3,
548 'PATH_typo3_enc' => rawurlencode($pathTYPO3),
549 'username' => htmlspecialchars($GLOBALS['BE_USER']->user
['username']),
550 'uniqueID' => t3lib_div
::shortMD5(uniqid('')),
551 'securityLevel' => $this->loginSecurityLevel
,
552 'TYPO3_mainDir' => TYPO3_mainDir
,
553 'pageModule' => $pageModule,
554 'condensedMode' => $GLOBALS['BE_USER']->uc
['condensedMode'] ?
1 : 0 ,
555 'inWorkspace' => $GLOBALS['BE_USER']->workspace
!== 0 ?
1 : 0,
556 'workspaceFrontendPreviewEnabled' => $GLOBALS['BE_USER']->user
['workspace_preview'] ?
1 : 0,
557 'veriCode' => $GLOBALS['BE_USER']->veriCode(),
558 'denyFileTypes' => PHP_EXTENSIONS_DEFAULT
,
559 'moduleMenuWidth' => $this->menuWidth
- 1,
560 'topBarHeight' => (isset($GLOBALS['TBE_STYLES']['dims']['topFrameH']) ?
intval($GLOBALS['TBE_STYLES']['dims']['topFrameH']) : 30),
561 'showRefreshLoginPopup' => isset($GLOBALS['TYPO3_CONF_VARS']['BE']['showRefreshLoginPopup']) ?
intval($GLOBALS['TYPO3_CONF_VARS']['BE']['showRefreshLoginPopup']) : FALSE,
562 'listModulePath' => t3lib_extMgm
::isLoaded('recordlist') ? t3lib_extMgm
::extRelPath('recordlist') . 'mod1/' : '',
563 'debugInWindow' => $GLOBALS['BE_USER']->uc
['debugInWindow'] ?
1 : 0,
564 'ContextHelpWindows' => array(
568 'firstWebmountPid' => intval($GLOBALS['WEBMOUNTS'][0]),
570 if ($GLOBALS['LANG']->charSet
!== 'utf-8') {
571 $t3Configuration['username'] = $GLOBALS['LANG']->csConvObj
->conv($t3Configuration['username'], $GLOBALS['LANG']->charSet
, 'utf-8');
575 TYPO3.configuration = ' . json_encode($t3Configuration) . ';
580 function typoSetup() { //
581 this.PATH_typo3 = TYPO3.configuration.PATH_typo3;
582 this.PATH_typo3_enc = TYPO3.configuration.PATH_typo3_enc;
583 this.username = TYPO3.configuration.username;
584 this.uniqueID = TYPO3.configuration.uniqueID;
585 this.navFrameWidth = 0;
586 this.securityLevel = TYPO3.configuration.securityLevel;
587 this.veriCode = TYPO3.configuration.veriCode;
588 this.denyFileTypes = TYPO3.configuration.denyFileTypes;
590 var TS = new typoSetup();
591 //backwards compatibility
593 * Frameset Module object
595 * Used in main modules with a frameset for submodules to keep the ID between modules
596 * Typically that is set by something like this in a Web>* sub module:
597 * if (top.fsMod) top.fsMod.recentIds["web"] = "\'.intval($this->id).\'";
598 * if (top.fsMod) top.fsMod.recentIds["file"] = "...(file reference/string)...";
600 function fsModules() { //
601 this.recentIds=new Array(); // used by frameset modules to track the most recent used id for list frame.
602 this.navFrameHighlightedID=new Array(); // used by navigation frames to track which row id was highlighted last time
603 this.currentMainLoaded="";
604 this.currentBank="0";
606 var fsMod = new fsModules();
608 top.goToModule = function(modName, cMR_flag, addGetVars) {
609 TYPO3.ModuleMenu.App.showModule(modName, addGetVars);
611 ' . $this->setStartupModule();
613 // Check editing of page:
614 $this->handlePageEditing();
619 * Checking if the "&edit" variable was sent so we can open it for editing the page.
620 * Code based on code from "alt_shortcut.php"
624 protected function handlePageEditing() {
626 if(!t3lib_extMgm
::isLoaded('cms')) {
631 $editId = preg_replace('/[^[:alnum:]_]/', '', t3lib_div
::_GET('edit'));
636 // Looking up the page to edit, checking permissions:
637 $where = ' AND ('.$GLOBALS['BE_USER']->getPagePermsClause(2)
638 .' OR '.$GLOBALS['BE_USER']->getPagePermsClause(16).')';
640 if(t3lib_utility_Math
::canBeInterpretedAsInteger($editId)) {
641 $editRecord = t3lib_BEfunc
::getRecordWSOL('pages', $editId, '*', $where);
643 $records = t3lib_BEfunc
::getRecordsByField('pages', 'alias', $editId, $where);
645 if(is_array($records)) {
646 $editRecord = reset($records);
647 t3lib_BEfunc
::workspaceOL('pages', $editRecord);
651 // If the page was accessible, then let the user edit it.
652 if(is_array($editRecord) && $GLOBALS['BE_USER']->isInWebMount($editRecord['uid'])) {
653 // Setting JS code to open editing:
655 // Load page to edit:
656 window.setTimeout("top.loadEditId('.intval($editRecord['uid']).');", 500);
659 // Checking page edit parameter:
660 if (!$GLOBALS['BE_USER']->getTSConfigVal('options.bookmark_onEditId_dontSetPageTree')) {
661 $bookmarkKeepExpanded = $GLOBALS['BE_USER']->getTSConfigVal('options.bookmark_onEditId_keepExistingExpanded');
663 // Expanding page tree:
664 t3lib_BEfunc
::openPageTree(intval($editRecord['pid']), !$bookmarkKeepExpanded);
668 // Warning about page editing:
669 alert('.$GLOBALS['LANG']->JScharCode(sprintf($GLOBALS['LANG']->getLL('noEditPage'), $editId)).');
676 * Sets the startup module from either GETvars module and mpdParams or user configuration.
680 protected function setStartupModule() {
681 $startModule = preg_replace('/[^[:alnum:]_]/', '', t3lib_div
::_GET('module'));
684 if ($GLOBALS['BE_USER']->uc
['startModule']) {
685 $startModule = $GLOBALS['BE_USER']->uc
['startModule'];
686 } elseif ($GLOBALS['BE_USER']->uc
['startInTaskCenter']) {
687 $startModule = 'user_task';
691 $moduleParameters = t3lib_div
::_GET('modParams');
695 top.startInModule = [\'' . $startModule . '\', ' . t3lib_div
::quoteJSvalue($moduleParameters) . '];
704 * adds a javascript snippet to the backend
706 * @param string javascript snippet
709 public function addJavascript($javascript) {
710 // TODO do we need more checks?
711 if(!is_string($javascript)) {
712 throw new InvalidArgumentException('parameter $javascript must be of type string', 1195129553);
715 $this->js
.= $javascript;
719 * adds a javscript file to the backend after it has been checked that it exists
721 * @param string javascript file reference
722 * @return boolean TRUE if the javascript file was successfully added, FALSE otherwise
724 public function addJavascriptFile($javascriptFile) {
725 $jsFileAdded = FALSE;
727 //TODO add more checks if neccessary
728 if(file_exists(t3lib_div
::resolveBackPath(PATH_typo3
.$javascriptFile))) {
729 $this->jsFiles
[] = $javascriptFile;
737 * adds a css snippet to the backend
739 * @param string css snippet
742 public function addCss($css) {
743 if(!is_string($css)) {
744 throw new InvalidArgumentException('parameter $css must be of type string', 1195129642);
751 * adds a css file to the backend after it has been checked that it exists
753 * @param string the css file's name with out the .css ending
754 * @param string css file reference
755 * @return boolean TRUE if the css file was added, FALSE otherwise
757 public function addCssFile($cssFileName, $cssFile) {
758 $cssFileAdded = FALSE;
760 if(empty($this->cssFiles
[$cssFileName])) {
761 $this->cssFiles
[$cssFileName] = $cssFile;
762 $cssFileAdded = TRUE;
765 return $cssFileAdded;
769 * adds an item to the toolbar, the class file for the toolbar item must be loaded at this point
771 * @param string toolbar item name, f.e. tx_toolbarExtension_coolItem
772 * @param string toolbar item class name, f.e. tx_toolbarExtension_coolItem
775 public function addToolbarItem($toolbarItemName, $toolbarItemClassName) {
776 $toolbarItem = t3lib_div
::makeInstance($toolbarItemClassName, $this);
778 if(!($toolbarItem instanceof backend_toolbarItem
)) {
779 throw new UnexpectedValueException('$toolbarItem "'.$toolbarItemName.'" must implement interface backend_toolbarItem', 1195125501);
782 if($toolbarItem->checkAccess()) {
783 $this->toolbarItems
[$toolbarItemName] = $toolbarItem;
790 * Executes defined hooks functions for the given identifier.
792 * These hook identifiers are valid:
793 * + constructPostProcess
795 * + renderPostProcess
797 * @param string $identifier Specific hook identifier
798 * @param array $hookConfiguration Additional configuration passed to hook functions
801 protected function executeHook($identifier, array $hookConfiguration = array()) {
802 $options =& $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/backend.php'];
804 if(isset($options[$identifier]) && is_array($options[$identifier])) {
805 foreach($options[$identifier] as $hookFunction) {
806 t3lib_div
::callUserFunction($hookFunction, $hookConfiguration, $this);
814 if(defined('TYPO3_MODE') && $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE
]['XCLASS']['typo3/backend.php']) {
815 include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE
]['XCLASS']['typo3/backend.php']);
819 // document generation
820 $TYPO3backend = t3lib_div
::makeInstance('TYPO3backend');
822 // include extensions which may add css, javascript or toolbar items
823 if(is_array($GLOBALS['TYPO3_CONF_VARS']['typo3/backend.php']['additionalBackendItems'])) {
824 foreach($GLOBALS['TYPO3_CONF_VARS']['typo3/backend.php']['additionalBackendItems'] as $additionalBackendItem) {
825 include_once($additionalBackendItem);
829 $TYPO3backend->render();