Dependency injection TYPO3-在itemsProcFunc中检索到的打字脚本不完整
我有以下问题: 我们正在用一个自定义列覆盖tt_内容TCA,该列的配置中有一个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
'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');