如何在 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)
我已经按照 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)