如何避免整个多站点安装的TYPO3缓存表映射?

问题描述:

我有一个TYPO3安装7.6.22与不同的网站,每个在自己的页面树。如何避免整个多站点安装的TYPO3缓存表映射?

在自己的扩展中,通常在表tx_myextension_domain_model_name中保留某个对象。

但对于一个网站。我需要这个对象地图上的其他表A.所以我定义的Typo脚本 config.tx_extbase.persistence.classes.MyVendor \ Myextension \域\型号\ Name.mapping ... 在单独的分机特别为这个网站A.

这工作,但它目前不可能有两个映射平行。

如果我 - 在清除所有缓存之后 - 在网站A的前端加载插件,则所有其他网站在表A上(而不是在tx_myextension_domain_model_name上)都有映射。

如果我 - 在清除所有缓存之后 - 在其他网站的前端加载插件,本网站上的所有内容都可以,但网站A会产生错误,因为某些进程不适用于默认表tx_myextension_domain_model_name。

因此,很显然,映射配置缓存整个安装,而不是每个网站的基地。 这是一个错误或功能?有没有办法解决?

看看这个问题在TYPO3伪造和我的评论在最底部。

https://forge.typo3.org/issues/75399#change-337355

很明显:你需要禁用属性映射器缓存。 在您的AdditionalConfiguration.php文件中添加以下内容。

$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_datamapfactory_datamap']['backend'] = 'TYPO3\CMS\Core\Cache\Backend\NullBackend'; 

这会花费你可能的一些表现,但我不认为它会那么多。但是,您将能够使用(本地)TypoScript设置为不同的站点配置不同的映射。

+0

谢谢Artur--这正是我所期待的。 – klaks

在一次安装中,您只能使用一组类/ PHP源/扩展。
如果你想要不同的行为,你需要插入条件。你可能会在控制器中分割使用,并且你可能会做一些曲折的工作来将它分解到你的仓库中。我认为这可能会非常复杂。

可能最干净的解决方案是使用另一个数据域和它自己的数据记录。

+0

问题不在于类/ PHP源/扩展名。唯一的问题是,表格映射的typoscript配置无法在每个网站上使用,正如您通常对其他输入法使用的那样。至少我不知道它有多可能。顺便说一下,我已经在控制器中分割了用法。 – klaks

是否应该只有另一个表来分隔条目? 为什么不使用pid字段来为不同页面定义不同的存储空间?

如果它应该有不同的源代码,那么“简单”复制​​这个扩展名并重命名它。

编辑:

您还可以使用不同的域模型每个网站,所以你必须为每个域不同的存储库和表。

将主模型扩展到新模型(Model1DomainB extends Model1())并复制sql ext_tables.sql以创建新表(tx_extension_domain_model_model1domainb)。

现在设置的设置,你的插件定义一个切换值:

plugin.tx_extension.settings.domain = b 

而在你的控制器,你可以做一个开关使用正确的资源库:

switch ($this->settings['domain']) { 
    case 'b': 
    $models = $this->model1DomainBRepository->findAll(); 
    case 'c': 
    $models = $this->model1DomainCRepository->findAll(); 
    case 'd': 
    $models = $this->model1DomainDRepository->findAll(); 
    default: 
    $models = $this->model1Repository->findAll(); 
    break; 
} 
+0

过渡式地从具有不同表结构的单独数据库导入网站A的数据记录。我想把它分开的原因以及映射表的原因。这是一个超过50个网站的非常大的安装,我想避免导入任何意想不到的副作用。但是如果没有其他解决方案,我会考虑复制扩展。 – klaks

+0

也许每个域的不同域模型扩展了第一个模型,因此您不必再次定义属性。然后你可以使用不同的存储库和不同的表格。当然,你也必须定义使用的资料库(例如,每个域的插件设置'plugin.tx_extension.setting.domain = 1')和控制器中的一个开关。 –

+0

我已将最新的建议添加到了我的答案中,并提供了更多详细信息。 –