Версионирование
Общее
Вся информация в Pimcore (документы, ассеты и объекты) поддерживает версионирование. Вы можете иметь любое количество версий. При каждом изменении создаётся новая версия элемента.
Например, чтобы просмотреть историю версий объекта, откройте вкладку Versions.
Там вы увидите список изменений, отличия между ревизиями и сможете выбрать, какая версия должна быть опубликована.

Настройки
Поведение версионирования можно настроить в Settings -> System Settings -> (Documents, Assets, Objects)
Стек вызовов (stack trace)
Pimcore сохраняет стек вызовов в базе данных для каждой версии. Вы можете отключить это с помощью следующих настроек:
pimcore:
assets:
versions:
disable_stack_trace: true
documents:
versions:
disable_stack_trace: true
objects:
versions:
disable_stack_trace: true
В Pimcore есть служебная задача обслуживания (VersionsCleanupStackTraceDbTask), которая очищает стеки вызовов для версий старше 7 дней.
Хранение версий
Для каждой версии сохраняются метаданные и, при наличии, бинарные данные. Поскольку объём данных может быстро вырасти, Pimcore предоставляет три различных способа хранения данных версий.
Конфигурация
Файловая система
Это настройка по умолчанию.
Для хранения данных версий в файловой системе используйте FileSystemStorageAdapter.
Pimcore\Model\Version\Adapter\VersionStorageAdapterInterface:
public: true
alias: Pimcore\Model\Version\Adapter\FileSystemVersionStorageAdapter
Pimcore\Model\Version\Adapter\FileSystemVersionStorageAdapter: ~
База данных
Чтобы хранить данные версий в базе данных, используйте сервис DatabaseVersionStorageAdapter.
Необходимо передать настроенное соединение doctrine в качестве аргумента.
Таким образом вы можете подключить полностью отдельную базу данных, которая будет содержать только данные версий.
Pimcore\Model\Version\Adapter\VersionStorageAdapterInterface:
public: true
alias: Pimcore\Model\Version\Adapter\DatabaseVersionStorageAdapter
Pimcore\Model\Version\Adapter\DatabaseVersionStorageAdapter:
arguments:
$databaseConnection: '@doctrine.dbal.versioning_connection'
База данных должна содержать таблицу с именем versionsData. Следующий SQL-скрипт можно использовать для создания таблицы с необходимыми колонками.
CREATE TABLE `versionsData` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`cid` int(11) unsigned DEFAULT NULL,
`ctype` enum('document','asset','object') DEFAULT NULL,
`metaData` longblob DEFAULT NULL,
`binaryData` longblob DEFAULT NULL,
PRIMARY KEY (`id`)
)
Делегирование
Чтобы хранить данные версий в зависимости от порогового размера либо в основном хранилище, либо в резервном (fallback), используйте сервис DelegateVersionStorageAdapter.
Если размер метаданных или бинарных данных превышает настроенное значение byteThreshold, данные версии будут сохранены с использованием fallback-адаптера.
Pimcore\Model\Version\Adapter\VersionStorageAdapterInterface:
public: true
alias: Pimcore\Model\Version\Adapter\DelegateVersionStorageAdapter
Pimcore\Model\Version\Adapter\DelegateVersionStorageAdapter:
public: true
arguments:
$byteThreshold: 1000000
$defaultAdapter: '@Pimcore\Model\Version\Adapter\DatabaseVersionStorageAdapter'
$fallbackAdapter: '@Pimcore\Model\Version\Adapter\FileSystemVersionStorageAdapter'
Pimcore\Model\Version\Adapter\FileSystemVersionStorageAdapter: ~
Pimcore\Model\Version\Adapter\DatabaseVersionStorageAdapter:
arguments:
$databaseConnection: '@doctrine.dbal.versioning_connection'
В этом примере данные версий хранятся в базе данных до тех пор, пока ни метаданные, ни бинарные данные не превысят 1 000 000 байт. В противном случае в качестве хранилища используется файловая система.
Отключение версионирования для текущего процесса
Иногда полезно временно отключить версионирование для определённого процесса — например, для импорта или синхронизации с внешними системами. Вы можете глобально выключить или включить версионирование с помощью следующего PHP-кода, выполняемого в ваших скриптах:
\Pimcore\Model\Version::disable(); // отключить версионирование для текущего процесса
\Pimcore\Model\Version::enable(); // включить версионирование для текущего процесса
Примечание: эти команды отключают/включают версионирование только для текущего PHP-процесса. Эта настройка не сохраняется и влияет только на изменения элементов, которые модифицируются в рамках этого процесса!
Работа с PHP API
При работе через PHP API — особенно при сохранении элементов — необходимо установить userModification, чтобы в истории версий отображался корректный пользователь.
Если установить userModification в 0, Pimcore в истории версий покажет system как пользователя.
$object->setUserModification(0);
$object->save();
Пример: как получить предыдущую версию объекта
$versions = $currentObject->getVersions();
$previousVersion = $versions[count($versions)-2];
$previousObject = $previousVersion->getData();
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.