问题描述
是否可以仅在编辑记录时禁用 TCA 配置中的字段?
新记录的TCA配置:
'title' => [
'exclude' => true,'label' => 'Title','config' => [
'type' => 'input','size' => 30,'eval' => 'trim,required'
],],
现有记录的TCA配置:
'title' => [
'exclude' => true,required'
'readOnly' => true,
解决方法
我不知道针对新记录和现有记录的不同 TCA 设置的内置解决方案。
由于最终的 TCA 已缓存,因此也无法在运行时使用某些 PHP 对其进行操作。
,可以在后端添加 Javascript。使用此 Javascript,您可以即时禁用字段。但请注意,这只是一种hacky 解决方法,很容易克服!
在 ext_localconf.php
中添加 Javascript:
if (TYPO3_MODE === 'BE') {
$renderer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Page\PageRenderer::class);
$renderer->addJsFile(
'EXT:myext/Resources/Public/JavaScript/Backend.js'
);
}
在 Backend.js
中,您可以执行以下操作:
require(["jquery"],function ($) {
const queryString = decodeURI(window.location.search),urlParams = new URLSearchParams(queryString);
if (urlParams.has('route') && urlParams.get('route') == '/record/edit') {
// check,that you just do changes,if you edit records of the desired model
if (queryString.indexOf('edit[tx_myextension_domain_model_model][')) {
let idPosStart = queryString.indexOf('edit[tx_myextension_domain_model_model][') + 40,idPosEnd = queryString.indexOf(']=',idPosStart),idLength = idPosEnd - idPosStart,idEl = queryString.substr(idPosStart,idLength),elVal = urlParams.get('edit[tx_myextension_domain_model_model][' + idEl + ']');
if (elVal == 'edit') {
// Delay everything a little bit,otherwise html is not fully loaded and can't be addressed
setTimeout(function () {
// disable desired fields,eg field "title"
let titleField = $('[data-field="title"]').parents('.form-section');
titleField.find('input').prop('disabled',true);
titleField.find('button.close').remove();
},800);
}
}
}
}