[TASK] Remove useless code after utf-8 code conversion
[Packages/TYPO3.CMS.git] / typo3 / backend.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 2007-2011 Ingo Renner <ingo@typo3.org>
6 * All rights reserved
7 *
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.
13 *
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.
18 *
19 *
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.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27
28 require_once('init.php');
29 require_once('template.php');
30 require_once(PATH_typo3 . 'interfaces/interface.backend_toolbaritem.php');
31
32 require('classes/class.typo3logo.php');
33 require('classes/class.modulemenu.php');
34
35 // core toolbar items
36 require('classes/class.clearcachemenu.php');
37 require('classes/class.shortcutmenu.php');
38 require('classes/class.livesearch.php');
39
40 $GLOBALS['LANG']->includeLLFile('EXT:lang/locallang_misc.xml');
41
42
43 /**
44 * Class for rendering the TYPO3 backend version 4.2+
45 *
46 * @author Ingo Renner <ingo@typo3.org>
47 * @package TYPO3
48 * @subpackage core
49 */
50 class TYPO3backend {
51
52 protected $content;
53 protected $css;
54 protected $cssFiles;
55 protected $js;
56 protected $jsFiles;
57 protected $jsFilesAfterInline;
58 protected $toolbarItems;
59 private $menuWidthDefault = 190; // intentionally private as nobody should modify defaults
60 protected $menuWidth;
61 protected $debug;
62
63 /**
64 * Object for loading backend modules
65 *
66 * @var t3lib_loadModules
67 */
68 protected $moduleLoader;
69
70 /**
71 * module menu generating object
72 *
73 * @var ModuleMenu
74 */
75 protected $moduleMenu;
76
77 /**
78 * Pagerenderer
79 *
80 * @var t3lib_PageRenderer
81 */
82 protected $pageRenderer;
83
84 /**
85 * constructor
86 *
87 * @return void
88 */
89 public function __construct() {
90 // set debug flag for BE development only
91 $this->debug = intval($GLOBALS['TYPO3_CONF_VARS']['BE']['debug']) === 1;
92
93 // Initializes the backend modules structure for use later.
94 $this->moduleLoader = t3lib_div::makeInstance('t3lib_loadModules');
95 $this->moduleLoader->load($GLOBALS['TBE_MODULES']);
96
97 $this->moduleMenu = t3lib_div::makeInstance('ModuleMenu');
98
99 $this->pageRenderer = $GLOBALS['TBE_TEMPLATE']->getPageRenderer();
100 $this->pageRenderer->loadScriptaculous('builder,effects,controls,dragdrop');
101 $this->pageRenderer->loadExtJS();
102 $this->pageRenderer->enableExtJSQuickTips();
103
104
105 $this->pageRenderer->addJsInlineCode(
106 'consoleOverrideWithDebugPanel',
107 '//already done',
108 FALSE
109 );
110 $this->pageRenderer->addExtDirectCode();
111
112 // add default BE javascript
113 $this->js = '';
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',
122 'md5' => 'md5.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',
140 );
141
142 if ($this->debug) {
143 unset($this->jsFiles['loginrefresh']);
144 }
145
146 // add default BE css
147 $this->css = '';
148 $this->cssFiles = array();
149
150 $this->toolbarItems = array();
151 $this->initializeCoreToolbarItems();
152
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'];
156 }
157
158 $this->executeHook('constructPostProcess');
159 }
160
161 /**
162 * initializes the core toolbar items
163 *
164 * @return void
165 */
166 protected function initializeCoreToolbarItems() {
167
168 $coreToolbarItems = array(
169 'shortcuts' => 'ShortcutMenu',
170 'clearCacheActions' => 'ClearCacheMenu',
171 'liveSearch' => 'LiveSearch'
172 );
173
174 foreach($coreToolbarItems as $toolbarItemName => $toolbarItemClassName) {
175 $toolbarItem = t3lib_div::makeInstance($toolbarItemClassName, $this);
176
177 if(!($toolbarItem instanceof backend_toolbarItem)) {
178 throw new UnexpectedValueException('$toolbarItem "'.$toolbarItemName.'" must implement interface backend_toolbarItem', 1195126772);
179 }
180
181 if($toolbarItem->checkAccess()) {
182 $this->toolbarItems[$toolbarItemName] = $toolbarItem;
183 } else {
184 unset($toolbarItem);
185 }
186 }
187 }
188
189 /**
190 * main function generating the BE scaffolding
191 *
192 * @return void
193 */
194 public function render() {
195 $this->executeHook('renderPreProcess');
196
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');
200
201
202
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() .
209 '</div>
210 </div>
211
212 ';
213
214 /******************************************************
215 * now put the complete backend document together
216 ******************************************************/
217
218 foreach($this->cssFiles as $cssFileName => $cssFile) {
219 $this->pageRenderer->addCssFile($cssFile);
220
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]);
224 }
225 }
226
227 if(!empty($this->css)) {
228 $this->pageRenderer->addCssInlineBlock('BackendInlineCSS', $this->css);
229 }
230
231 foreach ($this->jsFiles as $jsFile) {
232 $this->pageRenderer->addJsFile($jsFile);
233 }
234
235
236 $this->generateJavascript();
237 $this->pageRenderer->addJsInlineCode('BackendInlineJavascript', $this->js, FALSE);
238
239 $this->loadResourcesForRegisteredNavigationComponents();
240
241 // add state provider
242 $GLOBALS['TBE_TEMPLATE']->setExtDirectStateProvider();
243 $states = $GLOBALS['BE_USER']->uc['BackendComponents']['States'];
244 //save states in BE_USER->uc
245 $extOnReadyCode = '
246 Ext.state.Manager.setProvider(new TYPO3.state.ExtDirectProvider({
247 key: "BackendComponents.States",
248 autoRead: false
249 }));
250 ';
251 if ($states) {
252 $extOnReadyCode .= 'Ext.state.Manager.getProvider().initState(' . json_encode($states) . ');';
253 }
254 $extOnReadyCode .= '
255 TYPO3.Backend = new TYPO3.Viewport(TYPO3.Viewport.configuration);
256 if (typeof console === "undefined") {
257 console = TYPO3.Backend.DebugConsole;
258 }
259 TYPO3.ContextHelpWindow.init();';
260 $this->pageRenderer->addExtOnReadyCode($extOnReadyCode);
261
262
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
267 );
268
269 $this->content = $backendScaffolding;
270 // Renders the module page
271 $this->content = $GLOBALS['TBE_TEMPLATE']->render(
272 $title,
273 $this->content
274 );
275
276 $hookConfiguration = array('content' => &$this->content);
277 $this->executeHook('renderPostProcess', $hookConfiguration);
278
279 echo $this->content;
280 }
281
282 /**
283 * Loads the css and javascript files of all registered navigation widgets
284 *
285 * @return void
286 */
287 protected function loadResourcesForRegisteredNavigationComponents() {
288 if (!is_array($GLOBALS['TBE_MODULES']['_navigationComponents'])) {
289 return;
290 }
291
292 $loadedComponents = array();
293 foreach ($GLOBALS['TBE_MODULES']['_navigationComponents'] as $module => $info) {
294 if (in_array($info['componentId'], $loadedComponents)) {
295 continue;
296 }
297 $loadedComponents[] = $info['componentId'];
298
299 $component = strtolower(substr($info['componentId'], strrpos($info['componentId'], '-') + 1));
300 $componentDirectory = 'components/' . $component . '/';
301
302 if ($info['isCoreComponent']) {
303 $absoluteComponentPath = PATH_t3lib . 'js/extjs/' . $componentDirectory;
304 $relativeComponentPath = '../' . str_replace(PATH_site, '', $absoluteComponentPath);
305 } else {
306 $absoluteComponentPath = t3lib_extMgm::extPath($info['extKey']) . $componentDirectory;
307 $relativeComponentPath = t3lib_extMgm::extRelPath($info['extKey']) . $componentDirectory;
308 }
309
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);
316 }
317 foreach ($cssFiles as $cssFile) {
318 $this->pageRenderer->addCssFile($relativeComponentPath . 'css/' . $cssFile);
319 }
320
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);
327 }
328
329 foreach ($jsFiles as $jsFile) {
330 $this->pageRenderer->addJsFile($relativeComponentPath . 'javascript/' . $jsFile);
331 }
332 }
333 }
334
335 /**
336 * renders the items in the top toolbar
337 *
338 * @return string top toolbar elements as HTML
339 */
340 protected function renderToolbar() {
341
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;
347 }
348
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>';
352
353 $i = 0;
354 foreach($this->toolbarItems as $key => $toolbarItem) {
355 $i++;
356 $menu = $toolbarItem->render();
357 if ($menu) {
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);
362 else
363 $additionalAttributes .= 'class="separator"';
364 }
365 $toolbar .= '<li' . $additionalAttributes . '>' .$menu. '</li>';
366 }
367 }
368
369 return $toolbar.'</ul>';
370 }
371
372 /**
373 * Gets the label of the BE user currently logged in
374 *
375 * @return string html code snippet displaying the currently logged in user
376 */
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'];
382
383 $label = $realName ? $realName : $username;
384 $title = $username;
385
386 // Link to user setup if it's loaded and user has access
387 $link = '';
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;">';
390 }
391
392 // superuser mode
393 if ($GLOBALS['BE_USER']->user['ses_backuserid']) {
394 $css .= ' su-user';
395 $title = $GLOBALS['LANG']->getLL('switchtouser') . ': ' . $username;
396 $label = $GLOBALS['LANG']->getLL('switchtousershort') . ' ' .
397 ($realName ? $realName . ' (' . $username . ')' : $username);
398 }
399
400 return '<div id="username" class="' . $css . '">' . $link . $icon .
401 '<span title="' . htmlspecialchars($title) . '">' . htmlspecialchars($label) . '</span>' .
402 ($link ? '</a>' : '') . '</div>';
403 }
404
405 /**
406 * Returns the file name to the LLL JavaScript, containing the localized labels,
407 * which can be used in JavaScript code.
408 *
409 * @return string File name of the JS file, relative to TYPO3_mainDir
410 */
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);
418 }
419 }
420 return '../' . $filePath;
421 }
422
423 /**
424 * Reads labels required in JavaScript code from the localization system and returns them as JSON
425 * array in TYPO3.LLL.
426 *
427 * @return string JavaScript code containing the LLL labels in TYPO3.LLL
428 */
429 protected function generateLocalLang() {
430 $coreLabels = array(
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'),
455 );
456
457 $labels = array(
458 'fileUpload' => array(
459 'windowTitle',
460 'buttonSelectFiles',
461 'buttonCancelAll',
462 'infoComponentMaxFileSize',
463 'infoComponentFileUploadLimit',
464 'infoComponentFileTypeLimit',
465 'infoComponentOverrideFiles',
466 'processRunning',
467 'uploadWait',
468 'uploadStarting',
469 'uploadProgress',
470 'uploadSuccess',
471 'errorQueueLimitExceeded',
472 'errorQueueFileSizeLimit',
473 'errorQueueZeroByteFile',
474 'errorQueueInvalidFiletype',
475 'errorUploadHttp',
476 'errorUploadMissingUrl',
477 'errorUploadIO',
478 'errorUploadSecurityError',
479 'errorUploadLimit',
480 'errorUploadFailed',
481 'errorUploadFileIDNotFound',
482 'errorUploadFileValidation',
483 'errorUploadFileCancelled',
484 'errorUploadStopped',
485 'allErrorMessageTitle',
486 'allErrorMessageText',
487 'allError401',
488 'allError2038',
489 ),
490 'liveSearch' => array(
491 'title',
492 'helpTitle',
493 'emptyText',
494 'loadingText',
495 'listEmptyText',
496 'showAllResults',
497 'helpDescription',
498 'helpDescriptionPages',
499 'helpDescriptionContent',
500 ),
501 'viewPort' => array(
502 'tooltipModuleMenuSplit',
503 'tooltipNavigationContainerSplitDrag',
504 'tooltipDebugPanelSplitDrag',
505
506 ),
507 );
508 $generatedLabels = array();
509 $generatedLabels['core'] = $coreLabels;
510
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);
517 }
518 }
519
520 return 'TYPO3.LLL = ' . json_encode($generatedLabels) . ';';
521 }
522
523 /**
524 * Generates the JavaScript code for the backend.
525 *
526 * @return void
527 */
528 protected function generateJavascript() {
529
530 $pathTYPO3 = t3lib_div::dirname(t3lib_div::getIndpEnv('SCRIPT_NAME')).'/';
531
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)) {
536 $pageModule = '';
537 }
538
539 $menuFrameName = 'menu';
540 if($GLOBALS['BE_USER']->uc['noMenuMode'] === 'icons') {
541 $menuFrameName = 'topmenuFrame';
542 }
543
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'];
547 } else {
548 $this->loginSecurityLevel = 'superchallenged';
549 }
550
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(
571 'width' => 600,
572 'height' => 400
573 ),
574 'firstWebmountPid' => intval($GLOBALS['WEBMOUNTS'][0]),
575 );
576
577 $this->js .= '
578 TYPO3.configuration = ' . json_encode($t3Configuration) . ';
579
580 /**
581 * TypoSetup object.
582 */
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;
592 }
593 var TS = new typoSetup();
594 //backwards compatibility
595 /**
596 * Frameset Module object
597 *
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)...";
602 */
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";
608 }
609 var fsMod = new fsModules();
610
611 top.goToModule = function(modName, cMR_flag, addGetVars) {
612 TYPO3.ModuleMenu.App.showModule(modName, addGetVars);
613 }
614 ' . $this->setStartupModule();
615
616 // Check editing of page:
617 $this->handlePageEditing();
618
619 }
620
621 /**
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"
624 *
625 * @return void
626 */
627 protected function handlePageEditing() {
628
629 if(!t3lib_extMgm::isLoaded('cms')) {
630 return;
631 }
632
633 // EDIT page:
634 $editId = preg_replace('/[^[:alnum:]_]/', '', t3lib_div::_GET('edit'));
635 $editRecord = '';
636
637 if($editId) {
638
639 // Looking up the page to edit, checking permissions:
640 $where = ' AND ('.$GLOBALS['BE_USER']->getPagePermsClause(2)
641 .' OR '.$GLOBALS['BE_USER']->getPagePermsClause(16).')';
642
643 if(t3lib_utility_Math::canBeInterpretedAsInteger($editId)) {
644 $editRecord = t3lib_BEfunc::getRecordWSOL('pages', $editId, '*', $where);
645 } else {
646 $records = t3lib_BEfunc::getRecordsByField('pages', 'alias', $editId, $where);
647
648 if(is_array($records)) {
649 $editRecord = reset($records);
650 t3lib_BEfunc::workspaceOL('pages', $editRecord);
651 }
652 }
653
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:
657 $this->js .= '
658 // Load page to edit:
659 window.setTimeout("top.loadEditId('.intval($editRecord['uid']).');", 500);
660 ';
661
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');
665
666 // Expanding page tree:
667 t3lib_BEfunc::openPageTree(intval($editRecord['pid']), !$bookmarkKeepExpanded);
668 }
669 } else {
670 $this->js .= '
671 // Warning about page editing:
672 alert('.$GLOBALS['LANG']->JScharCode(sprintf($GLOBALS['LANG']->getLL('noEditPage'), $editId)).');
673 ';
674 }
675 }
676 }
677
678 /**
679 * Sets the startup module from either GETvars module and mpdParams or user configuration.
680 *
681 * @return void
682 */
683 protected function setStartupModule() {
684 $startModule = preg_replace('/[^[:alnum:]_]/', '', t3lib_div::_GET('module'));
685
686 if(!$startModule) {
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';
691 }
692 }
693
694 $moduleParameters = t3lib_div::_GET('modParams');
695 if($startModule) {
696 return '
697 // start in module:
698 top.startInModule = [\'' . $startModule . '\', ' . t3lib_div::quoteJSvalue($moduleParameters) . '];
699 ';
700 } else {
701 return '';
702 }
703
704 }
705
706 /**
707 * adds a javascript snippet to the backend
708 *
709 * @param string javascript snippet
710 * @return void
711 */
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);
716 }
717
718 $this->js .= $javascript;
719 }
720
721 /**
722 * adds a javscript file to the backend after it has been checked that it exists
723 *
724 * @param string javascript file reference
725 * @return boolean TRUE if the javascript file was successfully added, FALSE otherwise
726 */
727 public function addJavascriptFile($javascriptFile) {
728 $jsFileAdded = FALSE;
729
730 //TODO add more checks if neccessary
731 if(file_exists(t3lib_div::resolveBackPath(PATH_typo3.$javascriptFile))) {
732 $this->jsFiles[] = $javascriptFile;
733 $jsFileAdded = TRUE;
734 }
735
736 return $jsFileAdded;
737 }
738
739 /**
740 * adds a css snippet to the backend
741 *
742 * @param string css snippet
743 * @return void
744 */
745 public function addCss($css) {
746 if(!is_string($css)) {
747 throw new InvalidArgumentException('parameter $css must be of type string', 1195129642);
748 }
749
750 $this->css .= $css;
751 }
752
753 /**
754 * adds a css file to the backend after it has been checked that it exists
755 *
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
759 */
760 public function addCssFile($cssFileName, $cssFile) {
761 $cssFileAdded = FALSE;
762
763 if(empty($this->cssFiles[$cssFileName])) {
764 $this->cssFiles[$cssFileName] = $cssFile;
765 $cssFileAdded = TRUE;
766 }
767
768 return $cssFileAdded;
769 }
770
771 /**
772 * adds an item to the toolbar, the class file for the toolbar item must be loaded at this point
773 *
774 * @param string toolbar item name, f.e. tx_toolbarExtension_coolItem
775 * @param string toolbar item class name, f.e. tx_toolbarExtension_coolItem
776 * @return void
777 */
778 public function addToolbarItem($toolbarItemName, $toolbarItemClassName) {
779 $toolbarItem = t3lib_div::makeInstance($toolbarItemClassName, $this);
780
781 if(!($toolbarItem instanceof backend_toolbarItem)) {
782 throw new UnexpectedValueException('$toolbarItem "'.$toolbarItemName.'" must implement interface backend_toolbarItem', 1195125501);
783 }
784
785 if($toolbarItem->checkAccess()) {
786 $this->toolbarItems[$toolbarItemName] = $toolbarItem;
787 } else {
788 unset($toolbarItem);
789 }
790 }
791
792 /**
793 * Executes defined hooks functions for the given identifier.
794 *
795 * These hook identifiers are valid:
796 * + constructPostProcess
797 * + renderPreProcess
798 * + renderPostProcess
799 *
800 * @param string $identifier Specific hook identifier
801 * @param array $hookConfiguration Additional configuration passed to hook functions
802 * @return void
803 */
804 protected function executeHook($identifier, array $hookConfiguration = array()) {
805 $options =& $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/backend.php'];
806
807 if(isset($options[$identifier]) && is_array($options[$identifier])) {
808 foreach($options[$identifier] as $hookFunction) {
809 t3lib_div::callUserFunction($hookFunction, $hookConfiguration, $this);
810 }
811 }
812 }
813 }
814
815
816 // include XCLASS
817 if(defined('TYPO3_MODE') && $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/backend.php']) {
818 include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/backend.php']);
819 }
820
821
822 // document generation
823 $TYPO3backend = t3lib_div::makeInstance('TYPO3backend');
824
825 // include extensions which may add css, javascript or toolbar items
826 if(is_array($GLOBALS['TYPO3_CONF_VARS']['typo3/backend.php']['additionalBackendItems'])) {
827 foreach($GLOBALS['TYPO3_CONF_VARS']['typo3/backend.php']['additionalBackendItems'] as $additionalBackendItem) {
828 include_once($additionalBackendItem);
829 }
830 }
831 // process ExtJS module js and css
832 if (is_array($GLOBALS['TBE_MODULES']['_configuration'])) {
833 foreach ($GLOBALS['TBE_MODULES']['_configuration'] as $moduleConfig) {
834 if (is_array($moduleConfig['cssFiles'])) {
835 foreach ($moduleConfig['cssFiles'] as $cssFileName => $cssFile) {
836 $TYPO3backend->addCssFile($name, t3lib_div::getFileAbsFileName($cssFile));
837 }
838 }
839 if (is_array($moduleConfig['jsFiles'])) {
840 foreach ($moduleConfig['jsFiles'] as $jsFile) {
841 $files = array(t3lib_div::getFileAbsFileName($jsFile));
842 $files = t3lib_div::removePrefixPathFromList($files, PATH_site);
843 $TYPO3backend->addJavascriptFile('../' . $files[0]);
844 }
845 }
846 }
847 }
848
849 $TYPO3backend->render();
850
851 ?>