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('interfaces/interface.backend_toolbaritem.php');
32 require('classes/class.typo3logo.php');
33 require('classes/class.modulemenu.php');
34 require_once('classes/class.donatewindow.php');
37 require('classes/class.clearcachemenu.php');
38 require('classes/class.shortcutmenu.php');
39 require('classes/class.livesearch.php');
41 $GLOBALS['LANG']->includeLLFile('EXT:lang/locallang_misc.xml');
45 * Class for rendering the TYPO3 backend version 4.2+
47 * @author Ingo Renner <ingo@typo3.org>
58 protected $jsFilesAfterInline;
59 protected $toolbarItems;
60 private $menuWidthDefault = 190; // intentionally private as nobody should modify defaults
65 * Object for loading backend modules
67 * @var t3lib_loadModules
69 protected $moduleLoader;
72 * module menu generating object
76 protected $moduleMenu;
81 * @var t3lib_PageRenderer
83 protected $pageRenderer;
90 public function __construct() {
91 // set debug flag for BE development only
92 $this->debug
= intval($GLOBALS['TYPO3_CONF_VARS']['BE']['debug']) === 1;
94 // Initializes the backend modules structure for use later.
95 $this->moduleLoader
= t3lib_div
::makeInstance('t3lib_loadModules');
96 $this->moduleLoader
->load($GLOBALS['TBE_MODULES']);
98 $this->moduleMenu
= t3lib_div
::makeInstance('ModuleMenu');
100 $this->pageRenderer
= $GLOBALS['TBE_TEMPLATE']->getPageRenderer();
101 $this->pageRenderer
->loadScriptaculous('builder,effects,controls,dragdrop');
102 $this->pageRenderer
->loadExtJS();
103 $this->pageRenderer
->enableExtJSQuickTips();
105 $this->pageRenderer
->addExtOnReadyCode(
106 'TYPO3.Backend = new TYPO3.Viewport(TYPO3.Viewport.configuration);
107 if (typeof console === "undefined") {
108 console = TYPO3.Backend.DebugConsole;
110 TYPO3.ContextHelpWindow.init();',
113 $this->pageRenderer
->addJsInlineCode(
114 'consoleOverrideWithDebugPanel',
117 $this->pageRenderer
->addExtDirectCode();
119 // add default BE javascript
121 $this->jsFiles
= array(
122 'common' => 'js/common.js',
123 'locallang' => $this->getLocalLangFileName(),
124 'modernizr' => 'contrib/modernizr/modernizr.min.js',
125 'swfupload' => 'contrib/swfupload/swfupload.js',
126 'swfupload.swfobject' => 'contrib/swfupload/plugins/swfupload.swfobject.js',
127 'swfupload.cookies' => 'contrib/swfupload/plugins/swfupload.cookies.js',
128 'swfupload.queue' => 'contrib/swfupload/plugins/swfupload.queue.js',
129 'plupload' => 'contrib/plupload/js/plupload.full.min.js',
131 'toolbarmanager' => 'js/toolbarmanager.js',
132 'modulemenu' => 'js/modulemenu.js',
133 'iecompatibility' => 'js/iecompatibility.js',
134 'flashupload' => 'js/flashupload.js',
135 'pluploadPanel' => 'js/extjs/ext.ux.plupload.js',
136 'pluploadWindow' => 'js/extjs/PluploadWindow.js',
137 'evalfield' => '../t3lib/jsfunc.evalfield.js',
138 'flashmessages' => '../t3lib/js/extjs/ux/flashmessages.js',
139 'tabclosemenu' => '../t3lib/js/extjs/ux/ext.ux.tabclosemenu.js',
140 'notifications' => '../t3lib/js/extjs/notifications.js',
141 'backend' => 'js/backend.js',
142 'loginrefresh' => 'js/loginrefresh.js',
143 'debugPanel' => 'js/extjs/debugPanel.js',
144 'viewport' => 'js/extjs/viewport.js',
145 'iframepanel' => 'js/extjs/iframepanel.js',
146 'viewportConfiguration' => 'js/extjs/viewportConfiguration.js',
147 'util' => '../t3lib/js/extjs/util.js',
151 unset($this->jsFiles
['loginrefresh']);
154 // add default BE css
156 $this->cssFiles
= array();
158 $this->toolbarItems
= array();
159 $this->initializeCoreToolbarItems();
161 $this->menuWidth
= $this->menuWidthDefault
;
162 if (isset($GLOBALS['TBE_STYLES']['dims']['leftMenuFrameW']) && (int) $GLOBALS['TBE_STYLES']['dims']['leftMenuFrameW'] != (int) $this->menuWidth
) {
163 $this->menuWidth
= (int) $GLOBALS['TBE_STYLES']['dims']['leftMenuFrameW'];
166 $this->executeHook('constructPostProcess');
170 * initializes the core toolbar items
174 protected function initializeCoreToolbarItems() {
176 $coreToolbarItems = array(
177 'shortcuts' => 'ShortcutMenu',
178 'clearCacheActions' => 'ClearCacheMenu',
179 'liveSearch' => 'LiveSearch'
182 foreach($coreToolbarItems as $toolbarItemName => $toolbarItemClassName) {
183 $toolbarItem = t3lib_div
::makeInstance($toolbarItemClassName, $this);
185 if(!($toolbarItem instanceof backend_toolbarItem
)) {
186 throw new UnexpectedValueException('$toolbarItem "'.$toolbarItemName.'" must implement interface backend_toolbarItem', 1195126772);
189 if($toolbarItem->checkAccess()) {
190 $this->toolbarItems
[$toolbarItemName] = $toolbarItem;
198 * main function generating the BE scaffolding
202 public function render() {
203 $this->executeHook('renderPreProcess');
205 if (t3lib_div
::makeInstance('DonateWindow')->isDonateWindowAllowed()) {
206 $this->pageRenderer
->addJsFile('js/donate.js');
209 // prepare the scaffolding, at this point extension may still add javascript and css
210 $logo = t3lib_div
::makeInstance('TYPO3Logo');
211 $logo->setLogo('gfx/typo3logo_mini.png');
215 // create backend scaffolding
216 $backendScaffolding = '
217 <div id="typo3-top-container" class="x-hide-display">
218 <div id="typo3-logo">'.$logo->render().'</div>
219 <div id="typo3-top" class="typo3-top-toolbar">' .
220 $this->renderToolbar() .
226 /******************************************************
227 * now put the complete backend document together
228 ******************************************************/
230 foreach($this->cssFiles
as $cssFileName => $cssFile) {
231 $this->pageRenderer
->addCssFile($cssFile);
233 // load addditional css files to overwrite existing core styles
234 if(!empty($GLOBALS['TBE_STYLES']['stylesheets'][$cssFileName])) {
235 $this->pageRenderer
->addCssFile($GLOBALS['TBE_STYLES']['stylesheets'][$cssFileName]);
239 if(!empty($this->css
)) {
240 $this->pageRenderer
->addCssInlineBlock('BackendInlineCSS', $this->css
);
243 foreach ($this->jsFiles
as $jsFile) {
244 $this->pageRenderer
->addJsFile($jsFile);
248 // TYPO3.Ajax.ExtDirec is used for BE toolbar items and may be later for general services
249 if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ExtDirect']) && is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ExtDirect'])) {
250 foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ExtDirect'] as $key => $value) {
251 if (strpos($key, 'TYPO3.Ajax.ExtDirect') !== FALSE) {
252 $this->pageRenderer
->addJsFile('ajax.php?ajaxID=ExtDirect::getAPI&namespace=TYPO3.Ajax.ExtDirect', NULL, FALSE);
257 $this->pageRenderer
->addJsFile('ajax.php?ajaxID=ExtDirect::getAPI&namespace=TYPO3.BackendUserSettings', NULL, FALSE);
259 $this->generateJavascript();
260 $this->pageRenderer
->addJsInlineCode('BackendInlineJavascript', $this->js
);
262 $this->loadResourcesForRegisteredNavigationComponents();
264 // add state provider
265 $GLOBALS['TBE_TEMPLATE']->setExtDirectStateProvider();
266 $states = $GLOBALS['BE_USER']->uc
['BackendComponents']['States'];
267 //save states in BE_USER->uc
269 Ext.state.Manager.setProvider(new TYPO3.state.ExtDirectProvider({
270 key: "BackendComponents.States"
274 $extOnReadyCode .= 'Ext.state.Manager.getProvider().initState(' . $states . ');';
276 $this->pageRenderer
->addExtOnReadyCode($extOnReadyCode);
279 // set document title:
280 $title = ($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']
281 ?
$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'].' [TYPO3 '.TYPO3_version
.']'
282 : 'TYPO3 '.TYPO3_version
285 $this->content
= $backendScaffolding;
286 // Renders the module page
287 $this->content
= $GLOBALS['TBE_TEMPLATE']->render(
292 $hookConfiguration = array('content' => &$this->content
);
293 $this->executeHook('renderPostProcess', $hookConfiguration);
299 * Loads the css and javascript files of all registered navigation widgets
303 protected function loadResourcesForRegisteredNavigationComponents() {
304 if (!is_array($GLOBALS['TBE_MODULES']['_navigationComponents'])) {
308 $loadedComponents = array();
309 foreach ($GLOBALS['TBE_MODULES']['_navigationComponents'] as $module => $info) {
310 if (in_array($info['componentId'], $loadedComponents)) {
313 $loadedComponents[] = $info['componentId'];
315 $component = strtolower(substr($info['componentId'], strrpos($info['componentId'], '-') +
1));
316 $componentDirectory = 'components/' . $component . '/';
318 if ($info['isCoreComponent']) {
319 $absoluteComponentPath = PATH_t3lib
. 'js/extjs/' . $componentDirectory;
320 $relativeComponentPath = '../' . str_replace(PATH_site
, '', $absoluteComponentPath);
322 $absoluteComponentPath = t3lib_extMgm
::extPath($info['extKey']) . $componentDirectory;
323 $relativeComponentPath = t3lib_extMgm
::extRelPath($info['extKey']) . $componentDirectory;
326 $cssFiles = t3lib_div
::getFilesInDir($absoluteComponentPath . 'css/', 'css');
327 if (file_exists($absoluteComponentPath . 'css/loadorder.txt')) {
328 //don't allow inclusion outside directory
329 $loadOrder = str_replace('../', '', t3lib_div
::getURL($absoluteComponentPath . 'css/loadorder.txt'));
330 $cssFilesOrdered = t3lib_div
::trimExplode(LF
, $loadOrder, TRUE);
331 $cssFiles = array_merge($cssFilesOrdered, $cssFiles);
333 foreach ($cssFiles as $cssFile) {
334 $this->pageRenderer
->addCssFile($relativeComponentPath . 'css/' . $cssFile);
337 $jsFiles = t3lib_div
::getFilesInDir($absoluteComponentPath . 'javascript/', 'js');
338 if (file_exists($absoluteComponentPath . 'javascript/loadorder.txt')) {
339 //don't allow inclusion outside directory
340 $loadOrder = str_replace('../', '', t3lib_div
::getURL($absoluteComponentPath . 'javascript/loadorder.txt'));
341 $jsFilesOrdered = t3lib_div
::trimExplode(LF
, $loadOrder, TRUE);
342 $jsFiles = array_merge($jsFilesOrdered, $jsFiles);
345 foreach ($jsFiles as $jsFile) {
346 $this->pageRenderer
->addJsFile($relativeComponentPath . 'javascript/' . $jsFile);
349 if (is_array($info['extDirectNamespaces']) && count($info['extDirectNamespaces'])) {
350 foreach ($info['extDirectNamespaces'] as $namespace) {
351 $this->pageRenderer
->addJsFile(
352 'ajax.php?ajaxID=ExtDirect::getAPI&namespace=' . $namespace,
362 * renders the items in the top toolbar
364 * @return string top toolbar elements as HTML
366 protected function renderToolbar() {
368 // move search to last position
369 $search = $this->toolbarItems
['liveSearch'];
370 unset($this->toolbarItems
['liveSearch']);
371 $this->toolbarItems
['liveSearch'] = $search;
373 $toolbar = '<ul id="typo3-toolbar">';
374 $toolbar.= '<li>'.$this->getLoggedInUserLabel().'</li>
375 <li><div id="logout-button" class="toolbar-item no-separator">'.$this->moduleMenu
->renderLogoutButton().'</div></li>';
377 foreach($this->toolbarItems
as $toolbarItem) {
378 $menu = $toolbarItem->render();
380 $additionalAttributes = $toolbarItem->getAdditionalAttributes();
381 $toolbar .= '<li' . $additionalAttributes . '>' .$menu. '</li>';
385 return $toolbar.'</ul>';
389 * Gets the label of the BE user currently logged in
391 * @return string html code snippet displaying the currently logged in user
393 protected function getLoggedInUserLabel() {
394 global $BE_USER, $BACK_PATH;
396 $icon = t3lib_iconWorks
::getSpriteIcon('status-user-'. ($BE_USER->isAdmin() ?
'admin' : 'backend'));
398 $label = $GLOBALS['BE_USER']->user
['realName'] ?
399 $BE_USER->user
['realName'] . ' (' . $BE_USER->user
['username'] . ')' :
400 $BE_USER->user
['username'];
402 // Link to user setup if it's loaded and user has access
404 if (t3lib_extMgm
::isLoaded('setup') && $BE_USER->check('modules','user_setup')) {
405 $link = '<a href="#" onclick="top.goToModule(\'user_setup\');this.blur();return false;">';
408 $username = '">'.$link.$icon.'<span>'.htmlspecialchars($label).'</span>'.($link?
'</a>':'');
411 if($BE_USER->user
['ses_backuserid']) {
412 $username = ' su-user">'.$icon.
413 '<span title="' . $GLOBALS['LANG']->getLL('switchtouser') . '">' .
414 $GLOBALS['LANG']->getLL('switchtousershort') . ' </span>' .
415 '<span>' . htmlspecialchars($label) . '</span>';
418 return '<div id="username" class="toolbar-item no-separator'.$username.'</div>';
422 * Returns the file name to the LLL JavaScript, containing the localized labels,
423 * which can be used in JavaScript code.
425 * @return string File name of the JS file, relative to TYPO3_mainDir
427 protected function getLocalLangFileName() {
428 $code = $this->generateLocalLang();
429 $filePath = 'typo3temp/locallang-BE-' . sha1($code) . '.js';
430 if (!file_exists(PATH_site
. $filePath)) {
431 // writeFileToTypo3tempDir() returns NULL on success (please double-read!)
432 if (t3lib_div
::writeFileToTypo3tempDir(PATH_site
. $filePath, $code) !== NULL) {
433 throw new RuntimeException('LocalLangFile could not be written to ' . $filePath, 1295193026);
436 return '../' . $filePath;
440 * Reads labels required in JavaScript code from the localization system and returns them as JSON
441 * array in TYPO3.LLL.
443 * @return string JavaScript code containing the LLL labels in TYPO3.LLL
445 protected function generateLocalLang() {
447 'waitTitle' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_logging_in') ,
448 'refresh_login_failed' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_failed'),
449 'refresh_login_failed_message' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_failed_message'),
450 'refresh_login_title' => sprintf($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_title'), htmlspecialchars($GLOBALS['BE_USER']->user
['username'])),
451 'login_expired' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.login_expired'),
452 'refresh_login_username' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_username'),
453 'refresh_login_password' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_password'),
454 'refresh_login_emptyPassword' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_emptyPassword'),
455 'refresh_login_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_button'),
456 'refresh_logout_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_logout_button'),
457 'please_wait' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.please_wait'),
458 'loadingIndicator' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:loadingIndicator'),
459 'be_locked' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.be_locked'),
460 'refresh_login_countdown_singular' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_countdown_singular'),
461 'refresh_login_countdown' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_countdown'),
462 'login_about_to_expire' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.login_about_to_expire'),
463 'login_about_to_expire_title' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.login_about_to_expire_title'),
464 'refresh_login_refresh_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_refresh_button'),
465 'refresh_direct_logout_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_direct_logout_button'),
466 'tabs_closeAll' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeAll'),
467 'tabs_closeOther' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeOther'),
468 'tabs_close' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.close'),
469 'tabs_openInBrowserWindow' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.openInBrowserWindow'),
470 'donateWindow_title' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.title'),
471 'donateWindow_message' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.message'),
472 'donateWindow_button_donate' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.button_donate'),
473 'donateWindow_button_disable' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.button_disable'),
474 'donateWindow_button_postpone' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.button_postpone'),
475 'csh_tooltip_loading' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:csh_tooltip_loading'),
479 'fileUpload' => array(
485 'infoComponentMaxFileSize',
486 'infoComponentFileUploadLimit',
487 'infoComponentFileTypeLimit',
488 'infoComponentOverrideFiles',
489 'infoFileQueueEmpty',
498 'errorQueueLimitExceeded',
499 'errorQueueFileSizeLimit',
500 'errorQueueZeroByteFile',
501 'errorQueueInvalidFiletype',
503 'errorUploadMissingUrl',
505 'errorUploadSecurityError',
508 'errorUploadFileIDNotFound',
509 'errorUploadFileValidation',
510 'errorUploadFileCancelled',
511 'errorUploadStopped',
512 'allErrorMessageTitle',
513 'allErrorMessageText',
517 'liveSearch' => array(
525 'helpDescriptionPages',
526 'helpDescriptionContent',
529 $generatedLabels = array();
530 $generatedLabels['core'] = $coreLabels;
532 // first loop over all categories (fileUpload, liveSearch, ..)
533 foreach ($labels as $categoryName => $categoryLabels) {
534 // then loop over every single label
535 foreach ($categoryLabels as $label) {
536 // LLL identifier must be called $categoryName_$label, e.g. liveSearch_loadingText
537 $generatedLabels[$categoryName][$label] = $GLOBALS['LANG']->getLL($categoryName . '_' . $label);
541 // Convert labels/settings back to UTF-8 since json_encode() only works with UTF-8:
542 if ($GLOBALS['LANG']->charSet
!== 'utf-8') {
543 $GLOBALS['LANG']->csConvObj
->convArray($generatedLabels, $GLOBALS['LANG']->charSet
, 'utf-8');
546 return 'TYPO3.LLL = ' . json_encode($generatedLabels) . ';';
550 * Generates the JavaScript code for the backend.
554 protected function generateJavascript() {
556 $pathTYPO3 = t3lib_div
::dirname(t3lib_div
::getIndpEnv('SCRIPT_NAME')).'/';
558 // If another page module was specified, replace the default Page module with the new one
559 $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
560 $pageModule = t3lib_BEfunc
::isModuleSetInTBE_MODULES($newPageModule) ?
$newPageModule : 'web_layout';
561 if (!$GLOBALS['BE_USER']->check('modules', $pageModule)) {
565 $menuFrameName = 'menu';
566 if($GLOBALS['BE_USER']->uc
['noMenuMode'] === 'icons') {
567 $menuFrameName = 'topmenuFrame';
570 // determine security level from conf vars and default to super challenged
571 if ($GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel']) {
572 $this->loginSecurityLevel
= $GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel'];
574 $this->loginSecurityLevel
= 'superchallenged';
577 $t3Configuration = array(
578 'siteUrl' => t3lib_div
::getIndpEnv('TYPO3_SITE_URL'),
579 'PATH_typo3' => $pathTYPO3,
580 'PATH_typo3_enc' => rawurlencode($pathTYPO3),
581 'username' => htmlspecialchars($GLOBALS['BE_USER']->user
['username']),
582 'uniqueID' => t3lib_div
::shortMD5(uniqid('')),
583 'securityLevel' => $this->loginSecurityLevel
,
584 'TYPO3_mainDir' => TYPO3_mainDir
,
585 'pageModule' => $pageModule,
586 'condensedMode' => $GLOBALS['BE_USER']->uc
['condensedMode'] ?
1 : 0 ,
587 'inWorkspace' => $GLOBALS['BE_USER']->workspace
!== 0 ?
1 : 0,
588 'workspaceFrontendPreviewEnabled' => $GLOBALS['BE_USER']->user
['workspace_preview'] ?
1 : 0,
589 'veriCode' => $GLOBALS['BE_USER']->veriCode(),
590 'denyFileTypes' => PHP_EXTENSIONS_DEFAULT
,
591 'moduleMenuWidth' => $this->menuWidth
- 1,
592 'topBarHeight' => (isset($GLOBALS['TBE_STYLES']['dims']['topFrameH']) ?
intval($GLOBALS['TBE_STYLES']['dims']['topFrameH']) : 30),
593 'showRefreshLoginPopup' => isset($GLOBALS['TYPO3_CONF_VARS']['BE']['showRefreshLoginPopup']) ?
intval($GLOBALS['TYPO3_CONF_VARS']['BE']['showRefreshLoginPopup']) : FALSE,
594 'listModulePath' => t3lib_extMgm
::isLoaded('recordlist') ? t3lib_extMgm
::extRelPath('recordlist') . 'mod1/' : '',
595 'debugInWindow' => $GLOBALS['BE_USER']->uc
['debugInWindow'] ?
1 : 0,
596 'ContextHelpWindows' => array(
600 'FileUpload' => array(
601 'maxFileSize' => t3lib_div
::getMaxUploadFileSize()
604 if ($GLOBALS['LANG']->charSet
!== 'utf-8') {
605 $t3Configuration['username'] = $GLOBALS['LANG']->csConvObj
->conv($t3Configuration['username'], $GLOBALS['LANG']->charSet
, 'utf-8');
609 TYPO3.configuration = ' . json_encode($t3Configuration) . ';
614 function typoSetup() { //
615 this.PATH_typo3 = TYPO3.configuration.PATH_typo3;
616 this.PATH_typo3_enc = TYPO3.configuration.PATH_typo3_enc;
617 this.username = TYPO3.configuration.username;
618 this.uniqueID = TYPO3.configuration.uniqueID;
619 this.navFrameWidth = 0;
620 this.securityLevel = TYPO3.configuration.securityLevel;
621 this.veriCode = TYPO3.configuration.veriCode;
622 this.denyFileTypes = TYPO3.configuration.denyFileTypes;
624 var TS = new typoSetup();
625 //backwards compatibility
627 * Frameset Module object
629 * Used in main modules with a frameset for submodules to keep the ID between modules
630 * Typically that is set by something like this in a Web>* sub module:
631 * if (top.fsMod) top.fsMod.recentIds["web"] = "\'.intval($this->id).\'";
632 * if (top.fsMod) top.fsMod.recentIds["file"] = "...(file reference/string)...";
634 function fsModules() { //
635 this.recentIds=new Array(); // used by frameset modules to track the most recent used id for list frame.
636 this.navFrameHighlightedID=new Array(); // used by navigation frames to track which row id was highlighted last time
637 this.currentMainLoaded="";
638 this.currentBank="0";
640 var fsMod = new fsModules();
642 top.goToModule = function(modName, cMR_flag, addGetVars) {
643 TYPO3.ModuleMenu.App.showModule(modName, addGetVars);
645 ' . $this->setStartupModule();
647 // Check editing of page:
648 $this->handlePageEditing();
653 * Checking if the "&edit" variable was sent so we can open it for editing the page.
654 * Code based on code from "alt_shortcut.php"
658 protected function handlePageEditing() {
660 if(!t3lib_extMgm
::isLoaded('cms')) {
665 $editId = preg_replace('/[^[:alnum:]_]/', '', t3lib_div
::_GET('edit'));
670 // Looking up the page to edit, checking permissions:
671 $where = ' AND ('.$GLOBALS['BE_USER']->getPagePermsClause(2)
672 .' OR '.$GLOBALS['BE_USER']->getPagePermsClause(16).')';
674 if(t3lib_div
::testInt($editId)) {
675 $editRecord = t3lib_BEfunc
::getRecordWSOL('pages', $editId, '*', $where);
677 $records = t3lib_BEfunc
::getRecordsByField('pages', 'alias', $editId, $where);
679 if(is_array($records)) {
681 $editRecord = current($records);
682 t3lib_BEfunc
::workspaceOL('pages', $editRecord);
686 // If the page was accessible, then let the user edit it.
687 if(is_array($editRecord) && $GLOBALS['BE_USER']->isInWebMount($editRecord['uid'])) {
688 // Setting JS code to open editing:
690 // Load page to edit:
691 window.setTimeout("top.loadEditId('.intval($editRecord['uid']).');", 500);
694 // "Shortcuts" have been renamed to "Bookmarks"
695 // @deprecated remove shortcuts code in TYPO3 4.7
696 $shortcutSetPageTree = $GLOBALS['BE_USER']->getTSConfigVal('options.shortcut_onEditId_dontSetPageTree');
697 $bookmarkSetPageTree = $GLOBALS['BE_USER']->getTSConfigVal('options.bookmark_onEditId_dontSetPageTree');
698 if ($shortcutSetPageTree !== '') {
699 t3lib_div
::deprecationLog('options.shortcut_onEditId_dontSetPageTree - since TYPO3 4.5, will be removed in TYPO3 4.7 - use options.bookmark_onEditId_dontSetPageTree instead');
702 // Checking page edit parameter:
703 if (!$shortcutSetPageTree && !$bookmarkSetPageTree) {
705 $shortcutKeepExpanded = $GLOBALS['BE_USER']->getTSConfigVal('options.shortcut_onEditId_keepExistingExpanded');
706 $bookmarkKeepExpanded = $GLOBALS['BE_USER']->getTSConfigVal('options.bookmark_onEditId_keepExistingExpanded');
707 $keepExpanded = ($shortcutKeepExpanded ||
$bookmarkKeepExpanded);
709 // Expanding page tree:
710 t3lib_BEfunc
::openPageTree(intval($editRecord['pid']), !$keepExpanded);
712 if ($shortcutKeepExpanded) {
713 t3lib_div
::deprecationLog('options.shortcut_onEditId_keepExistingExpanded - since TYPO3 4.5, will be removed in TYPO3 4.7 - use options.bookmark_onEditId_keepExistingExpanded instead');
718 // Warning about page editing:
719 alert('.$GLOBALS['LANG']->JScharCode(sprintf($GLOBALS['LANG']->getLL('noEditPage'), $editId)).');
726 * Sets the startup module from either GETvars module and mpdParams or user configuration.
730 protected function setStartupModule() {
731 $startModule = preg_replace('/[^[:alnum:]_]/', '', t3lib_div
::_GET('module'));
734 if ($GLOBALS['BE_USER']->uc
['startModule']) {
735 $startModule = $GLOBALS['BE_USER']->uc
['startModule'];
736 } else if($GLOBALS['BE_USER']->uc
['startInTaskCenter']) {
737 $startModule = 'user_task';
741 $moduleParameters = t3lib_div
::_GET('modParams');
745 top.startInModule = [\'' . $startModule . '\', ' . t3lib_div
::quoteJSvalue($moduleParameters) . '];
754 * adds a javascript snippet to the backend
756 * @param string javascript snippet
759 public function addJavascript($javascript) {
760 // TODO do we need more checks?
761 if(!is_string($javascript)) {
762 throw new InvalidArgumentException('parameter $javascript must be of type string', 1195129553);
765 $this->js
.= $javascript;
769 * adds a javscript file to the backend after it has been checked that it exists
771 * @param string javascript file reference
772 * @return boolean true if the javascript file was successfully added, false otherwise
774 public function addJavascriptFile($javascriptFile) {
775 $jsFileAdded = false;
777 //TODO add more checks if neccessary
778 if(file_exists(t3lib_div
::resolveBackPath(PATH_typo3
.$javascriptFile))) {
779 $this->jsFiles
[] = $javascriptFile;
787 * adds a css snippet to the backend
789 * @param string css snippet
792 public function addCss($css) {
793 if(!is_string($css)) {
794 throw new InvalidArgumentException('parameter $css must be of type string', 1195129642);
801 * adds a css file to the backend after it has been checked that it exists
803 * @param string the css file's name with out the .css ending
804 * @param string css file reference
805 * @return boolean true if the css file was added, false otherwise
807 public function addCssFile($cssFileName, $cssFile) {
808 $cssFileAdded = false;
810 if(empty($this->cssFiles
[$cssFileName])) {
811 $this->cssFiles
[$cssFileName] = $cssFile;
812 $cssFileAdded = true;
815 return $cssFileAdded;
819 * adds an item to the toolbar, the class file for the toolbar item must be loaded at this point
821 * @param string toolbar item name, f.e. tx_toolbarExtension_coolItem
822 * @param string toolbar item class name, f.e. tx_toolbarExtension_coolItem
825 public function addToolbarItem($toolbarItemName, $toolbarItemClassName) {
826 $toolbarItem = t3lib_div
::makeInstance($toolbarItemClassName, $this);
828 if(!($toolbarItem instanceof backend_toolbarItem
)) {
829 throw new UnexpectedValueException('$toolbarItem "'.$toolbarItemName.'" must implement interface backend_toolbarItem', 1195125501);
832 if($toolbarItem->checkAccess()) {
833 $this->toolbarItems
[$toolbarItemName] = $toolbarItem;
840 * Executes defined hooks functions for the given identifier.
842 * These hook identifiers are valid:
843 * + constructPostProcess
845 * + renderPostProcess
847 * @param string $identifier Specific hook identifier
848 * @param array $hookConfiguration Additional configuration passed to hook functions
851 protected function executeHook($identifier, array $hookConfiguration = array()) {
852 $options =& $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/backend.php'];
854 if(isset($options[$identifier]) && is_array($options[$identifier])) {
855 foreach($options[$identifier] as $hookFunction) {
856 t3lib_div
::callUserFunction($hookFunction, $hookConfiguration, $this);
864 if(defined('TYPO3_MODE') && $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE
]['XCLASS']['typo3/backend.php']) {
865 include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE
]['XCLASS']['typo3/backend.php']);
869 // document generation
870 $TYPO3backend = t3lib_div
::makeInstance('TYPO3backend');
872 // include extensions which may add css, javascript or toolbar items
873 if(is_array($GLOBALS['TYPO3_CONF_VARS']['typo3/backend.php']['additionalBackendItems'])) {
874 foreach($GLOBALS['TYPO3_CONF_VARS']['typo3/backend.php']['additionalBackendItems'] as $additionalBackendItem) {
875 include_once($additionalBackendItem);
879 $TYPO3backend->render();