vendor/elements/demi-bundle/src/Elements/Demi/AbstractObject.php line 82

Open in your IDE?
  1. <?php
  2. /**
  3.  * Elements DeMI
  4.  *
  5.  * This source file is available under the elements DeMI license version 1
  6.  *
  7.  *  @copyright  Copyright (c) elements.at New Media Solutions GmbH (https://www.elements.at/)
  8.  *  @license    elements DeMI Lizenz Version 1 (https://www.elements.at/de/demi-lizenz)
  9.  */
  10. namespace Elements\Demi;
  11. use Elements\Demi\Deskline\Config;
  12. use Elements\Demi\Helper\Misc;
  13. use Exception;
  14. use Pimcore\Cache;
  15. use Pimcore\Cache\Runtime;
  16. use Pimcore\Db;
  17. use Pimcore\Model\DataObject\ClassDefinition\Data\Fieldcollections;
  18. use Pimcore\Model\DataObject\Concrete;
  19. use Pimcore\Model\DataObject\Exception\InheritanceParentNotFoundException;
  20. use Pimcore\Model\DataObject\PreGetValueHookInterface;
  21. abstract class AbstractObject extends Concrete implements PreGetValueHookInterface
  22. {
  23.     public const DEMI_PREFIX 'demi';
  24.     protected $adapter;
  25.     public function setAdapter($adapter): void
  26.     {
  27.         $this->adapter $adapter;
  28.     }
  29.     public function getAdapter()
  30.     {
  31.         if (!$this->adapter) { //cache
  32.             $ownClass get_class($this);
  33.             $ownClassArr explode('\\'$ownClass);
  34.             $adapterAbstractClass '\\Elements\\Demi\\DataObject\\Adapter\\Abstract' $ownClassArr[count($ownClassArr) - 1];
  35.             $system $this->getSystemIdentifier();
  36.             $adapterclass '';
  37.             if (!empty($system)) {
  38.                 $adapterclass '\\Elements\\Demi\\' $system '\\DataObject\\Adapter\\' $ownClassArr[count($ownClassArr) - 1];
  39.             }
  40.             if (!@class_exists($adapterclass)) {
  41.                 return;
  42.             }
  43.             $adapter = new $adapterclass($this);
  44.             if (!($adapter instanceof $adapterAbstractClass)) {
  45.                 throw new Exception('Adapter class ' $adapterclass ' not found (' $adapterAbstractClass ')');
  46.             }
  47.             $this->adapter $adapter;
  48.         }
  49.         return $this->adapter;
  50.     }
  51.     public function __construct()
  52.     {
  53.         \Elements\Demi\Deskline\Init::initDefines();
  54.         //pimcore abstract object does not have a constructor before pimcore 10.5
  55.         if(method_exists('Pimcore\Model\DataObject\AbstractObject','__construct')){
  56.             parent::__construct();
  57.         }
  58.     }
  59.     public function __call($method$args)
  60.     {
  61.         $name $method;
  62.         if (str_starts_with($methodself::DEMI_PREFIX)) {
  63.             $name lcfirst(substr($methodstrlen(self::DEMI_PREFIX)));
  64.         }
  65.         $adapter $this->getAdapter();
  66.         if ($adapter && method_exists($adapter$name)) {
  67.             return call_user_func_array([$adapter$name], $args);
  68.         }
  69.         if (method_exists($this$name)) {
  70.             return call_user_func_array([$this$name], $args);
  71.         }
  72.         return parent::__call($name$args);
  73.     }
  74.     /**
  75.      * @param string $o_key
  76.      *
  77.      * @return $this
  78.      */
  79.     public function setKey($o_key): static
  80.     {
  81.         parent::setKey(\Pimcore\Model\Element\Service::getValidKey($o_key'object'));
  82.         return $this;
  83.     }
  84.     public function preGetValue(string $key)
  85.     {
  86.         if (property_exists($this$key) && $key !== 'dates' && $key !== 'startTimes' && \Pimcore\Model\DataObject\AbstractObject::doGetInheritedValues() && $this->getClass()?->getAllowInherit() && (($this->getClass()?->getFieldDefinition($key) instanceof Fieldcollections))
  87.         ) {
  88.             try {
  89.                 return $this->getValueFromParent($key);
  90.             } catch (InheritanceParentNotFoundException $e) {
  91.                 // no data from parent available, continue ...
  92.             }
  93.         }
  94.     }
  95.     public static function getByFid(string $fidbool $withUnpublished false, array $objectTypes = [\Pimcore\Model\DataObject\AbstractObject::OBJECT_TYPE_OBJECT]): AbstractObject|null
  96.     {
  97.         //when importing, we ALWAYS want to get unpublished objects too, override $withUnpublished
  98.         //this override was added much later (since actually the isImporting()-flag was not available)
  99.         //and the corresponding getByFid's sets the $withUnpublished = true --> put out some logging in this case
  100.         if (Config::getInstance()->isImporting() && !$withUnpublished) {
  101.             $withUnpublished true;
  102.             //\Elements\Demi\Log::info("getByFid withUnpublished was overridden and set to true");
  103.         }
  104.         $result parent::getList(['orderKey' => 'o_published''order' => 'DESC''objectTypes' => $objectTypes'condition' => 'fid=' self::quote(strtolower($fid)), 'unpublished' => $withUnpublished'ignoreLocalizedFields' => true'limit' => 2]);
  105.         $result $result->getObjects();
  106.         if (isset($result[0]) && ($result[0] instanceof self)) {
  107.             if (count($result) > 1) {
  108.                 if ($result[0] instanceof Model\PriceTemplate) {
  109.                     Log::notice('there are multiple items with fid=' $fid ' but its just a PriceTemplate, so who cares.');
  110.                 } else {
  111.                     Log::alert('there are multiple items with fid=' $fid);
  112.                 }
  113.             }
  114.             $object $result[0];
  115.             //check for parent inconsistency (but only when importing)
  116.             if (Config::getInstance()->isImporting() && !Misc::checkParent($object)) {
  117.                 Log::critical('deleting inconsistent object ' $object->getPath() . $object->getKey());
  118.                 $object->delete();
  119.                 return null;
  120.             }
  121.             return $object;
  122.         }
  123.         return null;
  124.     }
  125.     /**
  126.      * @static
  127.      *
  128.      * @param  string $string
  129.      * @param  mixed $type
  130.      *
  131.      * @return string
  132.      */
  133.     public static function quote(string $stringmixed $type null): string
  134.     {
  135.         return Db::get()->quote($string$type);
  136.     }
  137.     /**
  138.      * @param  string $propertyName
  139.      * @param $translatedProperties
  140.      *
  141.      * @return void
  142.      *
  143.      * @internal param AbstractObject $object
  144.      * @internal param \SimpleXMLElement $translationData
  145.      */
  146.     public function setMultilangProperty(string $propertyName$translatedProperties): void
  147.     {
  148.         if (is_array($translatedProperties)) {
  149.             $method 'set' ucfirst($propertyName);
  150.             if (method_exists($this$method)) {
  151.                 foreach ($translatedProperties as $language => $data) {
  152.                     $this->$method($data$language);
  153.                 }
  154.             }
  155.         }
  156.     }
  157.     /**
  158.      * @return $this|void
  159.      *
  160.      * @throws Exception
  161.      */
  162.     public function save($params = [])
  163.     {
  164.         //TODO move that to event listeners?
  165.         //set objects with an "active" flag to unpublished
  166.         //we don't want to get objects by the search-services and lists that are inactive
  167.         //(but the importer is aware of this ;) )
  168.         try {
  169.             if (Config::getInstance()->isImporting() && method_exists($this'getActive')) {
  170.                 if (!$this->active) {
  171.                     $this->setPublished(false);
  172.                 } else {
  173.                     $this->setPublished(true);
  174.                 }
  175.             }
  176.         } catch (Exception $e) {
  177.             //do nothing
  178.         }
  179.         try {
  180.             if (method_exists($this'setSystemIdentifier') && method_exists($this'getSystemIdentifier')) {
  181.                 $system $this->getSystemIdentifier();
  182.                 if (empty($system)) {
  183.                     $this->setSystemIdentifier(Constant::DESKLINE_IDENTIFIER);
  184.                 }
  185.             }
  186.             parent::save();
  187.         } catch (Exception $e) {
  188.             throw $e;
  189.         }
  190.         //a performance "improvement" - this forces the object to be immediately written into the cache
  191.         //since this object may be used further used during the importing process and may be kicked out of the registry
  192.         //due to the continuously call of \Pimcore::collectGarbage() while importing
  193.         //so, do only when importing and enabled in config
  194.         if (Config::getInstance()->isImporting() && Misc::stringToBool(Config::getInstance()->getSynchronizationConfig()['useImmediateCacheWrite'])
  195.         ) {
  196.             Cache::getHandler()->writeSaveQueue(); //write items dependent to this object
  197.             Runtime::set('object_' $this->getId(), null); //remove object from registry, that it can be (re-)set with a newer object
  198.             self::getById($this->getId(), true); //let pimcore load and put object into saveStack
  199.             Cache::getHandler()->writeSaveQueue(); //write loaded object into cache
  200.         }
  201.     }
  202. }