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

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 Enterprise License (PEL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  * @category   Pimcore
  12.  * @package    Document
  13.  *
  14.  * @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  15.  * @license    http://www.pimcore.org/license     GPLv3 and PEL
  16.  */
  17. namespace Pimcore\Model\Document\Editable;
  18. use Pimcore\Model;
  19. use Pimcore\Model\Asset;
  20. use Pimcore\Model\DataObject;
  21. use Pimcore\Model\Document;
  22. use Pimcore\Model\Element;
  23. /**
  24.  * @method \Pimcore\Model\Document\Editable\Dao getDao()
  25.  */
  26. class Relations extends Model\Document\Editable implements \Iterator
  27. {
  28.     /**
  29.      * @var array
  30.      */
  31.     public $elements = [];
  32.     /**
  33.      * @var array
  34.      */
  35.     public $elementIds = [];
  36.     /**
  37.      * @see EditableInterface::getType
  38.      *
  39.      * @return string
  40.      */
  41.     public function getType()
  42.     {
  43.         return 'relations';
  44.     }
  45.     /**
  46.      * @return $this
  47.      */
  48.     public function setElements()
  49.     {
  50.         if (empty($this->elements)) {
  51.             $this->elements = [];
  52.             foreach ($this->elementIds as $elementId) {
  53.                 $el Element\Service::getElementById($elementId['type'], $elementId['id']);
  54.                 if ($el instanceof Element\ElementInterface) {
  55.                     $this->elements[] = $el;
  56.                 }
  57.             }
  58.         }
  59.         return $this;
  60.     }
  61.     /**
  62.      * @see EditableInterface::getData
  63.      *
  64.      * @return mixed
  65.      */
  66.     public function getData()
  67.     {
  68.         $this->setElements();
  69.         return $this->elements;
  70.     }
  71.     /**
  72.      * @return array
  73.      */
  74.     public function getDataForResource()
  75.     {
  76.         return $this->elementIds;
  77.     }
  78.     /**
  79.      * Converts the data so it's suitable for the editmode
  80.      *
  81.      * @return array
  82.      */
  83.     public function getDataEditmode()
  84.     {
  85.         $this->setElements();
  86.         $return = [];
  87.         if (is_array($this->elements) && count($this->elements) > 0) {
  88.             foreach ($this->elements as $element) {
  89.                 if ($element instanceof DataObject\Concrete) {
  90.                     $return[] = [$element->getId(), $element->getRealFullPath(), 'object'$element->getClassName()];
  91.                 } elseif ($element instanceof DataObject\AbstractObject) {
  92.                     $return[] = [$element->getId(), $element->getRealFullPath(), 'object''folder'];
  93.                 } elseif ($element instanceof Asset) {
  94.                     $return[] = [$element->getId(), $element->getRealFullPath(), 'asset'$element->getType()];
  95.                 } elseif ($element instanceof Document) {
  96.                     $return[] = [$element->getId(), $element->getRealFullPath(), 'document'$element->getType()];
  97.                 }
  98.             }
  99.         }
  100.         return $return;
  101.     }
  102.     /**
  103.      * @see EditableInterface::frontend
  104.      *
  105.      * @return string
  106.      */
  107.     public function frontend()
  108.     {
  109.         $this->setElements();
  110.         $return '';
  111.         foreach ($this->getElements() as $element) {
  112.             if ($element instanceof Element\ElementInterface) {
  113.                 $return .= Element\Service::getElementType($element) . ': ' $element->getFullPath() . '<br />';
  114.             }
  115.         }
  116.         return $return;
  117.     }
  118.     /**
  119.      * @see EditableInterface::setDataFromResource
  120.      *
  121.      * @param mixed $data
  122.      *
  123.      * @return $this
  124.      */
  125.     public function setDataFromResource($data)
  126.     {
  127.         if ($data = \Pimcore\Tool\Serialize::unserialize($data)) {
  128.             $this->setDataFromEditmode($data);
  129.         }
  130.         return $this;
  131.     }
  132.     /**
  133.      * @see EditableInterface::setDataFromEditmode
  134.      *
  135.      * @param mixed $data
  136.      *
  137.      * @return $this
  138.      */
  139.     public function setDataFromEditmode($data)
  140.     {
  141.         if (is_array($data)) {
  142.             $this->elementIds $data;
  143.             $this->elements = [];
  144.         }
  145.         return $this;
  146.     }
  147.     /**
  148.      * @return Element\ElementInterface[]
  149.      */
  150.     public function getElements()
  151.     {
  152.         $this->setElements();
  153.         $elements = [];
  154.         foreach ($this->elements as $element) {
  155.             if (Element\Service::doHideUnpublished($element)) {
  156.                 if (Element\Service::isPublished($element)) {
  157.                     $elements[] = $element;
  158.                 }
  159.             } else {
  160.                 $elements[] = $element;
  161.             }
  162.         }
  163.         return $elements;
  164.     }
  165.     /**
  166.      * @return bool
  167.      */
  168.     public function isEmpty()
  169.     {
  170.         $this->setElements();
  171.         return count($this->elements) > false true;
  172.     }
  173.     /**
  174.      * @return array
  175.      */
  176.     public function resolveDependencies()
  177.     {
  178.         $this->setElements();
  179.         $dependencies = [];
  180.         if (is_array($this->elements) && count($this->elements) > 0) {
  181.             foreach ($this->elements as $element) {
  182.                 if ($element instanceof Element\ElementInterface) {
  183.                     $elementType Element\Service::getElementType($element);
  184.                     $key $elementType '_' $element->getId();
  185.                     $dependencies[$key] = [
  186.                         'id' => $element->getId(),
  187.                         'type' => $elementType,
  188.                     ];
  189.                 }
  190.             }
  191.         }
  192.         return $dependencies;
  193.     }
  194.     /**
  195.      * Rewrites id from source to target, $idMapping contains
  196.      * array(
  197.      *  "document" => array(
  198.      *      SOURCE_ID => TARGET_ID,
  199.      *      SOURCE_ID => TARGET_ID
  200.      *  ),
  201.      *  "object" => array(...),
  202.      *  "asset" => array(...)
  203.      * )
  204.      *
  205.      * @param array $idMapping
  206.      */
  207.     public function rewriteIds($idMapping)
  208.     {
  209.         // reset existing elements store
  210.         $this->elements = [];
  211.         foreach ($this->elementIds as &$elementId) {
  212.             $type $elementId['type'];
  213.             $id $elementId['id'];
  214.             if (array_key_exists($type$idMapping) && array_key_exists((int) $id$idMapping[$type])) {
  215.                 $elementId['id'] = $idMapping[$type][$id];
  216.             }
  217.         }
  218.         $this->setElements();
  219.     }
  220.     /**
  221.      * @deprecated
  222.      *
  223.      * @param Model\Webservice\Data\Document\Element $wsElement
  224.      * @param Model\Document\PageSnippet $document
  225.      * @param array $params
  226.      * @param Model\Webservice\IdMapperInterface|null $idMapper
  227.      *
  228.      * @throws \Exception
  229.      */
  230.     public function getFromWebserviceImport($wsElement$document null$params = [], $idMapper null)
  231.     {
  232.         $wsData $wsElement->value;
  233.         if (is_array($wsData)) {
  234.             $result = [];
  235.             foreach ($wsData as $data) {
  236.                 $data $this->sanitizeWebserviceData($data);
  237.                 if ($data->id !== null) {
  238.                     $resultItem = [];
  239.                     $resultItem['type'] = $data->type;
  240.                     if (!is_numeric($data->id)) {
  241.                         throw new \Exception('cannot get values from web service import - id is not valid');
  242.                     }
  243.                     if ($idMapper) {
  244.                         $data->id $idMapper->getMappedId($data->type$data->id);
  245.                     }
  246.                     $resultItem['id'] = $data->id;
  247.                     if ($data->type == 'asset') {
  248.                         $element Asset::getById($data->id);
  249.                         if (!$element instanceof Asset) {
  250.                             if ($idMapper && $idMapper->ignoreMappingFailures()) {
  251.                                 $idMapper->recordMappingFailure('document'$this->getDocumentId(), $data->type$data->id);
  252.                             } else {
  253.                                 throw new \Exception('cannot get values from web service import - referenced asset with id [ ' $data->id ' ] is unknown');
  254.                             }
  255.                         }
  256.                     } elseif ($data->type == 'document') {
  257.                         $element Document::getById($data->id);
  258.                         if (!$element instanceof Document) {
  259.                             if ($idMapper && $idMapper->ignoreMappingFailures()) {
  260.                                 $idMapper->recordMappingFailure('document'$this->getDocumentId(), $data->type$data->id);
  261.                             } else {
  262.                                 throw new \Exception('cannot get values from web service import - referenced document with id [ ' $data->id ' ] is unknown');
  263.                             }
  264.                         }
  265.                     } elseif ($data->type == 'object') {
  266.                         $element DataObject\AbstractObject::getById($data->id);
  267.                         if (!$element instanceof DataObject\AbstractObject) {
  268.                             if ($idMapper && $idMapper->ignoreMappingFailures()) {
  269.                                 $idMapper->recordMappingFailure('document'$this->getDocumentId(), $data->type$data->id);
  270.                             } else {
  271.                                 throw new \Exception('cannot get values from web service import - referenced object with id [ ' $data->id ' ] is unknown');
  272.                             }
  273.                         }
  274.                     } else {
  275.                         if ($idMapper && $idMapper->ignoreMappingFailures()) {
  276.                             $idMapper->recordMappingFailure('document'$this->getDocumentId(), $data->type$data->id);
  277.                         } else {
  278.                             throw new \Exception('cannot get values from web service import - type is not valid');
  279.                         }
  280.                     }
  281.                     $result[] = $resultItem;
  282.                 }
  283.             }
  284.             $this->elementIds $result;
  285.         }
  286.     }
  287.     /**
  288.      * @return array
  289.      */
  290.     public function __sleep()
  291.     {
  292.         $finalVars = [];
  293.         $parentVars parent::__sleep();
  294.         $blockedVars = ['elements'];
  295.         foreach ($parentVars as $key) {
  296.             if (!in_array($key$blockedVars)) {
  297.                 $finalVars[] = $key;
  298.             }
  299.         }
  300.         return $finalVars;
  301.     }
  302.     public function load()
  303.     {
  304.         $this->setElements();
  305.     }
  306.     /**
  307.      * Methods for Iterator
  308.      */
  309.     public function rewind()
  310.     {
  311.         $this->setElements();
  312.         reset($this->elements);
  313.     }
  314.     /**
  315.      * @return mixed
  316.      */
  317.     public function current()
  318.     {
  319.         $this->setElements();
  320.         $var current($this->elements);
  321.         return $var;
  322.     }
  323.     /**
  324.      * @return mixed
  325.      */
  326.     public function key()
  327.     {
  328.         $this->setElements();
  329.         $var key($this->elements);
  330.         return $var;
  331.     }
  332.     /**
  333.      * @return mixed
  334.      */
  335.     public function next()
  336.     {
  337.         $this->setElements();
  338.         $var next($this->elements);
  339.         return $var;
  340.     }
  341.     /**
  342.      * @return bool
  343.      */
  344.     public function valid()
  345.     {
  346.         $this->setElements();
  347.         $el $this->current();
  348.         if (Element\Service::doHideUnpublished($el)) {
  349.             if (!Element\Service::isPublished($el)) {
  350.                 $this->next();
  351.             }
  352.         }
  353.         $var $this->current() !== false;
  354.         return $var;
  355.     }
  356.     /**
  357.      * Returns the current tag's data for web service export
  358.      *
  359.      * @deprecated
  360.      *
  361.      * @param Model\Document\PageSnippet|null $document
  362.      * @param array $params
  363.      *
  364.      * @return array|null
  365.      */
  366.     public function getForWebserviceExport($document null$params = [])
  367.     {
  368.         $elements $this->getElements();
  369.         if (is_array($elements)) {
  370.             $result = [];
  371.             foreach ($elements as $element) {
  372.                 $result[] = [
  373.                     'type' => Element\Service::getType($element),
  374.                     'id' => $element->getId(),
  375.                 ];
  376.             }
  377.             return $result;
  378.         }
  379.         return null;
  380.     }
  381. }
  382. class_alias(Relations::class, 'Pimcore\Model\Document\Tag\Multihref');
  383. class_alias(Relations::class, 'Pimcore\Model\Document\Tag\Relations');