TCA 字段的动态(基于 JavaScript)displayCond

问题描述 投票:0回答:1

TYPO3 在 TCA 中具有属性 displayCond 来定义“是否显示该字段的一个或多个条件规则。”

在某些情况下,当表单打开时,此条件不会改变(例如

REC:NEW
HIDE_FOR_NON_ADMINS
),但在某些情况下,它取决于另一个字段的值(例如 REQ),该值在编辑字段时可能会发生变化。在这种情况下,通常需要在其他字段中添加
'onChange' => 'reload'
。然而,这使得编辑变得笨拙和缓慢,因为记录是有效保存的,表单是通过 PHP 生成并再次加载的。还会显示一个确认对话框,必须确认。

示例是

pages.canonical_link
,这取决于
no_index
(EXT:必须显示seo)。

如果某个字段依赖于多个字段,则可能需要多次重新加载表单。

我正在寻找一种减少表单重新加载的解决方案,最有可能通过 JavaScript。

我已经在我的一个扩展中实现了类似的东西,无论如何都创建了自定义渲染类型。在本例中,JavaScript 部分负责字段的条件渲染。

但是,从长远来看,这不太容易维护,我正在寻找更通用的解决方案。

我想知道是否有人已经实现了这样的东西,以及您将如何创建这样的解决方案并使其可长期维护。

typo3 tca
1个回答
0
投票

实现此目的的“最简单”方法可能是通过调整后端部分,当 displayCond 计算结果为 false 时,从渲染中删除字段,并将它们隐藏输出。

覆盖/替换的位置可能是

\TYPO3\CMS\Backend\Form\FormDataProvider\EvaluateDisplayConditions
,特别是
evaluateConditions
方法,它执行实际的
unset

您可能可以“X-Class”该类,或者直接在 FormDataGroup 中替换它。对于后者,请参阅配置后端模块中的

$GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']
。我认为常规记录的默认值是
tcaDatabaseRecord
(不过可能是错误的)。

之后将 displayCond 添加到输出中的某处,这可能有点困难,因为有几个地方生成了包装“div”,例如

\TYPO3\CMS\Backend\Form\Container\PaletteAndSingleContainer
。或者,您可以尝试为每个字段类型添加它,但这可能比仅仅将其添加到容器中更难。

我认为要覆盖容器(或元素),您需要x-classing。不知道有没有更好的办法。

在 JavaScript 方面,您可能需要自己实现 displayCond 解析和评估。 PHP 版本可以在我上面提到的

EvaluateDisplayConditions
类中看到,所以如果你幸运的话,你也许可以直接翻译它。

如何将 JavaScript 添加到 FormEngine,但我并不完全确定。通常您可以为单个元素添加它,例如就像在

SelectMultipleSideBySideElement.php
元素中,它看起来像这样:

$resultArray['javaScriptModules'][] = JavaScriptModuleInstruction::create(
    '@typo3/backend/form-engine/element/select-multiple-side-by-side-element.js'
)->instance($selectedOptionsFieldId, $availableOptionsFieldId);

但是我们在 FormDataProviders 中没有 resultArray,但我们在 Container 类中确实有它(例如

\TYPO3\CMS\Backend\Form\Container\TabsContainer
),因此如果您覆盖其中一些类,那么这可能是注入 JavaScript 的可行位置。

但是可能有一个更好的、更“全球化”的地方来注入它。我不确定。

一些注意事项:

以上所有内容都要求您输出由 displayConds 隐藏的字段,但您应该注意,如果您输出它们,它们也将被提交 - 即使它们被隐藏 - 这与常规的 displayCond 不同行为。

因此,每当您隐藏字段时,您可能希望暂时删除任何输入上的“名称”属性,以便它保留以前的行为。

我不认为渲染但隐藏字段是一个安全问题,因为 displayConds 通常并不用于限制编辑器或类似内容的字段权限。但我不敢打赌它不会被用在那样的地方。 此外,任何类似的后端更改很可能会在下一个 TYPO3 主要版本中中断。我的经验之谈:D

如上所述,以上是我认为“最简单”的方法。

替代方案需要重写整个 FormEngine 机制,例如在客户端完全渲染表单(可能使用 JavaScript 框架),而不是像目前那样在 PHP 端渲染。

但这将是一项相当艰巨的任务,也许需要向 TYPO3 核心团队提出更多建议,尽管他们可能会觉得这很有趣,甚至是一个好主意(有争议),但我怀疑有人会想要甚至

拥有

花时间来实施它。

希望这对您有所帮助。

问候

似鸟

© www.soinside.com 2019 - 2024. All rights reserved.