TYPO3 CMS  TYPO3_6-2
DatabaseIntegrityCheck.php
Go to the documentation of this file.
1 <?php
3 
18 
29 
34  public $genTree_includeDeleted = TRUE;
35 
40  public $genTree_includeVersions = TRUE;
41 
46  public $genTree_includeRecords = FALSE;
47 
52  public $perms_clause = '';
53 
58  public $genTree_makeHTML = 0;
59 
60  // Internal
65  public $page_idArray = array();
66 
71  public $rec_idArray = array();
72 
77  public $genTree_HTML = '';
78 
83  public $backPath = '';
84 
85  // Internal
90  public $checkFileRefs = array();
91 
96  public $checkSelectDBRefs = array();
97 
102  public $checkGroupDBRefs = array();
103 
108  public $recStats = array(
109  'allValid' => array(),
110  'published_versions' => array(),
111  'deleted' => array()
112  );
113 
118  public $lRecords = array();
119 
124  public $lostPagesList = '';
125 
136  public function genTree($theID, $depthData, $versions = FALSE) {
137  if ($versions) {
138  $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,title,doktype,deleted,t3ver_wsid,t3ver_id,t3ver_count,hidden', 'pages', 'pid=-1 AND t3ver_oid=' . (int)$theID . ' ' . (!$this->genTree_includeDeleted ? 'AND deleted=0' : '') . $this->perms_clause, '', 'sorting');
139  } else {
140  $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,title,doktype,deleted,hidden', 'pages', 'pid=' . (int)$theID . ' ' . (!$this->genTree_includeDeleted ? 'AND deleted=0' : '') . $this->perms_clause, '', 'sorting');
141  }
142  // Traverse the records selected:
143  $a = 0;
144  $c = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
145  while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
146  // Prepare the additional label used in the HTML output in case of versions:
147  if ($versions) {
148  $versionLabel = '[v1.' . $row['t3ver_id'] . '; WS#' . $row['t3ver_wsid'] . ']';
149  } else {
150  $versionLabel = '';
151  }
152  $a++;
153  $newID = $row['uid'];
154  // Build HTML output:
155  if ($this->genTree_makeHTML) {
156  $this->genTree_HTML .= LF . '<div><span class="nobr">';
157  $PM = 'join';
158  $LN = $a == $c ? 'blank' : 'line';
159  $BTM = $a == $c ? 'bottom' : '';
160  $this->genTree_HTML .= $depthData . '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($this->backPath, ('gfx/ol/' . $PM . $BTM . '.gif'), 'width="18" height="16"') . ' align="top" alt="" />' . $versionLabel . \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIconForRecord('pages', $row) . htmlspecialchars(($row['uid'] . ': ' . \TYPO3\CMS\Core\Utility\GeneralUtility::fixed_lgd_cs(strip_tags($row['title']), 50))) . '</span></div>';
161  }
162  // Register various data for this item:
163  $this->page_idArray[$newID] = $row;
164  $this->recStats['all_valid']['pages'][$newID] = $newID;
165  if ($row['deleted']) {
166  $this->recStats['deleted']['pages'][$newID] = $newID;
167  }
168  if ($versions && $row['t3ver_count'] >= 1) {
169  $this->recStats['published_versions']['pages'][$newID] = $newID;
170  }
171  if ($row['deleted']) {
172  $this->recStats['deleted']++;
173  }
174  if ($row['hidden']) {
175  $this->recStats['hidden']++;
176  }
177  $this->recStats['doktype'][$row['doktype']]++;
178  // Create the HTML code prefix for recursive call:
179  $genHTML = $depthData . '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($this->backPath, ('gfx/ol/' . $LN . '.gif'), 'width="18" height="16"') . ' align="top" alt="" />' . $versionLabel;
180  // If all records should be shown, do so:
181  if ($this->genTree_includeRecords) {
182  foreach ($GLOBALS['TCA'] as $tableName => $cfg) {
183  if ($tableName != 'pages') {
184  $this->genTree_records($newID, $this->genTree_HTML ? $genHTML : '', $tableName);
185  }
186  }
187  }
188  // Add sub pages:
189  $this->genTree($newID, $this->genTree_HTML ? $genHTML : '');
190  // If versions are included in the tree, add those now:
191  if ($this->genTree_includeVersions) {
192  $this->genTree($newID, $this->genTree_HTML ? $genHTML : '', TRUE);
193  }
194  }
195  $GLOBALS['TYPO3_DB']->sql_free_result($res);
196  }
197 
206  public function genTree_records($theID, $depthData, $table = '', $versions = FALSE) {
207  if ($versions) {
208  // Select all records from table pointing to this page:
209  $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
211  $table,
212  'pid=-1 AND t3ver_oid=' . (int)$theID . (!$this->genTree_includeDeleted ? BackendUtility::deleteClause($table) : '')
213  );
214  } else {
215  // Select all records from table pointing to this page:
216  $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
218  $table,
219  'pid=' . (int)$theID . (!$this->genTree_includeDeleted ? BackendUtility::deleteClause($table) : '')
220  );
221  }
222  // Traverse selected:
223  $a = 0;
224  $c = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
225  while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
226  // Prepare the additional label used in the HTML output in case of versions:
227  if ($versions) {
228  $versionLabel = '[v1.' . $row['t3ver_id'] . '; WS#' . $row['t3ver_wsid'] . ']';
229  } else {
230  $versionLabel = '';
231  }
232  $a++;
233  $newID = $row['uid'];
234  // Build HTML output:
235  if ($this->genTree_makeHTML) {
236  $this->genTree_HTML .= LF . '<div><span class="nobr">';
237  $PM = 'join';
238  $LN = $a == $c ? 'blank' : 'line';
239  $BTM = $a == $c ? 'bottom' : '';
240  $this->genTree_HTML .= $depthData . '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($this->backPath, ('gfx/ol/' . $PM . $BTM . '.gif'), 'width="18" height="16"') . ' align="top" alt="" />' . $versionLabel . \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIconForRecord($table, $row, array('title' => $table)) . htmlspecialchars(($row['uid'] . ': ' . BackendUtility::getRecordTitle($table, $row))) . '</span></div>';
241  }
242  // Register various data for this item:
243  $this->rec_idArray[$table][$newID] = $row;
244  $this->recStats['all_valid'][$table][$newID] = $newID;
245  if ($row['deleted']) {
246  $this->recStats['deleted'][$table][$newID] = $newID;
247  }
248  if ($versions && $row['t3ver_count'] >= 1 && $row['t3ver_wsid'] == 0) {
249  $this->recStats['published_versions'][$table][$newID] = $newID;
250  }
251  // Select all versions of this record:
252  if ($this->genTree_includeVersions && $GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
253  $genHTML = $depthData . '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($this->backPath, ('gfx/ol/' . $LN . '.gif'), 'width="18" height="16"') . ' align="top" alt="" />';
254  $this->genTree_records($newID, $genHTML, $table, TRUE);
255  }
256  }
257  $GLOBALS['TYPO3_DB']->sql_free_result($res);
258  }
259 
267  public function lostRecords($pid_list) {
268  $this->lostPagesList = '';
269  if ($pid_list) {
270  foreach ($GLOBALS['TCA'] as $table => $tableConf) {
271  $pid_list_tmp = $pid_list;
272  if (!isset($GLOBALS['TCA'][$table]['ctrl']['versioningWS']) || !$GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
273  // Remove preceding "-1," for non-versioned tables
274  $pid_list_tmp = preg_replace('/^\\-1,/', '', $pid_list_tmp);
275  }
276  $garbage = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,pid,' . $GLOBALS['TCA'][$table]['ctrl']['label'], $table, 'pid NOT IN (' . $pid_list_tmp . ')');
277  $lostIdList = array();
278  while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($garbage)) {
279  $this->lRecords[$table][$row['uid']] = array(
280  'uid' => $row['uid'],
281  'pid' => $row['pid'],
282  'title' => strip_tags(BackendUtility::getRecordTitle($table, $row))
283  );
284  $lostIdList[] = $row['uid'];
285  }
286  $GLOBALS['TYPO3_DB']->sql_free_result($garbage);
287  if ($table == 'pages') {
288  $this->lostPagesList = implode(',', $lostIdList);
289  }
290  }
291  }
292  }
293 
303  public function fixLostRecord($table, $uid) {
304  if ($table && $GLOBALS['TCA'][$table] && $uid && is_array($this->lRecords[$table][$uid]) && $GLOBALS['BE_USER']->user['admin']) {
305  $updateFields = array();
306  $updateFields['pid'] = 0;
307  // If possible a lost record restored is hidden as default
308  if ($GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled']) {
309  $updateFields[$GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled']] = 1;
310  }
311  $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid=' . (int)$uid, $updateFields);
312  return TRUE;
313  } else {
314  return FALSE;
315  }
316  }
317 
325  public function countRecords($pid_list) {
326  $list = array();
327  $list_n = array();
328  if ($pid_list) {
329  foreach ($GLOBALS['TCA'] as $table => $tableConf) {
330  $pid_list_tmp = $pid_list;
331  if (!isset($GLOBALS['TCA'][$table]['ctrl']['versioningWS']) || !$GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
332  // Remove preceding "-1," for non-versioned tables
333  $pid_list_tmp = preg_replace('/^\\-1,/', '', $pid_list_tmp);
334  }
335  $count = $GLOBALS['TYPO3_DB']->exec_SELECTcountRows('uid', $table, 'pid IN (' . $pid_list_tmp . ')');
336  if ($count) {
337  $list[$table] = $count;
338  }
339  $count = $GLOBALS['TYPO3_DB']->exec_SELECTcountRows('uid', $table, 'pid IN (' . $pid_list_tmp . ')' . BackendUtility::deleteClause($table));
340  if ($count) {
341  $list_n[$table] = $count;
342  }
343  }
344  }
345  return array('all' => $list, 'non_deleted' => $list_n);
346  }
347 
355  public function getGroupFields($mode) {
356  $result = array();
357  foreach ($GLOBALS['TCA'] as $table => $tableConf) {
358  $cols = $GLOBALS['TCA'][$table]['columns'];
359  foreach ($cols as $field => $config) {
360  if ($config['config']['type'] == 'group') {
361  if ((!$mode || $mode == 'file') && $config['config']['internal_type'] == 'file' || (!$mode || $mode == 'db') && $config['config']['internal_type'] == 'db') {
362  $result[$table][] = $field;
363  }
364  }
365  if ((!$mode || $mode == 'db') && $config['config']['type'] == 'select' && $config['config']['foreign_table']) {
366  $result[$table][] = $field;
367  }
368  }
369  if ($result[$table]) {
370  $result[$table] = implode(',', $result[$table]);
371  }
372  }
373  return $result;
374  }
375 
383  public function getFileFields($uploadfolder) {
384  $result = array();
385  foreach ($GLOBALS['TCA'] as $table => $tableConf) {
386  $cols = $GLOBALS['TCA'][$table]['columns'];
387  foreach ($cols as $field => $config) {
388  if ($config['config']['type'] == 'group' && $config['config']['internal_type'] == 'file' && $config['config']['uploadfolder'] == $uploadfolder) {
389  $result[] = array($table, $field);
390  }
391  }
392  }
393  return $result;
394  }
395 
403  public function getDBFields($theSearchTable) {
404  $result = array();
405  foreach ($GLOBALS['TCA'] as $table => $tableConf) {
406  $cols = $GLOBALS['TCA'][$table]['columns'];
407  foreach ($cols as $field => $config) {
408  if ($config['config']['type'] == 'group' && $config['config']['internal_type'] == 'db') {
409  if (trim($config['config']['allowed']) == '*' || strstr($config['config']['allowed'], $theSearchTable)) {
410  $result[] = array($table, $field);
411  }
412  } elseif ($config['config']['type'] == 'select' && $config['config']['foreign_table'] == $theSearchTable) {
413  $result[] = array($table, $field);
414  }
415  }
416  }
417  return $result;
418  }
419 
428  public function selectNonEmptyRecordsWithFkeys($fkey_arrays) {
429  if (is_array($fkey_arrays)) {
430  foreach ($fkey_arrays as $table => $field_list) {
431  if ($GLOBALS['TCA'][$table] && trim($field_list)) {
432  $fieldArr = explode(',', $field_list);
433  if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('dbal')) {
434  $fields = $GLOBALS['TYPO3_DB']->admin_get_fields($table);
435  $field = array_shift($fieldArr);
436  $cl_fl = $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'], $table) == 'I' || $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'], $table) == 'N' || $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'], $table) == 'R' ? $field . '<>0' : $field . '<>\'\'';
437  foreach ($fieldArr as $field) {
438  $cl_fl .= $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'], $table) == 'I' || $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'], $table) == 'N' || $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'], $table) == 'R' ? ' OR ' . $field . '<>0' : ' OR ' . $field . '<>\'\'';
439  }
440  unset($fields);
441  } else {
442  $cl_fl = implode('<>\'\' OR ', $fieldArr) . '<>\'\'';
443  }
444  $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,' . $field_list, $table, $cl_fl);
445  while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
446  foreach ($fieldArr as $field) {
447  if (trim($row[$field])) {
448  $fieldConf = $GLOBALS['TCA'][$table]['columns'][$field]['config'];
449  if ($fieldConf['type'] == 'group') {
450  if ($fieldConf['internal_type'] == 'file') {
451  // Files...
452  if ($fieldConf['MM']) {
453  $tempArr = array();
455  $dbAnalysis = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Database\\RelationHandler');
456  $dbAnalysis->start('', 'files', $fieldConf['MM'], $row['uid']);
457  foreach ($dbAnalysis->itemArray as $somekey => $someval) {
458  if ($someval['id']) {
459  $tempArr[] = $someval['id'];
460  }
461  }
462  } else {
463  $tempArr = explode(',', trim($row[$field]));
464  }
465  foreach ($tempArr as $file) {
466  $file = trim($file);
467  if ($file) {
468  $this->checkFileRefs[$fieldConf['uploadfolder']][$file] += 1;
469  }
470  }
471  }
472  if ($fieldConf['internal_type'] == 'db') {
474  $dbAnalysis = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Database\\RelationHandler');
475  $dbAnalysis->start($row[$field], $fieldConf['allowed'], $fieldConf['MM'], $row['uid'], $table, $fieldConf);
476  foreach ($dbAnalysis->itemArray as $tempArr) {
477  $this->checkGroupDBRefs[$tempArr['table']][$tempArr['id']] += 1;
478  }
479  }
480  }
481  if ($fieldConf['type'] == 'select' && $fieldConf['foreign_table']) {
483  $dbAnalysis = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Database\\RelationHandler');
484  $dbAnalysis->start($row[$field], $fieldConf['foreign_table'], $fieldConf['MM'], $row['uid'], $table, $fieldConf);
485  foreach ($dbAnalysis->itemArray as $tempArr) {
486  if ($tempArr['id'] > 0) {
487  $this->checkGroupDBRefs[$fieldConf['foreign_table']][$tempArr['id']] += 1;
488  }
489  }
490  }
491  }
492  }
493  }
494  $GLOBALS['TYPO3_DB']->sql_free_result($mres);
495  }
496  }
497  }
498  }
499 
506  public function testFileRefs() {
507  $output = array();
508  // Handle direct references with upload folder setting (workaround)
509  $newCheckFileRefs = array();
510  foreach ($this->checkFileRefs as $folder => $files) {
511  // Only direct references without a folder setting
512  if ($folder !== '') {
513  $newCheckFileRefs[$folder] = $files;
514  continue;
515  }
516  foreach ($files as $file => $references) {
517  // Direct file references have often many references (removes occurences in the moreReferences section of the result array)
518  if ($references > 1) {
519  $references = 1;
520  }
521  // The directory must be empty (prevents checking of the root directory)
522  $directory = dirname($file);
523  if ($directory !== '') {
524  $newCheckFileRefs[$directory][basename($file)] = $references;
525  }
526  }
527  }
528  $this->checkFileRefs = $newCheckFileRefs;
529  foreach ($this->checkFileRefs as $folder => $fileArr) {
530  $path = PATH_site . $folder;
531  if (@is_dir($path) && @is_readable($path)) {
532  $d = dir($path);
533  while ($entry = $d->read()) {
534  if (@is_file(($path . '/' . $entry))) {
535  if (isset($fileArr[$entry])) {
536  if ($fileArr[$entry] > 1) {
537  $temp = $this->whereIsFileReferenced($folder, $entry);
538  $tempList = '';
539  foreach ($temp as $inf) {
540  $tempList .= '[' . $inf['table'] . '][' . $inf['uid'] . '][' . $inf['field'] . '] (pid:' . $inf['pid'] . ') - ';
541  }
542  $output['moreReferences'][] = array($path, $entry, $fileArr[$entry], $tempList);
543  }
544  unset($fileArr[$entry]);
545  } else {
546  // Contains workaround for direct references
547  if (!strstr($entry, 'index.htm') && !preg_match(('/^' . preg_quote($GLOBALS['TYPO3_CONF_VARS']['BE']['fileadminDir'], '/') . '/'), $folder)) {
548  $output['noReferences'][] = array($path, $entry);
549  }
550  }
551  }
552  }
553  $d->close();
554  $tempCounter = 0;
555  foreach ($fileArr as $file => $value) {
556  // Workaround for direct file references
557  if (preg_match('/^' . preg_quote($GLOBALS['TYPO3_CONF_VARS']['BE']['fileadminDir'], '/') . '/', $folder)) {
558  $file = $folder . '/' . $file;
559  $folder = '';
560  $path = substr(PATH_site, 0, -1);
561  }
562  $temp = $this->whereIsFileReferenced($folder, $file);
563  $tempList = '';
564  foreach ($temp as $inf) {
565  $tempList .= '[' . $inf['table'] . '][' . $inf['uid'] . '][' . $inf['field'] . '] (pid:' . $inf['pid'] . ') - ';
566  }
567  $tempCounter++;
568  $output['noFile'][substr($path, -3) . '_' . substr($file, 0, 3) . '_' . $tempCounter] = array($path, $file, $tempList);
569  }
570  } else {
571  $output['error'][] = array($path);
572  }
573  }
574  return $output;
575  }
576 
584  public function testDBRefs($theArray) {
585  $result = '';
586  foreach ($theArray as $table => $dbArr) {
587  if ($GLOBALS['TCA'][$table]) {
588  $idlist = array_keys($dbArr);
589  $theList = implode(',', $idlist);
590  if ($theList) {
591  $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', $table, 'uid IN (' . $theList . ')' . BackendUtility::deleteClause($table));
592  while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
593  if (isset($dbArr[$row['uid']])) {
594  unset($dbArr[$row['uid']]);
595  } else {
596  $result .= 'Strange Error. ...<br />';
597  }
598  }
599  $GLOBALS['TYPO3_DB']->sql_free_result($mres);
600  foreach ($dbArr as $theId => $theC) {
601  $result .= 'There are ' . $theC . ' records pointing to this missing or deleted record; [' . $table . '][' . $theId . ']<br />';
602  }
603  }
604  } else {
605  $result .= 'Codeerror. Table is not a table...<br />';
606  }
607  }
608  return $result;
609  }
610 
619  public function whereIsRecordReferenced($searchTable, $id) {
620  // Gets tables / Fields that reference to files
621  $fileFields = $this->getDBFields($searchTable);
622  $theRecordList = array();
623  foreach ($fileFields as $info) {
624  $table = $info[0];
625  $field = $info[1];
626  $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,pid,' . $GLOBALS['TCA'][$table]['ctrl']['label'] . ',' . $field, $table, $field . ' LIKE \'%' . $GLOBALS['TYPO3_DB']->quoteStr($id, $table) . '%\'');
627  while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
628  // Now this is the field, where the reference COULD come from. But we're not garanteed, so we must carefully examine the data.
629  $fieldConf = $GLOBALS['TCA'][$table]['columns'][$field]['config'];
630  $allowedTables = $fieldConf['type'] == 'group' ? $fieldConf['allowed'] : $fieldConf['foreign_table'];
632  $dbAnalysis = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Database\\RelationHandler');
633  $dbAnalysis->start($row[$field], $allowedTables, $fieldConf['MM'], $row['uid'], $table, $fieldConf);
634  foreach ($dbAnalysis->itemArray as $tempArr) {
635  if ($tempArr['table'] == $searchTable && $tempArr['id'] == $id) {
636  $theRecordList[] = array('table' => $table, 'uid' => $row['uid'], 'field' => $field, 'pid' => $row['pid']);
637  }
638  }
639  }
640  $GLOBALS['TYPO3_DB']->sql_free_result($mres);
641  }
642  return $theRecordList;
643  }
644 
653  public function whereIsFileReferenced($uploadfolder, $filename) {
654  // Gets tables / Fields that reference to files
655  $fileFields = $this->getFileFields($uploadfolder);
656  $theRecordList = array();
657  foreach ($fileFields as $info) {
658  $table = $info[0];
659  $field = $info[1];
660  $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,pid,' . $GLOBALS['TCA'][$table]['ctrl']['label'] . ',' . $field, $table, $field . ' LIKE \'%' . $GLOBALS['TYPO3_DB']->quoteStr($filename, $table) . '%\'');
661  while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
662  // Now this is the field, where the reference COULD come from.
663  // But we're not guaranteed, so we must carefully examine the data.
664  $tempArr = explode(',', trim($row[$field]));
665  foreach ($tempArr as $file) {
666  $file = trim($file);
667  if ($file == $filename) {
668  $theRecordList[] = array('table' => $table, 'uid' => $row['uid'], 'field' => $field, 'pid' => $row['pid']);
669  }
670  }
671  }
672  $GLOBALS['TYPO3_DB']->sql_free_result($mres);
673  }
674  return $theRecordList;
675  }
676 
677 }
static skinImg($backPath, $src, $wHattribs='', $outputMode=0)
$uid
Definition: server.php:36
static getRecordTitle($table, $row, $prep=FALSE, $forceResult=TRUE)
static getSpriteIconForRecord($table, array $row, array $options=array())
if($list_of_literals) if(!empty($literals)) if(!empty($literals)) $result
Analyse literals to prepend the N char to them if their contents aren&#39;t numeric.
static getCommonSelectFields($table, $prefix='', $fields=array())
genTree_records($theID, $depthData, $table='', $versions=FALSE)
if(!defined('TYPO3_MODE')) $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['logoff_pre_processing'][]
static deleteClause($table, $tableAlias='')