Как избежать кэширования таблиц в TYPO3 для установки всего сайта?
У меня есть одна установка TYPO3 7.6.22 с разными веб-сайтами, каждый в своем дереве страниц.
В собственном расширении обычно определенный объект сохраняется в таблице tx_myextension_domain_model_name.
Но для одного веб-сайта A I нужно сопоставить этот объект с другой таблицей A. Поэтому я определил typoscript config.tx_extbase.persistence.classes.MyVendor\Myextension\Domain\Model\Name.mapping ... в отдельном расширении специально для этого веб-сайта. A.
Это работает, но в настоящее время невозможно сделать оба отображения параллельными.
Если я - после очистки всех кешей - загрузить плагин во внешнем интерфейсе веб-сайта A, все остальные веб-сайты будут отображаться в таблице A (а не в tx_myextension_domain_model_name).
Если я - после очистки всех кэшей - загрузить плагин во внешнем интерфейсе одного из других веб-сайтов, на этом веб-сайте все в порядке, но веб-сайт A выдает ошибку, поскольку некоторые процессы не работают с таблицей по умолчанию tx_myextension_domain_model_name.
Очевидно, что где-то конфигурация сопоставления кэшируется для всей установки, а не для каждого сайта. Это ошибка или особенность? И есть ли способ обойти?
3 ответа
Посмотрите на эту проблему в кузнице TYPO3 и мой комментарий в самом низу.
https://forge.typo3.org/issues/75399
Понятно: вам нужно отключить кэш отображения свойств. В вашем файле AdditionalConfiguration.php добавьте следующее.
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_datamapfactory_datamap']['backend'] = 'TYPO3\CMS\Core\Cache\Backend\NullBackend';
Это может стоить вам, вероятно, некоторой производительности, но я не думаю, что это будет так много. Но вы сможете настроить различные сопоставления для разных сайтов, используя (локальную) настройку TypoScript.
В одной установке вы можете использовать только один набор классов / исходников / расширений PHP.
Если вы хотите другое поведение, вам нужно вставить условия. вы можете разделить использование в вашем контроллере, и вы можете сделать несколько поворотов, чтобы разделить его в своем хранилище. Но я думаю, что это может быть очень сложно.
Вероятно, самое чистое решение - использовать другую область данных с собственными записями данных.
Должна ли это только другая таблица для разделения записей? Почему бы не работать с 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;
}