[英]Howto get custom settings in template and finisher of ext:form in TYPO3?
我已經擴展並調整了ext:form
的flexform ,如下所述:
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()
這是一個快速而骯臟但有效的代碼示例。 不要在沒有清潔、棉絨和表面處理的情況下在生產中使用它:-)
可能的其他方式:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.