Typo3:使用 ext_conf_template.txt 渲染 selectMultipleSideBySide 元素

问题描述 投票:0回答:1

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();
        }
    }

php typo3 typo3-10.x
1个回答
0
投票

这已经部分发挥作用了。正如 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 解决方案,也许您可以使用它来编辑答案。

© www.soinside.com 2019 - 2024. All rights reserved.