如何在 TYPO3 中获取 ext:form 模板和修整器的自定义设置?

Howto get custom settings in template and finisher of ext:form in TYPO3?

我已经按照 here:

的描述扩展和调整了 ext:form 的弹性形式

ext_localconf.php:

$GLOBALS['TYPO3_CONF_VARS']
    ['SC_OPTIONS']
    [\TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools::class]
    ['flexParsing']
    [] = \Vendor\ExtKey\Hooks\FlexFormHook::class;

Classes/Hooks/FlexFormHook.php:

<?php

namespace Vendor\ExtKey\Hooks;

use TYPO3\CMS\Core\Core\Environment;
use TYPO3\CMS\Core\Utility\GeneralUtility;

class FlexFormHook
{
   /**
   * @param array $dataStructure
   * @param array $identifier
   * @return array
   */
   public function parseDataStructureByIdentifierPostProcess(array $dataStructure, array $identifier): array
   {
     if ($identifier['type'] === 'tca' && $identifier['tableName'] === 'tt_content' && $identifier['dataStructureKey'] === '*,form_formframework') {
         $file = Environment::getPublicPath() . '/typo3conf/ext/extKey/Configuration/Example.xml';
         $content = file_get_contents($file);
         if ($content) {
             $dataStructure['sheets']['extraEntry'] = GeneralUtility::xml2array($content);
         }
     }
     return $dataStructure;
   }
}

弹性变形:

<extra>
    <ROOT>
        <TCEforms>
            <sheetTitle>Fo</sheetTitle>
        </TCEforms>
        <type>array</type>
        <el>
            <settings.postsPerPage>
                <TCEforms>
                    <label>Max. number of posts to display per page</label>
                    <config>
                        <type>input</type>
                        <size>2</size>
                        <eval>int</eval>
                        <default>3</default>
                    </config>
                </TCEforms>
            </settings.postsPerPage>
        </el>
    </ROOT>
</extra>

现在我可以为表单设置自定义设置,而无需将表单的 YAML 配置加倍,到目前为止是理论。

但是: 我无法在模板中使用 {settings.postsPerPage} 访问设置,也无法在自定义修整器中获取它们。

是否可以通过某种方式在 ext:form 的模板和我的自定义修整器中获取我的自定义设置?如果是,怎么做?

根据经验:表单框架中有很多方法,很难理解一个:-)

事实:$this->settings 已分配给视图,但未传递给 formvh:render viewhelper。所以你不能在模板中访问它。您必须自己解决 flexform(无论是否扩展)并将其分配给您的表单配置。

解决这个问题的一种方法是:

1.挂接到 afterInitializeCurrentPage 进程

ext_localconf.php:

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/form']['afterInitializeCurrentPage'][1614844400]
        = \Vendor\Extension\Hooks\FormHooks::class;

2。阅读您的 flexform 并将您的变量分配为例如表单定义的渲染选项:

\Vendor\Extension\Hooks\FormHooks:

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
    {

        $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
        $flexFormData = GeneralUtility::xml2array($configurationManager->getContentObject()->data['pi_flexform'] ?? '');
        $flexFormService = GeneralUtility::makeInstance(FlexFormService::class);
        $flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);

        $sheetDataXml = $flexFormTools->flexArray2Xml($flexFormData);
        $settings = $flexFormService->convertFlexFormContentToArray($sheetDataXml)['settings'] ?? [];
        if (array_key_exists('postsPerPage', $settings)) {
            $formRuntime->getFormDefinition()->setRenderingOption('postsPerPage', $settings['postsPerPage']);
        }
        return $currentPage;
    }

3。在您的模板或装订器中访问您的设置:

流体:

<formvh:renderRenderable renderable="{form}">
  <f:debug>{form.formDefinition.renderingOptions.postsPerPage}</f:debug>
</formvh:renderRenderable>

终结者:

$this->finisherContext->getFormRuntime()->getFormDefinition()->getRenderingOptions()

这是一个快速而粗糙但有效的代码示例。不要在没有清洁、棉绒和完成的情况下在生产中使用它:-)


其他可能的方式:

  • 留在 yaml 中并使用强大的继承/mixin 选项
  • 扩展 FormFrontendController 并重写 renderAction。所有解析 flexform 数据的方法都已经是这个控制器的一部分,所以你只需要获取你自己的设置并将它们分配给你的表单配置(例如,如上所示的 renderingOptions)