TYPO3 表单框架:注册新的表单元素

问题描述

目标:动态创建部分中特定元素的克隆,并通过从请求参数重新注册来保持它们的形式。这些部分由 JavaScript(可重复容器)在前端克隆。

最小可重现示例:

动态创建部分和所属日期字段:

    public function beforeRendering(\TYPO3\CMS\Form\Domain\Runtime\FormRuntime $formRuntime,\TYPO3\CMS\Form\Domain\Model\Renderable\RootRenderableInterface $renderable)
    {
        if ($renderable instanceof Repeatable) {
            $renderable->buildClone();
        }
    }
    public function buildClone(): void
    {
        /** @var Section $section */
        $section = $this->createElement('clone-1','Fieldset');
        $date = $section->createElement('clone-1-date-1','Date');
        $this->clonedSection = $section;
    }

通过请求参数重新创建克隆,以保持它们的形式:

public function afterInitializeCurrentPage(
        \TYPO3\CMS\Form\Domain\Runtime\FormRuntime $formRuntime,\TYPO3\CMS\Form\Domain\Model\Renderable\CompositeRenderableInterface $currentPage = null,\TYPO3\CMS\Form\Domain\Model\Renderable\CompositeRenderableInterface $lastPage = null,array $requestArguments = []): ?\TYPO3\CMS\Form\Domain\Model\Renderable\CompositeRenderableInterface
    {
        $repeatables = [];
        foreach ($formRuntime->getPages() as $page) {
            foreach ($page->getRenderablesRecursively() as $renderable) {
                if ($renderable instanceof RepeatableInterface) {
                    $renderable->initFromrequest($formRuntime);
                }
            }
        }
        return $currentPage;
    }
public function initFromrequest(FormRuntime $formRuntime): void
    {
        if ($formRuntime->getRequest()->hasArgument('clone-1-date-1')) {
            $this->buildClone();
        }
    }

日期字段正确呈现,没有验证错误。 但是,如果我尝试注册元素,例如在下一个表单步骤中,我收到了 DuplicateFormElementException。

问题: 哪些钩子最适合这个用例,根据当前请求重新分配动态创建的元素的最佳方法是什么?


更新:

由于缺少类型转换,它适用于“文本”等普通字段,但不适用于“日期”等特殊字段。 我的解决方法是自己处理类型转换。知道如何以正确的方式处理它吗?

public function afterSubmit(\TYPO3\CMS\Form\Domain\Runtime\FormRuntime $formRuntime,\TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface $renderable,$elementValue,array $requestArguments = [])
    {
        if ($renderable instanceof Date) {
            if (array_key_exists($renderable->getIdentifier(),$requestArguments)) {
                if ($requestArguments[$renderable->getIdentifier()]) {
                    return new \DateTime($elementValue);
                }
            }
        }
        return $elementValue;
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)