0byt3m1n1
Path:
/
data
/
applications
/
aps
/
typo3
/
4.2.1-6
/
standard
/
htdocs
/
typo3
/
classes
/
[
Home
]
File: class.shortcutmenu.php
<?php /*************************************************************** * Copyright notice * * (c) 2007-2008 Ingo Renner <ingo@typo3.org> * All rights reserved * * This script is part of the TYPO3 project. The TYPO3 project is * free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * The GNU General Public License can be found at * http://www.gnu.org/copyleft/gpl.html. * A copy is found in the textfile GPL.txt and important notices to the license * from the author is found in LICENSE.txt distributed with these scripts. * * * This script is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ if(TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_AJAX) { require_once('interfaces/interface.backend_toolbaritem.php'); require_once(PATH_t3lib.'class.t3lib_loadmodules.php'); require_once(PATH_typo3.'sysext/lang/lang.php'); $GLOBALS['LANG'] = t3lib_div::makeInstance('language'); $GLOBALS['LANG']->init($GLOBALS['BE_USER']->uc['lang']); $GLOBALS['LANG']->includeLLFile('EXT:lang/locallang_misc.xml'); // needed to get the correct icons when reloading the menu after saving it $loadModules = t3lib_div::makeInstance('t3lib_loadModules'); $loadModules->load($GLOBALS['TBE_MODULES']); } /** * class to render the shortcut menu * * $Id: class.shortcutmenu.php 3669 2008-05-20 08:34:50Z flyguide $ * * @author Ingo Renner <ingo@typo3.org> * @package TYPO3 * @subpackage core */ class ShortcutMenu implements backend_toolbarItem { protected $shortcutGroups; /** * all available shortcuts * * @var array */ protected $shortcuts; /** * labels of all groups. * If value is 1, the system will try to find a label in the locallang array. * * @var array */ protected $groupLabels; /** * reference back to the backend object * * @var TYPO3backend */ protected $backendReference; /** * constructor * * @param TYPO3backend TYPO3 backend object reference * @return void */ public function __construct(TYPO3backend &$backendReference = null) { $this->backendReference = $backendReference; $this->shortcuts = array(); // by default, 5 groups are set $this->shortcutGroups = array( 1 => '1', 2 => '1', 3 => '1', 4 => '1', 5 => '1', ); $this->shortcutGroups = $this->initShortcutGroups(); $this->shortcuts = $this->initShortcuts(); } /** * checks whether the user has access to this toolbar item * * @return boolean true if user has access, false if not */ public function checkAccess() { // Shortcut module is enabled for everybody return true; } /** * Creates the shortcut menu (default renderer) * * @return string workspace selector as HTML select */ public function render() { $this->addJavascriptToBackend(); $shortcutMenu = array(); $shortcutMenu[] = '<a href="#" class="toolbar-item"><img'.t3lib_iconWorks::skinImg($this->backPath, 'gfx/toolbar_shortcut.png', 'width="16" height="16"').' title="Shortcuts" alt="" /></a>'; $shortcutMenu[] = '<div class="toolbar-item-menu" style="display: none;">'; $shortcutMenu[] = $this->renderMenu(); $shortcutMenu[] = '</div>'; return implode("\n", $shortcutMenu); } /** * renders the pure contents of the menu * * @return string the menu's content */ public function renderMenu() { $groupIcon = '<img'.t3lib_iconWorks::skinImg($this->backPath, 'gfx/i/sysf.gif', 'width="18" height="16"').' title="Shortcut Group" alt="" />'; $editIcon = '<img'.t3lib_iconWorks::skinImg($this->backPath, 'gfx/edit2.gif', 'width="11" height="12"').' title="Edit Shortcut" alt=""'; $deleteIcon = '<img'.t3lib_iconWorks::skinImg($this->backPath, 'gfx/garbage.gif', 'width="11" height="12"').' title="Delete Shortcut" alt="" />'; $shortcutMenu[] = '<table border="0" cellspacing="0" cellpadding="0" class="shortcut-list">'; // render shortcuts with no group (group id = 0) first $noGroupShortcuts = $this->getShortcutsByGroup(0); foreach($noGroupShortcuts as $shortcut) { $shortcutMenu[] = ' <tr id="shortcut-'.$shortcut['raw']['uid'].'" class="shortcut"> <td class="shortcut-icon">'.$shortcut['icon'].'</td> <td class="shortcut-label"> <a id="shortcut-label-'.$shortcut['raw']['uid'].'" href="" onclick="'.$shortcut['action'].'">'.$shortcut['label'].'</a> </td> <td class="shortcut-edit">'.$editIcon.' id="shortcut-edit-'.$shortcut['raw']['uid'].'" /></td> <td class="shortcut-delete">'.$deleteIcon.'</td> </tr>'; } // now render groups and the contained shortcuts $groups = $this->getGroupsFromShortcuts(); krsort($groups, SORT_NUMERIC); foreach($groups as $groupId => $groupLabel) { if($groupId != 0 ) { $shortcutGroup = ' <tr class="shortcut-group" id="shortcut-group-'.$groupId.'"> <td class="shortcut-group-icon">'.$groupIcon.'</td> <td class="shortcut-group-label">'.$groupLabel.'</td> <td colspan="2"> </td> </tr>'; $shortcuts = $this->getShortcutsByGroup($groupId); $i = 0; foreach($shortcuts as $shortcut) { $i++; $firstRow = ''; if($i == 1) { $firstRow = ' first-row'; } $shortcutGroup .= ' <tr id="shortcut-'.$shortcut['raw']['uid'].'" class="shortcut'.$firstRow.'"> <td class="shortcut-icon">'.$shortcut['icon'].'</td> <td class="shortcut-label"> <a id="shortcut-label-'.$shortcut['raw']['uid'].'" href="" onclick="'.$shortcut['action'].'">'.$shortcut['label'].'</a> </td> <td class="shortcut-edit">'.$editIcon.' id="shortcut-edit-'.$shortcut['raw']['uid'].'" /></td> <td class="shortcut-delete">'.$deleteIcon.'</td> </tr>'; } $shortcutMenu[] = $shortcutGroup; } } if(count($shortcutMenu) == 1) { //no shortcuts added yet, show a small help message how to add shortcuts $icon = '<img'.t3lib_iconWorks::skinImg($backPath,'gfx/shortcut.gif','width="14" height="14"').' title="shortcut icon" alt="" />'; $label = str_replace('%icon%', $icon, $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_misc.php:shortcutDescription')); $shortcutMenu[] = '<tr><td style="padding:1px 2px; color: #838383;">'.$label.'</td></tr>'; } $shortcutMenu[] = '</table>'; $compiledShortcutMenu = implode("\n", $shortcutMenu); return $compiledShortcutMenu; } /** * renders the menu so that it can be returned as response to an AJAX call * * @param array array of parameters from the AJAX interface, currently unused * @param TYPO3AJAX object of type TYPO3AJAX * @return void */ public function renderAjax($params = array(), TYPO3AJAX &$ajaxObj = null) { $menuContent = $this->renderMenu(); $ajaxObj->addContent('shortcutMenu', $menuContent); } /** * adds the necessary JavaScript to the backend * * @return void */ protected function addJavascriptToBackend() { $this->backendReference->addJavascriptFile('js/shortcutmenu.js'); } /** * returns additional attributes for the list item in the toolbar * * @return string list item HTML attibutes */ public function getAdditionalAttributes() { return ' id="shortcut-menu"'; } /** * retrieves the shortcuts for the current user * * @return array array of shortcuts */ protected function initShortcuts() { $shortcuts = array(); $globalGroups = $this->getGlobalShortcutGroups(); $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( '*', 'sys_be_shortcuts', '((userid = '.$GLOBALS['BE_USER']->user['uid'].' AND sc_group>=0) OR sc_group IN ('.implode(',', array_keys($globalGroups)).'))', '', 'sc_group,sorting' ); // Traverse shortcuts while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { $shortcut = array('raw' => $row); $moduleParts = explode('|', $row['module_name']); $row['module_name'] = $moduleParts[0]; $row['M_module_name'] = $moduleParts[1]; $moduleParts = explode('_', $row['M_module_name'] ? $row['M_module_name'] : $row['module_name'] ); $queryParts = parse_url($row['url']); $queryParameters = t3lib_div::explodeUrl2Array($queryParts['query'], 1); if($row['module_name'] == 'xMOD_alt_doc.php' && is_array($queryParameters['edit'])) { $shortcut['table'] = key($queryParameters['edit']); $shortcut['recordid'] = key($queryParameters['edit'][$shortcut['table']]); if($queryParameters['edit'][$shortcut['table']][$shortcut['recordid']] == 'edit') { $shortcut['type'] = 'edit'; } elseif($queryParameters['edit'][$shortcut['table']][$shortcut['recordid']] == 'new') { $shortcut['type'] = 'new'; } if(substr($shortcut['recordid'], -1) == ',') { $shortcut['recordid'] = substr($shortcut['recordid'], 0, -1); } } else { $shortcut['type'] = 'other'; } // check for module access if(!$GLOBALS['BE_USER']->isAdmin()) { if(!isset($GLOBALS['LANG']->moduleLabels['tabs_images'][implode('_', $moduleParts).'_tab'])) { // nice hack to check if the user has access to this module // - otherwise the translation label would not have been loaded :-) continue; } $pageId = $this->getLinkedPageId($row['url']); if(t3lib_div::testInt($pageId)) { // check for webmount access if(!$GLOBALS['BE_USER']->isInWebMount($pageId)) { continue; } // check for record access $pageRow = t3lib_BEfunc::getRecord('pages', $pageId); if(!$GLOBALS['BE_USER']->doesUserHaveAccess($pageRow, $perms = 1)) { continue; } } } $shortcutGroup = $row['sc_group']; if($shortcutGroup && strcmp($lastGroup, $shortcutGroup) && ($shortcutGroup != -100)) { $shortcut['groupLabel'] = $this->getShortcutGroupLabel($shortcutGroup); } if($row['description']) { $shortcut['label'] = $row['description']; } else { $shortcut['label'] = t3lib_div::fixed_lgd(rawurldecode($queryParts['query']), 150); } $shortcut['group'] = $shortcutGroup; $shortcut['icon'] = $this->getShortcutIcon($row, $shortcut); $shortcut['iconTitle'] = $this->getShortcutIconTitle($shortcutLabel, $row['module_name'], $row['M_module_name']); $shortcut['action'] = 'jump(unescape(\''.rawurlencode($row['url']).'\'),\''.implode('_',$moduleParts).'\',\''.$moduleParts[0].'\');'; $lastGroup = $row['sc_group']; $shortcuts[] = $shortcut; } return $shortcuts; } /** * gets shortcuts for a specific group * * @param integer group Id * @return array array of shortcuts that matched the group */ protected function getShortcutsByGroup($groupId) { $shortcuts = array(); foreach($this->shortcuts as $shortcut) { if($shortcut['group'] == $groupId) { $shortcuts[] = $shortcut; } } return $shortcuts; } /** * gets a shortcut by its uid * * @param integer shortcut id to get the complete shortcut for * @return mixed an array containing the shortcut's data on success or false on failure */ protected function getShortcutById($shortcutId) { $returnShortcut = false; foreach($this->shortcuts as $shortcut) { if($shortcut['raw']['uid'] == (int) $shortcutId) { $returnShortcut = $shortcut; continue; } } return $returnShortcut; } /** * gets the available shortcut groups from default gropups, user TSConfig, * and global groups * * @param array array of parameters from the AJAX interface, currently unused * @param TYPO3AJAX object of type TYPO3AJAX * @return array */ protected function initShortcutGroups($params = array(), TYPO3AJAX &$ajaxObj = null) { // groups from TSConfig $userShortcutGroups = $GLOBALS['BE_USER']->getTSConfig('options.shortcutGroups'); if(is_array($userShortcutGroups['properties']) && count($userShortcutGroups['properties'])) { foreach($userShortcutGroups['properties'] as $groupId => $label) { if(strcmp('', $label) && strcmp('0', $label)) { $this->shortcutGroups[$groupId] = (string) $label; } elseif($GLOBALS['BE_USER']->isAdmin()) { unset($this->shortcutGroups[$groupId]); } } } // generate global groups, all global groups have negative IDs. if(count($this->shortcutGroups)) { $groups = $this->shortcutGroups; foreach($groups as $groupId => $groupLabel) { $this->shortcutGroups[($groupId * -1)] = $groupLabel; } } // group -100 is kind of superglobal and can't be changed. $this->shortcutGroups[-100] = 1; // add labels foreach($this->shortcutGroups as $groupId => $groupLabel) { $label = $groupLabel; if($groupLabel == '1') { $label = $GLOBALS['LANG']->getLL('shortcut_group_'.abs($groupId), 1); if(empty($label)) { // fallback label $label = $GLOBALS['LANG']->getLL('shortcut_group', 1).' '.abs($groupId); } } if($groupId < 0) { // global group $label = $GLOBALS['LANG']->getLL('shortcut_global', 1).': '. (!empty($label) ? $label : abs($groupId) ); if($groupId == -100) { $label = $GLOBALS['LANG']->getLL('shortcut_global', 1).': '.$GLOBALS['LANG']->getLL('shortcut_all', 1); } } $this->shortcutGroups[$groupId] = $label; } return $this->shortcutGroups; } /** * gets the available shortcut groups * * @param array array of parameters from the AJAX interface, currently unused * @param TYPO3AJAX object of type TYPO3AJAX * @return void */ public function getAjaxShortcutGroups($params = array(), TYPO3AJAX &$ajaxObj = null) { $shortcutGroups = $this->shortcutGroups; if(!$GLOBALS['BE_USER']->isAdmin()) { foreach($shortcutGroups as $groupId => $groupName) { if(intval($groupId) < 0) { unset($shortcutGroups[$groupId]); } } } $ajaxObj->addContent('shortcutGroups', $shortcutGroups); $ajaxObj->setContentFormat('json'); } /** * deletes a shortcut through an AJAX call * * @param array array of parameters from the AJAX interface, currently unused * @param TYPO3AJAX object of type TYPO3AJAX * @return void */ public function deleteAjaxShortcut($params = array(), TYPO3AJAX &$ajaxObj = null) { $shortcutId = (int) t3lib_div::_POST('shortcutId'); $fullShortcut = $this->getShortcutById($shortcutId); $ajaxReturn = 'failed'; if($fullShortcut['raw']['userid'] == $GLOBALS['BE_USER']->user['uid']) { $GLOBALS['TYPO3_DB']->exec_DELETEquery( 'sys_be_shortcuts', 'uid = '.$shortcutId ); if($GLOBALS['TYPO3_DB']->sql_affected_rows() == 1) { $ajaxReturn = 'deleted'; } } $ajaxObj->addContent('delete', $ajaxReturn); } /** * creates a shortcut through an AJAX call * * @param array array of parameters from the AJAX interface, currently unused * @param TYPO3AJAX object of type TYPO3AJAX * @return void */ public function createAjaxShortcut($params = array(), TYPO3AJAX &$ajaxObj = null) { global $TCA, $LANG; $shortcutCreated = 'failed'; $shortcutName = 'Shortcut'; // default name $shortcutNamePrepend = ''; $url = urldecode(t3lib_div::_POST('url')); $module = t3lib_div::_POST('module'); $motherModule = t3lib_div::_POST('motherModName'); // determine shortcut type $queryParts = parse_url($url); $queryParameters = t3lib_div::explodeUrl2Array($queryParts['query'], 1); if(is_array($queryParameters['edit'])) { $shortcut['table'] = key($queryParameters['edit']); $shortcut['recordid'] = key($queryParameters['edit'][$shortcut['table']]); if($queryParameters['edit'][$shortcut['table']][$shortcut['recordid']] == 'edit') { $shortcut['type'] = 'edit'; $shortcutNamePrepend = $GLOBALS['LANG']->getLL('shortcut_edit', 1); } elseif($queryParameters['edit'][$shortcut['table']][$shortcut['recordid']] == 'new') { $shortcut['type'] = 'new'; $shortcutNamePrepend = $GLOBALS['LANG']->getLL('shortcut_create', 1); } } else { $shortcut['type'] = 'other'; } // Lookup the title of this page and use it as default description $pageId = $this->getLinkedPageId($url); if(t3lib_div::testInt($pageId)) { $page = t3lib_BEfunc::getRecord('pages', $pageId); if(count($page)) { // set the name to the title of the page if($shortcut['type'] == 'other') { $shortcutName = $page['title']; } else { $shortcutName = $shortcutNamePrepend.' '.$LANG->sL($TCA[$shortcut['table']]['ctrl']['title']).' ('.$page['title'].')'; } } } else { if (preg_match('/\/$/', $pageId)) { // if $pageId is a string and ends with a slash, // assume it is a fileadmin reference and set // the description to the basename of that path $shortcutName .= basename($pageId); } } // adding the shortcut if($module && $url) { $fieldValues = array( 'userid' => $GLOBALS['BE_USER']->user['uid'], 'module_name' => $module.'|'.$motherModule, 'url' => $url, 'description' => $shortcutName, 'sorting' => time(), ); $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_be_shortcuts', $fieldValues); if($GLOBALS['TYPO3_DB']->sql_affected_rows() == 1) { $shortcutCreated = 'success'; } } $ajaxObj->addContent('create', $shortcutCreated); } /** * gets called when a shortcut is changed, checks whether the user has * permissions to do so and saves the changes if everything is ok * * @param array array of parameters from the AJAX interface, currently unused * @param TYPO3AJAX object of type TYPO3AJAX * @return void */ public function setAjaxShortcut($params = array(), TYPO3AJAX &$ajaxObj = null) { $shortcutId = (int) t3lib_div::_POST('shortcutId'); $shortcutName = strip_tags(t3lib_div::_POST('value')); $shortcutGroupId = (int) t3lib_div::_POST('shortcut-group'); if($shortcutGroupId > 0 || $GLOBALS['BE_USER']->isAdmin()) { // users can delete only their own shortcuts (except admins) $addUserWhere = (!$GLOBALS['BE_USER']->isAdmin() ? ' AND userid='.intval($GLOBALS['BE_USER']->user['uid']) : '' ); $fieldValues = array( 'description' => $shortcutName, 'sc_group' => $shortcutGroupId ); if($fieldValues['sc_group'] < 0 && !$GLOBALS['BE_USER']->isAdmin()) { $fieldValues['sc_group'] = 0; } $GLOBALS['TYPO3_DB']->exec_UPDATEquery( 'sys_be_shortcuts', 'uid='.$shortcutId.$addUserWhere, $fieldValues ); $affectedRows = $GLOBALS['TYPO3_DB']->sql_affected_rows(); if($affectedRows == 1) { $ajaxObj->addContent('shortcut', $shortcutName); } else { $ajaxObj->addContent('shortcut', 'failed'); } } $ajaxObj->setContentFormat('plain'); } /** * gets the label for a shortcut group * * @param integer a shortcut group id * @return string the shortcut group label, can be an empty string if no group was found for the id */ protected function getShortcutGroupLabel($groupId) { $label = ''; if($this->shortcutGroups[$groupId]) { $label = $this->shortcutGroups[$groupId]; } return $label; } /** * gets a list of global groups, shortcuts in these groups are available to all users * * @return array array of global groups */ protected function getGlobalShortcutGroups() { $globalGroups = array(); foreach($this->shortcutGroups as $groupId => $groupLabel) { if($groupId < 0) { $globalGroups[$groupId] = $groupLabel; } } return $globalGroups; } /** * runs through the available shortcuts an collects their groups * * @return array array of groups which have shortcuts */ protected function getGroupsFromShortcuts() { $groups = array(); foreach($this->shortcuts as $shortcut) { $groups[$shortcut['group']] = $this->shortcutGroups[$shortcut['group']]; } return array_unique($groups); } /** * gets the icon for the shortcut * * @param string backend module name * @return string shortcut icon as img tag */ protected function getShortcutIcon($row, $shortcut) { global $TCA; switch($row['module_name']) { case 'xMOD_alt_doc.php': $table = $shortcut['table']; $recordid = $shortcut['recordid']; if($shortcut['type'] == 'edit') { // Creating the list of fields to include in the SQL query: $selectFields = $this->fieldArray; $selectFields[] = 'uid'; $selectFields[] = 'pid'; if($table=='pages') { if(t3lib_extMgm::isLoaded('cms')) { $selectFields[] = 'module'; $selectFields[] = 'extendToSubpages'; } $selectFields[] = 'doktype'; } if(is_array($TCA[$table]['ctrl']['enablecolumns'])) { $selectFields = array_merge($selectFields,$TCA[$table]['ctrl']['enablecolumns']); } if($TCA[$table]['ctrl']['type']) { $selectFields[] = $TCA[$table]['ctrl']['type']; } if($TCA[$table]['ctrl']['typeicon_column']) { $selectFields[] = $TCA[$table]['ctrl']['typeicon_column']; } if($TCA[$table]['ctrl']['versioningWS']) { $selectFields[] = 't3ver_state'; } $selectFields = array_unique($selectFields); // Unique list! $permissionClause = ($table=='pages' && $this->perms_clause) ? ' AND '.$this->perms_clause : ''; $sqlQueryParts = array( 'SELECT' => implode(',', $selectFields), 'FROM' => $table, 'WHERE' => 'uid IN ('.$recordid.') '.$permissionClause. t3lib_BEfunc::deleteClause($table). t3lib_BEfunc::versioningPlaceholderClause($table) ); $result = $GLOBALS['TYPO3_DB']->exec_SELECT_queryArray($sqlQueryParts); $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result); $icon = t3lib_iconWorks::getIcon($table, $row, $this->backPath); } elseif($shortcut['type'] == 'new') { $icon = t3lib_iconWorks::getIcon($table, '', $this->backPath); } $icon = t3lib_iconWorks::skinImg($this->backPath, $icon, '', 1); break; case 'xMOD_file_edit.php': $icon = 'gfx/edit_file.gif'; break; case 'xMOD_wizard_rte.php': $icon = 'gfx/edit_rtewiz.gif'; break; default: if($GLOBALS['LANG']->moduleLabels['tabs_images'][$row['module_name'].'_tab']) { $icon = $GLOBALS['LANG']->moduleLabels['tabs_images'][$row['module_name'].'_tab']; // change icon of fileadmin references - otherwise it doesn't differ with Web->List $icon = str_replace('mod/file/list/list.gif', 'mod/file/file.gif', $icon); if(t3lib_div::isAbsPath($icon)) { $icon = '../'.substr($icon, strlen(PATH_site)); } } else { $icon = 'gfx/dummy_module.gif'; } } return '<img src="'.$icon.'" alt="shortcut icon" />'; } /** * Returns title for the shortcut icon * * @param string shortcut label * @param string backend module name (key) * @param string parent module label * @return string title for the shortcut icon */ protected function getShortcutIconTitle($shortcutLabel, $moduleName, $parentModuleName = '') { $title = ''; if(substr($moduleName, 0, 5) == 'xMOD_') { $title = substr($moduleName, 5); } else { $splitModuleName = explode('_', $moduleName); $title = $GLOBALS['LANG']->moduleLabels['tabs'][$splitModuleName[0].'_tab']; if(count($splitModuleName) > 1) { $title .= '>'.$GLOBALS['LANG']->moduleLabels['tabs'][$moduleName.'_tab']; } } if($parentModuleName) { $title .= ' ('.$parentModuleName.')'; } $title .= ': '.$shortcutLabel; return $title; } /** * Return the ID of the page in the URL if found. * * @param string The URL of the current shortcut link * @return string If a page ID was found, it is returned. Otherwise: 0 */ protected function getLinkedPageId($url) { return preg_replace('/.*[\?&]id=([^&]+).*/', '$1', $url); } } if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/classes/class.shortcutmenu.php']) { include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/classes/class.shortcutmenu.php']); } ?>