[TASK] Reapply direct changes of TYPO3 Core
[Packages/TYPO3.CMS.git] / typo3 / sysext / version / ws / workspaceforms.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
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 * Module: Workspace manager
29 *
30 * $Id: workspaceforms.php 9122 2010-10-17 09:55:41Z benni $
31 *
32 * @author Dmitry Dulepov <typo3@accio.lv>
33 */
34 /**
35 * [CLASS/FUNCTION INDEX of SCRIPT]
36 *
37 *
38 *
39 * 93: class SC_mod_user_ws_workspaceForms extends t3lib_SCbase
40 *
41 * SECTION: PUBLIC MODULE METHODS
42 * 123: function init()
43 * 158: function main()
44 * 233: function printContent()
45 *
46 * SECTION: PRIVATE FUNCTIONS
47 * 257: function initTCEForms()
48 * 284: function getModuleParameters()
49 * 302: function getTitle()
50 * 321: function buildForm()
51 * 330: function buildEditForm()
52 * 395: function buildNewForm()
53 * 458: function createButtons()
54 * 484: function getOwnerUser($uid)
55 * 510: function processData()
56 * 554: function fixVariousTCAFields()
57 * 566: function fixTCAUserField($fieldName)
58 * 593: function checkWorkspaceAccess()
59 *
60 *
61 * 606: class user_SC_mod_user_ws_workspaceForms
62 * 615: function processUserAndGroups($conf, $tceforms)
63 *
64 * TOTAL FUNCTIONS: 16
65 * (This index is automatically created/updated by the extension "extdeveval")
66 *
67 */
68
69
70 // Initialize module:
71 unset($MCONF);
72 require('conf.php');
73 require($BACK_PATH.'init.php');
74 require($BACK_PATH.'template.php');
75 $BE_USER->modAccess($MCONF,1);
76
77 // Include libraries of various kinds used inside:
78 $LANG->includeLLFile('EXT:lang/locallang_mod_user_ws.xml');
79
80 /**
81 * Module: Workspace forms for editing/creating workspaces.
82 *
83 * @author Dmitry Dulepov <typo3@fm-world.ru>
84 * @package TYPO3
85 * @subpackage core
86 */
87 class SC_mod_user_ws_workspaceForms extends t3lib_SCbase {
88
89 // Default variables for backend modules
90 var $MCONF = array(); // Module configuration
91 var $MOD_MENU = array(); // Module menu items
92 var $MOD_SETTINGS = array(); // Module session settings
93
94 /**
95 * Document Template Object
96 *
97 * @var mediumDoc
98 */
99 var $doc;
100 var $content; // Accumulated content
101
102 // internal variables
103 var $isEditAction = FALSE; // TRUE if about to edit workspace
104 var $workspaceId; // ID of the workspace that we will edit. Set only if $isEditAction is TRUE.
105
106 /**
107 * An instance of t3lib_TCEForms
108 *
109 * @var t3lib_TCEforms
110 */
111 var $tceforms;
112
113
114
115
116
117
118 /*************************
119 *
120 * PUBLIC MODULE METHODS
121 *
122 *************************/
123
124 /**
125 * Initializes the module. See <code>t3lib_SCbase::init()</code> for more information.
126 *
127 * @return void
128 */
129 function init() {
130 // Setting module configuration:
131 $this->MCONF = $GLOBALS['MCONF'];
132
133 // Initialize Document Template object:
134 $this->doc = t3lib_div::makeInstance('template');
135 $this->doc->backPath = $GLOBALS['BACK_PATH'];
136 $this->doc->setModuleTemplate('templates/ws_forms.html');
137 $this->doc->form = '<form action="' . t3lib_div::getIndpEnv('SCRIPT_NAME').'" method="post" enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'" name="editform" onsubmit="return TBE_EDITOR.checkSubmit(1);">';
138
139 $this->doc->getContextMenuCode();
140
141 // Parent initialization:
142 t3lib_SCbase::init();
143 }
144
145
146
147
148
149
150
151
152
153
154
155 /**
156 * Creates module content.
157 *
158 * @return void
159 */
160 function main() {
161 global $LANG;
162
163 // see what we have to do and get parameters (call before processing data!!!)
164 $this->getModuleParameters();
165
166 $hasAccess = (
167 $GLOBALS['BE_USER']->isAdmin() ||
168 0 != ($GLOBALS['BE_USER']->groupData['workspace_perms'] & 4) ||
169 ($this->isEditAction && $this->checkWorkspaceAccess())
170 );
171
172 if (!$hasAccess) {
173 $title = $this->getTitle();
174 $this->content .= $this->doc->startPage($title);
175 $this->content .= $this->doc->header($title);
176 $this->content .= $this->doc->spacer(5);
177 $this->content .= $LANG->getLL($this->isEditAction ? 'edit_workspace_no_permission' : 'create_workspace_no_permission');
178 $this->content .= $this->doc->spacer(5);
179 $goBack = $GLOBALS['LANG']->getLL('edit_workspace_go_back');
180 $this->content .= t3lib_iconWorks::getSpriteIcon('actions-view-go-back') .
181 '<a href="javascript:history.back()" title="'. $goBack . '">' .
182 $goBack .
183 '</a>';
184 $this->content .= $this->doc->endPage();
185 return;
186 }
187
188 // process submission (this may override action and workspace ID!)
189 if (t3lib_div::_GP('workspace_form_submited')) {
190 $this->processData();
191 // if 'Save&Close' was pressed, redirect to main module script
192 if (t3lib_div::_GP('_saveandclosedok_x')) {
193 // `n` below is to prevent caching
194 t3lib_utility_Http::redirect('index.php?n=' . uniqid(''));
195 }
196 }
197
198 $this->initTCEForms();
199
200 //
201 // start page
202 //
203 $this->content .= $this->doc->header($this->getTitle());
204 $this->content .= $this->doc->spacer(5);
205
206 //
207 // page content
208 //
209 $this->content .= $this->tceforms->printNeededJSFunctions_top();
210 $this->content .= $this->buildForm();
211 $this->content .= $this->tceforms->printNeededJSFunctions();
212
213 // Setting up the buttons and markers for docheader
214 $docHeaderButtons = $this->getButtons();
215 // $markers['CSH'] = $docHeaderButtons['csh'];
216 $markers['CONTENT'] = $this->content;
217
218 // Build the <body> for the module
219 $this->content = $this->doc->startPage($this->getTitle());
220 $this->content.= $this->doc->moduleBody($this->pageinfo, $docHeaderButtons, $markers);
221 $this->content.= $this->doc->endPage();
222 $this->content = $this->doc->insertStylesAndJS($this->content);
223 }
224
225 /**
226 * Outputs module content to the browser.
227 *
228 * @return void
229 */
230 function printContent() {
231 echo $this->content;
232 }
233
234 /**
235 * Create the panel of buttons for submitting the form or otherwise perform operations.
236 *
237 * @return array all available buttons as an assoc. array
238 */
239 protected function getButtons() {
240 global $LANG;
241
242 $buttons = array(
243 'close' => '',
244 'save' => '',
245 'save_close' => ''
246 );
247
248 // Close, `n` below is simply to prevent caching
249 $buttons['close'] = '<a href="index.php?n=' . uniqid('wksp') . '" title="' . $LANG->sL('LLL:EXT:lang/locallang_core.php:rm.closeDoc', 1) . '">' . t3lib_iconWorks::getSpriteIcon('actions-document-close') . '</a>';
250 // Save
251 $buttons['save'] = '<input type="image" class="c-inputButton" name="_savedok"' . t3lib_iconWorks::skinImg($this->doc->backPath, 'gfx/savedok.gif') . ' title="' . $LANG->sL('LLL:EXT:lang/locallang_core.php:rm.saveDoc', 1) . '" value="_savedok" />';
252 // Save & Close
253 $buttons['save_close'] = '<input type="image" class="c-inputButton" name="_saveandclosedok"' . t3lib_iconWorks::skinImg($this->doc->backPath, 'gfx/saveandclosedok.gif') . ' title="' . $LANG->sL('LLL:EXT:lang/locallang_core.php:rm.saveCloseDoc', 1) . '" value="_saveandclosedok" />';
254
255 return $buttons;
256 }
257
258
259
260
261
262
263
264
265 /*************************
266 *
267 * PRIVATE FUNCTIONS
268 *
269 *************************/
270
271 /**
272 * Initializes <code>t3lib_TCEform</code> class for use in this module.
273 *
274 * @return void
275 */
276 function initTCEForms() {
277 $this->tceforms = t3lib_div::makeInstance('t3lib_TCEforms');
278 $this->tceforms->initDefaultBEMode();
279 $this->tceforms->backPath = $GLOBALS['BACK_PATH'];
280 $this->tceforms->doSaveFieldName = 'doSave';
281 $this->tceforms->localizationMode = t3lib_div::inList('text,media',$this->localizationMode) ? $this->localizationMode : ''; // text,media is keywords defined in TYPO3 Core API..., see "l10n_cat"
282 $this->tceforms->returnUrl = $this->R_URI;
283 $this->tceforms->palettesCollapsed = !$this->MOD_SETTINGS['showPalettes'];
284 $this->tceforms->disableRTE = $this->MOD_SETTINGS['disableRTE'];
285 $this->tceforms->enableClickMenu = TRUE;
286 $this->tceforms->enableTabMenu = TRUE;
287
288 // Setting external variables:
289 if ($GLOBALS['BE_USER']->uc['edit_showFieldHelp']!='text' && $this->MOD_SETTINGS['showDescriptions']) $this->tceforms->edit_showFieldHelp='text';
290 }
291
292
293
294
295
296
297
298 /**
299 * Retrieves module parameters from the <code>t3lib_div::_GP</code>. The following arguments are retrieved: <ul><li>action</li><li>workspace id (if action == 'edit')</li></ul>
300 *
301 * @return void
302 */
303 function getModuleParameters(){
304 $this->isEditAction = (t3lib_div::_GP('action') == 'edit');
305 if ($this->isEditAction) {
306 $this->workspaceId = intval(t3lib_div::_GP('wkspId'));
307 }
308 }
309
310
311
312
313
314
315
316 /**
317 * Retrieves a title of the module according to action.
318 *
319 * @return string A title for the module
320 */
321 function getTitle() {
322 $label = ($this->isEditAction ? 'edit_workspace_title_edit' : 'edit_workspace_title_new');
323 return $GLOBALS['LANG']->getLL($label);
324 }
325
326
327
328
329
330
331
332
333
334
335 /**
336 * Creates form for workspace. This function is a wrapper around <code>buildEditForm()</code> and <code>buildNewForm()</code>.
337 *
338 * @return string Generated form
339 */
340 function buildForm() {
341 return $this->isEditAction ? $this->buildEditForm() : $this->buildNewForm();
342 }
343
344 /**
345 * Creates a form for editing workspace. Parts were adopted from <code>alt_doc.php</code>.
346 *
347 * @return string Generated form
348 */
349 function buildEditForm() {
350 $content = '';
351 $table = 'sys_workspace';
352 $prevPageID = '';
353 $trData = t3lib_div::makeInstance('t3lib_transferData');
354 $trData->addRawData = TRUE;
355 $trData->defVals = $this->defVals;
356 $trData->lockRecords=1;
357 $trData->disableRTE = $this->MOD_SETTINGS['disableRTE'];
358 $trData->prevPageID = $prevPageID;
359 $trData->fetchRecord($table, $this->workspaceId, '');
360 reset($trData->regTableItems_data);
361 $rec = current($trData->regTableItems_data);
362
363 // Setting variables in TCEforms object:
364 $this->tceforms->hiddenFieldList = '';
365 // Register default language labels, if any:
366 $this->tceforms->registerDefaultLanguageData($table,$rec);
367
368 $this->fixVariousTCAFields();
369 if (!$GLOBALS['BE_USER']->isAdmin()) {
370 // Non-admins cannot select users from the root. We "fix" it for them.
371 $this->fixTCAUserField('adminusers');
372 $this->fixTCAUserField('members');
373 $this->fixTCAUserField('reviewers');
374 }
375
376 // Create form for the record (either specific list of fields or the whole record):
377 $form = '';
378 $form .= $this->tceforms->getMainFields($table,$rec);
379 $form .= '<input type="hidden" name="data['.$table.']['.$rec['uid'].'][pid]" value="'.$rec['pid'].'" />';
380 $form .= '<input type="hidden" name="workspace_form_submited" value="1" />';
381 $form .= '<input type="hidden" name="returnUrl" value="index.php" />';
382 $form .= '<input type="hidden" name="action" value="edit" />';
383 $form .= '<input type="hidden" name="closeDoc" value="0" />';
384 $form .= '<input type="hidden" name="doSave" value="0" />';
385 $form .= '<input type="hidden" name="_serialNumber" value="'.md5(microtime()).'" />';
386 $form .= '<input type="hidden" name="_disableRTE" value="'.$this->tceforms->disableRTE.'" />';
387 $form .= '<input type="hidden" name="wkspId" value="' . htmlspecialchars($this->workspaceId) . '" />';
388 $form = $this->tceforms->wrapTotal($form, $rec, $table);
389
390 // Combine it all:
391 $content .= $form;
392 return $content;
393 }
394
395
396
397
398
399
400
401
402
403
404
405
406 /**
407 * Creates a form for new workspace. Parts are adopted from <code>alt_doc.php</code>.
408 *
409 * @return string Generated form
410 */
411 function buildNewForm() {
412 $content = '';
413 $table = 'sys_workspace';
414 $prevPageID = '';
415 $trData = t3lib_div::makeInstance('t3lib_transferData');
416 $trData->addRawData = TRUE;
417 $trData->defVals = $this->defVals;
418 $trData->lockRecords=1;
419 $trData->disableRTE = $this->MOD_SETTINGS['disableRTE'];
420 $trData->prevPageID = $prevPageID;
421 $trData->fetchRecord($table, 0, 'new');
422 reset($trData->regTableItems_data);
423 $rec = current($trData->regTableItems_data);
424 $rec['uid'] = uniqid('NEW');
425 $rec['pid'] = 0;
426 $rec['adminusers'] = $this->getOwnerUser($rec['uid']);
427
428 // Setting variables in TCEforms object:
429 $this->tceforms->hiddenFieldList = '';
430 // Register default language labels, if any:
431 $this->tceforms->registerDefaultLanguageData($table,$rec);
432
433 $this->fixVariousTCAFields();
434 if (!$GLOBALS['BE_USER']->isAdmin()) {
435 // Non-admins cannot select users from the root. We "fix" it for them.
436 $this->fixTCAUserField('adminusers');
437 $this->fixTCAUserField('members');
438 $this->fixTCAUserField('reviewers');
439 }
440
441
442 // Create form for the record (either specific list of fields or the whole record):
443 $form = '';
444 $form .= $this->doc->spacer(5);
445 $form .= $this->tceforms->getMainFields($table,$rec);
446
447 $form .= '<input type="hidden" name="workspace_form_submited" value="1" />';
448 $form .= '<input type="hidden" name="data['.$table.']['.$rec['uid'].'][pid]" value="'.$rec['pid'].'" />';
449 $form .= '<input type="hidden" name="returnUrl" value="index.php" />';
450 $form .= '<input type="hidden" name="action" value="new" />';
451 $form .= '<input type="hidden" name="closeDoc" value="0" />';
452 $form .= '<input type="hidden" name="doSave" value="0" />';
453 $form .= '<input type="hidden" name="_serialNumber" value="'.md5(microtime()).'" />';
454 $form .= '<input type="hidden" name="_disableRTE" value="'.$this->tceforms->disableRTE.'" />';
455 $form = $this->tceforms->wrapTotal($form, $rec, $table);
456
457 // Combine it all:
458 $content .= $form;
459 return $content;
460 }
461
462
463
464
465
466
467
468
469
470
471
472
473 /**
474 * Returns owner user (i.e. current BE user) in the format suitable for TCE forms. This function uses <code>t3lib_loadDBGroup</code> to create value. Code is adopted from <code>t3lib_transferdata::renderRecord_groupProc()</code>.
475 *
476 * @param string $uid UID of the record (as <code>NEW...</code>)
477 * @return string User record formatted for TCEForms
478 */
479 function getOwnerUser($uid) {
480 $loadDB = t3lib_div::makeInstance('t3lib_loadDBGroup');
481 // Make sure that `sys_workspace` is in $TCA
482 t3lib_div::loadTCA('sys_workspace');
483 // shortcut to `config` of `adminusers` field -- shorter code and better PHP performance
484 $config = &$GLOBALS['TCA']['sys_workspace']['columns']['adminusers']['config'];
485 // Notice: $config['MM'] is not set in the current version of $TCA but
486 // we still pass it to ensure compatibility with feature versions!
487 $loadDB->start($GLOBALS['BE_USER']->user['uid'], $config['allowed'], $config['MM'], $uid, 'sys_workspace', $config);
488 $loadDB->getFromDB();
489 return $loadDB->readyForInterface();
490 }
491
492
493
494
495
496
497
498
499
500 /**
501 * Processes submitted data. This function uses <code>t3lib_TCEmain::process_datamap()</code> to create/update records in the <code>sys_workspace</code> table. It will print error messages just like any other Typo3 module with similar functionality. Function also changes workspace ID and module mode to 'edit' if new record was just created.
502 *
503 * @return void
504 */
505 function processData() {
506 $tce = t3lib_div::makeInstance('t3lib_TCEmain');
507 $tce->stripslashes_values = 0;
508
509 $TCAdefaultOverride = $GLOBALS['BE_USER']->getTSConfigProp('TCAdefaults');
510 if (is_array($TCAdefaultOverride)) {
511 $tce->setDefaultsFromUserTS($TCAdefaultOverride);
512 }
513 $tce->stripslashes_values = 0;
514
515 // The following is a security precaution; It makes sure that the input data array can ONLY contain data for the sys_workspace table and ONLY one record.
516 // If this is not present it could be mis-used for nasty XSS attacks which can escalate rights to admin for even non-admin users.
517 $inputData_tmp = t3lib_div::_GP('data');
518 $inputData = array();
519 if (is_array($inputData_tmp['sys_workspace'])) {
520 reset($inputData_tmp['sys_workspace']);
521 $inputData['sys_workspace'][key($inputData_tmp['sys_workspace'])] = current($inputData_tmp['sys_workspace']);
522 }
523
524 $tce->start($inputData, array(), $GLOBALS['BE_USER']);
525 $tce->admin = 1; // Bypass table restrictions
526 $tce->bypassWorkspaceRestrictions = TRUE;
527 $tce->process_datamap();
528
529 // print error messages (if any)
530 $script = t3lib_div::getIndpEnv('TYPO3_REQUEST_SCRIPT');
531 $tce->printLogErrorMessages($script . '?' .
532 ($this->isEditAction ? 'action=edit&wkspId=' . $this->workspaceId : 'action=new'));
533
534 // If there was saved any new items, load them and update mode and workspace id
535 if (count($tce->substNEWwithIDs_table)) {
536 reset($tce->substNEWwithIDs_table); // not really necessary but better be safe...
537 $this->workspaceId = current($tce->substNEWwithIDs);
538 $this->isEditAction = TRUE;
539 }
540 }
541
542
543
544 /**
545 * Fixes various <code>$TCA</code> fields for better visual representation of workspace editor.
546 *
547 * @return void
548 */
549 function fixVariousTCAFields() {
550 // enable tabs
551 $GLOBALS['TCA']['sys_workspace']['ctrl']['dividers2tabs'] = TRUE;
552 }
553
554
555 /**
556 * "Fixes" <code>$TCA</code> to enable blinding for users/groups for non-admin users only.
557 *
558 * @param string $fieldName Name of the field to change
559 * @return void
560 */
561 function fixTCAUserField($fieldName) {
562 // fix fields for non-admin
563 if (!$GLOBALS['BE_USER']->isAdmin()) {
564 // make a shortcut to field
565 t3lib_div::loadTCA('sys_workspace');
566 $field = &$GLOBALS['TCA']['sys_workspace']['columns'][$fieldName];
567 $newField = array (
568 'label' => $field['label'],
569 'config' => Array (
570 'type' => 'select',
571 'itemsProcFunc' => 'user_SC_mod_user_ws_workspaceForms->processUserAndGroups',
572 //'iconsInOptionTags' => TRUE,
573 'size' => 10,
574 'maxitems' => $field['config']['maxitems'],
575 'autoSizeMax' => $field['config']['autoSizeMax'],
576 'mod_ws_allowed' => $field['config']['allowed'] // let us know what we can use in itemProcFunc
577 )
578 );
579 $field = $newField;
580 }
581 }
582
583 /**
584 * Checks if use has editing access to the workspace.
585 *
586 * @return boolean Returns TRUE if user can edit workspace
587 */
588 function checkWorkspaceAccess() {
589 $workspaces = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid,title,adminusers,members,reviewers','sys_workspace','uid=' . intval($this->workspaceId) . ' AND pid=0'.t3lib_BEfunc::deleteClause('sys_workspace'));
590 if (is_array($workspaces) && count($workspaces) != 0 && FALSE !== ($rec = $GLOBALS['BE_USER']->checkWorkspace($workspaces[0]))) {
591 return ($rec['_ACCESS'] == 'owner' || $rec['_ACCESS'] == 'admin');
592 }
593 return FALSE;
594 }
595 }
596
597 /**
598 * This class contains Typo3 callback functions. Class name must start from <code>user_</code> thus we use a separate class.
599 *
600 */
601 class user_SC_mod_user_ws_workspaceForms {
602
603 /**
604 * Callback function to blind user and group accounts. Used as <code>itemsProcFunc</code> in <code>$TCA</code>.
605 *
606 * @param array $conf Configuration array. The following elements are set:<ul><li>items - initial set of items (empty in our case)</li><li>config - field config from <code>$TCA</code></li><li>TSconfig - this function name</li><li>table - table name</li><li>row - record row (???)</li><li>field - field name</li></ul>
607 * @param object $tceforms <code>t3lib_div::TCEforms</code> object
608 * @return void
609 */
610 function processUserAndGroups($conf, $tceforms) {
611 // Get usernames and groupnames
612 $be_group_Array = t3lib_BEfunc::getListGroupNames('title,uid');
613 $groupArray = array_keys($be_group_Array);
614
615 $be_user_Array = t3lib_BEfunc::getUserNames();
616 $be_user_Array = t3lib_BEfunc::blindUserNames($be_user_Array,$groupArray,1);
617
618 // users
619 $title = $GLOBALS['LANG']->sL($GLOBALS['TCA']['be_users']['ctrl']['title']);
620 foreach ($be_user_Array as $uid => $user) {
621 $conf['items'][] = array(
622 $user['username'] . ' (' . $title . ')',
623 'be_users_' . $user['uid'],
624 t3lib_iconWorks::getIcon('be_users', $user)
625 );
626 }
627
628 // Process groups only if necessary -- save time!
629 if (strstr($conf['config']['mod_ws_allowed'], 'be_groups')) {
630 // groups
631
632 $be_group_Array = $be_group_Array_o = t3lib_BEfunc::getGroupNames();
633 $be_group_Array = t3lib_BEfunc::blindGroupNames($be_group_Array_o,$groupArray,1);
634
635 $title = $GLOBALS['LANG']->sL($GLOBALS['TCA']['be_groups']['ctrl']['title']);
636 foreach ($be_group_Array as $uid => $group) {
637 $conf['items'][] = array(
638 $group['title'] . ' (' . $title . ')',
639 'be_groups_' . $group['uid'],
640 t3lib_iconWorks::getIcon('be_groups', $user)
641 );
642 }
643 }
644 }
645 }
646
647
648 if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/mod/user/ws/workspaceforms.php'])) {
649 include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/mod/user/ws/workspaceforms.php']);
650 }
651
652 // Make instance:
653 $SOBE = t3lib_div::makeInstance('SC_mod_user_ws_workspaceForms');
654 $SOBE->init();
655 $SOBE->main();
656 $SOBE->printContent();
657
658 ?>