Dependency injection TYPO3-在itemsProcFunc中检索到的打字脚本不完整

Dependency injection TYPO3-在itemsProcFunc中检索到的打字脚本不完整,dependency-injection,typo3,typoscript,Dependency Injection,Typo3,Typoscript,我有以下问题: 我们正在用一个自定义列覆盖tt_内容TCA,该列的配置中有一个itemsProcFunc。在函数中,我们尝试检索打字稿设置,以便动态显示项目。问题是:在函数中,我们没有收到所有的打字稿设置,其中包括但只有一些 'itemsProcFunc' => 'Vendor\Ext\Backend\Hooks\TcaHook->addFields', $setup现在不完整,并且不包含完整的打字脚本,例如,缺少一些静态包含的打字脚本 在编写器模式下使用了TYPO3 7 LT

我有以下问题: 我们正在用一个自定义列覆盖tt_内容TCA,该列的配置中有一个itemsProcFunc。在函数中,我们尝试检索打字稿设置,以便动态显示项目。问题是:在函数中,我们没有收到所有的打字稿设置,其中包括但只有一些

'itemsProcFunc' => 'Vendor\Ext\Backend\Hooks\TcaHook->addFields',


$setup现在不完整,并且不包含完整的打字脚本,例如,缺少一些静态包含的打字脚本

在编写器模式下使用了TYPO3 7 LTS(7.6.18)、PHP7.0.*


有人知道问题出在哪里吗?有其他选择吗?

您可能误解了TypoScipt的目的。这是前端的一种配置方式。您提到的钩子用于TCA,which是TYPO3的后端部分。打字脚本通常根本不用于后端相关的内容,因为它绑定到特定的页面模板记录。相反,在后端,有可以绑定到页面,但也可以全局添加的。另一个错误是使用ObjectManager和ConfigurationManager,它们是extbase的类,在后端没有初始化。我建议不要在TCA中使用extbase,因为TCA是为每个页面请求缓存和加载的。而是使用TSConfig或直接向TCA提供配置设置。不要初始化extbase,也不要在这些钩子中使用extbase类。 根据您希望通过打字脚本配置的内容,您可能需要执行以下操作:

'config' => [
    'type' => 'select',
    'renderType' => 'singleSelect',
    'items' => [
        ['EXT:my_ext/Resources/Private/Language/locallang_db.xlf:myfield.I.0', '']
    ],
    'itemsProcFunc' => \VENDOR\MyExt\UserFunctions\FormEngine\TypeSelectProcFunc::class . '->fillSelect',
    'customSetting' => 'somesetting'
]
然后在类中访问它:

class TypeSelectProcFunc{
    public function fillSelect(&$params){
        if( $params['customSetting'] === 'somesetting' ){
            $params['items'][] = ['New item',1];
        }
    }
}
我也遇到了类似的问题(还有
itemsProcFunc
和检索打字稿)。在我的例子中,ConfigurationManager不知道所选后端页面的当前页面ID。因此,它使用了根页面的页面id(例如1),并且一些打字模板没有加载


然而,在我们研究解决方案之前,Euli提出了一些好的观点:

  • 不要在TCA函数中使用extbase configuration manager
  • 对于后端配置,请使用TSconfig而不是TypoScript
您可能想问另一个问题,您想具体做什么,以及为什么您需要在上下文中使用打字稿


为了完整性起见,我测试了这个变通方法,但我不推荐它,因为上面提到的原因以及我不确定这是否是最佳实践。(我之所以使用它,是因为我正在修补一个已经在TCA中使用打字脚本的扩展,我想找出它不起作用的原因。我可能会完全返工这个部分。)

我发布这篇文章是希望对类似的问题有所帮助

public function populateItemsProcFunc(array &$config): array
{
    // workaround to set current page id for BackendConfigurationManager
    $_GET['id'] = $this->getPageId((int)($config['flexParentDatabaseRow']['pid'] ?? 0));

    $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
    $configurationManager = $objectManager->get(BackendConfigurationManager::class);
    $setting = $configurationManager->getTypoScriptSetup();
    $templates = $setting['plugin.']['tx_rssdisplay.']['settings.']['templates.'] ?? [];

    // ... some code removed
}

protected function getPageId(int $pid): int
{
   if ($pid > 0) {
       return $pid;
   }

   $row = BackendUtility::getRecord('tt_content', abs($pid), 'uid,pid');
   return $row['pid'];
}

函数
getPageId()
是从ext:news派生的,该函数在itemsProcFunc中也使用该函数,但随后它从TSconfig检索配置。您可能还想看看这个例子:::user\u templateLayout

如果您查看TYPO3核心中的代码,它将尝试从中获取当前页面id

(int)GeneralUtility::_GP('id');


这通常会被设置,但在itemsProcFunc中可能不会设置(我在TYPO3 10.4.14中就是这样)。

什么是“静态包含的打字脚本”?您的意思是使用
ExtensionManagementUtility::addStaticFile
添加的打字脚本吗?是的,并将其包含在模板中的include static字段中。无法重现您的问题。模板中添加的整个打字脚本正在我的测试中加载。
(int)GeneralUtility::_GP('id');