Skip to content

Commit

Permalink
[BUGFIX] Ensure dynamically added TCA DB fields are added first
Browse files Browse the repository at this point in the history
The new functionality introduced in #85160 adds TCA control
database fields dynamically.
However, newly created extensions add these fields (except "uid"
which is a primary column) at the end after the content-related
fields.

The patch re-orders the columns to be added to move them to the
very beginning.

Resolves: #85195
Related: #85160
Releases: master
Change-Id: Ibcf77ae3fea41f067dca0f247bef50d00bdd014f
Reviewed-on: https://review.typo3.org/57155
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Susanne Moog <susanne.moog@typo3.org>
Tested-by: Susanne Moog <susanne.moog@typo3.org>
  • Loading branch information
bmack authored and susannemoog committed Jun 9, 2018
1 parent c888f73 commit 87f4395
Show file tree
Hide file tree
Showing 10 changed files with 207 additions and 97 deletions.
83 changes: 83 additions & 0 deletions typo3/sysext/core/Classes/Database/Schema/DefaultTcaSchema.php
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,89 @@ public function enrich(array $tables): array
return $tables;
}

/**
* If the enrich() method adds fields, they should be added in the beginning of a table.
*
* @param string $tableName
* @return string[]
*/
public function getPrioritizedFieldNames(string $tableName): array
{
if (!isset($GLOBALS['TCA'][$tableName])) {
return [];
}

$prioritizedFieldNames = [
'uid',
'pid'
];

$tableDefinition = $GLOBALS['TCA']['ctrl'];

if (!empty($tableDefinition['crdate'])) {
$prioritizedFieldNames[] = $tableDefinition['crdate'];
}
if (!empty($tableDefinition['tstamp'])) {
$prioritizedFieldNames[] = $tableDefinition['tstamp'];
}
if (!empty($tableDefinition['cruser_id'])) {
$prioritizedFieldNames[] = $tableDefinition['cruser_id'];
}
if (!empty($tableDefinition['delete'])) {
$prioritizedFieldNames[] = $tableDefinition['delete'];
}
if (!empty($tableDefinition['enablecolumns']['disabled'])) {
$prioritizedFieldNames[] = $tableDefinition['enablecolumns']['disabled'];
}
if (!empty($tableDefinition['enablecolumns']['starttime'])) {
$prioritizedFieldNames[] = $tableDefinition['enablecolumns']['starttime'];
}
if (!empty($tableDefinition['enablecolumns']['endtime'])) {
$prioritizedFieldNames[] = $tableDefinition['enablecolumns']['endtime'];
}
if (!empty($tableDefinition['enablecolumns']['fe_group'])) {
$prioritizedFieldNames[] = $tableDefinition['enablecolumns']['fe_group'];
}
if (!empty($tableDefinition['languageField'])) {
$prioritizedFieldNames[] = $tableDefinition['languageField'];
if (!empty($tableDefinition['transOrigPointerField'])) {
$prioritizedFieldNames[] = $tableDefinition['transOrigPointerField'];
$prioritizedFieldNames[] = 'l10n_state';
}
if (!empty($tableDefinition['translationSource'])) {
$prioritizedFieldNames[] = $tableDefinition['translationSource'];
}
if (!empty($tableDefinition['transOrigDiffSourceField'])) {
$prioritizedFieldNames[] = $tableDefinition['transOrigDiffSourceField'];
}
}
if (!empty($tableDefinition['sortby'])) {
$prioritizedFieldNames[] = $tableDefinition['sortby'];
}
if (!empty($tableDefinition['descriptionColumn'])) {
$prioritizedFieldNames[] = $tableDefinition['descriptionColumn'];
}
if (!empty($tableDefinition['editlock'])) {
$prioritizedFieldNames[] = $tableDefinition['editlock'];
}
if (!empty($tableDefinition['origUid'])) {
$prioritizedFieldNames[] = $tableDefinition['origUid'];
}
if (!empty($tableDefinition['versioningWS'])) {
$prioritizedFieldNames[] = 't3ver_wsid';
$prioritizedFieldNames[] = 't3ver_oid';
$prioritizedFieldNames[] = 't3ver_state';
$prioritizedFieldNames[] = 't3ver_stage';
$prioritizedFieldNames[] = 't3ver_id';
$prioritizedFieldNames[] = 't3ver_move_id';
$prioritizedFieldNames[] = 't3ver_count';
$prioritizedFieldNames[] = 't3ver_tstamp';
$prioritizedFieldNames[] = 't3ver_label';
}

return $prioritizedFieldNames;
}

/**
* True if table with given table name is defined within incoming $tables array
*
Expand Down
39 changes: 33 additions & 6 deletions typo3/sysext/core/Classes/Database/Schema/SchemaMigrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -271,17 +271,44 @@ public function parseCreateTableStatements(array $statements): array
// Flatten the array of arrays by one level
$tables = array_merge(...$tables);

// @deprecated (?!) Drop any definition of pages_language_overlay in SQL
// will be removed in TYPO3 v10.0 once the feature is enabled by default
$disabledPagesLanguageOverlay = GeneralUtility::makeInstance(Features::class)->isFeatureEnabled('unifiedPageTranslationHandling');

// Add default TCA fields
$defaultTcaSchema = GeneralUtility::makeInstance(DefaultTcaSchema::class);
$tables = $defaultTcaSchema->enrich($tables);
// Ensure the default TCA fields are ordered
foreach ($tables as $k => $table) {
if ($disabledPagesLanguageOverlay && $table->getName() === 'pages_language_overlay') {
unset($tables[$k]);
continue;
}
$prioritizedColumnNames = $defaultTcaSchema->getPrioritizedFieldNames($table->getName());
// no TCA table
if (empty($prioritizedColumnNames)) {
continue;
}

// @deprecated (?!) Drop any definition of pages_language_overlay in SQL
// will be removed in TYPO3 v10.0 once the feature is enabled by default
if (GeneralUtility::makeInstance(Features::class)->isFeatureEnabled('unifiedPageTranslationHandling')) {
foreach ($tables as $k => $table) {
if ($table->getName() === 'pages_language_overlay') {
unset($tables[$k]);
$prioritizedColumns = [];
$nonPrioritizedColumns = [];

foreach ($table->getColumns() as $columnObject) {
if (in_array($columnObject->getName(), $prioritizedColumnNames, true)) {
$prioritizedColumns[] = $columnObject;
} else {
$nonPrioritizedColumns[] = $columnObject;
}
}

$tables[$k] = new Table(
$table->getName(),
array_merge($prioritizedColumns, $nonPrioritizedColumns),
$table->getIndexes(),
$table->getForeignKeys(),
0,
$table->getOptions()
);
}

return $tables;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,10 @@
<tablerow index="pages:1" type="array">
<fieldlist index="data" type="array">
<field index="uid">1</field>
<field index="pid">0</field>
<field index="perms_everybody">15</field>
<field index="title">Root</field>
<field index="doktype">1</field>
<field index="pid">0</field>
<field index="deleted">0</field>
<field index="hidden">0</field>
</fieldlist>
Expand All @@ -108,10 +108,10 @@
<tablerow index="tx_impexpgroupfiles_item:1" type="array">
<fieldlist index="data" type="array">
<field index="uid">1</field>
<field index="pid">1</field>
<field index="title">Test item</field>
<field index="images">typo3_image4.jpg</field>
<field index="image_references">fileadmin/user_upload/typo3_image5.jpg</field>
<field index="pid">1</field>
<field index="deleted">0</field>
<field index="hidden">0</field>
</fieldlist>
Expand Down Expand Up @@ -139,6 +139,7 @@
<tablerow index="sys_file:3" type="array">
<fieldlist index="data" type="array">
<field index="uid">3</field>
<field index="pid">0</field>
<field index="storage">1</field>
<field index="type">2</field>
<field index="metadata">0</field>
Expand All @@ -152,7 +153,6 @@
<field index="size">7425</field>
<field index="creation_date">1393432184</field>
<field index="modification_date">1393432183</field>
<field index="pid">0</field>
</fieldlist>
<related index="rels" type="array">
<field index="storage" type="array">
Expand All @@ -169,6 +169,7 @@
<tablerow index="sys_file_storage:1" type="array">
<fieldlist index="data" type="array">
<field index="uid">1</field>
<field index="pid">0</field>
<field index="name">fileadmin/ (auto-created)</field>
<field index="driver">Local</field>
<field index="configuration">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;yes&quot; ?&gt;
Expand All @@ -194,7 +195,6 @@
<field index="is_public">1</field>
<field index="is_writable">1</field>
<field index="is_online">1</field>
<field index="pid">0</field>
<field index="description" type="NULL"></field>
</fieldlist>
<related index="rels" type="array">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,10 @@
<tablerow index="pages:2" type="array">
<fieldlist index="data" type="array">
<field index="uid">2</field>
<field index="pid">1</field>
<field index="perms_everybody">15</field>
<field index="title">Dummy 1-2</field>
<field index="doktype">1</field>
<field index="pid">1</field>
<field index="deleted">0</field>
<field index="hidden">0</field>
</fieldlist>
Expand All @@ -141,6 +141,7 @@
<tablerow index="tx_impexpgroupfiles_item:2" type="array">
<fieldlist index="data" type="array">
<field index="uid">2</field>
<field index="pid">2</field>
<field index="title">Test item 2</field>
<field index="images"></field>
<field index="image_references"></field>
Expand All @@ -162,7 +163,6 @@
&lt;/sheet&gt;
&lt;/data&gt;
&lt;/T3FlexForms&gt;</field>
<field index="pid">2</field>
<field index="deleted">0</field>
<field index="hidden">0</field>
</fieldlist>
Expand Down Expand Up @@ -211,6 +211,7 @@
<tablerow index="sys_file:3" type="array">
<fieldlist index="data" type="array">
<field index="uid">3</field>
<field index="pid">0</field>
<field index="storage">1</field>
<field index="type">2</field>
<field index="metadata">0</field>
Expand All @@ -224,7 +225,6 @@
<field index="size">7425</field>
<field index="creation_date">1393432184</field>
<field index="modification_date">1393432183</field>
<field index="pid">0</field>
</fieldlist>
<related index="rels" type="array">
<field index="storage" type="array">
Expand All @@ -241,6 +241,7 @@
<tablerow index="sys_file:2" type="array">
<fieldlist index="data" type="array">
<field index="uid">2</field>
<field index="pid">0</field>
<field index="storage">1</field>
<field index="type">2</field>
<field index="metadata">0</field>
Expand All @@ -254,7 +255,6 @@
<field index="size">5565</field>
<field index="creation_date">1393346082</field>
<field index="modification_date">1392907534</field>
<field index="pid">0</field>
</fieldlist>
<related index="rels" type="array">
<field index="storage" type="array">
Expand All @@ -271,6 +271,7 @@
<tablerow index="sys_file_storage:1" type="array">
<fieldlist index="data" type="array">
<field index="uid">1</field>
<field index="pid">0</field>
<field index="name">fileadmin/ (auto-created)</field>
<field index="driver">Local</field>
<field index="configuration">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;yes&quot; ?&gt;
Expand All @@ -296,7 +297,6 @@
<field index="is_public">1</field>
<field index="is_writable">1</field>
<field index="is_online">1</field>
<field index="pid">0</field>
<field index="description" type="NULL"></field>
</fieldlist>
<related index="rels" type="array">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,10 @@
<tablerow index="pages:1" type="array">
<fieldlist index="data" type="array">
<field index="uid">1</field>
<field index="pid">0</field>
<field index="perms_everybody">15</field>
<field index="title">Root</field>
<field index="doktype">1</field>
<field index="pid">0</field>
<field index="deleted">0</field>
<field index="hidden">0</field>
</fieldlist>
Expand All @@ -108,10 +108,10 @@
<tablerow index="tx_impexpgroupfiles_item:1" type="array">
<fieldlist index="data" type="array">
<field index="uid">1</field>
<field index="pid">1</field>
<field index="title">Test item</field>
<field index="images">typo3_image4.jpg</field>
<field index="image_references">fileadmin/user_upload/typo3_image5.jpg</field>
<field index="pid">1</field>
<field index="deleted">0</field>
<field index="hidden">0</field>
</fieldlist>
Expand Down Expand Up @@ -139,6 +139,7 @@
<tablerow index="sys_file:3" type="array">
<fieldlist index="data" type="array">
<field index="uid">3</field>
<field index="pid">0</field>
<field index="storage">1</field>
<field index="type">2</field>
<field index="metadata">0</field>
Expand All @@ -152,7 +153,6 @@
<field index="size">7425</field>
<field index="creation_date">1393432184</field>
<field index="modification_date">1393432183</field>
<field index="pid">0</field>
</fieldlist>
<related index="rels" type="array">
<field index="storage" type="array">
Expand All @@ -169,6 +169,7 @@
<tablerow index="sys_file_storage:1" type="array">
<fieldlist index="data" type="array">
<field index="uid">1</field>
<field index="pid">0</field>
<field index="name">fileadmin/ (auto-created)</field>
<field index="driver">Local</field>
<field index="configuration">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;yes&quot; ?&gt;
Expand All @@ -194,7 +195,6 @@
<field index="is_public">1</field>
<field index="is_writable">1</field>
<field index="is_online">1</field>
<field index="pid">0</field>
<field index="description" type="NULL"></field>
</fieldlist>
<related index="rels" type="array">
Expand Down
Loading

0 comments on commit 87f4395

Please sign in to comment.