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

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Model\Document\Editable;
  15. use Pimcore\Model;
  16. use Pimcore\Model\Asset;
  17. use Pimcore\Model\DataObject;
  18. use Pimcore\Model\Document;
  19. use Pimcore\Model\Element;
  20. /**
  21.  * @method \Pimcore\Model\Document\Editable\Dao getDao()
  22.  */
  23. class Relations extends Model\Document\Editable implements \Iterator
  24. {
  25.     /**
  26.      * @internal
  27.      *
  28.      * @var Element\ElementInterface[]
  29.      */
  30.     protected $elements = [];
  31.     /**
  32.      * @internal
  33.      *
  34.      * @var array
  35.      */
  36.     protected $elementIds = [];
  37.     /**
  38.      * {@inheritdoc}
  39.      */
  40.     public function getType()
  41.     {
  42.         return 'relations';
  43.     }
  44.     /**
  45.      * @return $this
  46.      */
  47.     public function setElements()
  48.     {
  49.         if (empty($this->elements)) {
  50.             $this->elements = [];
  51.             foreach ($this->elementIds as $elementId) {
  52.                 $el Element\Service::getElementById($elementId['type'], $elementId['id']);
  53.                 if ($el instanceof Element\ElementInterface) {
  54.                     $this->elements[] = $el;
  55.                 }
  56.             }
  57.         }
  58.         return $this;
  59.     }
  60.     /**
  61.      * @return array
  62.      */
  63.     public function getElementIds()
  64.     {
  65.         return $this->elementIds;
  66.     }
  67.     /**
  68.      * {@inheritdoc}
  69.      */
  70.     public function getData()
  71.     {
  72.         $this->setElements();
  73.         return $this->elements;
  74.     }
  75.     /**
  76.      * {@inheritdoc}
  77.      */
  78.     public function getDataForResource()
  79.     {
  80.         return $this->elementIds;
  81.     }
  82.     /**
  83.      * Converts the data so it's suitable for the editmode
  84.      *
  85.      * @return array
  86.      */
  87.     public function getDataEditmode()
  88.     {
  89.         $this->setElements();
  90.         $return = [];
  91.         if (is_array($this->elements) && count($this->elements) > 0) {
  92.             foreach ($this->elements as $element) {
  93.                 if ($element instanceof DataObject\Concrete) {
  94.                     $return[] = [$element->getId(), $element->getRealFullPath(), DataObject::OBJECT_TYPE_OBJECT$element->getClassName()];
  95.                 } elseif ($element instanceof DataObject\AbstractObject) {
  96.                     $return[] = [$element->getId(), $element->getRealFullPath(), DataObject::OBJECT_TYPE_OBJECTDataObject::OBJECT_TYPE_FOLDER];
  97.                 } elseif ($element instanceof Asset) {
  98.                     $return[] = [$element->getId(), $element->getRealFullPath(), 'asset'$element->getType()];
  99.                 } elseif ($element instanceof Document) {
  100.                     $return[] = [$element->getId(), $element->getRealFullPath(), 'document'$element->getType()];
  101.                 }
  102.             }
  103.         }
  104.         return $return;
  105.     }
  106.     /**
  107.      * {@inheritdoc}
  108.      */
  109.     public function frontend()
  110.     {
  111.         $this->setElements();
  112.         $return '';
  113.         foreach ($this->getElements() as $element) {
  114.             if ($element instanceof Element\ElementInterface) {
  115.                 $return .= Element\Service::getElementType($element) . ': ' $element->getFullPath() . '<br />';
  116.             }
  117.         }
  118.         return $return;
  119.     }
  120.     /**
  121.      * {@inheritdoc}
  122.      */
  123.     public function setDataFromResource($data)
  124.     {
  125.         if ($data \Pimcore\Tool\Serialize::unserialize($data)) {
  126.             $this->setDataFromEditmode($data);
  127.         }
  128.         return $this;
  129.     }
  130.     /**
  131.      * {@inheritdoc}
  132.      */
  133.     public function setDataFromEditmode($data)
  134.     {
  135.         if (is_array($data)) {
  136.             $this->elementIds $data;
  137.             $this->elements = [];
  138.         }
  139.         return $this;
  140.     }
  141.     /**
  142.      * @return Element\ElementInterface[]
  143.      */
  144.     public function getElements()
  145.     {
  146.         $this->setElements();
  147.         $elements = [];
  148.         foreach ($this->elements as $element) {
  149.             if (Element\Service::doHideUnpublished($element)) {
  150.                 if (Element\Service::isPublished($element)) {
  151.                     $elements[] = $element;
  152.                 }
  153.             } else {
  154.                 $elements[] = $element;
  155.             }
  156.         }
  157.         return $elements;
  158.     }
  159.     /**
  160.      * {@inheritdoc}
  161.      */
  162.     public function isEmpty()
  163.     {
  164.         $this->setElements();
  165.         return count($this->elements) > false true;
  166.     }
  167.     /**
  168.      * {@inheritdoc}
  169.      */
  170.     public function resolveDependencies()
  171.     {
  172.         $this->setElements();
  173.         $dependencies = [];
  174.         if (is_array($this->elements) && count($this->elements) > 0) {
  175.             foreach ($this->elements as $element) {
  176.                 if ($element instanceof Element\ElementInterface) {
  177.                     $elementType Element\Service::getElementType($element);
  178.                     $key $elementType '_' $element->getId();
  179.                     $dependencies[$key] = [
  180.                         'id' => $element->getId(),
  181.                         'type' => $elementType,
  182.                     ];
  183.                 }
  184.             }
  185.         }
  186.         return $dependencies;
  187.     }
  188.     /**
  189.      * Rewrites id from source to target, $idMapping contains
  190.      * array(
  191.      *  "document" => array(
  192.      *      SOURCE_ID => TARGET_ID,
  193.      *      SOURCE_ID => TARGET_ID
  194.      *  ),
  195.      *  "object" => array(...),
  196.      *  "asset" => array(...)
  197.      * )
  198.      *
  199.      * @param array $idMapping
  200.      */
  201.     public function rewriteIds($idMapping)
  202.     {
  203.         // reset existing elements store
  204.         $this->elements = [];
  205.         foreach ($this->elementIds as &$elementId) {
  206.             $type $elementId['type'];
  207.             $id $elementId['id'];
  208.             if (array_key_exists($type$idMapping) && array_key_exists((int) $id$idMapping[$type])) {
  209.                 $elementId['id'] = $idMapping[$type][$id];
  210.             }
  211.         }
  212.         $this->setElements();
  213.     }
  214.     /**
  215.      * {@inheritdoc}
  216.      */
  217.     public function __sleep()
  218.     {
  219.         $finalVars = [];
  220.         $parentVars parent::__sleep();
  221.         $blockedVars = ['elements'];
  222.         foreach ($parentVars as $key) {
  223.             if (!in_array($key$blockedVars)) {
  224.                 $finalVars[] = $key;
  225.             }
  226.         }
  227.         return $finalVars;
  228.     }
  229.     public function load()
  230.     {
  231.         $this->setElements();
  232.     }
  233.     /**
  234.      * Methods for Iterator
  235.      */
  236.     /**
  237.      * @return void
  238.      */
  239.     #[\ReturnTypeWillChange]
  240.     public function rewind()// : void
  241.     {
  242.         $this->setElements();
  243.         reset($this->elements);
  244.     }
  245.     /**
  246.      * @return Element\ElementInterface|false
  247.      */
  248.     #[\ReturnTypeWillChange]
  249.     public function current()// : Element\ElementInterface|false
  250.     {
  251.         $this->setElements();
  252.         return current($this->elements);
  253.     }
  254.     /**
  255.      * @return int|null
  256.      */
  257.     #[\ReturnTypeWillChange]
  258.     public function key()// : int|null
  259.     {
  260.         $this->setElements();
  261.         return key($this->elements);
  262.     }
  263.     /**
  264.      * @return void
  265.      */
  266.     #[\ReturnTypeWillChange]
  267.     public function next()// : void
  268.     {
  269.         $this->setElements();
  270.         next($this->elements);
  271.     }
  272.     /**
  273.      * @return bool
  274.      */
  275.     #[\ReturnTypeWillChange]
  276.     public function valid()// : bool
  277.     {
  278.         $this->setElements();
  279.         $el $this->current();
  280.         if (Element\Service::doHideUnpublished($el)) {
  281.             if (!Element\Service::isPublished($el)) {
  282.                 $this->next();
  283.             }
  284.         }
  285.         return $this->current() !== false;
  286.     }
  287. }