PageRenderTime 64ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/Classes/Controller/OverviewController.php

https://github.com/dkd/tc_beuser
PHP | 517 lines | 343 code | 77 blank | 97 comment | 31 complexity | dfd120da09fa1eb4889871ea28f480f4 MD5 | raw file
  1. <?php
  2. namespace dkd\TcBeuser\Controller;
  3. /***************************************************************
  4. * Copyright notice
  5. *
  6. * (c) 2006 Ingo Renner <ingo.renner@dkd.de>
  7. * All rights reserved
  8. *
  9. * This script is part of the TYPO3 project. The TYPO3 project is
  10. * free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * The GNU General Public License can be found at
  16. * http://www.gnu.org/copyleft/gpl.html.
  17. *
  18. * This script is distributed in the hope that it will be useful,
  19. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  21. * GNU General Public License for more details.
  22. *
  23. * This copyright notice MUST APPEAR in all copies of the script!
  24. ***************************************************************/
  25. use dkd\TcBeuser\Utility\TcBeuserUtility;
  26. use TYPO3\CMS\Backend\Utility\BackendUtility;
  27. use TYPO3\CMS\Backend\Utility\IconUtility;
  28. use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
  29. use TYPO3\CMS\Core\Utility\GeneralUtility;
  30. use TYPO3\CMS\Core\Utility\MathUtility;
  31. /**
  32. * Module 'User / Group Overview' for the 'tc_beuser' extension.
  33. *
  34. * @author Ingo Renner <ingo.renner@dkd.de>
  35. * @package TYPO3
  36. * @subpackage tx_tcbeuser
  37. */
  38. class OverviewController extends \TYPO3\CMS\Backend\Module\BaseScriptClass {
  39. var $content;
  40. var $doc;
  41. var $jsCode;
  42. var $MOD_MENU = array();
  43. var $MOD_SETTINGS = array();
  44. var $pageinfo;
  45. var $compareFlags;
  46. var $be_user;
  47. var $be_group;
  48. var $table;
  49. function main() {
  50. $this->init();
  51. //TODO more access check!?
  52. $access = $GLOBALS['BE_USER']->modAccess($this->MCONF, true);
  53. if ($access || $GLOBALS['BE_USER']->isAdmin()) {
  54. // We need some uid in rootLine for the access check, so use first webmount
  55. $webmounts = $GLOBALS['BE_USER']->returnWebmounts();
  56. $this->pageinfo['uid'] = $webmounts[0];
  57. $this->pageinfo['_thePath'] = '/';
  58. if(GeneralUtility::_GP('beUser')){
  59. $this->MOD_SETTINGS['function'] = 2;
  60. }
  61. if(GeneralUtility::_GP('beGroup')){
  62. $this->MOD_SETTINGS['function'] = 1;
  63. }
  64. if($this->MOD_SETTINGS['function'] == 1) {
  65. $title = $GLOBALS['LANG']->getLL('overview-groups');
  66. } elseif($this->MOD_SETTINGS['function'] == 2) {
  67. $title = $GLOBALS['LANG']->getLL('overview-users');
  68. }
  69. $menu = BackendUtility::getFuncMenu(
  70. $this->id,
  71. 'SET[function]',
  72. $this->MOD_SETTINGS['function'],
  73. $this->MOD_MENU['function']
  74. );
  75. $moduleContent = $this->moduleContent();
  76. // all necessary JS code needs to be set before this line!
  77. $this->doc->JScode = $this->doc->wrapScriptTags($this->jsCode);
  78. $this->doc->JScode .= '
  79. <script src="' . ExtensionManagementUtility::extRelPath('tc_beuser') . 'mod4/prototype.js" type="text/javascript"></script>
  80. <script src="' . ExtensionManagementUtility::extRelPath('tc_beuser') . 'mod4/ajax.js" type="text/javascript"></script>';
  81. $this->content = '';
  82. $this->content .= $this->doc->spacer(5);
  83. $this->content .= $this->doc->section(
  84. '',
  85. $this->doc->funcMenu(
  86. $this->doc->header($title),
  87. $menu
  88. )
  89. );
  90. $this->content .= $this->doc->divider(5);
  91. $this->content .= $moduleContent;
  92. $docHeaderButtons = $this->getButtons();
  93. $markers['CSH'] = $this->docHeaderButtons['csh'];
  94. $markers['FUNC_MENU'] = BackendUtility::getFuncMenu($this->id, 'SET[mode]', $this->MOD_SETTINGS['mode'], $this->MOD_MENU['mode']);
  95. $markers['CONTENT'] = $this->content;
  96. // Build the <body> for the module
  97. $this->content = $this->doc->moduleBody($this->pageinfo, $docHeaderButtons, $markers);
  98. $this->content = $this->doc->render($GLOBALS['LANG']->getLL('permissions'), $this->content);
  99. }
  100. $GLOBALS['BE_USER']->user['admin'] = 0;
  101. }
  102. function init() {
  103. parent::init();
  104. TcBeuserUtility::switchUser(GeneralUtility::_GP('SwitchUser'));
  105. $this->backPath = $GLOBALS['BACK_PATH'];
  106. // Initializing document template object:
  107. $this->doc = GeneralUtility::makeInstance('TYPO3\\CMS\\Backend\\Template\\DocumentTemplate');
  108. $this->doc->backPath = $GLOBALS['BACK_PATH'];
  109. $this->doc->setModuleTemplate('EXT:tc_beuser/Resources/Private/Templates/module.html');
  110. $this->doc->form = '<form action="'.htmlspecialchars($this->R_URI).'" method="post" enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'" name="editform" onsubmit="return TBE_EDITOR_checkSubmit(1);">'; // JavaScript
  111. $this->doc->getPageRenderer()->loadPrototype();
  112. $this->doc->postCode .= $this->doc->wrapScriptTags('
  113. script_ended = 1;
  114. if (top.fsMod) top.fsMod.recentIds["web"] = 0;
  115. ');
  116. $this->doc->postCode .= $this->doc->wrapScriptTags('
  117. script_ended = 0;
  118. function jumpToUrl(URL) {
  119. document.location = URL;
  120. }
  121. var T3_BACKPATH = \''.$this->doc->backPath.'\';
  122. var ajaxUrl = \'' . BackendUtility::getModuleUrl($GLOBALS['MCONF']['name']) . '\';
  123. ');
  124. $this->jsCode .= $this->doc->redirectUrls(GeneralUtility::linkThisScript());
  125. $this->id = 0;
  126. // update compareFlags
  127. if (GeneralUtility::_GP('ads')) {
  128. $this->compareFlags = GeneralUtility::_GP('compareFlags');
  129. $GLOBALS['BE_USER']->pushModuleData('txtcbeuserM1_txtcbeuserM4/index.php/compare',$this->compareFlags);
  130. } else {
  131. $this->compareFlags = $GLOBALS['BE_USER']->getModuleData('txtcbeuserM1_txtcbeuserM4/index.php/compare','ses');
  132. }
  133. // Setting return URL
  134. $this->returnUrl = GeneralUtility::_GP('returnUrl');
  135. $this->retUrl = $this->returnUrl ? $this->returnUrl : 'dummy.php';
  136. //init user / group
  137. $beuser = GeneralUtility::_GET('beUser');
  138. if($beuser) {
  139. $this->be_user = $beuser;
  140. }
  141. $begroup = GeneralUtility::_GET('beGroup');
  142. if($begroup) {
  143. $this->be_group = $begroup;
  144. }
  145. }
  146. /**
  147. * Adds items to the ->MOD_MENU array. Used for the function menu selector.
  148. *
  149. * @return void
  150. */
  151. function menuConfig() {
  152. $this->MOD_MENU = array (
  153. 'function' => array (
  154. '1' => $GLOBALS['LANG']->getLL('overview-groups'),
  155. '2' => $GLOBALS['LANG']->getLL('overview-users'),
  156. )
  157. );
  158. $groupOnly = array();
  159. if($this->MOD_SETTINGS['function'] == 1) { // groups
  160. $groupOnly['members'] = $GLOBALS['LANG']->getLL('showCol-members');
  161. }
  162. $groupAndUser = array(
  163. 'filemounts' => $GLOBALS['LANG']->getLL('showCol-filemounts'),
  164. 'webmounts' => $GLOBALS['LANG']->getLL('showCol-webmounts'),
  165. 'pagetypes' => $GLOBALS['LANG']->getLL('showCol-pagetypes'),
  166. 'selecttables' => $GLOBALS['LANG']->getLL('showCol-selecttables'),
  167. 'modifytables' => $GLOBALS['LANG']->getLL('showCol-modifytables'),
  168. 'nonexcludefields' => $GLOBALS['LANG']->getLL('showCol-nonexcludefields'),
  169. 'explicitallowdeny' => $GLOBALS['LANG']->getLL('showCol-explicitallowdeny'),
  170. 'limittolanguages' => $GLOBALS['LANG']->getLL('showCol-limittolanguages'),
  171. 'workspaceperms' => $GLOBALS['LANG']->getLL('showCol-workspaceperms'),
  172. 'workspacememship' => $GLOBALS['LANG']->getLL('showCol-workspacememship'),
  173. 'description' => $GLOBALS['LANG']->getLL('showCol-description'),
  174. 'modules' => $GLOBALS['LANG']->getLL('showCol-modules'),
  175. 'tsconfig' => $GLOBALS['LANG']->getLL('showCol-tsconfig'),
  176. 'tsconfighl' => $GLOBALS['LANG']->getLL('showCol-tsconfighl'),
  177. );
  178. $this->MOD_MENU['showCols'] = array_merge($groupOnly, $groupAndUser);
  179. parent::menuConfig();
  180. }
  181. /**
  182. * Generates the module content
  183. *
  184. * @return void
  185. */
  186. function moduleContent() {
  187. $content = '';
  188. switch((string)$this->MOD_SETTINGS['function']) {
  189. case '1':
  190. // group view
  191. $content .= $this->doc->section(
  192. '',
  193. $this->getGroupView($this->be_group)
  194. );
  195. break;
  196. case '2':
  197. // user view
  198. $content .= $this->doc->section(
  199. '',
  200. $this->getUserView($this->be_user)
  201. );
  202. break;
  203. }
  204. return $content;
  205. }
  206. function printContent() {
  207. $this->content .= $this->doc->endPage();
  208. echo $this->content;
  209. }
  210. function getUserView($userUid) {
  211. $content = '';
  212. if($this->be_user == 0) {
  213. //warning - no user selected
  214. $content .= $GLOBALS['LANG']->getLL('select-user');
  215. $this->id = 0;
  216. $this->search_field = GeneralUtility::_GP('search_field');
  217. $this->pointer = MathUtility::forceIntegerInRange(
  218. GeneralUtility::_GP('pointer'),
  219. 0,
  220. 100000
  221. );
  222. $this->table = 'be_users';
  223. /** @var dkd\TcBeuser\Utility\RecordListUtility $dblist */
  224. $dblist = GeneralUtility::makeInstance('dkd\\TcBeuser\\Utility\\RecordListUtility');
  225. $dblist->backPath = $this->doc->backPath;
  226. $dblist->script = $this->MCONF['script'];
  227. $dblist->alternateBgColors = true;
  228. $dblist->userMainGroupOnly = true;
  229. $dblist->calcPerms = $GLOBALS['BE_USER']->calcPerms($this->pageinfo);
  230. $dblist->showFields = array('username', 'realName', 'usergroup');
  231. $dblist->disableControls = array('edit' => true, 'hide' => true, 'delete' => true, 'import' => true);
  232. //Setup for analyze Icon
  233. $dblist->analyzeLabel = $GLOBALS['LANG']->sL('LLL:EXT:tc_beuser/mod2/locallang.xml:analyze',1);
  234. $dblist->analyzeParam = 'beUser';
  235. $dblist->start(0, $this->table, $this->pointer, $this->search_field);
  236. $dblist->generateList();
  237. $content .= $dblist->HTMLcode ? $dblist->HTMLcode : '<br />'.$GLOBALS['LANG']->sL('LLL:EXT:tc_beuser/mod2/locallang.xml:not-found').'<br />';
  238. $content .= $dblist->getSearchBox(
  239. false,
  240. $GLOBALS['LANG']->sL('LLL:EXT:tc_beuser/mod2/locallang.xml:search-user',1)
  241. );
  242. } else {
  243. //real content
  244. $this->table = 'be_users';
  245. $userRecord = BackendUtility::getRecord($this->table, $userUid);
  246. $content .= $this->getColSelector();
  247. $content .= '<br />';
  248. $content .= $this->getUserViewHeader($userRecord);
  249. /** @var dkd\TcBeuser\Utility\OverviewUtility $userView */
  250. $userView = GeneralUtility::makeInstance('dkd\\TcBeuser\\Utility\\OverviewUtility');
  251. //if there is member in the compareFlags array, remove it. There is no 'member' in user view
  252. unset($this->compareFlags['members']);
  253. $content .= $userView->getTable($userRecord, $this->compareFlags);
  254. }
  255. return $content;
  256. }
  257. function getGroupView($groupUid) {
  258. $content = '';
  259. if($this->be_group == 0) {
  260. //warning - no user selected
  261. $content .= $GLOBALS['LANG']->getLL('select-group');
  262. $this->id = 0;
  263. $this->search_field = GeneralUtility::_GP('search_field');
  264. $this->pointer = MathUtility::forceIntegerInRange(
  265. GeneralUtility::_GP('pointer'),
  266. 0,
  267. 100000
  268. );
  269. $this->table = 'be_groups';
  270. /** @var dkd\TcBeuser\Utility\RecordListUtility $dblist */
  271. $dblist = GeneralUtility::makeInstance('dkd\\TcBeuser\\Utility\\RecordListUtility');
  272. $dblist->backPath = $this->doc->backPath;
  273. $dblist->script = $this->MCONF['script'];
  274. $dblist->alternateBgColors = true;
  275. $dblist->userMainGroupOnly = true;
  276. $dblist->calcPerms = $GLOBALS['BE_USER']->calcPerms($this->pageinfo);
  277. $dblist->showFields = array('title');
  278. $dblist->disableControls = array('edit' => true, 'hide' => true, 'delete' => true, 'history' => true, 'new' => true, 'import' => true);
  279. //Setup for analyze Icon
  280. $dblist->analyzeLabel = $GLOBALS['LANG']->sL('LLL:EXT:tc_beuser/mod3/locallang.xml:analyze',1);
  281. $dblist->analyzeParam = 'beGroup';
  282. $dblist->start(0, $this->table, $this->pointer, $this->search_field);
  283. $dblist->generateList();
  284. $content .= $dblist->HTMLcode ? $dblist->HTMLcode : '<br />'.$GLOBALS['LANG']->sL('LLL:EXT:tc_beuser/mod3/locallang.xml:not-found').'<br />';
  285. $content .= $dblist->getSearchBox(
  286. false,
  287. $GLOBALS['LANG']->sL('LLL:EXT:tc_beuser/mod3/locallang.xml:search-group',1)
  288. );
  289. } else {
  290. //real content
  291. $this->table = 'be_groups';
  292. $groupRecord = BackendUtility::getRecord($this->table, $groupUid);
  293. $content .= $this->getColSelector();
  294. $content .= '<br />';
  295. // $content .= $this->getUserViewHeader($groupRecord);
  296. /** @var dkd\TcBeuser\Module\OverviewController $userView */
  297. $userView = GeneralUtility::makeInstance('dkd\\TcBeuser\\Utility\\OverviewUtility');
  298. $content .= $userView->getTableGroup($groupRecord, $this->compareFlags);
  299. }
  300. return $content;
  301. }
  302. function getColSelector() {
  303. $content = '';
  304. $i = 0;
  305. foreach($this->MOD_MENU['showCols'] as $key => $label) {
  306. $content .= '<span style="display: block; float: left; width: 180px;">'
  307. .'<input type="checkbox" value="1" name="compareFlags['.$key.']"'.($this->compareFlags[$key]?' checked="checked"':'').' />'
  308. .'&nbsp;'.$label.'</span> '.chr(10);
  309. $i++;
  310. if($i == 4) {
  311. $content .= chr(10).'<br />'.chr(10);
  312. $i = 0;
  313. }
  314. }
  315. $content .= '<br style="clear: left;" /><br />';
  316. $content .= '<input type="submit" name="ads" value="Update" />';
  317. $content .= '<br />';
  318. return $content;
  319. }
  320. function getUserViewHeader($userRecord) {
  321. $content = '';
  322. $alttext = BackendUtility::getRecordIconAltText($userRecord, $this->table);
  323. $recTitle = htmlspecialchars(BackendUtility::getRecordTitle($this->table, $userRecord));
  324. // icon
  325. $iconImg = IconUtility::getSpriteIconForRecord(
  326. $this->table,
  327. $userRecord,
  328. array('title' => htmlspecialchars($alttext))
  329. );
  330. // controls
  331. $control = $this->makeUserControl($userRecord);
  332. $content .= $iconImg.' '.$recTitle.' '.$control;
  333. return $content;
  334. }
  335. function makeUserControl($userRecord) {
  336. // edit
  337. $control = '<a href="#" onclick="'.htmlspecialchars(
  338. $this->editOnClick(
  339. '&edit['.$this->table.']['.$userRecord['uid'].']=edit&SET[function]=edit',
  340. GeneralUtility::getIndpEnv('REQUEST_URI').'SET[function]=2'
  341. )
  342. ).'"><img'.IconUtility::skinImg(
  343. $this->backPath,
  344. 'gfx/edit2.gif',
  345. 'width="11" height="12"'
  346. ).' title="edit" alt="" /></a>'.chr(10);
  347. //info
  348. // always show info
  349. $control .= '<a href="#" onclick="' . htmlspecialchars('top.launchView(\'' . $this->table . '\', \'' . $userRecord['uid'] . '\'); return false;') . '">' .
  350. '<img' . IconUtility::skinImg($this->backPath, 'gfx/zoom2.gif', 'width="12" height="12"') . ' title="" alt="" />' .
  351. '</a>' . chr(10);
  352. // hide/unhide
  353. $hiddenField = $GLOBALS['TCA'][$this->table]['ctrl']['enablecolumns']['disabled'];
  354. if ($userRecord[$hiddenField]) {
  355. $params = '&data[' . $this->table . '][' . $userRecord['uid'] . '][' . $hiddenField . ']=0&SET[function]=action';
  356. $control .= '<a href="#" onclick="return jumpToUrl(\'' . htmlspecialchars($this->actionOnClick($params, -1)) . '\');">' .
  357. '<img' . IconUtility::skinImg($this->backPath, 'gfx/button_unhide.gif', 'width="11" height="10"') . ' title="unhide" alt="" />' .
  358. '</a>' . chr(10);
  359. } else {
  360. $params = '&data[' . $this->table . '][' . $userRecord['uid'] . '][' . $hiddenField . ']=1&SET[function]=action';
  361. $control .= '<a href="#" onclick="return jumpToUrl(\'' . htmlspecialchars($this->actionOnClick($params, -1)) . '\');">' .
  362. '<img' . IconUtility::skinImg($this->backPath, 'gfx/button_hide.gif', 'width="11" height="10"') . ' title="hide" alt="" />' .
  363. '</a>' . chr(10);
  364. }
  365. // delete
  366. $params = '&cmd['.$this->table.']['.$userRecord['uid'].'][delete]=1&SET[function]=action&vC=' . rawurlencode($GLOBALS['BE_USER']->veriCode()) . '&prErr=1&uPT=1';
  367. $control .= '<a href="#" onclick="' . htmlspecialchars('if (confirm(' .
  368. $GLOBALS['LANG']->JScharCode(
  369. $GLOBALS['LANG']->getLL('deleteWarning') .
  370. BackendUtility::referenceCount(
  371. $this->table,
  372. $userRecord['uid'],
  373. ' (There are %s reference(s) to this record!)'
  374. )
  375. ) . ')) { return jumpToUrl(\'' . $this->actionOnClick($params, BackendUtility::getModuleUrl($GLOBALS['MCONF']['name']), $this->MOD_SETTINGS) . '\'); } return false;'
  376. ) . '">' .
  377. '<img' . IconUtility::skinImg($this->backPath, 'gfx/garbage.gif', 'width="11" height="12"') . ' title="' . $GLOBALS['LANG']->getLL('delete', 1) . '" alt="" />' .
  378. '</a>' . chr(10);
  379. //TODO: only for admins or authorized user
  380. // swith user / switch user back
  381. if(!$userRecord[$hiddenField] && ($GLOBALS['BE_USER']->user['tc_beuser_switch_to'] || $GLOBALS['BE_USER']->isAdmin())) {
  382. $control .= '<a href="'.GeneralUtility::linkThisScript(array('SwitchUser'=>$userRecord['uid'])).'" target="_top"><img '.IconUtility::skinImg($this->backPath,'gfx/su.gif').' border="0" align="top" title="'.htmlspecialchars('Switch user to: '.$userRecord['username']).' [change-to mode]" alt="" /></a>'.
  383. '<a href="'.GeneralUtility::linkThisScript(array('SwitchUser'=>$userRecord['uid'], 'switchBackUser' => 1)).'" target="_top"><img '.IconUtility::skinImg($this->backPath,'gfx/su_back.gif').' border="0" align="top" title="'.htmlspecialchars('Switch user to: '.$userRecord['username']).' [switch-back mode]" alt="" /></a>'
  384. .chr(10).chr(10);
  385. }
  386. return $control;
  387. }
  388. /**
  389. * ingo.renner@dkd.de: from BackendUtility, modified
  390. *
  391. * Returns a JavaScript string (for an onClick handler) which will load the alt_doc.php script that shows the form for editing of the record(s) you have send as params.
  392. * REMEMBER to always htmlspecialchar() content in href-properties to ampersands get converted to entities (XHTML requirement and XSS precaution)
  393. * Usage: 35
  394. *
  395. * @param string $params is parameters sent along to alt_doc.php. This requires a much more details description which you must seek in Inside TYPO3s documentation of the alt_doc.php API. And example could be '&edit[pages][123]=edit' which will show edit form for page record 123.
  396. * @param string $requestUri is an optional returnUrl you can set - automatically set to REQUEST_URI.
  397. * @return string
  398. * @see template::issueCommand()
  399. */
  400. function editOnClick($params, $requestUri = '') {
  401. $retUrl = '&returnUrl=' . ($requestUri == -1 ? "'+T3_THIS_LOCATION+'" : rawurlencode($requestUri ? $requestUri : GeneralUtility::getIndpEnv('REQUEST_URI')));
  402. return "window.location.href='" . BackendUtility::getModuleUrl('txtcbeuserM1_txtcbeuserM2') . $retUrl . $params . "'; return false;";
  403. }
  404. /**
  405. * create link for the hide/unhide and delete icon.
  406. * not using tce_db.php, because we need to manipulate user's permission
  407. *
  408. * @param string param with command (hide/unhide, delete) and records id
  409. * @param string redirect link, after process the command
  410. * @return string jumpTo URL link with redirect
  411. */
  412. function actionOnClick($params, $requestURI = '') {
  413. $redirect = '&redirect=' . ($requestURI == -1 ? "'+T3_THIS_LOCATION+'" : rawurlencode($requestURI ? $requestURI : GeneralUtility::getIndpEnv('REQUEST_URI'))) .
  414. '&vC=' . rawurlencode($GLOBALS['BE_USER']->veriCode()) . '&prErr=1&uPT=1';
  415. return BackendUtility::getModuleUrl('txtcbeuserM1_txtcbeuserM2') . $params . $redirect;
  416. }
  417. /**
  418. * Create the panel of buttons for submitting the form or otherwise perform operations.
  419. *
  420. * @return array all available buttons as an assoc. array
  421. */
  422. protected function getButtons() {
  423. $buttons = array(
  424. 'csh' => '',
  425. 'view' => '',
  426. 'shortcut' => ''
  427. );
  428. // CSH
  429. $buttons['csh'] = BackendUtility::cshItem('_MOD_web_info', '', $GLOBALS['BACK_PATH'], '', TRUE);
  430. // Shortcut
  431. if ($GLOBALS['BE_USER']->mayMakeShortcut()) {
  432. $buttons['shortcut'] = $this->doc->makeShortcutIcon('id, edit_record, pointer, new_unique_uid, search_field, search_levels, showLimit', implode(',', array_keys($this->MOD_MENU)), $this->MCONF['name']);
  433. }
  434. return $buttons;
  435. }
  436. }
  437. if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/tc_beuser/mod4/index.php']) {
  438. include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/tc_beuser/mod4/index.php']);
  439. }