编辑记录时禁用 TCA 中的字段

问题描述

是否可以仅在编辑记录时禁用 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);

            }

        }
    }

}