如何避免整个多站点安装的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设置为不同的站点配置不同的映射。
在一次安装中,您只能使用一组类/ PHP源/扩展。
如果你想要不同的行为,你需要插入条件。你可能会在控制器中分割使用,并且你可能会做一些曲折的工作来将它分解到你的仓库中。我认为这可能会非常复杂。
可能最干净的解决方案是使用另一个数据域和它自己的数据记录。
问题不在于类/ 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;
}
过渡式地从具有不同表结构的单独数据库导入网站A的数据记录。我想把它分开的原因以及映射表的原因。这是一个超过50个网站的非常大的安装,我想避免导入任何意想不到的副作用。但是如果没有其他解决方案,我会考虑复制扩展。 – klaks
也许每个域的不同域模型扩展了第一个模型,因此您不必再次定义属性。然后你可以使用不同的存储库和不同的表格。当然,你也必须定义使用的资料库(例如,每个域的插件设置'plugin.tx_extension.setting.domain = 1')和控制器中的一个开关。 –
我已将最新的建议添加到了我的答案中,并提供了更多详细信息。 –
谢谢Artur--这正是我所期待的。 – klaks