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

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, IdRewriterInterface, EditmodeDataInterface, LazyLoadingInterface
  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. * {@inheritdoc}
  84. */
  85. public function getDataEditmode() /** : mixed */
  86. {
  87. $this->setElements();
  88. $return = [];
  89. if (is_array($this->elements) && count($this->elements) > 0) {
  90. foreach ($this->elements as $element) {
  91. if ($element instanceof DataObject\Concrete) {
  92. $return[] = [$element->getId(), $element->getRealFullPath(), DataObject::OBJECT_TYPE_OBJECT, $element->getClassName()];
  93. } elseif ($element instanceof DataObject\AbstractObject) {
  94. $return[] = [$element->getId(), $element->getRealFullPath(), DataObject::OBJECT_TYPE_OBJECT, DataObject::OBJECT_TYPE_FOLDER];
  95. } elseif ($element instanceof Asset) {
  96. $return[] = [$element->getId(), $element->getRealFullPath(), 'asset', $element->getType()];
  97. } elseif ($element instanceof Document) {
  98. $return[] = [$element->getId(), $element->getRealFullPath(), 'document', $element->getType()];
  99. }
  100. }
  101. }
  102. return $return;
  103. }
  104. /**
  105. * {@inheritdoc}
  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. * {@inheritdoc}
  120. */
  121. public function setDataFromResource($data)
  122. {
  123. if ($data = \Pimcore\Tool\Serialize::unserialize($data)) {
  124. $this->setDataFromEditmode($data);
  125. }
  126. return $this;
  127. }
  128. /**
  129. * {@inheritdoc}
  130. */
  131. public function setDataFromEditmode($data)
  132. {
  133. if (is_array($data)) {
  134. $this->elementIds = $data;
  135. $this->elements = [];
  136. }
  137. return $this;
  138. }
  139. /**
  140. * @return Element\ElementInterface[]
  141. */
  142. public function getElements()
  143. {
  144. $this->setElements();
  145. $elements = [];
  146. foreach ($this->elements as $element) {
  147. if (Element\Service::doHideUnpublished($element)) {
  148. if (Element\Service::isPublished($element)) {
  149. $elements[] = $element;
  150. }
  151. } else {
  152. $elements[] = $element;
  153. }
  154. }
  155. return $elements;
  156. }
  157. /**
  158. * {@inheritdoc}
  159. */
  160. public function isEmpty()
  161. {
  162. $this->setElements();
  163. return count($this->elements) > 0 ? false : true;
  164. }
  165. /**
  166. * {@inheritdoc}
  167. */
  168. public function resolveDependencies()
  169. {
  170. $this->setElements();
  171. $dependencies = [];
  172. if (is_array($this->elements) && count($this->elements) > 0) {
  173. foreach ($this->elements as $element) {
  174. if ($element instanceof Element\ElementInterface) {
  175. $elementType = Element\Service::getElementType($element);
  176. $key = $elementType . '_' . $element->getId();
  177. $dependencies[$key] = [
  178. 'id' => $element->getId(),
  179. 'type' => $elementType,
  180. ];
  181. }
  182. }
  183. }
  184. return $dependencies;
  185. }
  186. /**
  187. * { @inheritdoc }
  188. */
  189. public function rewriteIds($idMapping) /** : void */
  190. {
  191. // reset existing elements store
  192. $this->elements = [];
  193. foreach ($this->elementIds as &$elementId) {
  194. $type = $elementId['type'];
  195. $id = $elementId['id'];
  196. if (array_key_exists($type, $idMapping) && array_key_exists((int) $id, $idMapping[$type])) {
  197. $elementId['id'] = $idMapping[$type][$id];
  198. }
  199. }
  200. $this->setElements();
  201. }
  202. /**
  203. * {@inheritdoc}
  204. */
  205. public function __sleep()
  206. {
  207. $finalVars = [];
  208. $parentVars = parent::__sleep();
  209. $blockedVars = ['elements'];
  210. foreach ($parentVars as $key) {
  211. if (!in_array($key, $blockedVars)) {
  212. $finalVars[] = $key;
  213. }
  214. }
  215. return $finalVars;
  216. }
  217. /**
  218. * {@inheritdoc}
  219. */
  220. public function load() /** : void */
  221. {
  222. $this->setElements();
  223. }
  224. /**
  225. * Methods for Iterator
  226. */
  227. /**
  228. * @return void
  229. */
  230. #[\ReturnTypeWillChange]
  231. public function rewind()// : void
  232. {
  233. $this->setElements();
  234. reset($this->elements);
  235. }
  236. /**
  237. * @return Element\ElementInterface|false
  238. */
  239. #[\ReturnTypeWillChange]
  240. public function current()// : Element\ElementInterface|false
  241. {
  242. $this->setElements();
  243. return current($this->elements);
  244. }
  245. /**
  246. * @return int|null
  247. */
  248. #[\ReturnTypeWillChange]
  249. public function key()// : int|null
  250. {
  251. $this->setElements();
  252. return key($this->elements);
  253. }
  254. /**
  255. * @return void
  256. */
  257. #[\ReturnTypeWillChange]
  258. public function next()// : void
  259. {
  260. $this->setElements();
  261. next($this->elements);
  262. }
  263. /**
  264. * @return bool
  265. */
  266. #[\ReturnTypeWillChange]
  267. public function valid()// : bool
  268. {
  269. $this->setElements();
  270. $el = $this->current();
  271. if (Element\Service::doHideUnpublished($el)) {
  272. if (!Element\Service::isPublished($el)) {
  273. $this->next();
  274. }
  275. }
  276. return $this->current() !== false;
  277. }
  278. }