TYPO3 CMS  TYPO3_7-6
VersionModuleController.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
25 
30 {
36  public $MCONF = [];
37 
43  public $MOD_MENU = [];
44 
50  public $MOD_SETTINGS = [];
51 
57  public $doc;
58 
62  public $content;
63 
69  public $showWorkspaceCol = 0;
70 
75 
79  public $formatCount_cache = [];
80 
84  public $targets = [];
85 
91  public $pageModule = '';
92 
98  public $publishAccess = false;
99 
103  public $stageIndex = [];
104 
108  public $recIndex = [];
109 
115  protected $moduleName = 'web_txversionM1';
116 
122  protected $moduleTemplate;
123 
127  public function __construct()
128  {
129  $GLOBALS['SOBE'] = $this;
130  $GLOBALS['LANG']->includeLLFile('EXT:version/Resources/Private/Language/locallang.xlf');
131  $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
132  }
133 
139  public function menuConfig()
140  {
141  // CLEANSE SETTINGS
142  $this->MOD_SETTINGS = BackendUtility::getModuleData($this->MOD_MENU, GeneralUtility::_GP('SET'), $this->moduleName, 'ses');
143  }
144 
150  public function main()
151  {
152  // Template markers
153  $markers = [
154  'CSH' => '',
155  'FUNC_MENU' => '',
156  'WS_MENU' => '',
157  'CONTENT' => ''
158  ];
159  // Setting module configuration:
160  $this->MCONF['name'] = $this->moduleName;
161  $this->REQUEST_URI = str_replace('&sendToReview=1', '', GeneralUtility::getIndpEnv('REQUEST_URI'));
162  // Draw the header.
163  $this->doc = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Template\DocumentTemplate::class);
164  $this->doc->setModuleTemplate('EXT:version/Resources/Private/Templates/version.html');
165 
166  // Setting up the context sensitive menu:
167  $this->doc->getContextMenuCode();
168  // Getting input data:
169  $this->id = (int)GeneralUtility::_GP('id');
170 
171  // Record uid. Goes with table name to indicate specific record
172  $this->uid = (int)GeneralUtility::_GP('uid');
173  // // Record table. Goes with uid to indicate specific record
174  $this->table = GeneralUtility::_GP('table');
175 
176  $this->details = GeneralUtility::_GP('details');
177  // Page id. If set, indicates activation from Web>Versioning module
178  $this->diffOnly = GeneralUtility::_GP('diffOnly');
179  // Flag. If set, shows only the offline version and with diff-view
180  // Force this setting:
181  $this->MOD_SETTINGS['expandSubElements'] = true;
182  $this->MOD_SETTINGS['diff'] = $this->details || $this->MOD_SETTINGS['diff'] ? 1 : 0;
183  // Reading the record:
184  $record = BackendUtility::getRecord($this->table, $this->uid);
185  if ($record['pid'] == -1) {
186  $record = BackendUtility::getRecord($this->table, $record['t3ver_oid']);
187  }
188  $this->recordFound = is_array($record);
189  $pidValue = $this->table === 'pages' ? $this->uid : $record['pid'];
190  // Checking access etc.
191  if ($this->recordFound && $GLOBALS['TCA'][$this->table]['ctrl']['versioningWS'] && !$this->id) {
192  $this->uid = $record['uid'];
193  // Might have changed if new live record was found!
194  // Access check!
195  // The page will show only if there is a valid page and if this page may be viewed by the user
196  $this->pageinfo = BackendUtility::readPageAccess($pidValue, $this->perms_clause);
197  $access = is_array($this->pageinfo) ? 1 : 0;
198  if ($pidValue && $access || $GLOBALS['BE_USER']->user['admin'] && !$pidValue) {
199  // If another page module was specified, replace the default Page module with the new one
200  $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
201  $this->pageModule = BackendUtility::isModuleSetInTBE_MODULES($newPageModule) ? $newPageModule : 'web_layout';
202  // Setting publish access permission for workspace:
203  $this->publishAccess = $GLOBALS['BE_USER']->workspacePublishAccess($GLOBALS['BE_USER']->workspace);
204  $this->versioningMgm();
205  }
206  // Setting up the buttons and markers for docheader
207  $docHeaderButtons = $this->getButtons();
208  $markers['CSH'] = $docHeaderButtons['csh'];
209  $markers['FUNC_MENU'] = BackendUtility::getFuncMenu($this->id, 'SET[function]', $this->MOD_SETTINGS['function'], $this->MOD_MENU['function']);
210  $markers['CONTENT'] = $this->content;
211  } else {
212  // If no access or id value, create empty document
213  $this->content = '<h2>' . $GLOBALS['LANG']->getLL('clickAPage_header', true) . '</h2><div>' . $GLOBALS['LANG']->getLL('clickAPage_content') . '</div>';
214  // Setting up the buttons and markers for docheader
215  $docHeaderButtons = $this->getButtons();
216  $markers['CONTENT'] = $this->content;
217  }
218  // Build the <body> for the module
219  $this->content = $this->doc->startPage($GLOBALS['LANG']->getLL('title'));
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 
231  public function printContent()
232  {
234  echo $this->content;
235  }
236 
242  protected function getButtons()
243  {
244  $buttons = [
245  'csh' => '',
246  'view' => '',
247  'record_list' => '',
248  'shortcut' => ''
249  ];
250  // CSH
251  if ($this->recordFound && $GLOBALS['TCA'][$this->table]['ctrl']['versioningWS']) {
252  // View page
253  $buttons['view'] = '
254  <a href="#" onclick="' . htmlspecialchars(BackendUtility::viewOnClick($this->pageinfo['uid'], '', BackendUtility::BEgetRootLine($this->pageinfo['uid']))) . '" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.showPage', true) . '">
255  ' . $this->moduleTemplate->getIconFactory()->getIcon('actions-document-view', Icon::SIZE_SMALL)->render() . '
256  </a>';
257  // Shortcut
258  if ($GLOBALS['BE_USER']->mayMakeShortcut()) {
259  $buttons['shortcut'] = $this->doc->makeShortcutIcon('id, edit_record, pointer, new_unique_uid, search_field, search_levels, showLimit', implode(',', array_keys($this->MOD_MENU)), $this->moduleName);
260  }
261  // If access to Web>List for user, then link to that module.
262  $buttons['record_list'] = BackendUtility::getListViewLink([
263  'id' => $this->pageinfo['uid'],
264  'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI')
265  ], '', $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.showList'));
266  }
267  return $buttons;
268  }
269 
270  /******************************
271  *
272  * Versioning management
273  *
274  ******************************/
280  public function versioningMgm()
281  {
282  // Diffing:
283  $diff_1 = GeneralUtility::_POST('diff_1');
284  $diff_2 = GeneralUtility::_POST('diff_2');
285  if (GeneralUtility::_POST('do_diff')) {
286  $content = '';
287  $content .= '<div class="panel panel-space panel-default">';
288  $content .= '<div class="panel-heading">' . $GLOBALS['LANG']->getLL('diffing') . '</div>';
289  if ($diff_1 && $diff_2) {
290  $diff_1_record = BackendUtility::getRecord($this->table, $diff_1);
291  $diff_2_record = BackendUtility::getRecord($this->table, $diff_2);
292  if (is_array($diff_1_record) && is_array($diff_2_record)) {
293  $diffUtility = GeneralUtility::makeInstance(DiffUtility::class);
294  $diffUtility->stripTags = false;
295  $rows = [];
296  $rows[] = '
297  <tr>
298  <th>' . $GLOBALS['LANG']->getLL('fieldname') . '</th>
299  <th width="98%">' . $GLOBALS['LANG']->getLL('coloredDiffView') . ':</th>
300  </tr>
301  ';
302  foreach ($diff_1_record as $fN => $fV) {
303  if ($GLOBALS['TCA'][$this->table]['columns'][$fN] && $GLOBALS['TCA'][$this->table]['columns'][$fN]['config']['type'] !== 'passthrough' && $fN !== 't3ver_label') {
304  if ((string)$diff_1_record[$fN] !== (string)$diff_2_record[$fN]) {
305  $diffres = $diffUtility->makeDiffDisplay(
306  BackendUtility::getProcessedValue($this->table, $fN, $diff_2_record[$fN], 0, 1),
307  BackendUtility::getProcessedValue($this->table, $fN, $diff_1_record[$fN], 0, 1)
308  );
309  $rows[] = '
310  <tr>
311  <td>' . $fN . '</td>
312  <td width="98%">' . $diffres . '</td>
313  </tr>
314  ';
315  }
316  }
317  }
318  if (count($rows) > 1) {
319  $content .= '<div class="table-fit"><table class="table">' . implode('', $rows) . '</table></div>';
320  } else {
321  $content .= '<div class="panel-body">' . $GLOBALS['LANG']->getLL('recordsMatchesCompletely') . '</div>';
322  }
323  } else {
324  $content .= '<div class="panel-body">' . $GLOBALS['LANG']->getLL('errorRecordsNotFound') . '</div>';
325  }
326  } else {
327  $content .= '<div class="panel-body">' . $GLOBALS['LANG']->getLL('errorDiffSources') . '</div>';
328  }
329  $content .= '</div>';
330  }
331  // Element:
332  $record = BackendUtility::getRecord($this->table, $this->uid);
333  $recTitle = BackendUtility::getRecordTitle($this->table, $record, true);
334  // Display versions:
335  $content .= '
336  <form name="theform" action="' . str_replace('&sendToReview=1', '', $this->REQUEST_URI) . '" method="post">
337  <div class="panel panel-space panel-default">
338  <div class="panel-heading">' . $recTitle . '</div>
339  <div class="table-fit">
340  <table class="table">
341  <thead>
342  <tr>
343  <th colspan="2" class="col-icon"></th>
344  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_title') . '">' . $GLOBALS['LANG']->getLL('tblHeader_title') . '</th>
345  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_uid') . '"><i>' . $GLOBALS['LANG']->getLL('tblHeader_uid') . '</i></th>
346  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_oid') . '"><i>' . $GLOBALS['LANG']->getLL('tblHeader_t3ver_oid') . '</i></th>
347  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_id') . '"><i>' . $GLOBALS['LANG']->getLL('tblHeader_t3ver_id') . '</i></th>
348  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_wsid') . '"><i>' . $GLOBALS['LANG']->getLL('tblHeader_t3ver_wsid') . '</i></th>
349  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_state', true) . '"><i>' . $GLOBALS['LANG']->getLL('tblHeader_t3ver_state') . '</i></th>
350  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_stage') . '"><i>' . $GLOBALS['LANG']->getLL('tblHeader_t3ver_stage') . '</i></th>
351  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_count') . '"><i>' . $GLOBALS['LANG']->getLL('tblHeader_t3ver_count') . '</i></th>
352  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_pid') . '"><i>' . $GLOBALS['LANG']->getLL('tblHeader_pid') . '</i></th>
353  <th title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_label') . '"><i>' . $GLOBALS['LANG']->getLL('tblHeader_t3ver_label') . '</i></th>
354  <th></th>
355  <th colspan="2">
356  <button class="btn btn-default btn-sm" type="submit" name="do_diff" value="true">
357  ' . $GLOBALS['LANG']->getLL('diff') . '
358  </button>
359  </th>
360  </tr>
361  </thead>
362  <tbody>
363  ';
364  $versions = BackendUtility::selectVersionsOfRecord($this->table, $this->uid, '*', $GLOBALS['BE_USER']->workspace);
365  foreach ($versions as $row) {
366  $adminLinks = $this->adminLinks($this->table, $row);
367 
368  $editUrl = BackendUtility::getModuleUrl('record_edit', [
369  'edit' => [
370  $this->table => [
371  $row['uid'] => 'edit'
372  ]
373  ],
374  'columnsOnly' => 't3ver_label',
375  'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI')
376  ]);
377  $content .= '
378  <tr' . ($row['uid'] != $this->uid ? '' : ' class="active"') . '>
379  <td class="col-icon">' .
380  ($row['uid'] != $this->uid ?
381  '<a href="' . BackendUtility::getLinkToDataHandlerAction('&cmd[' . $this->table . '][' . $this->uid . '][version][swapWith]=' . $row['uid'] . '&cmd[' . $this->table . '][' . $this->uid . '][version][action]=swap') . '" title="' . $GLOBALS['LANG']->getLL('swapWithCurrent', true) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-version-swap-version', Icon::SIZE_SMALL)->render() . '</a>' :
382  '<span title="' . $GLOBALS['LANG']->getLL('currentOnlineVersion', true) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('status-status-current', Icon::SIZE_SMALL)->render() . '</span>'
383  ) . '
384  </td>
385  <td class="col-icon">' . $this->moduleTemplate->getIconFactory()->getIconForRecord($this->table, $row, Icon::SIZE_SMALL)->render() . '</td>
386  <td>' . BackendUtility::getRecordTitle($this->table, $row, true) . '</td>
387  <td>' . $row['uid'] . '</td>
388  <td>' . $row['t3ver_oid'] . '</td>
389  <td>' . $row['t3ver_id'] . '</td>
390  <td>' . $row['t3ver_wsid'] . '</td>
391  <td>' . $row['t3ver_state'] . '</td>
392  <td>' . $row['t3ver_stage'] . '</td>
393  <td>' . $row['t3ver_count'] . '</td>
394  <td>' . $row['pid'] . '</td>
395  <td>
396  <a href="' . htmlspecialchars($editUrl) . '" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:cm.edit', true) . '">
397  ' . $this->moduleTemplate->getIconFactory()->getIcon('actions-document-open', Icon::SIZE_SMALL)->render() . '
398  </a>' . htmlspecialchars($row['t3ver_label']) . '
399  </td>
400  <td class="col-control">' . $adminLinks . '</td>
401  <td class="text-center success"><input type="radio" name="diff_1" value="' . $row['uid'] . '"' . ($diff_1 == $row['uid'] ? ' checked="checked"' : '') . '/></td>
402  <td class="text-center danger"><input type="radio" name="diff_2" value="' . $row['uid'] . '"' . ($diff_2 == $row['uid'] ? ' checked="checked"' : '') . '/></td>
403  </tr>';
404  // Show sub-content if the table is pages AND it is not the online branch (because that will mostly render the WHOLE tree below - not smart;)
405  if ($this->table === 'pages' && $row['uid'] != $this->uid) {
406  $sub = $this->pageSubContent($row['uid']);
407  if ($sub) {
408  $content .= '
409  <tr>
410  <td colspan="2"></td>
411  <td colspan="11">' . $sub . '</td>
412  <td class="success"></td>
413  <td class="danger"></td>
414  </tr>';
415  }
416  }
417  }
418  $content .= '
419  </tbody>
420  </table>
421  </div>
422  </div>
423  </form>';
424  $this->content .= '<h2>' . $GLOBALS['LANG']->getLL('title', true) . '</h2><div>' . $content . '</div>';
425  // Create new:
426  $content = '
427  <form action="' . htmlspecialchars(BackendUtility::getModuleUrl('tce_db')) . '" method="post">
428  <div class="row">
429  <div class="col-sm-6 col-md-4 col-lg-3">
430  <div class="form-group">
431  <label for="typo3-new-version-label">' . $GLOBALS['LANG']->getLL('tblHeader_t3ver_label') . '</label>
432  <input id="typo3-new-version-label" class="form-control" type="text" name="cmd[' . $this->table . '][' . $this->uid . '][version][label]" />
433  </div>
434  <div class="form-group">
435  <input type="hidden" name="cmd[' . $this->table . '][' . $this->uid . '][version][action]" value="new" />
436  <input type="hidden" name="prErr" value="1" />
437  <input type="hidden" name="redirect" value="' . htmlspecialchars($this->REQUEST_URI) . '" />
438  <input class="btn btn-default" type="submit" name="_" value="' . $GLOBALS['LANG']->getLL('createNewVersion') . '" />
439  </div>
440  </div>
441  </div>
442  </form>
443 
444  ';
445  $this->content .= '<h2>' . $GLOBALS['LANG']->getLL('createNewVersion', true) . '</h2><div>' . $content . '</div>';
446  }
447 
455  public function pageSubContent($pid, $c = 0)
456  {
457  $tableNames = ArrayUtility::removeArrayEntryByValue(array_keys($GLOBALS['TCA']), 'pages');
458  $tableNames[] = 'pages';
459  $content = '';
460  foreach ($tableNames as $table) {
461  // Basically list ALL tables - not only those being copied might be found!
462  $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $table, 'pid=' . (int)$pid . BackendUtility::deleteClause($table), '', $GLOBALS['TCA'][$table]['ctrl']['sortby'] ? $GLOBALS['TCA'][$table]['ctrl']['sortby'] : '');
463  if ($GLOBALS['TYPO3_DB']->sql_num_rows($mres)) {
464  $content .= '
465  <table class="table">
466  <tr>
467  <th class="col-icon">' . $this->moduleTemplate->getIconFactory()->getIconForRecord($table, [], Icon::SIZE_SMALL)->render() . '</th>
468  <th class="col-title">' . $GLOBALS['LANG']->sL($GLOBALS['TCA'][$table]['ctrl']['title'], true) . '</th>
469  <th></th>
470  <th></th>
471  </tr>';
472  while ($subrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
473  $ownVer = $this->lookForOwnVersions($table, $subrow['uid']);
474  $content .= '
475  <tr>
476  <td class="col-icon">' . $this->moduleTemplate->getIconFactory()->getIconForRecord($table, $subrow, Icon::SIZE_SMALL)->render() . '</td>
477  <td class="col-title">' . BackendUtility::getRecordTitle($table, $subrow, true) . '</td>
478  <td>' . ($ownVer > 1 ? '<a href="' . htmlspecialchars(BackendUtility::getModuleUrl('web_txversionM1', ['table' => $table, 'uid' => $subrow['uid']])) . '">' . ($ownVer - 1) . '</a>' : '') . '</td>
479  <td class="col-control">' . $this->adminLinks($table, $subrow) . '</td>
480  </tr>';
481  if ($table == 'pages' && $c < 100) {
482  $sub = $this->pageSubContent($subrow['uid'], $c + 1);
483  if ($sub) {
484  $content .= '
485  <tr>
486  <td></td>
487  <td></td>
488  <td></td>
489  <td width="98%">' . $sub . '</td>
490  </tr>';
491  }
492  }
493  }
494  $content .= '</table>';
495  }
496  $GLOBALS['TYPO3_DB']->sql_free_result($mres);
497  }
498  return $content;
499  }
500 
508  public function lookForOwnVersions($table, $uid)
509  {
510  $versions = BackendUtility::selectVersionsOfRecord($table, $uid, 'uid', null);
511  if (is_array($versions)) {
512  return count($versions);
513  }
514  return false;
515  }
516 
524  public function adminLinks($table, $row)
525  {
526  // Edit link:
527  $editUrl = BackendUtility::getModuleUrl('record_edit', [
528  'edit' => [
529  $table => [
530  $row['uid'] => 'edit'
531  ]
532  ],
533  'returnUrl' => GeneralUtility::getIndpEnv('REQUEST_URI')
534  ]);
535  $adminLink = '<a class="btn btn-default" href="' . htmlspecialchars($editUrl) . '" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:cm.edit', true) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-document-open', Icon::SIZE_SMALL)->render() . '</a>';
536  // Delete link:
537  $adminLink .= '<a class="btn btn-default" href="' . htmlspecialchars(BackendUtility::getLinkToDataHandlerAction('&cmd[' . $table . '][' . $row['uid'] . '][delete]=1')) . '" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:cm.delete', true) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-edit-delete', Icon::SIZE_SMALL)->render() . '</a>';
538  if ($table === 'pages') {
539  // If another page module was specified, replace the default Page module with the new one
540  $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
541  $pageModule = BackendUtility::isModuleSetInTBE_MODULES($newPageModule) ? $newPageModule : 'web_layout';
542  // Perform some access checks:
543  $a_wl = $GLOBALS['BE_USER']->check('modules', 'web_list');
544  $a_wp = $GLOBALS['BE_USER']->check('modules', $pageModule);
545  $adminLink .= '<a class="btn btn-default" href="#" onclick="top.loadEditId(' . $row['uid'] . ');top.goToModule(' . GeneralUtility::quoteJSvalue($pageModule) . '); return false;">'
546  . $this->moduleTemplate->getIconFactory()->getIcon('actions-page-open', Icon::SIZE_SMALL)->render()
547  . '</a>';
548  $adminLink .= '<a class="btn btn-default" href="#" onclick="top.loadEditId(' . $row['uid'] . ');top.goToModule(\'web_list\'); return false;">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-system-list-open', Icon::SIZE_SMALL)->render() . '</a>';
549  // "View page" icon is added:
550  $adminLink .= '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::viewOnClick($row['uid'], '', BackendUtility::BEgetRootLine($row['uid']))) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-document-view', Icon::SIZE_SMALL)->render() . '</a>';
551  } else {
552  if ($row['pid'] == -1) {
553  $getVars = '&ADMCMD_vPrev[' . rawurlencode(($table . ':' . $row['t3ver_oid'])) . ']=' . $row['uid'];
554  // "View page" icon is added:
555  $adminLink .= '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::viewOnClick($row['_REAL_PID'], '', BackendUtility::BEgetRootLine($row['_REAL_PID']), '', '', $getVars)) . '">' . $this->moduleTemplate->getIconFactory()->getIcon('actions-document-view', Icon::SIZE_SMALL)->render() . '</a>';
556  }
557  }
558  return '<div class="btn-group btn-group-sm" role="group">' . $adminLink . '</div>';
559  }
560 
568  public function mainAction(ServerRequestInterface $request, ResponseInterface $response)
569  {
570  $this->init();
571  $this->main();
572 
573  $response->getBody()->write($this->content);
574  return $response;
575  }
576 }
static readPageAccess($id, $perms_clause)
static BEgetRootLine($uid, $clause='', $workspaceOL=false)
mainAction(ServerRequestInterface $request, ResponseInterface $response)
static getModuleData($MOD_MENU, $CHANGED_SETTINGS, $modName, $type='', $dontValidateList='', $setDefaultList='')
static removeArrayEntryByValue(array $array, $cmpValue)
static getRecordTitle($table, $row, $prep=false, $forceResult=true)
static getFuncMenu($mainParams, $elementName, $currentValue, $menuItems, $script='', $addParams='')
static viewOnClick($pageUid, $backPath='', $rootLine=null, $anchorSection='', $alternativeUrl='', $additionalGetVars='', $switchFocus=true)
$uid
Definition: server.php:38
static getRecord($table, $uid, $fields=' *', $where='', $useDeleteClause=true)
if(TYPO3_MODE==='BE') $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tsfebeuserauth.php']['frontendEditingController']['default']
static selectVersionsOfRecord($table, $uid, $fields=' *', $workspace=0, $includeDeletedRecords=false, $row=null)
static getLinkToDataHandlerAction($parameters, $redirectUrl='')
static deleteClause($table, $tableAlias='')