Typo3版本:10.4.6
在我的项目中,我有一个自定义扩展,其中包含 ext_conf_template.txt 文件。
根据 Typo3 文档,应该可以使用链接到自定义用户函数的用户选项类型。(https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us /ExtensionArchitecture/FileStructure/ExtConfTemplate.html)
我尝试使用它,但没有成功。
是否有另一种方法可以在扩展配置中创建 selectMultipleSideBySide 字段,而无需编辑 ext_conf_template.txt 文件?
到目前为止,这是我的错误做法:
# cat=basic/enable; type=user[My\Path\UserFunctions\ExtConfUserFunctions->renderCategories]; label=Kategorien ausschließen
excluded =
<?php
namespace My\Path\UserFunctions;
use TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement;
use TYPO3\CMS\Backend\Form\NodeFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class ExtConfUserFunctions
{
/**
* @return string
*/
public function renderCategories(): string
{
/** @var NodeFactory $nodeFactory */
$nodeFactory = GeneralUtility::makeInstance(NodeFactory::class);
/** @var SelectMultipleSideBySideElement $element */
$element = GeneralUtility::makeInstance(
SelectMultipleSideBySideElement::class,
$nodeFactory,
[
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'items' => [
['Option 1', '1'],
['Option 2', '2'],
['Option 3', '3'],
]
]
]
);
$elementArray = $element->render();
}
}
这已经部分发挥作用了。正如 Julian Hoffmann 所描述的,您必须更改传递给
SelectMultipleSideBySideElement
类的参数。
为了避免缺少 BackendUser 的错误,您必须为
SelectMultipleSideBySideElement
类实现自定义子类并重写 appendValueToLabelInDebugMode
方法。为了简单起见,我只是在 UserFunctions
文件夹中添加了子类。这是代码:
<?php
namespace My\Path\UserFunctions;
use \TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement as OrigSelectMultipleSideBySideElement;
class SelectMultipleSideBySideElement extends OrigSelectMultipleSideBySideElement
{
protected function appendValueToLabelInDebugMode($label, $value): string
{
return (string)$label;
}
}
现在
SelectMultipleSideBySideElement
已渲染。但由于缺少两个东西,仍然无法正常工作。
第一个缺少的东西是 html 中用于保存所选配置的字段。这很容易。您只需将隐藏字段添加到呈现的 html 中即可。此时的 UserFunc 如下所示:
<?php
namespace My\Path\UserFunctions;
use TYPO3\CMS\Backend\Form\NodeFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class ExtConfUserFunction
{
/**
* @return string
*/
public function renderCategories(): string
{
/** @var NodeFactory $nodeFactory */
$nodeFactory = GeneralUtility::makeInstance(NodeFactory::class);
/** @var SelectMultipleSideBySideElement $element */
$element = GeneralUtility::makeInstance(
SelectMultipleSideBySideElement::class,
$nodeFactory,
[
'parameterArray' => [
'fieldConf' => [
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'items' => [
['Option 1', '1'],
['Option 2', '2'],
['Option 3', '3'],
]
]
]
]
]
);
$elementArray = $element->render();
$elementArray['html'] .= '<input type="hidden" id="em-nc_hobby_vehicles-excluded" name="excluded" class="form-control" value="">';
return $elementArray['html'];
}
}
现在是更难的了。缺少元素功能的 JS。我对此没有解决方案。这是我到目前为止尝试过的:
$elementArray = $element->render();
$pageRenderer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Page\PageRenderer::class);
$pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/FormEngine/RequestUpdate');
$pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/FormEngine/Element/SelectMultipleSideBySideElement');
$js = $pageRenderer->getJavaScriptRenderer()->render();
$elementArray['html'] .= '<input type="hidden" id="em-nc_hobby_vehicles-excluded" name="excluded" class="form-control" value="Ficken">';
$elementArray['html'] .= $js;
return $elementArray['html'];
然后 JavaScriptHandler 就被加载了。但我不确定
SelectMultipleSideBySideElement
的 JS 是否加载正确。也不确定此时是否可以像这样使用PageRenderer
。
事实上,JS 不起作用。
即使您让 JS 以某种方式工作,您也必须实现自定义 JS 代码,以将选定的类别 uid 作为逗号分隔列表保存在隐藏字段中。也许为元素的完整功能实现自定义 JS 代码更容易。
希望这可以帮助您使其正常工作。如果您运行自定义 JS 解决方案,也许您可以使用它来编辑答案。