Pimcore中父对象修改继承字段时能否为子对象创建版本?
Pimcore父对象更新时自动为受影响子对象创建版本的解决方案
核心逻辑
通过监听父对象的postUpdate事件,对比修改前后的字段及Object Bricks状态,仅当父对象改动了子对象继承的字段或关联Object Bricks时,为对应的子对象创建版本,避免无意义的版本生成。
1. 实现事件监听器
创建监听类,处理父对象更新后的字段对比、Object Bricks检查及子对象版本创建逻辑:
<?php namespace App\EventListener; use Pimcore\Event\Model\ObjectEvent; use Pimcore\Model\DataObject; use Pimcore\Model\Version; class ParentObjectUpdateListener { public function onPostUpdate(ObjectEvent $event) { $parent = $event->getObject(); // 仅处理目标父对象类型,替换为你的父对象类名 if (!$parent instanceof DataObject\YourParentClass) { return; } // 获取父对象修改的字段 $dirtyFields = array_keys($parent->getDirtyData()); // 定义子对象继承的字段列表,替换为实际字段名 $inheritedFields = ['inheritFieldA', 'inheritFieldB']; // 筛选出影响子对象的字段 $affectedFields = array_intersect($dirtyFields, $inheritedFields); // 检查Object Bricks是否有改动 $brickChanged = false; foreach ($parent->getObjectBricks() as $brick) { if ($brick->isDirty()) { $brickChanged = true; break; } } // 无影响字段且无Brick改动时直接返回 if (empty($affectedFields) && !$brickChanged) { return; } // 获取关联的子对象,替换为实际关联字段的getter方法 $children = $parent->getYourChildrenRelation(); if (empty($children)) { return; } // 为受影响的子对象创建版本 foreach ($children as $child) { // 仅处理目标子对象类型,替换为你的子对象类名 if (!$child instanceof DataObject\YourChildClass) { continue; } $child->setDirty(true); Version::create($child, '父对象更新:继承字段或Object Brick变更'); } } }
2. 注册监听器
在config/services.yaml中注册事件监听服务:
services: App\EventListener\ParentObjectUpdateListener: tags: - { name: kernel.event_listener, event: pimcore.dataobject.postUpdate, method: onPostUpdate }
3. 关键细节调整
- 对象类型适配:将代码中的
YourParentClass、YourChildClass替换为实际的Pimcore对象类名。 - 继承字段配置:更新
$inheritedFields数组为子对象实际继承的父对象字段名。 - 关联关系适配:如果子对象通过非默认关联方式绑定,修改
getYourChildrenRelation()为对应关联字段的getter方法。 - Brick精细控制:若只需监听特定Object Brick类型,可在遍历Brick时增加类型判断。
内容的提问来源于stack exchange,提问作者Ali Ghalambaz
相关产品推荐
相关产品推荐

