‪TYPO3CMS  11.5
DefaultTcaSchema.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Doctrine\DBAL\Schema\Table;
23 
38 {
48  public function ‪enrich(array $tables): array
49  {
50  $tables = $this->‪enrichSingleTableFields($tables);
51  $tables = $this->‪enrichMmTables($tables);
52  return $tables;
53  }
54 
58  protected function ‪enrichSingleTableFields($tables)
59  {
60  foreach (‪$GLOBALS['TCA'] as $tableName => $tableDefinition) {
61  $isTableDefined = $this->‪isTableDefined($tables, $tableName);
62  if (!$isTableDefined) {
63  continue;
64  }
65 
66  // If the table is given in existing $tables list, add all fields to the first
67  // position of that table - in case it is in there multiple times which happens
68  // if extensions add single fields to tables that have been defined in
69  // other ext_tables.sql, too.
70  $tablePosition = $this->‪getTableFirstPosition($tables, $tableName);
71 
72  // uid column and primary key if uid is not defined
73  if (!$this->‪isColumnDefinedForTable($tables, $tableName, 'uid')) {
74  $tables[$tablePosition]->addColumn(
75  $this->‪quote('uid'),
76  'integer',
77  [
78  'notnull' => true,
79  'unsigned' => true,
80  'autoincrement' => true,
81  ]
82  );
83  $tables[$tablePosition]->setPrimaryKey(['uid']);
84  }
85 
86  // pid column and prepare parent key if pid is not defined
87  $pidColumnAdded = false;
88  if (!$this->‪isColumnDefinedForTable($tables, $tableName, 'pid')) {
89  $options = [
90  'default' => 0,
91  'notnull' => true,
92  'unsigned' => false,
93  ];
94  if (empty($tableDefinition['ctrl']['versioningWS'])) {
95  // We need negative pid's (-1) if table is workspace aware
96  $options['unsigned'] = true;
97  }
98  $tables[$tablePosition]->addColumn($this->‪quote('pid'), 'integer', $options);
99  $pidColumnAdded = true;
100  }
101 
102  // tstamp column
103  if (!empty($tableDefinition['ctrl']['tstamp'])
104  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['tstamp'])
105  ) {
106  $tables[$tablePosition]->addColumn(
107  $this->‪quote($tableDefinition['ctrl']['tstamp']),
108  'integer',
109  [
110  'default' => 0,
111  'notnull' => true,
112  'unsigned' => true,
113  ]
114  );
115  }
116 
117  // crdate column
118  if (!empty($tableDefinition['ctrl']['crdate'])
119  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['crdate'])
120  ) {
121  $tables[$tablePosition]->addColumn(
122  $this->‪quote($tableDefinition['ctrl']['crdate']),
123  'integer',
124  [
125  'default' => 0,
126  'notnull' => true,
127  'unsigned' => true,
128  ]
129  );
130  }
131 
132  // cruser_id column
133  if (!empty($tableDefinition['ctrl']['cruser_id'])
134  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['cruser_id'])
135  ) {
136  $tables[$tablePosition]->addColumn(
137  $this->‪quote($tableDefinition['ctrl']['cruser_id']),
138  'integer',
139  [
140  'default' => 0,
141  'notnull' => true,
142  'unsigned' => true,
143  ]
144  );
145  }
146 
147  // deleted column - soft delete
148  if (!empty($tableDefinition['ctrl']['delete'])
149  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['delete'])
150  ) {
151  $tables[$tablePosition]->addColumn(
152  $this->‪quote($tableDefinition['ctrl']['delete']),
153  'smallint',
154  [
155  'default' => 0,
156  'notnull' => true,
157  'unsigned' => true,
158  ]
159  );
160  }
161 
162  // disabled column
163  if (!empty($tableDefinition['ctrl']['enablecolumns']['disabled'])
164  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['enablecolumns']['disabled'])
165  ) {
166  $tables[$tablePosition]->addColumn(
167  $this->‪quote($tableDefinition['ctrl']['enablecolumns']['disabled']),
168  'smallint',
169  [
170  'default' => 0,
171  'notnull' => true,
172  'unsigned' => true,
173  ]
174  );
175  }
176 
177  // starttime column
178  if (!empty($tableDefinition['ctrl']['enablecolumns']['starttime'])
179  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['enablecolumns']['starttime'])
180  ) {
181  $tables[$tablePosition]->addColumn(
182  $this->‪quote($tableDefinition['ctrl']['enablecolumns']['starttime']),
183  'integer',
184  [
185  'default' => 0,
186  'notnull' => true,
187  'unsigned' => true,
188  ]
189  );
190  }
191 
192  // endtime column
193  if (!empty($tableDefinition['ctrl']['enablecolumns']['endtime'])
194  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['enablecolumns']['endtime'])
195  ) {
196  $tables[$tablePosition]->addColumn(
197  $this->‪quote($tableDefinition['ctrl']['enablecolumns']['endtime']),
198  'integer',
199  [
200  'default' => 0,
201  'notnull' => true,
202  'unsigned' => true,
203  ]
204  );
205  }
206 
207  // fe_group column
208  if (!empty($tableDefinition['ctrl']['enablecolumns']['fe_group'])
209  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['enablecolumns']['fe_group'])
210  ) {
211  $tables[$tablePosition]->addColumn(
212  $this->‪quote($tableDefinition['ctrl']['enablecolumns']['fe_group']),
213  'string',
214  [
215  'default' => '0',
216  'notnull' => true,
217  'length' => 255,
218  ]
219  );
220  }
221 
222  // sorting column
223  if (!empty($tableDefinition['ctrl']['sortby'])
224  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['sortby'])
225  ) {
226  $tables[$tablePosition]->addColumn(
227  $this->‪quote($tableDefinition['ctrl']['sortby']),
228  'integer',
229  [
230  'default' => 0,
231  'notnull' => true,
232  'unsigned' => false,
233  ]
234  );
235  }
236 
237  // index on pid column and maybe others - only if pid has not been defined via ext_tables.sql before
238  if ($pidColumnAdded && !$this->‪isIndexDefinedForTable($tables, $tableName, 'parent')) {
239  $parentIndexFields = ['pid'];
240  if (!empty($tableDefinition['ctrl']['delete'])) {
241  $parentIndexFields[] = (string)$tableDefinition['ctrl']['delete'];
242  }
243  if (!empty($tableDefinition['ctrl']['enablecolumns']['disabled'])) {
244  $parentIndexFields[] = (string)$tableDefinition['ctrl']['enablecolumns']['disabled'];
245  }
246  $tables[$tablePosition]->addIndex($parentIndexFields, 'parent');
247  }
248 
249  // description column
250  if (!empty($tableDefinition['ctrl']['descriptionColumn'])
251  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['descriptionColumn'])
252  ) {
253  $tables[$tablePosition]->addColumn(
254  $this->‪quote($tableDefinition['ctrl']['descriptionColumn']),
255  'text',
256  [
257  'notnull' => false,
258  'length' => 65535,
259  ]
260  );
261  }
262 
263  // editlock column
264  if (!empty($tableDefinition['ctrl']['editlock'])
265  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['editlock'])
266  ) {
267  $tables[$tablePosition]->addColumn(
268  $this->‪quote($tableDefinition['ctrl']['editlock']),
269  'smallint',
270  [
271  'default' => 0,
272  'notnull' => true,
273  'unsigned' => true,
274  ]
275  );
276  }
277 
278  // sys_language_uid column
279  if (!empty($tableDefinition['ctrl']['languageField'])
280  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['languageField'])
281  ) {
282  $tables[$tablePosition]->addColumn(
283  $this->‪quote((string)$tableDefinition['ctrl']['languageField']),
284  'integer',
285  [
286  'default' => 0,
287  'notnull' => true,
288  'unsigned' => false,
289  ]
290  );
291  }
292 
293  // l10n_parent column
294  if (!empty($tableDefinition['ctrl']['languageField'])
295  && !empty($tableDefinition['ctrl']['transOrigPointerField'])
296  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['transOrigPointerField'])
297  ) {
298  $tables[$tablePosition]->addColumn(
299  $this->‪quote((string)$tableDefinition['ctrl']['transOrigPointerField']),
300  'integer',
301  [
302  'default' => 0,
303  'notnull' => true,
304  'unsigned' => true,
305  ]
306  );
307  }
308 
309  // l10n_source column
310  if (!empty($tableDefinition['ctrl']['languageField'])
311  && !empty($tableDefinition['ctrl']['translationSource'])
312  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['translationSource'])
313  ) {
314  $tables[$tablePosition]->addColumn(
315  $this->‪quote((string)$tableDefinition['ctrl']['translationSource']),
316  'integer',
317  [
318  'default' => 0,
319  'notnull' => true,
320  'unsigned' => true,
321  ]
322  );
323  $tables[$tablePosition]->addIndex([$tableDefinition['ctrl']['translationSource']], 'translation_source');
324  }
325 
326  // l10n_state column
327  if (!empty($tableDefinition['ctrl']['languageField'])
328  && !empty($tableDefinition['ctrl']['transOrigPointerField'])
329  && !$this->‪isColumnDefinedForTable($tables, $tableName, 'l10n_state')
330  ) {
331  $tables[$tablePosition]->addColumn(
332  $this->‪quote('l10n_state'),
333  'text',
334  [
335  'notnull' => false,
336  'length' => 65535,
337  ]
338  );
339  }
340 
341  // t3_origuid column
342  if (!empty($tableDefinition['ctrl']['origUid'])
343  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['origUid'])
344  ) {
345  $tables[$tablePosition]->addColumn(
346  $this->‪quote($tableDefinition['ctrl']['origUid']),
347  'integer',
348  [
349  'default' => 0,
350  'notnull' => true,
351  'unsigned' => true,
352  ]
353  );
354  }
355 
356  // l18n_diffsource column
357  if (!empty($tableDefinition['ctrl']['transOrigDiffSourceField'])
358  && !$this->‪isColumnDefinedForTable($tables, $tableName, $tableDefinition['ctrl']['transOrigDiffSourceField'])
359  ) {
360  $tables[$tablePosition]->addColumn(
361  $this->‪quote($tableDefinition['ctrl']['transOrigDiffSourceField']),
362  'blob',
363  [
364  // mediumblob (16MB) on mysql
365  'length' => 16777215,
366  'notnull' => false,
367  ]
368  );
369  }
370 
371  // workspaces t3ver_oid column
372  if (!empty($tableDefinition['ctrl']['versioningWS'])
373  && (bool)$tableDefinition['ctrl']['versioningWS'] === true
374  && !$this->‪isColumnDefinedForTable($tables, $tableName, 't3ver_oid')
375  ) {
376  $tables[$tablePosition]->addColumn(
377  $this->‪quote('t3ver_oid'),
378  'integer',
379  [
380  'default' => 0,
381  'notnull' => true,
382  'unsigned' => true,
383  ]
384  );
385  }
386 
387  // workspaces t3ver_wsid column
388  if (!empty($tableDefinition['ctrl']['versioningWS'])
389  && (bool)$tableDefinition['ctrl']['versioningWS'] === true
390  && !$this->‪isColumnDefinedForTable($tables, $tableName, 't3ver_wsid')
391  ) {
392  $tables[$tablePosition]->addColumn(
393  $this->‪quote('t3ver_wsid'),
394  'integer',
395  [
396  'default' => 0,
397  'notnull' => true,
398  'unsigned' => true,
399  ]
400  );
401  }
402 
403  // workspaces t3ver_state column
404  if (!empty($tableDefinition['ctrl']['versioningWS'])
405  && (bool)$tableDefinition['ctrl']['versioningWS'] === true
406  && !$this->‪isColumnDefinedForTable($tables, $tableName, 't3ver_state')
407  ) {
408  $tables[$tablePosition]->addColumn(
409  $this->‪quote('t3ver_state'),
410  'smallint',
411  [
412  'default' => 0,
413  'notnull' => true,
414  'unsigned' => false,
415  ]
416  );
417  }
418 
419  // workspaces t3ver_stage column
420  if (!empty($tableDefinition['ctrl']['versioningWS'])
421  && (bool)$tableDefinition['ctrl']['versioningWS'] === true
422  && !$this->‪isColumnDefinedForTable($tables, $tableName, 't3ver_stage')
423  ) {
424  $tables[$tablePosition]->addColumn(
425  $this->‪quote('t3ver_stage'),
426  'integer',
427  [
428  'default' => 0,
429  'notnull' => true,
430  'unsigned' => false,
431  ]
432  );
433  }
434 
435  // workspaces index on t3ver_oid and t3ver_wsid fields
436  if (!empty($tableDefinition['ctrl']['versioningWS'])
437  && (bool)$tableDefinition['ctrl']['versioningWS'] === true
438  && !$this->‪isIndexDefinedForTable($tables, $tableName, 't3ver_oid')
439  ) {
440  $tables[$tablePosition]->addIndex(['t3ver_oid', 't3ver_wsid'], 't3ver_oid');
441  }
442 
443  // Add category fields for all tables, defining category columns (TCA type=category)
444  if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
445  foreach ($tableDefinition['columns'] as $fieldName => $fieldConfig) {
446  if ((string)($fieldConfig['config']['type'] ?? '') !== 'category'
447  || $this->‪isColumnDefinedForTable($tables, $tableName, $fieldName)
448  ) {
449  continue;
450  }
451 
452  if (($fieldConfig['config']['relationship'] ?? '') === 'oneToMany') {
453  $tables[$tablePosition]->addColumn(
454  $this->‪quote($fieldName),
455  'text',
456  [
457  'notnull' => false,
458  ]
459  );
460  } else {
461  $tables[$tablePosition]->addColumn(
462  $this->‪quote($fieldName),
463  'integer',
464  [
465  'default' => 0,
466  'notnull' => true,
467  'unsigned' => true,
468  ]
469  );
470  }
471  }
472  }
473  }
474 
475  return $tables;
476  }
477 
484  protected function ‪enrichMmTables($tables): array
485  {
486  foreach (‪$GLOBALS['TCA'] as $tableName => $tableDefinition) {
487  // Consider this TCA table only if it is within the set of incoming tables. Important
488  // when the schema analyzer is used within extension manager for a sub set of tables.
489  $isTableDefined = $this->‪isTableDefined($tables, $tableName);
490  if (!$isTableDefined) {
491  continue;
492  }
493  if (!is_array($tableDefinition['columns'] ?? false)) {
494  // TCA definition in general is broken if there are no specified columns. Skip to be sure here.
495  continue;
496  }
497  foreach ($tableDefinition['columns'] as $tcaColumn) {
498  if (
499  !is_array($tcaColumn['config'] ?? false)
500  || !is_string($tcaColumn['config']['type'] ?? false)
501  || !in_array($tcaColumn['config']['type'], ['select', 'group', 'inline', 'category'], true)
502  || !is_string($tcaColumn['config']['MM'] ?? false)
503  // Consider this mm only if looking at it from the local side
504  || ($tcaColumn['config']['MM_opposite_field'] ?? false)
505  ) {
506  // Broken TCA or not of expected type, or no MM, or foreign side
507  continue;
508  }
509  $mmTableName = $tcaColumn['config']['MM'];
510  try {
511  // If the mm table is defined, work with it. Else add at and.
512  $tablePosition = $this->‪getTableFirstPosition($tables, $mmTableName);
514  $tablePosition = array_key_last($tables) + 1;
515  $tables[$tablePosition] = GeneralUtility::makeInstance(
516  Table::class,
517  $mmTableName
518  );
519  }
520 
521  // Add 'uid' field with primary key if MM_hasUidField is set.
522  // @todo: ['config']['MM_hasUidField'] is only (?!) needed when ['config']['multiple'] = true. It seems
523  // as if we could drop TCA MM_hasUidField and simply test for 'multiple' to simplify things.
524  $hasUid = (bool)($tcaColumn['config']['MM_hasUidField'] ?? false);
525  if ($hasUid && !$this->‪isColumnDefinedForTable($tables, $mmTableName, 'uid')) {
526  $tables[$tablePosition]->addColumn(
527  $this->‪quote('uid'),
528  'integer',
529  [
530  'notnull' => true,
531  'unsigned' => true,
532  'autoincrement' => true,
533  ]
534  );
535  $tables[$tablePosition]->setPrimaryKey(['uid']);
536  }
537 
538  if (!$this->‪isColumnDefinedForTable($tables, $mmTableName, 'uid_local')) {
539  $tables[$tablePosition]->addColumn(
540  $this->‪quote('uid_local'),
541  'integer',
542  [
543  'default' => 0,
544  'notnull' => true,
545  'unsigned' => true,
546  ]
547  );
548  }
549  if (!$this->‪isIndexDefinedForTable($tables, $mmTableName, 'uid_local')) {
550  $tables[$tablePosition]->addIndex(['uid_local'], 'uid_local');
551  }
552 
553  if (!$this->‪isColumnDefinedForTable($tables, $mmTableName, 'uid_foreign')) {
554  $tables[$tablePosition]->addColumn(
555  $this->‪quote('uid_foreign'),
556  'integer',
557  [
558  'default' => 0,
559  'notnull' => true,
560  'unsigned' => true,
561  ]
562  );
563  }
564  if (!$this->‪isIndexDefinedForTable($tables, $mmTableName, 'uid_foreign')) {
565  $tables[$tablePosition]->addIndex(['uid_foreign'], 'uid_foreign');
566  }
567 
568  if (!$this->‪isColumnDefinedForTable($tables, $mmTableName, 'sorting')) {
569  $tables[$tablePosition]->addColumn(
570  $this->‪quote('sorting'),
571  'integer',
572  [
573  'default' => 0,
574  'notnull' => true,
575  'unsigned' => true,
576  ]
577  );
578  }
579  if (!$this->‪isColumnDefinedForTable($tables, $mmTableName, 'sorting_foreign')) {
580  $tables[$tablePosition]->addColumn(
581  $this->‪quote('sorting_foreign'),
582  'integer',
583  [
584  'default' => 0,
585  'notnull' => true,
586  'unsigned' => true,
587  ]
588  );
589  }
590 
591  if (!empty($tcaColumn['config']['MM_oppositeUsage'])) {
592  // This local table can be the target of multiple foreign tables and table fields. The mm table
593  // thus needs two further fields to specify which foreign/table field combination links is used.
594  // Those are stored in two additional fields called "tablenames" and "fieldname".
595  if (!$this->‪isColumnDefinedForTable($tables, $mmTableName, 'tablenames')) {
596  $tables[$tablePosition]->addColumn(
597  $this->‪quote('tablenames'),
598  'string',
599  [
600  'default' => '',
601  'length' => 255,
602  'notnull' => true,
603  ]
604  );
605  }
606  if (!$this->‪isColumnDefinedForTable($tables, $mmTableName, 'fieldname')) {
607  $tables[$tablePosition]->addColumn(
608  $this->‪quote('fieldname'),
609  'string',
610  [
611  'default' => '',
612  'length' => 255,
613  'notnull' => true,
614  ]
615  );
616  }
617  }
618 
619  // @todo: If there is no "uid" primary key field, the combination of "uid_local & uid_foreign", or
620  // "uid_local & uid_foreign & tablenames & fieldname" *should* be specified as combined primary key.
621  // However, workspaces has a bug and currently inserts broken duplicate rows. A primary
622  // key, or at least an unique constraint should be added when this is resolved.
623  // Note especially galera clusters rely on this.
624  }
625  }
626  return $tables;
627  }
628 
637  public function ‪getPrioritizedFieldNames(string $tableName): array
638  {
639  if (!isset(‪$GLOBALS['TCA'][$tableName]['ctrl'])) {
640  return [];
641  }
642 
643  $prioritizedFieldNames = [
644  'uid',
645  'pid',
646  ];
647 
648  $tableDefinition = ‪$GLOBALS['TCA'][$tableName]['ctrl'];
649 
650  if (!empty($tableDefinition['crdate'])) {
651  $prioritizedFieldNames[] = $tableDefinition['crdate'];
652  }
653  if (!empty($tableDefinition['tstamp'])) {
654  $prioritizedFieldNames[] = $tableDefinition['tstamp'];
655  }
656  if (!empty($tableDefinition['cruser_id'])) {
657  $prioritizedFieldNames[] = $tableDefinition['cruser_id'];
658  }
659  if (!empty($tableDefinition['delete'])) {
660  $prioritizedFieldNames[] = $tableDefinition['delete'];
661  }
662  if (!empty($tableDefinition['enablecolumns']['disabled'])) {
663  $prioritizedFieldNames[] = $tableDefinition['enablecolumns']['disabled'];
664  }
665  if (!empty($tableDefinition['enablecolumns']['starttime'])) {
666  $prioritizedFieldNames[] = $tableDefinition['enablecolumns']['starttime'];
667  }
668  if (!empty($tableDefinition['enablecolumns']['endtime'])) {
669  $prioritizedFieldNames[] = $tableDefinition['enablecolumns']['endtime'];
670  }
671  if (!empty($tableDefinition['enablecolumns']['fe_group'])) {
672  $prioritizedFieldNames[] = $tableDefinition['enablecolumns']['fe_group'];
673  }
674  if (!empty($tableDefinition['languageField'])) {
675  $prioritizedFieldNames[] = $tableDefinition['languageField'];
676  if (!empty($tableDefinition['transOrigPointerField'])) {
677  $prioritizedFieldNames[] = $tableDefinition['transOrigPointerField'];
678  $prioritizedFieldNames[] = 'l10n_state';
679  }
680  if (!empty($tableDefinition['translationSource'])) {
681  $prioritizedFieldNames[] = $tableDefinition['translationSource'];
682  }
683  if (!empty($tableDefinition['transOrigDiffSourceField'])) {
684  $prioritizedFieldNames[] = $tableDefinition['transOrigDiffSourceField'];
685  }
686  }
687  if (!empty($tableDefinition['sortby'])) {
688  $prioritizedFieldNames[] = $tableDefinition['sortby'];
689  }
690  if (!empty($tableDefinition['descriptionColumn'])) {
691  $prioritizedFieldNames[] = $tableDefinition['descriptionColumn'];
692  }
693  if (!empty($tableDefinition['editlock'])) {
694  $prioritizedFieldNames[] = $tableDefinition['editlock'];
695  }
696  if (!empty($tableDefinition['origUid'])) {
697  $prioritizedFieldNames[] = $tableDefinition['origUid'];
698  }
699  if (!empty($tableDefinition['versioningWS'])) {
700  $prioritizedFieldNames[] = 't3ver_wsid';
701  $prioritizedFieldNames[] = 't3ver_oid';
702  $prioritizedFieldNames[] = 't3ver_state';
703  $prioritizedFieldNames[] = 't3ver_stage';
704  }
705 
706  return $prioritizedFieldNames;
707  }
708 
716  protected function ‪isTableDefined(array $tables, string $tableName): bool
717  {
718  foreach ($tables as $table) {
719  if ($table->getName() === $tableName) {
720  return true;
721  }
722  }
723  return false;
724  }
725 
735  protected function ‪isColumnDefinedForTable(array $tables, string $tableName, string $fieldName): bool
736  {
737  foreach ($tables as $table) {
738  if ($table->getName() !== $tableName) {
739  continue;
740  }
741  $columns = $table->getColumns();
742  foreach ($columns as $column) {
743  if ($column->getName() === $fieldName) {
744  return true;
745  }
746  }
747  }
748  return false;
749  }
750 
760  protected function ‪isIndexDefinedForTable(array $tables, string $tableName, string $indexName): bool
761  {
762  foreach ($tables as $table) {
763  if ($table->getName() !== $tableName) {
764  continue;
765  }
766  $indexes = $table->getIndexes();
767  foreach ($indexes as $index) {
768  if ($index->getName() === $indexName) {
769  return true;
770  }
771  }
772  }
773  return false;
774  }
775 
790  protected function ‪getTableFirstPosition(array $tables, string $tableName): int
791  {
792  foreach ($tables as $position => $table) {
793  if ($table->getName() === $tableName) {
794  return (int)$position;
795  }
796  }
797  throw new ‪DefaultTcaSchemaTablePositionException('Table ' . $tableName . ' not found in schema list', 1527854474);
798  }
799 
804  protected function ‪quote(string $identifier): string
805  {
806  return '`' . $identifier . '`';
807  }
808 }
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema\isIndexDefinedForTable
‪bool isIndexDefinedForTable(array $tables, string $tableName, string $indexName)
Definition: DefaultTcaSchema.php:760
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema\getTableFirstPosition
‪int getTableFirstPosition(array $tables, string $tableName)
Definition: DefaultTcaSchema.php:790
‪TYPO3\CMS\Core\Database\Schema
Definition: Comparator.php:18
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema
Definition: DefaultTcaSchema.php:38
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema\isTableDefined
‪bool isTableDefined(array $tables, string $tableName)
Definition: DefaultTcaSchema.php:716
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema\isColumnDefinedForTable
‪bool isColumnDefinedForTable(array $tables, string $tableName, string $fieldName)
Definition: DefaultTcaSchema.php:735
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema\enrichMmTables
‪enrichMmTables($tables)
Definition: DefaultTcaSchema.php:484
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema\quote
‪string quote(string $identifier)
Definition: DefaultTcaSchema.php:804
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema\getPrioritizedFieldNames
‪string[] getPrioritizedFieldNames(string $tableName)
Definition: DefaultTcaSchema.php:637
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema\enrichSingleTableFields
‪enrichSingleTableFields($tables)
Definition: DefaultTcaSchema.php:58
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema\enrich
‪Table[] enrich(array $tables)
Definition: DefaultTcaSchema.php:48
‪TYPO3\CMS\Core\Database\Schema\Exception\DefaultTcaSchemaTablePositionException
Definition: DefaultTcaSchemaTablePositionException.php:27