<?php
namespace Elements\Bundle\UniversalLicenseBundle\EventListener;
use Elements\Bundle\UniversalLicenseBundle\Model\DataObject\AbstractULicense;
use Pimcore\Event\Model\ElementEventInterface;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Event\Model\AssetEvent;
use Pimcore\Event\Model\DocumentEvent;
use Pimcore\Model\Asset;
use Pimcore\Model\DataObject\ULicense;
use Pimcore\Model\DataObject;
use Pimcore\Model\Document;
use Pimcore\Model\Element\Tag;
class PreUpdateListener
{
const TAG_PARENT_NAME = 'ULicenses';
public function onPreUpdate(ElementEventInterface $e) {
if($e instanceof AssetEvent) {
$asset = $e->getAsset();
$oldVersion = Asset::getById($asset->getId(), true);
$oldLicense = $oldVersion ? $oldVersion->getProperty(AbstractULicense::LICENSE_PROPERTY) : null;
$license = $asset->getProperty(AbstractULicense::LICENSE_PROPERTY);
if ($oldLicense instanceof ULicense && (!$license instanceof ULicense || ($license->getId() != $oldLicense->getId()))) {
if ($tag = $oldLicense->getTag()) {
try {
Tag::removeTagFromElement('asset', $asset->getId(), $tag);
} catch (\Throwable $exception) {
// ignore
}
}
}
if ($license instanceof ULicense) {
if ($tag = $license->getTag()) {
try {
Tag::addTagToElement('asset', $asset->getId(), $tag);
} catch (\Throwable $exception) {
// ignore
}
}
}
} else if ($e instanceof DocumentEvent) {
$document = $e->getDocument();
$oldVersion = Document::getById($document->getId(), true);
$oldLicense = $oldVersion ? $oldVersion->getProperty(AbstractULicense::LICENSE_PROPERTY) : null;
$license = $document->getProperty(AbstractULicense::LICENSE_PROPERTY);
if ($oldLicense instanceof ULicense && (!$license instanceof ULicense || ($license->getId() != $oldLicense->getId()))) {
if ($tag = $oldLicense->getTag()) {
try {
Tag::removeTagFromElement('document', $document->getId(), $tag);
} catch (\Throwable $exception) {
// ignore
}
}
}
if ($license instanceof ULicense) {
if ($tag = $license->getTag()) {
try {
Tag::addTagToElement('document', $document->getId(), $tag);
} catch (\Throwable $exception) {
throw $exception;
// ignore
}
}
}
} else if ($e instanceof DataObjectEvent) {
$object = $e->getObject();
$oldVersion = DataObject::getById($object->getId(), true);
$oldLicense = $oldVersion ? $oldVersion->getProperty(AbstractULicense::LICENSE_PROPERTY) : null;
$license = $object->getProperty(AbstractULicense::LICENSE_PROPERTY);
if ($oldLicense instanceof ULicense && (!$license instanceof ULicense || ($license->getId() != $oldLicense->getId()))) {
if ($tag = $oldLicense->getTag()) {
try {
Tag::removeTagFromElement('object', $object->getId(), $tag);
} catch (\Throwable $exception) {
// ignore
}
}
}
if ($object instanceof ULicense) {
$tag = $object->getTag();
if ($tag == '') {
$tag = $this->getTagByCode($object->getCode());
$object->setTagId($tag->getId());
}
} else if ($license instanceof ULicense) {
if ($tag = $license->getTag()) {
try {
Tag::addTagToElement('object', $object->getId(), $tag);
} catch (\Throwable $exception) {
// ignore
}
}
}
}
}
/**
* @param $code
* @return Tag
*/
private function getTagByCode($code) {
$tagParent = $this->getTagParent();
$tags = new Tag\Listing();
$tags->addConditionParam('idPath LIKE "/' . $tagParent->getId() . '/%"');
foreach($tags->load() ?? [] as $tag){
if ($tag->getName() == $code) {
return $tag;
}
}
$tag = new Tag();
$tag->setName($code);
$tag->setParentId($tagParent->getId());
$tag->save();
return $tag;
}
private function getTagParent() {
$tags = new Tag\Listing();
$tags->addConditionParam('name = "' . self::TAG_PARENT_NAME . '"');
$tags = $tags->load();
if (!empty($tags)) {
$tagParent = $tags[0];
} else {
$tagParent = new Tag();
$tagParent->setName(self::TAG_PARENT_NAME);
$tagParent->setParentId(0);
$tagParent->save();
}
return $tagParent;
}
}