【问题标题】:Howto get custom settings in template and finisher of ext:form in TYPO3?如何在 TYPO3 中的 ext:form 的模板和整理器中获取自定义设置?
【发布时间】:2022-01-12 17:01:06
【问题描述】:

我已经扩展和调整了ext:form 的flexform,就像here 描述的那样:

ext_localconf.php:

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

类/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 的模板和我的自定义修整器中获取我的自定义设置?如果有,怎么做?

【问题讨论】:

    标签: typo3 typo3-10.x


    【解决方案1】:

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

    事实:$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 并将您的变量分配为例如表单定义的renderingOptions:

    \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 中并使用强大的继承/混合选项
    • 扩展 FormFrontendController 并重写 renderAction。所有解析 flexform 数据的方法都已经是这个控制器的一部分,所以你只需要获取你自己的设置并将它们分配给你的表单配置(例如,如上所示的 renderOptions)

    【讨论】:

    • 哇,感谢您的广泛回答!我现在可以在模板中看到我的设置,但在整理器中看不到。我猜,beforeRendering() 是在终结者之后调用的。还有其他的钩子,我可以用吗?
    • 就像我说的,很难理解所有选项、钩子、绑定 :-) 您可以使用“afterInitializeCurrentPage”。我更新了我的答案。你可以看到这里描述的所有钩子:docs.typo3.org/c/typo3/cms-form/main/en-us/I/ApiReference/…
    • 竖起大拇指,这很好用!非常感谢!
    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2014-08-31
    • 2023-03-20
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多