vendor/pimcore/pimcore/models/Document/Editable/Relations.php line 27

  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace Pimcore\Model\Document\Editable;
  16. use Pimcore\Model;
  17. use Pimcore\Model\Asset;
  18. use Pimcore\Model\DataObject;
  19. use Pimcore\Model\Document;
  20. use Pimcore\Model\Element;
  21. /**
  22.  * @method \Pimcore\Model\Document\Editable\Dao getDao()
  23.  */
  24. class Relations extends Model\Document\Editable implements \IteratorIdRewriterInterfaceEditmodeDataInterfaceLazyLoadingInterface
  25. {
  26.     /**
  27.      * @internal
  28.      *
  29.      * @var Element\ElementInterface[]
  30.      */
  31.     protected array $elements = [];
  32.     /**
  33.      * @internal
  34.      *
  35.      */
  36.     protected array $elementIds = [];
  37.     public function getType(): string
  38.     {
  39.         return 'relations';
  40.     }
  41.     public function setElements(): static
  42.     {
  43.         if (empty($this->elements)) {
  44.             $this->elements = [];
  45.             foreach ($this->elementIds as $elementId) {
  46.                 $el Element\Service::getElementById($elementId['type'], $elementId['id']);
  47.                 if ($el instanceof Element\ElementInterface) {
  48.                     $this->elements[] = $el;
  49.                 }
  50.             }
  51.         }
  52.         return $this;
  53.     }
  54.     public function getElementIds(): array
  55.     {
  56.         return $this->elementIds;
  57.     }
  58.     public function getData(): mixed
  59.     {
  60.         $this->setElements();
  61.         return $this->elements;
  62.     }
  63.     public function getDataForResource(): mixed
  64.     {
  65.         return $this->elementIds;
  66.     }
  67.     public function getDataEditmode(): array
  68.     {
  69.         $this->setElements();
  70.         $return = [];
  71.         foreach ($this->elements as $element) {
  72.             if ($element instanceof DataObject\Concrete) {
  73.                 $return[] = [$element->getId(), $element->getRealFullPath(), DataObject::OBJECT_TYPE_OBJECT$element->getClassName()];
  74.             } elseif ($element instanceof DataObject\AbstractObject) {
  75.                 $return[] = [$element->getId(), $element->getRealFullPath(), DataObject::OBJECT_TYPE_OBJECTDataObject::OBJECT_TYPE_VARIANTDataObject::OBJECT_TYPE_FOLDER];
  76.             } elseif ($element instanceof Asset) {
  77.                 $return[] = [$element->getId(), $element->getRealFullPath(), 'asset'$element->getType()];
  78.             } elseif ($element instanceof Document) {
  79.                 $return[] = [$element->getId(), $element->getRealFullPath(), 'document'$element->getType()];
  80.             }
  81.         }
  82.         return $return;
  83.     }
  84.     public function frontend()
  85.     {
  86.         $this->setElements();
  87.         $return '';
  88.         foreach ($this->getElements() as $element) {
  89.             if ($element instanceof Element\ElementInterface) {
  90.                 $return .= Element\Service::getElementType($element) . ': ' $element->getFullPath() . '<br />';
  91.             }
  92.         }
  93.         return $return;
  94.     }
  95.     public function setDataFromResource(mixed $data): static
  96.     {
  97.         if ($data \Pimcore\Tool\Serialize::unserialize($data)) {
  98.             $this->setDataFromEditmode($data);
  99.         }
  100.         return $this;
  101.     }
  102.     public function setDataFromEditmode(mixed $data): static
  103.     {
  104.         if (is_array($data)) {
  105.             $this->elementIds $data;
  106.             $this->elements = [];
  107.         }
  108.         return $this;
  109.     }
  110.     /**
  111.      * @return Element\ElementInterface[]
  112.      */
  113.     public function getElements(): array
  114.     {
  115.         $this->setElements();
  116.         $elements = [];
  117.         foreach ($this->elements as $element) {
  118.             if (Element\Service::doHideUnpublished($element)) {
  119.                 if (Element\Service::isPublished($element)) {
  120.                     $elements[] = $element;
  121.                 }
  122.             } else {
  123.                 $elements[] = $element;
  124.             }
  125.         }
  126.         return $elements;
  127.     }
  128.     public function isEmpty(): bool
  129.     {
  130.         $this->setElements();
  131.         return count($this->elements) > false true;
  132.     }
  133.     public function resolveDependencies(): array
  134.     {
  135.         $this->setElements();
  136.         $dependencies = [];
  137.         foreach ($this->elements as $element) {
  138.             if ($element instanceof Element\ElementInterface) {
  139.                 $elementType Element\Service::getElementType($element);
  140.                 $key $elementType '_' $element->getId();
  141.                 $dependencies[$key] = [
  142.                     'id' => $element->getId(),
  143.                     'type' => $elementType,
  144.                 ];
  145.             }
  146.         }
  147.         return $dependencies;
  148.     }
  149.     public function rewriteIds(array $idMapping): void
  150.     {
  151.         // reset existing elements store
  152.         $this->elements = [];
  153.         foreach ($this->elementIds as &$elementId) {
  154.             $type $elementId['type'];
  155.             $id $elementId['id'];
  156.             if (array_key_exists($type$idMapping) && array_key_exists((int) $id$idMapping[$type])) {
  157.                 $elementId['id'] = $idMapping[$type][$id];
  158.             }
  159.         }
  160.         $this->setElements();
  161.     }
  162.     public function __sleep(): array
  163.     {
  164.         $finalVars = [];
  165.         $parentVars parent::__sleep();
  166.         $blockedVars = ['elements'];
  167.         foreach ($parentVars as $key) {
  168.             if (!in_array($key$blockedVars)) {
  169.                 $finalVars[] = $key;
  170.             }
  171.         }
  172.         return $finalVars;
  173.     }
  174.     public function load(): void
  175.     {
  176.         $this->setElements();
  177.     }
  178.     /**
  179.      * Methods for Iterator
  180.      */
  181.     public function rewind(): void
  182.     {
  183.         $this->setElements();
  184.         reset($this->elements);
  185.     }
  186.     public function current(): false|Element\ElementInterface
  187.     {
  188.         $this->setElements();
  189.         return current($this->elements);
  190.     }
  191.     public function key(): ?int
  192.     {
  193.         $this->setElements();
  194.         return key($this->elements);
  195.     }
  196.     public function next(): void
  197.     {
  198.         $this->setElements();
  199.         next($this->elements);
  200.     }
  201.     public function valid(): bool
  202.     {
  203.         $this->setElements();
  204.         $el $this->current();
  205.         if (
  206.             $el instanceof Element\ElementInterface &&
  207.             Element\Service::doHideUnpublished($el) &&
  208.             !Element\Service::isPublished($el)
  209.         ) {
  210.             $this->next();
  211.         }
  212.         return $this->current() !== false;
  213.     }
  214. }