问题描述
目标:动态创建部分中特定元素的克隆,并通过从请求参数重新注册来保持它们的形式。这些部分由 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 (将#修改为@)