Наследование данных и родительский класс
Pimcore предоставляет два вида наследования. В то время как наследование данных позволяет передавать данные объектов по дереву иерархии объектов, разработчик также может изменять иерархию PHP-классов с помощью настройки родительского класса (parent class) для классов объектов.
Наследование данных
Наследование данных — это крайне важная функция в контексте PIM-систем. Она означает, что объекты одного и того же класса могут наследовать данные от своих родительских объектов в дереве объектов.
Одним из вариантов использования является хранение данных о товарах. Представьте, что у вас есть группа товаров с множеством общих атрибутов, которые различаются лишь в нескольких деталях (например, размер, цвет). Вы можете создать родительский объект («эталонный товар»), в котором будут храниться все общие атрибуты. Затем вы добавляете дочерние объекты и указываете только те атрибуты, которыми они отличаются. Все остальные значения будут наследоваться от общего родителя.
Наследование данных должно быть включено в определении класса, как на экране ниже:

Если наследование включено и атрибут объекта пуст, Pimcore пытается получить значение этого атрибута от родительского объекта. Это работает только в том случае, если родительский объект принадлежит к тому же классу, что и дочерний. Наследование данных между разными классами не поддерживается.
В административной панели Pimcore унаследованные значения визуализируются серым цветом (полупрозрачные) с зеленым маркером в верхнем левом углу. Клик по этому маркеру позволяет открыть исходный объект, от которого получено значение.
Важное примечание об изменении флага наследования Если вы переключите флаг наследования после создания объектов, таблицы запросов object_***_query* могут содержать неверные значения даже после повторного сохранения. Pimcore отключает детектор изменений, если дата изменения класса новее даты объекта, что должно решить проблему. Однако вы можете явно вызвать DataObject::disableDirtyDetection() перед сохранением объекта для исправления данных.
**Значения по умолчанию Убедитесь, что вы понимаете последствия определения значения по умолчанию, которые описаны здесь



Чтобы получить унаследованные значения через код, необходимо использовать геттеры. При прямой попытке доступа к свойствам объекта унаследованные значения получены не будут.
Обратите внимание сложный тип данных Field Collections не поддерживает наследование.
Получение значений из объекта без учета наследования
// Установите первый аргумент в false, чтобы не наследовать значения
DataObject\Service::userInheritedValues(false, function() {
// ... Ваш код здесь
// ...
// ...
});
Родительский класс — наследование классов
Объекты данных Pimcore поддерживают наследование, как и любой другой объект PHP. В Pimcore класс, от которого
наследуется определенный класс данных, может быть изменен. По умолчанию класс данных наследуется от Pimcore\Model\DataObject\Concrete, но при необходимости
класс данных может расширять другой родительский класс. Если родительский класс должен быть изменен, это должно быть
указано в определении класса, как показано на экране ниже:

Предостережение
Это продвинутая функция. Она должна использоваться только опытными разработчиками, которые понимают последствия замены родительского класса сPimcore\Model\DataObject\Concreteна другой.
Чтобы поддерживать все функциональные возможности Pimcore, необходимо убедиться, что специальный класс, используемый в
приведенном выше примере, расширяет Pimcore\Model\DataObject\Concrete и что его методы не переопределяют и не конфликтуют неожиданным образом
с существующими методами Pimcore\Model\DataObject\Concrete или какими-либо магическими функциями Pimcore\Model\DataObject\Concrete
или его родительских классов.
Также возможно использовать наследование классов и трейтов для отображения объектной модели данных.
Хуки, доступные при использовании наследования классов
На данный момент доступен один интерфейс для работы с хуками в кастомных родительских классах:
| Интерфейс | Описание |
|---|---|
PreGetValueHookInterface | Позволяет изменять данные перед их возвратом вызывающему коду. Хук вызывается в начале каждого геттера поля. |
Пример:
namespace Website\DataObject;
use \Pimcore\Model\DataObject;
class Special extends DataObject\Concrete implements DataObject\PreGetValueHookInterface
{
public function preGetValue(string $key): ?string
{
if ($key == "myCustomProperty") {
return strtolower($object->myCustomProperty);
}
return null;
}
}
Переопределение моделей Pimcore
Помимо родительских классов, можно полностью переопределить сгенерированные классы объектов Pimcore своими кастомными классами через настройки model_overrides.
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.