簡體   English   中英

如何在 TYPO3 的 ext:form 的模板和修整器中獲取自定義設置?

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

我已經擴展並調整了ext:formflexform ,如下所述:

ext_localconf.php:

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

類/鈎子/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. 掛鈎beforeRendering過程

ext_localconf.php:

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

2. 閱讀您的 flexform 並將您的變量分配為例如表單定義的 renderingOptions:

\Vendor\Extension\Hooks\FormHooks

public function beforeRendering(
        \TYPO3\CMS\Form\Domain\Runtime\FormRuntime $formRuntime,
        \TYPO3\CMS\Form\Domain\Model\Renderable\RootRenderableInterface $renderable)
    {
        if ($renderable instanceof FormDefinition) {
            $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']);
            }
        }
    }

3. 訪問模板或裝訂器中的設置:

體液:

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

終結者:

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

這是一個快速而骯臟但有效的代碼示例。 不要在沒有清潔、棉絨和表面處理的情況下在生產中使用它:-)


可能的其他方式:

  • 留在 yaml 內並使用強大的繼承/混合選項
  • 擴展 FormFrontendController 並重寫 renderAction。 解析 flexform 數據的所有方法都已包含在此 controller 中,因此您只需獲取自己的設置並將它們分配給您的表單配置(例如,如上所示的 renderOptions)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM