138 lines
4.3 KiB
PHP
138 lines
4.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* This file is part of the TYPO3 CMS project.
|
|
*
|
|
* It is free software; you can redistribute it and/or modify it under
|
|
* the terms of the GNU General Public License, either version 2
|
|
* of the License, or any later version.
|
|
*
|
|
* For the full copyright and license information, please read the
|
|
* LICENSE.txt file that was distributed with this source code.
|
|
*
|
|
* The TYPO3 project - inspiring people to share!
|
|
*/
|
|
|
|
namespace TYPO3\CMS\Backend\Form\FormDataProvider;
|
|
|
|
use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
|
|
|
|
/**
|
|
* Override child TCA in an inline parent child relation.
|
|
*
|
|
* This basically merges the inline property ['overrideChildTca'] from
|
|
* parent TCA over given child TCA.
|
|
*/
|
|
class InlineOverrideChildTca implements FormDataProviderInterface
|
|
{
|
|
/**
|
|
* ['columns'] section child TCA field names that can not be overridden
|
|
* by overrideChildTca from parent.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $notSettableFields = [
|
|
'uid',
|
|
'pid',
|
|
't3ver_oid',
|
|
't3ver_wsid',
|
|
't3ver_state',
|
|
't3ver_stage',
|
|
];
|
|
|
|
/**
|
|
* Configuration fields in ctrl section. Their values are field names and if the
|
|
* keys are set in ['ctrl'] section, they are added to the $notSettableFields list
|
|
* and can not be overridden, too.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $configurationKeysForNotSettableFields = [
|
|
'crdate',
|
|
'delete',
|
|
'origUid',
|
|
'transOrigDiffSourceField',
|
|
'transOrigPointerField',
|
|
'tstamp',
|
|
];
|
|
|
|
/**
|
|
* Inline parent TCA may override some TCA of children.
|
|
*
|
|
* @param array $result Main result array
|
|
* @return array Modified result array
|
|
*/
|
|
public function addData(array $result): array
|
|
{
|
|
$result = $this->overrideTypes($result);
|
|
return $this->overrideColumns($result);
|
|
}
|
|
|
|
/**
|
|
* Override ['types'] configuration in child TCA
|
|
*
|
|
* @param array $result Main result array
|
|
* @return array Modified result array
|
|
*/
|
|
protected function overrideTypes(array $result): array
|
|
{
|
|
if (!isset($result['inlineParentConfig']['overrideChildTca']['types'])) {
|
|
return $result;
|
|
}
|
|
$result['processedTca']['types'] = array_replace_recursive(
|
|
$result['processedTca']['types'],
|
|
$result['inlineParentConfig']['overrideChildTca']['types']
|
|
);
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Override ['columns'] configuration in child TCA.
|
|
* Sanitizes that various hard dependencies can not be changed.
|
|
*
|
|
* @param array $result Main result array
|
|
* @return array Modified result array
|
|
* @throws \RuntimeException
|
|
*/
|
|
protected function overrideColumns(array $result): array
|
|
{
|
|
if (!isset($result['inlineParentConfig']['overrideChildTca']['columns'])) {
|
|
return $result;
|
|
}
|
|
$fieldBlackList = $this->generateFieldBlackList($result);
|
|
foreach ($fieldBlackList as $notChangeableFieldName) {
|
|
if (isset($result['inlineParentConfig']['overrideChildTca']['columns'][$notChangeableFieldName])) {
|
|
throw new \RuntimeException(
|
|
'System field \'' . $notChangeableFieldName . '\' can not be overridden in inline config'
|
|
. ' \'overrideChildTca\' from parent TCA',
|
|
1490371322
|
|
);
|
|
}
|
|
}
|
|
$result['processedTca']['columns'] = array_replace_recursive(
|
|
$result['processedTca']['columns'],
|
|
$result['inlineParentConfig']['overrideChildTca']['columns']
|
|
);
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Add field names defined in ctrl section of child table to black list
|
|
*
|
|
* @param array $result Main result array
|
|
* @return array Column field names which can not be changed by parent TCA
|
|
*/
|
|
protected function generateFieldBlackList(array $result): array
|
|
{
|
|
$notSettableFields = $this->notSettableFields;
|
|
foreach ($this->configurationKeysForNotSettableFields as $configurationKey) {
|
|
if (isset($result['processedTca']['ctrl'][$configurationKey])) {
|
|
$notSettableFields[] = $result['processedTca']['ctrl'][$configurationKey];
|
|
}
|
|
}
|
|
return $notSettableFields;
|
|
}
|
|
}
|