Typo3 8.7 itemsProcFunc 不修改现有项目

Typo3 8.7 itemsProcFunc do not modifies existing items

我是 Typo3 的新手。我想在此内容元素中添加一个带有特定 select 字段的自定义内容元素。 对于自定义内容元素,我修改了 pageTSConfig

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig 并添加了我的元素。这是工作。为了存储我的内容值,我在“ext_tables.sql”文件中添加了

#
# Table structure for table 'tt_content'
#
CREATE TABLE tt_content (
    tx_spk_shopware_category varchar(20) NULL
);

最后我重写了 tt_content 的 TCA 配置,但这是行不通的。我在配置中看到带有自定义类型的新内容元素和我的项目,但我无法修改/添加 itemsProcFunc.

中引用的 class 中的任何项目

tt_content.php:

<?php declare(strict_types=1);

defined('TYPO3_MODE') || die();

// static TypoScript
(static function () {
    \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPlugin(
        array(
            'LLL:EXT:spk_shopware/Resources/Private/Language/Tca.xlf:spk_shopware_category.wizard.title',
            'spk_shopware_category',
            'EXT:spk_shopware/Resources/Public/Icons/ContentElements/spk_shopware_category.gif'
        ),
        'CType',
        'spk_shopware'
    );

    $temporaryColumn = array(
        'tx_spk_shopware_category' => array (
            'exclude' => 1,
            'label' => 'LLL:EXT:spk_shopware/Resources/Private/Language/Tca.xlf:spk_shopware_category.title',
            'config' => array (
                'type' => 'select',
                'itemsProcFunc' => SPK\Shopware\Hook\ShopwareCategorySelect::class . '->listAvailableShopwareCategories',
                'items' => array(
                    array('test 1', '8'),
                    array('test 2', '10'),
                ),
                'maxitems' => 1,
                'minitems' => 1,
                'required' => true,
            )
        )
    );

    \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns(
        'tt_content',
        $temporaryColumn
    );
})();


// Configure the default backend fields for the content element
$GLOBALS['TCA']['tt_content']['types']['spk_shopware_category'] = array(
    'showitem' => '
         --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xml:palette.general;general,
         tx_spk_shopware_category
');

CategorySelect.php

<?php

namespace SPK\Shopware\Hook;

class ShopwareCategorySelect
{
    public function listAvailableShopwareCategories(&$config)
    {
        $config['items'][] = ["Tim", 0];
        $config['items'][] = ["Tom", 1];
        $config['items'][] = ["Jerry", 2];
        array_push($config['items'], ["as", 1]);
        return $config;
    }
}

我看到自定义元素和新的 select 字段,但只有配置中的测试元素。我不知道我错过了什么。

你真的不需要return任何东西。您只想修改列的项目。尝试以下操作:

public function listAvailableShopwareCategories(&$config)
{
    $config['items'][] = ["Tim", 0];
    $config['items'][] = ["Tom", 1];
    $config['items'][] = ["Jerry", 2];
   
    $this->getItems = $config['items'];
}

您通过在 TCA 上呈现之前添加项目来修改 &$config。这就是为什么您的 PHP 文件位于 Hooks 文件夹下的原因。它只是挂钩响应之间的项目:)

看来,TYPO3 没有找到您的class。请检查您是否提供了适当的信息:

通过 composer.json,部分“autoload”:

{
    "name": "vendorname/my-extension",
    "type": "typo3-cms-extension",
    // ...
    "autoload": {
        "psr-4": {
            "Vendorname\MyExtension\": "Classes/"
        }
    }
}

...或通过 ext_emconf.php,部分“autoload”:

<?php
    $EM_CONF[$_EXTKEY] = [
        'title' => 'My Extension',
        // ...
        'autoload' => [
            'psr-4' => [
                'Vendorname\MyExtension\' => 'Classes'
            ]
        ]
    ];