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 'backendcontentiframe' => 'js/extjs/backendcontentiframe.js',
137 'modulepanel' => 'js/extjs/modulepanel.js',
138 'viewportConfiguration' => 'js/extjs/viewportConfiguration.js',
139 'util' => '../t3lib/js/extjs/util.js',
143 unset($this->jsFiles
['loginrefresh']);
146 // add default BE css
148 $this->cssFiles
= array();
150 $this->toolbarItems
= array();
151 $this->initializeCoreToolbarItems();
153 $this->menuWidth
= $this->menuWidthDefault
;
154 if (isset($GLOBALS['TBE_STYLES']['dims']['leftMenuFrameW']) && (int) $GLOBALS['TBE_STYLES']['dims']['leftMenuFrameW'] != (int) $this->menuWidth
) {
155 $this->menuWidth
= (int) $GLOBALS['TBE_STYLES']['dims']['leftMenuFrameW'];
158 $this->executeHook('constructPostProcess');
162 * initializes the core toolbar items
166 protected function initializeCoreToolbarItems() {
168 $coreToolbarItems = array(
169 'shortcuts' => 'ShortcutMenu',
170 'clearCacheActions' => 'ClearCacheMenu',
171 'liveSearch' => 'LiveSearch'
174 foreach($coreToolbarItems as $toolbarItemName => $toolbarItemClassName) {
175 $toolbarItem = t3lib_div
::makeInstance($toolbarItemClassName, $this);
177 if(!($toolbarItem instanceof backend_toolbarItem
)) {
178 throw new UnexpectedValueException('$toolbarItem "'.$toolbarItemName.'" must implement interface backend_toolbarItem', 1195126772);
181 if($toolbarItem->checkAccess()) {
182 $this->toolbarItems
[$toolbarItemName] = $toolbarItem;
190 * main function generating the BE scaffolding
194 public function render() {
195 $this->executeHook('renderPreProcess');
197 // prepare the scaffolding, at this point extension may still add javascript and css
198 $logo = t3lib_div
::makeInstance('TYPO3Logo');
199 $logo->setLogo('gfx/typo3logo_mini.png');
203 // create backend scaffolding
204 $backendScaffolding = '
205 <div id="typo3-top-container" class="x-hide-display">
206 <div id="typo3-logo">'.$logo->render().'</div>
207 <div id="typo3-top" class="typo3-top-toolbar">' .
208 $this->renderToolbar() .
214 /******************************************************
215 * now put the complete backend document together
216 ******************************************************/
218 foreach($this->cssFiles
as $cssFileName => $cssFile) {
219 $this->pageRenderer
->addCssFile($cssFile);
221 // load addditional css files to overwrite existing core styles
222 if(!empty($GLOBALS['TBE_STYLES']['stylesheets'][$cssFileName])) {
223 $this->pageRenderer
->addCssFile($GLOBALS['TBE_STYLES']['stylesheets'][$cssFileName]);
227 if(!empty($this->css
)) {
228 $this->pageRenderer
->addCssInlineBlock('BackendInlineCSS', $this->css
);
231 foreach ($this->jsFiles
as $jsFile) {
232 $this->pageRenderer
->addJsFile($jsFile);
236 $this->generateJavascript();
237 $this->pageRenderer
->addJsInlineCode('BackendInlineJavascript', $this->js
, FALSE);
239 $this->loadResourcesForRegisteredNavigationComponents();
241 // add state provider
242 $GLOBALS['TBE_TEMPLATE']->setExtDirectStateProvider();
243 $states = $GLOBALS['BE_USER']->uc
['BackendComponents']['States'];
244 //save states in BE_USER->uc
246 Ext.state.Manager.setProvider(new TYPO3.state.ExtDirectProvider({
247 key: "BackendComponents.States",
252 $extOnReadyCode .= 'Ext.state.Manager.getProvider().initState(' . json_encode($states) . ');';
255 TYPO3.Backend = new TYPO3.Viewport(TYPO3.Viewport.configuration);
256 if (typeof console === "undefined") {
257 console = TYPO3.Backend.DebugConsole;
259 TYPO3.ContextHelpWindow.init();';
260 $this->pageRenderer
->addExtOnReadyCode($extOnReadyCode);
263 // set document title:
264 $title = ($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']
265 ?
$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'].' [TYPO3 '.TYPO3_version
.']'
266 : 'TYPO3 '.TYPO3_version
269 $this->content
= $backendScaffolding;
270 // Renders the module page
271 $this->content
= $GLOBALS['TBE_TEMPLATE']->render(
276 $hookConfiguration = array('content' => &$this->content
);
277 $this->executeHook('renderPostProcess', $hookConfiguration);
283 * Loads the css and javascript files of all registered navigation widgets
287 protected function loadResourcesForRegisteredNavigationComponents() {
288 if (!is_array($GLOBALS['TBE_MODULES']['_navigationComponents'])) {
292 $loadedComponents = array();
293 foreach ($GLOBALS['TBE_MODULES']['_navigationComponents'] as $module => $info) {
294 if (in_array($info['componentId'], $loadedComponents)) {
297 $loadedComponents[] = $info['componentId'];
299 $component = strtolower(substr($info['componentId'], strrpos($info['componentId'], '-') +
1));
300 $componentDirectory = 'components/' . $component . '/';
302 if ($info['isCoreComponent']) {
303 $absoluteComponentPath = PATH_t3lib
. 'js/extjs/' . $componentDirectory;
304 $relativeComponentPath = '../' . str_replace(PATH_site
, '', $absoluteComponentPath);
306 $absoluteComponentPath = t3lib_extMgm
::extPath($info['extKey']) . $componentDirectory;
307 $relativeComponentPath = t3lib_extMgm
::extRelPath($info['extKey']) . $componentDirectory;
310 $cssFiles = t3lib_div
::getFilesInDir($absoluteComponentPath . 'css/', 'css');
311 if (file_exists($absoluteComponentPath . 'css/loadorder.txt')) {
312 //don't allow inclusion outside directory
313 $loadOrder = str_replace('../', '', t3lib_div
::getUrl($absoluteComponentPath . 'css/loadorder.txt'));
314 $cssFilesOrdered = t3lib_div
::trimExplode(LF
, $loadOrder, TRUE);
315 $cssFiles = array_merge($cssFilesOrdered, $cssFiles);
317 foreach ($cssFiles as $cssFile) {
318 $this->pageRenderer
->addCssFile($relativeComponentPath . 'css/' . $cssFile);
321 $jsFiles = t3lib_div
::getFilesInDir($absoluteComponentPath . 'javascript/', 'js');
322 if (file_exists($absoluteComponentPath . 'javascript/loadorder.txt')) {
323 //don't allow inclusion outside directory
324 $loadOrder = str_replace('../', '', t3lib_div
::getUrl($absoluteComponentPath . 'javascript/loadorder.txt'));
325 $jsFilesOrdered = t3lib_div
::trimExplode(LF
, $loadOrder, TRUE);
326 $jsFiles = array_merge($jsFilesOrdered, $jsFiles);
329 foreach ($jsFiles as $jsFile) {
330 $this->pageRenderer
->addJsFile($relativeComponentPath . 'javascript/' . $jsFile);
336 * renders the items in the top toolbar
338 * @return string top toolbar elements as HTML
340 protected function renderToolbar() {
342 // move search to last position
343 if (array_key_exists('liveSearch', $this->toolbarItems
)) {
344 $search = $this->toolbarItems
['liveSearch'];
345 unset($this->toolbarItems
['liveSearch']);
346 $this->toolbarItems
['liveSearch'] = $search;
349 $toolbar = '<ul id="typo3-toolbar">';
350 $toolbar .= '<li>' . $this->getLoggedInUserLabel() . '</li>';
351 $toolbar .= '<li class="separator"><div id="logout-button" class="toolbar-item no-separator">' . $this->moduleMenu
->renderLogoutButton() . '</div></li>';
354 foreach($this->toolbarItems
as $key => $toolbarItem) {
356 $menu = $toolbarItem->render();
358 $additionalAttributes = $toolbarItem->getAdditionalAttributes();
359 if (sizeof($this->toolbarItems
) > 1 && $i == sizeof($this->toolbarItems
) -1) {
360 if (strpos($additionalAttributes, 'class="'))
361 str_replace('class="', 'class="separator ', $additionalAttributes);
363 $additionalAttributes .= 'class="separator"';
365 $toolbar .= '<li' . $additionalAttributes . '>' .$menu. '</li>';
369 return $toolbar.'</ul>';
373 * Gets the label of the BE user currently logged in
375 * @return string html code snippet displaying the currently logged in user
377 protected function getLoggedInUserLabel() {
378 $css = 'toolbar-item';
379 $icon = t3lib_iconWorks
::getSpriteIcon('status-user-' . ($GLOBALS['BE_USER']->isAdmin() ?
'admin' : 'backend'));
380 $realName = $GLOBALS['BE_USER']->user
['realName'];
381 $username = $GLOBALS['BE_USER']->user
['username'];
383 $label = $realName ?
$realName : $username;
386 // Link to user setup if it's loaded and user has access
388 if (t3lib_extMgm
::isLoaded('setup') && $GLOBALS['BE_USER']->check('modules', 'user_setup')) {
389 $link = '<a href="#" onclick="top.goToModule(\'user_setup\'); this.blur(); return false;">';
393 if ($GLOBALS['BE_USER']->user
['ses_backuserid']) {
395 $title = $GLOBALS['LANG']->getLL('switchtouser') . ': ' . $username;
396 $label = $GLOBALS['LANG']->getLL('switchtousershort') . ' ' .
397 ($realName ?
$realName . ' (' . $username . ')' : $username);
400 return '<div id="username" class="' . $css . '">' . $link . $icon .
401 '<span title="' . htmlspecialchars($title) . '">' . htmlspecialchars($label) . '</span>' .
402 ($link ?
'</a>' : '') . '</div>';
406 * Returns the file name to the LLL JavaScript, containing the localized labels,
407 * which can be used in JavaScript code.
409 * @return string File name of the JS file, relative to TYPO3_mainDir
411 protected function getLocalLangFileName() {
412 $code = $this->generateLocalLang();
413 $filePath = 'typo3temp/locallang-BE-' . sha1($code) . '.js';
414 if (!file_exists(PATH_site
. $filePath)) {
415 // writeFileToTypo3tempDir() returns NULL on success (please double-read!)
416 if (t3lib_div
::writeFileToTypo3tempDir(PATH_site
. $filePath, $code) !== NULL) {
417 throw new RuntimeException('LocalLangFile could not be written to ' . $filePath, 1295193026);
420 return '../' . $filePath;
424 * Reads labels required in JavaScript code from the localization system and returns them as JSON
425 * array in TYPO3.LLL.
427 * @return string JavaScript code containing the LLL labels in TYPO3.LLL
429 protected function generateLocalLang() {
431 'waitTitle' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_logging_in') ,
432 'refresh_login_failed' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_failed'),
433 'refresh_login_failed_message' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_failed_message'),
434 'refresh_login_title' => sprintf($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_title'), htmlspecialchars($GLOBALS['BE_USER']->user
['username'])),
435 'login_expired' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.login_expired'),
436 'refresh_login_username' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_username'),
437 'refresh_login_password' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_password'),
438 'refresh_login_emptyPassword' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_emptyPassword'),
439 'refresh_login_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_button'),
440 'refresh_logout_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_logout_button'),
441 'please_wait' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.please_wait'),
442 'loadingIndicator' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:loadingIndicator'),
443 'be_locked' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.be_locked'),
444 'refresh_login_countdown_singular' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_countdown_singular'),
445 'refresh_login_countdown' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_countdown'),
446 'login_about_to_expire' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.login_about_to_expire'),
447 'login_about_to_expire_title' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.login_about_to_expire_title'),
448 'refresh_login_refresh_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_login_refresh_button'),
449 'refresh_direct_logout_button' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:mess.refresh_direct_logout_button'),
450 'tabs_closeAll' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeAll'),
451 'tabs_closeOther' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeOther'),
452 'tabs_close' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.close'),
453 'tabs_openInBrowserWindow' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.openInBrowserWindow'),
454 'csh_tooltip_loading' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:csh_tooltip_loading'),
458 'fileUpload' => array(
462 'infoComponentMaxFileSize',
463 'infoComponentFileUploadLimit',
464 'infoComponentFileTypeLimit',
465 'infoComponentOverrideFiles',
471 'errorQueueLimitExceeded',
472 'errorQueueFileSizeLimit',
473 'errorQueueZeroByteFile',
474 'errorQueueInvalidFiletype',
476 'errorUploadMissingUrl',
478 'errorUploadSecurityError',
481 'errorUploadFileIDNotFound',
482 'errorUploadFileValidation',
483 'errorUploadFileCancelled',
484 'errorUploadStopped',
485 'allErrorMessageTitle',
486 'allErrorMessageText',
490 'liveSearch' => array(
498 'helpDescriptionPages',
499 'helpDescriptionContent',
502 'tooltipModuleMenuSplit',
503 'tooltipNavigationContainerSplitDrag',
504 'tooltipDebugPanelSplitDrag',
508 $generatedLabels = array();
509 $generatedLabels['core'] = $coreLabels;
511 // first loop over all categories (fileUpload, liveSearch, ..)
512 foreach ($labels as $categoryName => $categoryLabels) {
513 // then loop over every single label
514 foreach ($categoryLabels as $label) {
515 // LLL identifier must be called $categoryName_$label, e.g. liveSearch_loadingText
516 $generatedLabels[$categoryName][$label] = $GLOBALS['LANG']->getLL($categoryName . '_' . $label);
520 return 'TYPO3.LLL = ' . json_encode($generatedLabels) . ';';
524 * Generates the JavaScript code for the backend.
528 protected function generateJavascript() {
530 $pathTYPO3 = t3lib_div
::dirname(t3lib_div
::getIndpEnv('SCRIPT_NAME')).'/';
532 // If another page module was specified, replace the default Page module with the new one
533 $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
534 $pageModule = t3lib_BEfunc
::isModuleSetInTBE_MODULES($newPageModule) ?
$newPageModule : 'web_layout';
535 if (!$GLOBALS['BE_USER']->check('modules', $pageModule)) {
539 $menuFrameName = 'menu';
540 if($GLOBALS['BE_USER']->uc
['noMenuMode'] === 'icons') {
541 $menuFrameName = 'topmenuFrame';
544 // determine security level from conf vars and default to super challenged
545 if ($GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel']) {
546 $this->loginSecurityLevel
= $GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel'];
548 $this->loginSecurityLevel
= 'superchallenged';
551 $t3Configuration = array(
552 'siteUrl' => t3lib_div
::getIndpEnv('TYPO3_SITE_URL'),
553 'PATH_typo3' => $pathTYPO3,
554 'PATH_typo3_enc' => rawurlencode($pathTYPO3),
555 'username' => htmlspecialchars($GLOBALS['BE_USER']->user
['username']),
556 'uniqueID' => t3lib_div
::shortMD5(uniqid('')),
557 'securityLevel' => $this->loginSecurityLevel
,
558 'TYPO3_mainDir' => TYPO3_mainDir
,
559 'pageModule' => $pageModule,
560 'condensedMode' => $GLOBALS['BE_USER']->uc
['condensedMode'] ?
1 : 0 ,
561 'inWorkspace' => $GLOBALS['BE_USER']->workspace
!== 0 ?
1 : 0,
562 'workspaceFrontendPreviewEnabled' => $GLOBALS['BE_USER']->user
['workspace_preview'] ?
1 : 0,
563 'veriCode' => $GLOBALS['BE_USER']->veriCode(),
564 'denyFileTypes' => PHP_EXTENSIONS_DEFAULT
,
565 'moduleMenuWidth' => $this->menuWidth
- 1,
566 'topBarHeight' => (isset($GLOBALS['TBE_STYLES']['dims']['topFrameH']) ?
intval($GLOBALS['TBE_STYLES']['dims']['topFrameH']) : 30),
567 'showRefreshLoginPopup' => isset($GLOBALS['TYPO3_CONF_VARS']['BE']['showRefreshLoginPopup']) ?
intval($GLOBALS['TYPO3_CONF_VARS']['BE']['showRefreshLoginPopup']) : FALSE,
568 'listModulePath' => t3lib_extMgm
::isLoaded('recordlist') ? t3lib_extMgm
::extRelPath('recordlist') . 'mod1/' : '',
569 'debugInWindow' => $GLOBALS['BE_USER']->uc
['debugInWindow'] ?
1 : 0,
570 'ContextHelpWindows' => array(
574 'firstWebmountPid' => intval($GLOBALS['WEBMOUNTS'][0]),
578 TYPO3.configuration = ' . json_encode($t3Configuration) . ';
583 function typoSetup() { //
584 this.PATH_typo3 = TYPO3.configuration.PATH_typo3;
585 this.PATH_typo3_enc = TYPO3.configuration.PATH_typo3_enc;
586 this.username = TYPO3.configuration.username;
587 this.uniqueID = TYPO3.configuration.uniqueID;
588 this.navFrameWidth = 0;
589 this.securityLevel = TYPO3.configuration.securityLevel;
590 this.veriCode = TYPO3.configuration.veriCode;
591 this.denyFileTypes = TYPO3.configuration.denyFileTypes;
593 var TS = new typoSetup();
594 //backwards compatibility
596 * Frameset Module object
598 * Used in main modules with a frameset for submodules to keep the ID between modules
599 * Typically that is set by something like this in a Web>* sub module:
600 * if (top.fsMod) top.fsMod.recentIds["web"] = "\'.intval($this->id).\'";
601 * if (top.fsMod) top.fsMod.recentIds["file"] = "...(file reference/string)...";
603 function fsModules() { //
604 this.recentIds=new Array(); // used by frameset modules to track the most recent used id for list frame.
605 this.navFrameHighlightedID=new Array(); // used by navigation frames to track which row id was highlighted last time
606 this.currentMainLoaded="";
607 this.currentBank="0";
609 var fsMod = new fsModules();
611 top.goToModule = function(modName, cMR_flag, addGetVars) {
612 TYPO3.ModuleMenu.App.showModule(modName, addGetVars);
614 ' . $this->setStartupModule();
616 // Check editing of page:
617 $this->handlePageEditing();
622 * Checking if the "&edit" variable was sent so we can open it for editing the page.
623 * Code based on code from "alt_shortcut.php"
627 protected function handlePageEditing() {
629 if(!t3lib_extMgm
::isLoaded('cms')) {
634 $editId = preg_replace('/[^[:alnum:]_]/', '', t3lib_div
::_GET('edit'));
639 // Looking up the page to edit, checking permissions:
640 $where = ' AND ('.$GLOBALS['BE_USER']->getPagePermsClause(2)
641 .' OR '.$GLOBALS['BE_USER']->getPagePermsClause(16).')';
643 if(t3lib_utility_Math
::canBeInterpretedAsInteger($editId)) {
644 $editRecord = t3lib_BEfunc
::getRecordWSOL('pages', $editId, '*', $where);
646 $records = t3lib_BEfunc
::getRecordsByField('pages', 'alias', $editId, $where);
648 if(is_array($records)) {
649 $editRecord = reset($records);
650 t3lib_BEfunc
::workspaceOL('pages', $editRecord);
654 // If the page was accessible, then let the user edit it.
655 if(is_array($editRecord) && $GLOBALS['BE_USER']->isInWebMount($editRecord['uid'])) {
656 // Setting JS code to open editing:
658 // Load page to edit:
659 window.setTimeout("top.loadEditId('.intval($editRecord['uid']).');", 500);
662 // Checking page edit parameter:
663 if (!$GLOBALS['BE_USER']->getTSConfigVal('options.bookmark_onEditId_dontSetPageTree')) {
664 $bookmarkKeepExpanded = $GLOBALS['BE_USER']->getTSConfigVal('options.bookmark_onEditId_keepExistingExpanded');
666 // Expanding page tree:
667 t3lib_BEfunc
::openPageTree(intval($editRecord['pid']), !$bookmarkKeepExpanded);
671 // Warning about page editing:
672 alert('.$GLOBALS['LANG']->JScharCode(sprintf($GLOBALS['LANG']->getLL('noEditPage'), $editId)).');
679 * Sets the startup module from either GETvars module and mpdParams or user configuration.
683 protected function setStartupModule() {
684 $startModule = preg_replace('/[^[:alnum:]_]/', '', t3lib_div
::_GET('module'));
687 if ($GLOBALS['BE_USER']->uc
['startModule']) {
688 $startModule = $GLOBALS['BE_USER']->uc
['startModule'];
689 } elseif ($GLOBALS['BE_USER']->uc
['startInTaskCenter']) {
690 $startModule = 'user_task';
694 $moduleParameters = t3lib_div
::_GET('modParams');
698 top.startInModule = [\'' . $startModule . '\', ' . t3lib_div
::quoteJSvalue($moduleParameters) . '];
707 * adds a javascript snippet to the backend
709 * @param string javascript snippet
712 public function addJavascript($javascript) {
713 // TODO do we need more checks?
714 if(!is_string($javascript)) {
715 throw new InvalidArgumentException('parameter $javascript must be of type string', 1195129553);
718 $this->js
.= $javascript;
722 * adds a javscript file to the backend after it has been checked that it exists
724 * @param string javascript file reference
725 * @return boolean TRUE if the javascript file was successfully added, FALSE otherwise
727 public function addJavascriptFile($javascriptFile) {
728 $jsFileAdded = FALSE;
730 //TODO add more checks if neccessary
731 if(file_exists(t3lib_div
::resolveBackPath(PATH_typo3
.$javascriptFile))) {
732 $this->jsFiles
[] = $javascriptFile;
740 * adds a css snippet to the backend
742 * @param string css snippet
745 public function addCss($css) {
746 if(!is_string($css)) {
747 throw new InvalidArgumentException('parameter $css must be of type string', 1195129642);
754 * adds a css file to the backend after it has been checked that it exists
756 * @param string the css file's name with out the .css ending
757 * @param string css file reference
758 * @return boolean TRUE if the css file was added, FALSE otherwise
760 public function addCssFile($cssFileName, $cssFile) {
761 $cssFileAdded = FALSE;
763 if(empty($this->cssFiles
[$cssFileName])) {
764 $this->cssFiles
[$cssFileName] = $cssFile;
765 $cssFileAdded = TRUE;
768 return $cssFileAdded;
772 * adds an item to the toolbar, the class file for the toolbar item must be loaded at this point
774 * @param string toolbar item name, f.e. tx_toolbarExtension_coolItem
775 * @param string toolbar item class name, f.e. tx_toolbarExtension_coolItem
778 public function addToolbarItem($toolbarItemName, $toolbarItemClassName) {
779 $toolbarItem = t3lib_div
::makeInstance($toolbarItemClassName, $this);
781 if(!($toolbarItem instanceof backend_toolbarItem
)) {
782 throw new UnexpectedValueException('$toolbarItem "'.$toolbarItemName.'" must implement interface backend_toolbarItem', 1195125501);
785 if($toolbarItem->checkAccess()) {
786 $this->toolbarItems
[$toolbarItemName] = $toolbarItem;
793 * Executes defined hooks functions for the given identifier.
795 * These hook identifiers are valid:
796 * + constructPostProcess
798 * + renderPostProcess
800 * @param string $identifier Specific hook identifier
801 * @param array $hookConfiguration Additional configuration passed to hook functions
804 protected function executeHook($identifier, array $hookConfiguration = array()) {
805 $options =& $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/backend.php'];
807 if(isset($options[$identifier]) && is_array($options[$identifier])) {
808 foreach($options[$identifier] as $hookFunction) {
809 t3lib_div
::callUserFunction($hookFunction, $hookConfiguration, $this);
815 // document generation
816 $TYPO3backend = t3lib_div
::makeInstance('TYPO3backend');
818 // include extensions which may add css, javascript or toolbar items
819 if(is_array($GLOBALS['TYPO3_CONF_VARS']['typo3/backend.php']['additionalBackendItems'])) {
820 foreach($GLOBALS['TYPO3_CONF_VARS']['typo3/backend.php']['additionalBackendItems'] as $additionalBackendItem) {
821 include_once($additionalBackendItem);
824 // process ExtJS module js and css
825 if (is_array($GLOBALS['TBE_MODULES']['_configuration'])) {
826 foreach ($GLOBALS['TBE_MODULES']['_configuration'] as $moduleConfig) {
827 if (is_array($moduleConfig['cssFiles'])) {
828 foreach ($moduleConfig['cssFiles'] as $cssFileName => $cssFile) {
829 $TYPO3backend->addCssFile($name, t3lib_div
::getFileAbsFileName($cssFile));
832 if (is_array($moduleConfig['jsFiles'])) {
833 foreach ($moduleConfig['jsFiles'] as $jsFile) {
834 $files = array(t3lib_div
::getFileAbsFileName($jsFile));
835 $files = t3lib_div
::removePrefixPathFromList($files, PATH_site
);
836 $TYPO3backend->addJavascriptFile('../' . $files[0]);
842 $TYPO3backend->render();
844 Typo3_Bootstrap
::shutdown();