Как избежать кэширования таблиц в 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;
}
Другие вопросы по тегам