2 /***************************************************************
5 * (c) 1999-2010 Kasper Skårhøj (kasperYYYY@typo3.com)
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 ***************************************************************/
29 * Appears in the bottom frame of the backend frameset.
30 * Provides links to registered shortcuts
31 * If the 'cms' extension is loaded you will also have a field for entering page id/alias which will be found/edited
34 * Revised for TYPO3 3.6 2/2003 by Kasper Skårhøj
35 * XHTML compliant output
37 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
40 * [CLASS/FUNCTION INDEX of SCRIPT]
44 * 86: class SC_alt_shortcut
45 * 125: function preinit()
46 * 152: function preprocess()
47 * 234: function init()
48 * 275: function main()
49 * 452: function editLoadedFunc()
50 * 532: function editPageIdFunc()
51 * 586: function printContent()
53 * SECTION: WORKSPACE FUNCTIONS:
54 * 611: function workspaceSelector()
56 * SECTION: OTHER FUNCTIONS:
57 * 686: function mIconFilename($Ifilename,$backPath)
58 * 702: function getIcon($modName)
59 * 726: function itemLabel($inlabel,$modName,$M_modName='')
60 * 748: function getLinkedPageId($url)
63 * (This index is automatically created/updated by the extension "extdeveval")
69 require('template.php');
70 $LANG->includeLLFile('EXT:lang/locallang_misc.xml');
78 * Script Class for the shortcut frame, bottom frame of the backend frameset
80 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
84 class SC_alt_shortcut
{
86 // Internal, static: GPvar
98 * Object for backend modules, load modules-object
100 * @var t3lib_loadModules
103 protected $isAjaxCall;
106 * Document template object
112 // Internal, dynamic:
113 var $content; // Accumulation of output HTML (string)
114 var $lines; // Accumulation of table cells (array)
116 var $editLoaded; // Flag for defining whether we are editing
117 var $editError; // Can contain edit error message
118 var $editPath; // Set to the record path of the record being edited.
119 var $editSC_rec; // Holds the shortcut record when editing
120 var $theEditRec; // Page record to be edited
121 var $editPage; // Page alias or id to be edited
122 var $selOpt; // Select options.
123 var $searchFor; // Text to search for...
124 var $groupLabels=array(); // Labels of all groups. If value is 1, the system will try to find a label in the locallang array.
126 var $alternativeTableUid = array(); // Array with key 0/1 being table/uid of record to edit. Internally set.
131 * Pre-initialization - setting input variables for storing shortcuts etc.
139 $this->isAjaxCall
= (boolean
) t3lib_div
::_GP('ajax');
140 $this->modName
= t3lib_div
::_GP('modName');
141 $this->M_modName
= t3lib_div
::_GP('motherModName');
142 $this->URL
= t3lib_div
::_GP('URL');
143 $this->editSC
= t3lib_div
::_GP('editShortcut');
145 $this->deleteCategory
= t3lib_div
::_GP('deleteCategory');
146 $this->editPage
= t3lib_div
::_GP('editPage');
147 $this->changeWorkspace
= t3lib_div
::_GP('changeWorkspace');
148 $this->changeWorkspacePreview
= t3lib_div
::_GP('changeWorkspacePreview');
149 $this->editName
= t3lib_div
::_GP('editName');
150 $this->editGroup
= t3lib_div
::_GP('editGroup');
151 $this->whichItem
= t3lib_div
::_GP('whichItem');
153 // Creating modules object
154 $this->loadModules
= t3lib_div
::makeInstance('t3lib_loadModules');
155 $this->loadModules
->load($TBE_MODULES);
159 * Adding shortcuts, editing shortcuts etc.
163 function preprocess() {
165 $description = ''; // Default description
166 $url = urldecode($this->URL
);
167 $queryParts = parse_url($url);
169 // Lookup the title of this page and use it as default description
170 $page_id = $this->getLinkedPageId($url);
171 if (t3lib_div
::testInt($page_id)) {
172 if (preg_match('/\&edit\[(.*)\]\[(.*)\]=edit/',$url,$matches)) {
174 $description = ''; // TODO: Set something useful
177 $pageRow = t3lib_BEfunc
::getRecord('pages',$page_id);
178 if (count($pageRow)) {
179 // If $page_id is an integer, set the description to the title of that page
180 $description = $pageRow['title'];
184 if (preg_match('/\/$/', $page_id)) {
185 // If $page_id is a string and ends with a slash, assume it is a fileadmin reference and set the description to the basename of that path
186 $description = basename($page_id);
191 // Adding a shortcut being set from another frame,
192 // but only if it's a relative URL (i.e. scheme part is not defined)
193 if ($this->modName
&& $this->URL
&& empty($queryParts['scheme'])) {
194 $fields_values = array(
195 'userid' => $BE_USER->user
['uid'],
196 'module_name' => $this->modName
.'|'.$this->M_modName
,
198 'description' => $description,
199 'sorting' => $GLOBALS['EXEC_TIME'],
201 $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_be_shortcuts', $fields_values);
204 // Selection-clause for users - so users can deleted only their own shortcuts (except admins)
205 $addUSERWhere = (!$BE_USER->isAdmin()?
' AND userid='.intval($BE_USER->user
['uid']):'');
207 // Deleting shortcuts:
208 if (strcmp($this->deleteCategory
,'')) {
209 if (t3lib_div
::testInt($this->deleteCategory
)) {
210 $GLOBALS['TYPO3_DB']->exec_DELETEquery('sys_be_shortcuts', 'sc_group='.intval($this->deleteCategory
).$addUSERWhere);
214 // If other changes in post-vars:
215 if (is_array($_POST)) {
217 if (isset($_POST['_savedok_x']) ||
isset($_POST['_saveclosedok_x'])) {
218 $fields_values = array(
219 'description' => $this->editName
,
220 'sc_group' => intval($this->editGroup
)
222 if ($fields_values['sc_group']<0 && !$BE_USER->isAdmin()) {
223 $fields_values['sc_group']=0;
226 $GLOBALS['TYPO3_DB']->exec_UPDATEquery('sys_be_shortcuts', 'uid='.intval($this->whichItem
).$addUSERWhere, $fields_values);
228 // If save without close, keep the session going...
229 if (isset($_POST['_savedok_x'])) {
230 $this->editSC
=$this->whichItem
;
232 // Deleting a single shortcut ?
233 if (isset($_POST['_deletedok_x'])) {
234 $GLOBALS['TYPO3_DB']->exec_DELETEquery('sys_be_shortcuts', 'uid='.intval($this->whichItem
).$addUSERWhere);
236 if (!$this->editSC
) $this->editSC
=-1; // Just to have the checkbox set...
243 * Initialize (page output)
250 $this->doc
= t3lib_div
::makeInstance('template');
251 $this->doc
->backPath
= $BACK_PATH;
252 $this->doc
->form
='<form action="alt_shortcut.php" name="shForm" method="post">';
253 $this->doc
->divClass
='typo3-shortcut';
254 $this->doc
->JScode
.=$this->doc
->wrapScriptTags('
255 function jump(url,modName,mainModName) { //
256 // Clear information about which entry in nav. tree that might have been highlighted.
257 top.fsMod.navFrameHighlightedID = new Array();
258 if (top.content && top.content.nav_frame && top.content.nav_frame.refresh_nav) {
259 top.content.nav_frame.refresh_nav();
262 top.nextLoadModuleUrl = url;
263 top.goToModule(modName);
265 function editSh(uid) { //
266 window.location.href="alt_shortcut.php?editShortcut="+uid;
268 function submitEditPage(id) { //
269 window.location.href="alt_shortcut.php?editPage="+top.rawurlencodeAndRemoveSiteUrl(id);
271 function changeWorkspace(workspaceId) { //
272 window.location.href="alt_shortcut.php?changeWorkspace="+top.rawurlencodeAndRemoveSiteUrl(workspaceId);
274 function changeWorkspacePreview(newstate) { //
275 window.location.href="alt_shortcut.php?changeWorkspacePreview="+newstate;
277 function refreshShortcuts() {
278 window.location.href = document.URL;
282 $this->content
.=$this->doc
->startPage('Shortcut frame');
286 * Main function, creating content in the frame
291 global $BE_USER,$LANG,$TCA;
293 // By default, 5 groups are set
294 $this->groupLabels
=array(
302 $shortCutGroups = $BE_USER->getTSConfig('options.shortcutGroups');
303 if (is_array($shortCutGroups['properties']) && count($shortCutGroups['properties'])) {
304 foreach ($shortCutGroups['properties'] as $k=>$v) {
305 if (strcmp('',$v) && strcmp('0',$v)) {
306 $this->groupLabels
[$k] = (string)$v;
307 } elseif ($BE_USER->isAdmin()) {
308 unset($this->groupLabels
[$k]);
313 // List of global groups that will be loaded. All global groups have negative IDs.
314 $globalGroups = -100; // Group -100 is kind of superglobal and can't be changed.
315 if (count($this->groupLabels
)) {
316 $globalGroups .= ','.implode(',',array_keys($this->groupLabels
));
317 $globalGroups = str_replace(',',',-',$globalGroups); // Ugly hack to make the UIDs negative - is there any better solution?
320 // Fetching shortcuts to display for this user:
321 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'sys_be_shortcuts', '((userid='.$BE_USER->user
['uid'].' AND sc_group>=0) OR sc_group IN ('.$globalGroups.'))', '', 'sc_group,sorting');
324 $this->lines
=array();
325 $this->linesPre
=array();
326 $this->editSC_rec
='';
327 $this->selOpt
=array();
330 // Traverse shortcuts
331 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
332 $mParts = explode('|',$row['module_name']);
333 $row['module_name']=$mParts[0];
334 $row['M_module_name']=$mParts[1];
335 $mParts = explode('_',$row['M_module_name']?
$row['M_module_name']:$row['module_name']);
336 $qParts = parse_url($row['url']);
338 if (!$BE_USER->isAdmin()) {
339 // Check for module access
340 if (!isset($LANG->moduleLabels
['tabs_images'][implode('_',$mParts).'_tab'])) { // Nice hack to check if the user has access to this module - otherwise the translation label would not have been loaded :-)
344 $page_id = $this->getLinkedPageId($row['url']);
345 if (t3lib_div
::testInt($page_id)) {
346 // Check for webmount access
347 if (!$GLOBALS['BE_USER']->isInWebMount($page_id)) continue;
349 // Check for record access
350 $pageRow = t3lib_BEfunc
::getRecord('pages',$page_id);
351 if (!$GLOBALS['BE_USER']->doesUserHaveAccess($pageRow,$perms=1)) continue;
355 if ($this->editSC
&& $row['uid']==$this->editSC
) {
356 $this->editSC_rec
=$row;
359 $sc_group = $row['sc_group'];
360 if ($sc_group && strcmp($formerGr,$sc_group)) {
361 if ($sc_group!=-100) {
362 if ($this->groupLabels
[abs($sc_group)] && strcmp('1',$this->groupLabels
[abs($sc_group)])) {
363 $label = $this->groupLabels
[abs($sc_group)];
365 $label = $LANG->getLL('shortcut_group_'.abs($sc_group),1);
366 if (!$label) $label = $LANG->getLL('shortcut_group',1).' '.abs($sc_group); // Fallback label
370 $onC = 'if (confirm('.$GLOBALS['LANG']->JScharCode($LANG->getLL('bookmark_delAllInCat')).')){window.location.href=\'alt_shortcut.php?deleteCategory='.$sc_group.'\';}return false;';
371 $this->linesPre
[]='<td> </td><td class="bgColor5"><a href="#" onclick="'.htmlspecialchars($onC).'" title="'.$LANG->getLL('bookmark_delAllInCat',1).'">'.$label.'</a></td>';
373 $label = $LANG->getLL('bookmark_global',1).': '.($label ?
$label : abs($sc_group)); // Fallback label
374 $this->lines
[]='<td> </td><td class="bgColor5">'.$label.'</td>';
380 $bgColorClass = $row['uid']==$this->editSC ?
'bgColor5' : ($row['sc_group']<0 ?
'bgColor6' : 'bgColor4');
382 if ($row['description']&&($row['uid']!=$this->editSC
)) {
383 $label = $row['description'];
385 $label = t3lib_div
::fixed_lgd_cs(rawurldecode($qParts['query']),150);
387 $titleA = $this->itemLabel($label,$row['module_name'],$row['M_module_name']);
389 $editSH = ($row['sc_group']>=0 ||
$BE_USER->isAdmin()) ?
'editSh('.intval($row['uid']).');' : "alert('".$LANG->getLL('bookmark_onlyAdmin')."')";
390 $jumpSC = 'jump(unescape(\''.rawurlencode($row['url']).'\'),\''.implode('_',$mParts).'\',\''.$mParts[0].'\');';
391 $onC = 'if (document.shForm.editShortcut_check && document.shForm.editShortcut_check.checked){'.$editSH.'}else{'.$jumpSC.'}return false;';
392 if ($sc_group>=0) { // user defined groups show up first
393 $this->linesPre
[]='<td class="'.$bgColorClass.'"><a href="#" onclick="'.htmlspecialchars($onC).'"><img src="'.$this->getIcon($row['module_name']).'" title="'.htmlspecialchars($titleA).'" alt="" /></a></td>';
395 $this->lines
[]='<td class="'.$bgColorClass.'"><a href="#" onclick="'.htmlspecialchars($onC).'"><img src="'.$this->getIcon($row['module_name']).'" title="'.htmlspecialchars($titleA).'" alt="" /></a></td>';
397 if (trim($row['description'])) {
398 $kkey = strtolower(substr($row['description'],0,20)).'_'.$row['uid'];
399 $this->selOpt
[$kkey]='<option value="'.htmlspecialchars($jumpSC).'">'.htmlspecialchars(t3lib_div
::fixed_lgd_cs($row['description'],50)).'</option>';
401 $formerGr=$row['sc_group'];
403 ksort($this->selOpt
);
404 array_unshift($this->selOpt
,'<option>['.$LANG->getLL('bookmark_selSC',1).']</option>');
406 $this->editLoadedFunc();
407 $this->editPageIdFunc();
409 if (!$this->editLoaded
&& t3lib_extMgm
::isLoaded('cms')) {
410 $editIdCode = '<td nowrap="nowrap">'.$LANG->getLL('bookmark_editID',1).': <input type="text" value="'.($this->editError?
htmlspecialchars($this->editPage
):'').'" name="editPage"'.$this->doc
->formWidth(15).' onchange="submitEditPage(this.value);" />'.
411 ($this->editError?
' <strong><span class="typo3-red">'.htmlspecialchars($this->editError
).'</span></strong>':'').
412 (is_array($this->theEditRec
)?
' <strong>'.$LANG->getLL('bookmark_loadEdit',1).' \''.t3lib_BEfunc
::getRecordTitle('pages',$this->theEditRec
,TRUE).'\'</strong> ('.htmlspecialchars($this->editPath
).')':'').
413 ($this->searchFor?
' '.$LANG->getLL('bookmark_searchFor',1).' <strong>\''.htmlspecialchars($this->searchFor
).'\'</strong>':'').
415 } else $editIdCode = '';
418 $editIdCode.= '<td> '.t3lib_BEfunc
::cshItem('xMOD_csh_corebe', 'bookmarks', $GLOBALS['BACK_PATH'],'',TRUE).'</td>';
423 <table border="0" cellpadding="0" cellspacing="0" width="99%">
427 Shortcut Display Table:
429 <table border="0" cellpadding="0" cellspacing="2" id="typo3-shortcuts">
432 if ($GLOBALS['BE_USER']->getTSConfigVal('options.enableShortcuts')) {
433 $this->content
.= implode('
436 $this->content
.= $editIdCode . '
441 if ($this->hasWorkspaceAccess()) {
442 $this->content
.= $this->workspaceSelector() .
443 t3lib_BEfunc
::cshItem('xMOD_csh_corebe', 'workspaceSelector', $GLOBALS['BACK_PATH'],'',TRUE);
452 if ($this->theEditRec
['uid']) {
453 $this->content
.=$this->doc
->wrapScriptTags('top.loadEditId('.$this->theEditRec
['uid'].');');
457 // Load alternative table/uid into editing form.
458 if (count($this->alternativeTableUid
)==2 && isset($TCA[$this->alternativeTableUid
[0]]) && t3lib_div
::testInt($this->alternativeTableUid
[1])) {
459 $JSaction = t3lib_BEfunc
::editOnClick('&edit['.$this->alternativeTableUid
[0].']['.$this->alternativeTableUid
[1].']=edit','','dummy.php');
460 $this->content
.=$this->doc
->wrapScriptTags('function editArbitraryElement() { top.content.'.$JSaction.'; } editArbitraryElement();');
463 // Load search for something.
464 if ($this->searchFor
) {
465 $firstMP = intval($GLOBALS['WEBMOUNTS'][0]);
466 $this->content
.= $this->doc
->wrapScriptTags('jump(unescape("' .
467 rawurlencode(t3lib_extMgm
::extRelPath('list') . 'mod1/db_list.php?id=' . $firstMP . '&search_field=' . rawurlencode($this->searchFor
) . '&search_levels=4') .
468 '"), "web_list", "web");');
473 * Creates lines for the editing form.
477 function editLoadedFunc() {
478 global $BE_USER,$LANG;
481 if (is_array($this->editSC_rec
) && ($this->editSC_rec
['sc_group']>=0 ||
$BE_USER->isAdmin())) { // sc_group numbers below 0 requires admin to edit those. sc_group numbers above zero must always be owned by the user himself.
485 $opt[]='<option value="0"></option>';
487 foreach($this->groupLabels
as $k=>$v) {
488 if ($v && strcmp('1',$v)) {
491 $label = $LANG->getLL('bookmark_group_'.$k,1);
492 if (!$label) $label = $LANG->getLL('bookmark_group',1).' '.$k; // Fallback label
494 $opt[]='<option value="'.$k.'"'.(!strcmp($this->editSC_rec
['sc_group'],$k)?
' selected="selected"':'').'>'.$label.'</option>';
497 if ($BE_USER->isAdmin()) {
498 foreach($this->groupLabels
as $k=>$v) {
499 if ($v && strcmp('1',$v)) {
502 $label = $LANG->getLL('bookmark_group_'.$k,1);
503 if (!$label) $label = $LANG->getLL('bookmark_group',1).' '.$k; // Fallback label
505 $label = $LANG->getLL('bookmark_global',1).': '.$label; // Add a prefix for global groups
507 $opt[]='<option value="-'.$k.'"'.(!strcmp($this->editSC_rec
['sc_group'],'-'.$k)?
' selected="selected"':'').'>'.$label.'</option>';
509 $opt[]='<option value="-100"'.(!strcmp($this->editSC_rec
['sc_group'],'-100')?
' selected="selected"':'').'>'.$LANG->getLL('bookmark_global',1).': '.$LANG->getLL('bookmark_all',1).'</option>';
512 // border="0" hspace="2" width="21" height="16" - not XHTML compliant in <input type="image" ...>
516 Shortcut Editing Form:
518 <table border="0" cellpadding="0" cellspacing="0" id="typo3-shortcuts-editing">
520 <td> </td>
521 <td><input type="image" class="c-inputButton" name="_savedok"'.t3lib_iconWorks
::skinImg($this->doc
->backPath
,'gfx/savedok.gif','').' title="'.$LANG->getLL('shortcut_save',1).'" /></td>
522 <td><input type="image" class="c-inputButton" name="_saveclosedok"'.t3lib_iconWorks
::skinImg($this->doc
->backPath
,'gfx/saveandclosedok.gif','').' title="'.$LANG->getLL('bookmark_saveClose',1).'" /></td>
523 <td><input type="image" class="c-inputButton" name="_closedok"'.t3lib_iconWorks
::skinImg($this->doc
->backPath
,'gfx/closedok.gif','').' title="'.$LANG->getLL('bookmark_close',1).'" /></td>
524 <td><input type="image" class="c-inputButton" name="_deletedok"'.t3lib_iconWorks
::skinImg($this->doc
->backPath
,'gfx/deletedok.gif','').' title="'.$LANG->getLL('bookmark_delete',1).'" /></td>
525 <td><input name="editName" type="text" value="'.htmlspecialchars($this->editSC_rec
['description']).'"'.$this->doc
->formWidth(15).' /></td>
526 <td><select name="editGroup">'.implode('',$opt).'</select></td>
529 <input type="hidden" name="whichItem" value="'.$this->editSC_rec
['uid'].'" />
532 } else $manageForm='';
534 if (!$this->editLoaded
&& count($this->selOpt
)>1) {
535 $this->lines
[]='<td> </td>';
536 $this->lines
[]='<td><select name="_selSC" onchange="eval(this.options[this.selectedIndex].value);this.selectedIndex=0;">'.implode('',$this->selOpt
).'</select></td>';
539 // $this->linesPre contains elements with sc_group>=0
540 $this->lines
= array_merge($this->linesPre
,$this->lines
);
542 if (count($this->lines
)) {
543 if (!$BE_USER->getTSConfigVal('options.mayNotCreateEditShortcuts')) {
544 $this->lines
=array_merge(array('<td><input type="checkbox" id="editShortcut_check" name="editShortcut_check" value="1"'.($this->editSC?
' checked="checked"':'').' /> <label for="editShortcut_check">'.$LANG->getLL('bookmark_edit',1).'</label> </td>'),$this->lines
);
545 $this->lines
[]='<td>'.$manageForm.'</td>';
547 $this->lines
[]='<td><img src="clear.gif" width="10" height="1" alt="" /></td>';
552 * If "editPage" value is sent to script and it points to an accessible page, the internal var $this->theEditRec is set to the page record which should be loaded.
557 function editPageIdFunc() {
558 global $BE_USER,$LANG;
560 if (!t3lib_extMgm
::isLoaded('cms')) return;
563 $this->editPage
= trim($LANG->csConvObj
->conv_case($LANG->charSet
,$this->editPage
,'toLower'));
564 $this->editError
= '';
565 $this->theEditRec
= '';
566 $this->searchFor
= '';
567 if ($this->editPage
) {
569 // First, test alternative value consisting of [table]:[uid] and if not found, proceed with traditional page ID resolve:
570 $this->alternativeTableUid
= explode(':',$this->editPage
);
571 if (!(count($this->alternativeTableUid
)==2 && $BE_USER->isAdmin())) { // We restrict it to admins only just because I'm not really sure if alt_doc.php properly checks permissions of passed records for editing. If alt_doc.php does that, then we can remove this.
573 $where = ' AND ('.$BE_USER->getPagePermsClause(2).' OR '.$BE_USER->getPagePermsClause(16).')';
574 if (t3lib_div
::testInt($this->editPage
)) {
575 $this->theEditRec
= t3lib_BEfunc
::getRecordWSOL('pages',$this->editPage
,'*',$where);
577 $records = t3lib_BEfunc
::getRecordsByField('pages','alias',$this->editPage
,$where);
578 if (is_array($records)) {
580 $this->theEditRec
= current($records);
581 t3lib_BEfunc
::workspaceOL('pages',$this->theEditRec
);
584 if (!is_array($this->theEditRec
)) {
585 unset($this->theEditRec
);
586 $this->searchFor
= $this->editPage
;
587 } elseif (!$BE_USER->isInWebMount($this->theEditRec
['uid'])) {
588 unset($this->theEditRec
);
589 $this->editError
=$LANG->getLL('bookmark_notEditable');
593 $perms_clause = $BE_USER->getPagePermsClause(1);
594 $this->editPath
= t3lib_BEfunc
::getRecordPath($this->theEditRec
['pid'], $perms_clause, 30);
596 if(!$BE_USER->getTSConfigVal('options.shortcut_onEditId_dontSetPageTree')) {
598 // Expanding page tree:
599 t3lib_BEfunc
::openPageTree($this->theEditRec
['pid'],!$BE_USER->getTSConfigVal('options.shortcut_onEditId_keepExistingExpanded'));
607 * Outputting the accumulated content to screen
611 function printContent() {
614 $this->content
.= $this->doc
->endPage();
615 $this->content
= $this->doc
->insertStylesAndJS($this->content
);
617 if($this->editPage
&& $this->isAjaxCall
) {
621 if($this->theEditRec
['uid']) {
622 $data['type'] = 'page';
623 $data['editRecord'] = $this->theEditRec
['uid'];
626 // edit alternative table/uid
627 if(count($this->alternativeTableUid
) == 2
628 && isset($GLOBALS['TCA'][$this->alternativeTableUid
[0]])
629 && t3lib_div
::testInt($this->alternativeTableUid
[1])) {
630 $data['type'] = 'alternative';
631 $data['alternativeTable'] = $this->alternativeTableUid
[0];
632 $data['alternativeUid'] = $this->alternativeTableUid
[1];
635 // search for something else
636 if($this->searchFor
) {
637 $data['type'] = 'search';
638 $data['firstMountPoint'] = intval($GLOBALS['WEBMOUNTS'][0]);
639 $data['searchFor'] = $this->searchFor
;
642 $content = json_encode($data);
644 header('Content-type: application/json; charset=utf-8');
645 header('X-JSON: '.$content);
647 $content = $this->content
;
661 /***************************
663 * WORKSPACE FUNCTIONS:
665 ***************************/
668 * Create selector for workspaces and change workspace if command is given to do that.
670 * @return string HTML
672 function workspaceSelector() {
673 global $TYPO3_DB,$BE_USER,$LANG;
675 // Changing workspace and if so, reloading entire backend:
676 if (strlen($this->changeWorkspace
)) {
677 $BE_USER->setWorkspace($this->changeWorkspace
);
678 return $this->doc
->wrapScriptTags('top.location.href="'. t3lib_BEfunc
::getBackendScript() . '";');
680 // Changing workspace and if so, reloading entire backend:
681 if (strlen($this->changeWorkspacePreview
)) {
682 $BE_USER->setWorkspacePreview($this->changeWorkspacePreview
);
685 // Create options array:
687 if ($BE_USER->checkWorkspace(array('uid' => 0))) {
688 $options[0] = '['.$LANG->getLL('bookmark_onlineWS').']';
690 if ($BE_USER->checkWorkspace(array('uid' => -1))) {
691 $options[-1] = '['.$LANG->getLL('bookmark_offlineWS').']';
694 // Add custom workspaces (selecting all, filtering by BE_USER check):
695 $workspaces = $TYPO3_DB->exec_SELECTgetRows('uid,title,adminusers,members,reviewers','sys_workspace','pid=0'.t3lib_BEfunc
::deleteClause('sys_workspace'),'','title');
696 if (count($workspaces)) {
697 foreach ($workspaces as $rec) {
698 if ($BE_USER->checkWorkspace($rec)) {
699 $options[$rec['uid']] = $rec['uid'].': '.$rec['title'];
704 // Build selector box:
705 if (count($options)) {
706 foreach($options as $value => $label) {
707 $selected = ((int)$BE_USER->workspace
===$value ?
' selected="selected"' : '');
708 $options[$value] = '<option value="'.htmlspecialchars($value).'"'.$selected.'>'.htmlspecialchars($label).'</option>';
711 $options[] = '<option value="-99">'.$LANG->getLL('bookmark_noWSfound',1).'</option>';
716 if ($BE_USER->workspace
!==0) {
717 $selector.= '<label for="workspacePreview">Frontend Preview:</label> <input type="checkbox" name="workspacePreview" id="workspacePreview" onclick="changeWorkspacePreview('.($BE_USER->user
['workspace_preview'] ?
0 : 1).')"; '.($BE_USER->user
['workspace_preview'] ?
'checked="checked"' : '').'/> ';
720 $selector.= '<a href="mod/user/ws/index.php" target="content">'.
721 t3lib_iconWorks
::getSpriteIconForRecord('sys_workspace', array()).
723 if (count($options) > 1) {
724 $selector .= '<select name="_workspaceSelector" onchange="changeWorkspace(this.options[this.selectedIndex].value);">'.implode('',$options).'</select>';
736 /***************************
740 ***************************/
743 * Returns relative filename for icon.
745 * @param string Absolute filename of the icon
746 * @param string Backpath string to prepend the icon after made relative
749 function mIconFilename($Ifilename,$backPath) {
750 // Change icon of fileadmin references - otherwise it doesn't differ with Web->List
751 $Ifilename = str_replace ('mod/file/list/list.gif', 'mod/file/file.gif', $Ifilename);
753 if (t3lib_div
::isAbsPath($Ifilename)) {
754 $Ifilename = '../'.substr($Ifilename,strlen(PATH_site
));
756 return $backPath.$Ifilename;
760 * Returns icon for shortcut display
762 * @param string Backend module name
763 * @return string Icon file name
765 function getIcon($modName) {
767 if ($LANG->moduleLabels
['tabs_images'][$modName.'_tab']) {
768 $icon = $this->mIconFilename($LANG->moduleLabels
['tabs_images'][$modName.'_tab'],'');
769 } elseif ($modName=='xMOD_alt_doc.php') {
770 $icon = 'gfx/edit2.gif';
771 } elseif ($modName=='xMOD_file_edit.php') {
772 $icon = 'gfx/edit_file.gif';
773 } elseif ($modName=='xMOD_wizard_rte.php') {
774 $icon = 'gfx/edit_rtewiz.gif';
776 $icon = 'gfx/dummy_module.gif';
782 * Returns title-label for icon
784 * @param string In-label
785 * @param string Backend module name (key)
786 * @param string Backend module label (user defined?)
787 * @return string Label for the shortcut item
789 function itemLabel($inlabel,$modName,$M_modName='') {
791 if (substr($modName,0,5)=='xMOD_') {
792 $label=substr($modName,5);
794 $split = explode('_',$modName);
795 $label = $LANG->moduleLabels
['tabs'][$split[0].'_tab'];
796 if (count($split)>1) {
797 $label.='>'.$LANG->moduleLabels
['tabs'][$modName.'_tab'];
800 if ($M_modName) $label.=' ('.$M_modName.')';
801 $label.=': '.$inlabel;
806 * Return the ID of the page in the URL if found.
808 * @param string The URL of the current shortcut link
809 * @return string If a page ID was found, it is returned. Otherwise: 0
811 function getLinkedPageId($url) {
812 return preg_replace('/.*[\?&]id=([^&]+).*/', '$1', $url);
816 * Checks if user has access to Workspace module.
818 * @return boolean Returns true if user has access to workspace module.
820 function hasWorkspaceAccess() {
822 include('mod/user/ws/conf.php');
823 return $GLOBALS['BE_USER']->modAccess(array('name' => 'user', 'access' => 'user,group'), false) && $GLOBALS['BE_USER']->modAccess($MCONF, false);
828 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['typo3/alt_shortcut.php']) {
829 include_once($TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['typo3/alt_shortcut.php']);
835 $SOBE = t3lib_div
::makeInstance('SC_alt_shortcut');
840 $SOBE->printContent();