diff --git a/lib/Event/AssetEvents.php b/lib/Event/AssetEvents.php index ad5ddaf9e99..4b3c80e073c 100644 --- a/lib/Event/AssetEvents.php +++ b/lib/Event/AssetEvents.php @@ -114,6 +114,16 @@ final class AssetEvents */ const POST_DELETE_FAILURE = 'pimcore.asset.postDeleteFailure'; + /** + * Arguments: + * - params | array | contains the values that were passed to getById() as the second parameter + * + * @Event("Pimcore\Event\Model\AssetPreLoadEvent") + * + * @var string + */ + const PRE_LOAD = 'pimcore.asset.preLoad'; + /** * Arguments: * - params | array | contains the values that were passed to getById() as the second parameter diff --git a/lib/Event/DataObjectEvents.php b/lib/Event/DataObjectEvents.php index 6bb0523fdb6..a8043eb68fd 100644 --- a/lib/Event/DataObjectEvents.php +++ b/lib/Event/DataObjectEvents.php @@ -116,6 +116,16 @@ final class DataObjectEvents */ const POST_DELETE_FAILURE = 'pimcore.dataobject.postDeleteFailure'; + /** + * Arguments: + * - params | array | contains the values that were passed to getById() as the second parameter + * + * @Event("Pimcore\Event\Model\DataObjectPreLoadEvent") + * + * @var string + */ + const PRE_LOAD = 'pimcore.dataobject.preLoad'; + /** * Arguments: * - params | array | contains the values that were passed to getById() as the second parameter diff --git a/lib/Event/DocumentEvents.php b/lib/Event/DocumentEvents.php index 202cacb5cac..553dbcda3c3 100644 --- a/lib/Event/DocumentEvents.php +++ b/lib/Event/DocumentEvents.php @@ -104,6 +104,16 @@ final class DocumentEvents */ const POST_DELETE_FAILURE = 'pimcore.document.postDeleteFailure'; + /** + * Arguments: + * - params | array | contains the values that were passed to getById() as the second parameter + * + * @Event("Pimcore\Event\Model\DocumentPreLoadEvent") + * + * @var string + */ + const PRE_LOAD = 'pimcore.document.preLoad'; + /** * Arguments: * - params | array | contains the values that were passed to getById() as the second parameter diff --git a/lib/Event/Model/AssetPreLoadEvent.php b/lib/Event/Model/AssetPreLoadEvent.php new file mode 100644 index 00000000000..62d0cda958b --- /dev/null +++ b/lib/Event/Model/AssetPreLoadEvent.php @@ -0,0 +1,58 @@ +asset = $asset; + $this->arguments = $arguments; + } + + public function getAsset(): Asset + { + if ($this->asset === null) { + throw new NotFoundException(); + } + return $this->asset; + } + + public function setAsset(?Asset $asset): void + { + $this->asset = $asset; + } + + public function getElement(): Asset + { + return $this->getAsset(); + } +} diff --git a/lib/Event/Model/DataObjectPreLoadEvent.php b/lib/Event/Model/DataObjectPreLoadEvent.php new file mode 100644 index 00000000000..56633f858af --- /dev/null +++ b/lib/Event/Model/DataObjectPreLoadEvent.php @@ -0,0 +1,57 @@ +object = $object; + $this->arguments = $arguments; + } + + public function getObject(): AbstractObject + { + if ($this->object === null) { + throw new NotFoundException(); + } + return $this->object; + } + + public function setObject(?AbstractObject $object): void + { + $this->object = $object; + } + + public function getElement(): AbstractObject + { + return $this->getObject(); + } +} diff --git a/lib/Event/Model/DocumentPreLoadEvent.php b/lib/Event/Model/DocumentPreLoadEvent.php new file mode 100644 index 00000000000..8a719f69ee7 --- /dev/null +++ b/lib/Event/Model/DocumentPreLoadEvent.php @@ -0,0 +1,57 @@ +document = $document; + $this->arguments = $arguments; + } + + public function getDocument(): Document + { + if ($this->document === null) { + throw new NotFoundException(); + } + return $this->document; + } + + public function setDocument(?Document $document): void + { + $this->document = $document; + } + + public function getElement(): Document + { + return $this->getDocument(); + } +} diff --git a/models/Asset.php b/models/Asset.php index 62cabe515f2..3127ddbdacf 100644 --- a/models/Asset.php +++ b/models/Asset.php @@ -17,6 +17,7 @@ use Doctrine\DBAL\Exception\DeadlockException; use Exception; +use Pimcore\Event\Model\AssetPreLoadEvent; use function is_array; use League\Flysystem\FilesystemException; use League\Flysystem\FilesystemOperator; @@ -283,6 +284,11 @@ public static function getById($id, $force = false) try { $asset->getDao()->getById($id); + // fire pre load event + $preLoadEvent = new AssetPreLoadEvent($asset, ['params' => $params]); + \Pimcore::getEventDispatcher()->dispatch($preLoadEvent, AssetEvents::PRE_LOAD); + $asset = $preLoadEvent->getAsset(); + $className = 'Pimcore\\Model\\Asset\\' . ucfirst($asset->getType()); /** @var Asset $newAsset */ $newAsset = self::getModelFactory()->build($className); @@ -302,6 +308,14 @@ public static function getById($id, $force = false) $asset = null; } } else { + try { + // fire pre load event + $preLoadEvent = new AssetPreLoadEvent($asset, ['params' => $params]); + \Pimcore::getEventDispatcher()->dispatch($preLoadEvent, AssetEvents::PRE_LOAD); + $asset = $preLoadEvent->getAsset(); + } catch (NotFoundException $e) { + return null; + } RuntimeCache::set($cacheKey, $asset); } diff --git a/models/DataObject/AbstractObject.php b/models/DataObject/AbstractObject.php index e62f99370c9..c631a5256b7 100644 --- a/models/DataObject/AbstractObject.php +++ b/models/DataObject/AbstractObject.php @@ -22,6 +22,7 @@ use Pimcore\Db; use Pimcore\Event\DataObjectEvents; use Pimcore\Event\Model\DataObjectEvent; +use Pimcore\Event\Model\DataObjectPreLoadEvent; use Pimcore\Logger; use Pimcore\Model; use Pimcore\Model\DataObject; @@ -399,6 +400,11 @@ public static function getById($id, $force = false) $object = self::getModelFactory()->build($className); RuntimeCache::set($cacheKey, $object); $object->getDao()->getById($id); + // fire pre load event + $preLoadEvent = new DataObjectPreLoadEvent($object, ['params' => $params]); + \Pimcore::getEventDispatcher()->dispatch($preLoadEvent, DataObjectEvents::PRE_LOAD); + $object = $preLoadEvent->getObject(); + $object->__setDataVersionTimestamp($object->getModificationDate()); Service::recursiveResetDirtyMap($object); @@ -416,6 +422,15 @@ public static function getById($id, $force = false) return null; } } else { + try { + // fire pre load event + $preLoadEvent = new DataObjectPreLoadEvent($object, ['params' => $params]); + \Pimcore::getEventDispatcher()->dispatch($preLoadEvent, DataObjectEvents::PRE_LOAD); + $object = $preLoadEvent->getObject(); + } catch (Model\Exception\NotFoundException $e) { + return null; + } + RuntimeCache::set($cacheKey, $object); } diff --git a/models/Document.php b/models/Document.php index f21adf54aa8..c75f435275e 100644 --- a/models/Document.php +++ b/models/Document.php @@ -20,6 +20,7 @@ use Pimcore\Event\DocumentEvents; use Pimcore\Event\FrontendEvents; use Pimcore\Event\Model\DocumentEvent; +use Pimcore\Event\Model\DocumentPreLoadEvent; use Pimcore\Loader\ImplementationLoader\Exception\UnsupportedException; use Pimcore\Logger; use Pimcore\Model\Document\Hardlink\Wrapper\WrapperInterface; @@ -259,6 +260,10 @@ public static function getById($id, $force = false) try { $document->getDao()->getById($id); + // fire pre load event + $preLoadEvent = new DocumentPreLoadEvent($document, ['params' => $params]); + \Pimcore::getEventDispatcher()->dispatch($preLoadEvent, DocumentEvents::PRE_LOAD); + $document = $preLoadEvent->getDocument(); } catch (NotFoundException $e) { return null; } @@ -305,6 +310,14 @@ public static function getById($id, $force = false) \Pimcore\Cache::save($document, $cacheKey); } else { + try { + // fire pre load event + $preLoadEvent = new DocumentPreLoadEvent($document, ['params' => $params]); + \Pimcore::getEventDispatcher()->dispatch($preLoadEvent, DocumentEvents::PRE_LOAD); + $document = $preLoadEvent->getDocument(); + } catch (NotFoundException $e) { + return null; + } RuntimeCache::set($cacheKey, $document); }