vendor/pimcore/pimcore/models/Document/Editable/Renderlet.php line 33

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\Document\Editable\EditableHandlerInterface;
  19. use Pimcore\Logger;
  20. use Pimcore\Model;
  21. use Pimcore\Model\Asset;
  22. use Pimcore\Model\DataObject;
  23. use Pimcore\Model\Document;
  24. use Pimcore\Model\Element;
  25. use Pimcore\Targeting\Document\DocumentTargetingConfigurator;
  26. use Pimcore\Tool;
  27. /**
  28.  * @method \Pimcore\Model\Document\Editable\Dao getDao()
  29.  */
  30. class Renderlet extends Model\Document\Editable
  31. {
  32.     /**
  33.      * Contains the ID of the linked object
  34.      *
  35.      * @var int|null
  36.      */
  37.     public $id;
  38.     /**
  39.      * Contains the object
  40.      *
  41.      * @var Document|Asset|DataObject|null
  42.      */
  43.     public $o;
  44.     /**
  45.      * Contains the type
  46.      *
  47.      * @var string|null
  48.      */
  49.     public $type;
  50.     /**
  51.      * Contains the subtype
  52.      *
  53.      * @var string|null
  54.      */
  55.     public $subtype;
  56.     /**
  57.      * @see EditableInterface::getType
  58.      *
  59.      * @return string
  60.      */
  61.     public function getType()
  62.     {
  63.         return 'renderlet';
  64.     }
  65.     /**
  66.      * @see EditableInterface::getData
  67.      *
  68.      * @return mixed
  69.      */
  70.     public function getData()
  71.     {
  72.         return [
  73.             'id' => $this->id,
  74.             'type' => $this->getObjectType(),
  75.             'subtype' => $this->subtype,
  76.         ];
  77.     }
  78.     /**
  79.      * Converts the data so it's suitable for the editmode
  80.      *
  81.      * @return mixed
  82.      */
  83.     public function getDataEditmode()
  84.     {
  85.         if ($this->instanceof Element\ElementInterface) {
  86.             return [
  87.                 'id' => $this->id,
  88.                 'type' => $this->getObjectType(),
  89.                 'subtype' => $this->subtype,
  90.             ];
  91.         }
  92.         return null;
  93.     }
  94.     /**
  95.      * @see EditableInterface::frontend
  96.      *
  97.      * @return string
  98.      */
  99.     public function frontend()
  100.     {
  101.         // TODO inject services via DI when tags are built through container
  102.         $container = \Pimcore::getContainer();
  103.         $editableHandler $container->get(EditableHandlerInterface::class);
  104.         if (!$editableHandler->supports($this->view)) {
  105.             return '';
  106.         }
  107.         if (!$this->config['controller'] && !$this->config['action']) {
  108.             if (is_null($this->config)) {
  109.                 $this->config = [];
  110.             }
  111.             $this->config += Tool::getRoutingDefaults();
  112.         }
  113.         if (method_exists($this->o'isPublished')) {
  114.             if (!$this->o->isPublished()) {
  115.                 return '';
  116.             }
  117.         }
  118.         if ($this->instanceof Element\ElementInterface) {
  119.             // apply best matching target group (if any)
  120.             if ($this->instanceof Document\Targeting\TargetingDocumentInterface) {
  121.                 $targetingConfigurator $container->get(DocumentTargetingConfigurator::class);
  122.                 $targetingConfigurator->configureTargetGroup($this->o);
  123.             }
  124.             $blockparams = ['action''controller''module''bundle''template'];
  125.             $params = [
  126.                 'template' => isset($this->config['template']) ? $this->config['template'] : null,
  127.                 'id' => $this->id,
  128.                 'type' => $this->type,
  129.                 'subtype' => $this->subtype,
  130.                 'pimcore_request_source' => 'renderlet',
  131.             ];
  132.             foreach ($this->config as $key => $value) {
  133.                 if (!array_key_exists($key$params) && !in_array($key$blockparams)) {
  134.                     $params[$key] = $value;
  135.                 }
  136.             }
  137.             $moduleOrBundle null;
  138.             if (isset($this->config['bundle'])) {
  139.                 $moduleOrBundle $this->config['bundle'];
  140.             } elseif (isset($this->config['module'])) {
  141.                 $moduleOrBundle $this->config['module'];
  142.             }
  143.             return $editableHandler->renderAction(
  144.                 $this->view,
  145.                 $this->config['controller'],
  146.                 $this->config['action'],
  147.                 $moduleOrBundle,
  148.                 $params
  149.             );
  150.         }
  151.         return '';
  152.     }
  153.     /**
  154.      * @see EditableInterface::setDataFromResource
  155.      *
  156.      * @param mixed $data
  157.      *
  158.      * @return $this
  159.      */
  160.     public function setDataFromResource($data)
  161.     {
  162.         $data = \Pimcore\Tool\Serialize::unserialize($data);
  163.         $this->id $data['id'];
  164.         $this->type $data['type'];
  165.         $this->subtype $data['subtype'];
  166.         $this->setElement();
  167.         return $this;
  168.     }
  169.     /**
  170.      * @see EditableInterface::setDataFromEditmode
  171.      *
  172.      * @param mixed $data
  173.      *
  174.      * @return $this
  175.      */
  176.     public function setDataFromEditmode($data)
  177.     {
  178.         if (is_array($data) && isset($data['id'])) {
  179.             $this->id $data['id'];
  180.             $this->type $data['type'];
  181.             $this->subtype $data['subtype'];
  182.             $this->setElement();
  183.         }
  184.         return $this;
  185.     }
  186.     /**
  187.      * Sets the element by the data stored for the object
  188.      *
  189.      * @return $this
  190.      */
  191.     public function setElement()
  192.     {
  193.         $this->Element\Service::getElementById($this->type$this->id);
  194.         return $this;
  195.     }
  196.     /**
  197.      * @return array
  198.      */
  199.     public function resolveDependencies()
  200.     {
  201.         $this->load();
  202.         $dependencies = [];
  203.         if ($this->instanceof Element\ElementInterface) {
  204.             $elementType Element\Service::getElementType($this->o);
  205.             $key $elementType '_' $this->o->getId();
  206.             $dependencies[$key] = [
  207.                 'id' => $this->o->getId(),
  208.                 'type' => $elementType,
  209.             ];
  210.         }
  211.         return $dependencies;
  212.     }
  213.     /**
  214.      * get correct type of object as string
  215.      *
  216.      * @param Element\ElementInterface|null $object
  217.      *
  218.      * @return string|null
  219.      *
  220.      * @internal param mixed $data
  221.      */
  222.     public function getObjectType($object null)
  223.     {
  224.         $this->load();
  225.         if (!$object) {
  226.             $object $this->o;
  227.         }
  228.         if ($object instanceof Element\ElementInterface) {
  229.             return Element\Service::getType($object);
  230.         }
  231.         return null;
  232.     }
  233.     /**
  234.      * @return bool
  235.      */
  236.     public function isEmpty()
  237.     {
  238.         $this->load();
  239.         if ($this->instanceof Element\ElementInterface) {
  240.             return false;
  241.         }
  242.         return true;
  243.     }
  244.     /**
  245.      * @param Model\Webservice\Data\Document\Element $wsElement
  246.      * @param Model\Document\PageSnippet $document
  247.      * @param array $params
  248.      * @param Model\Webservice\IdMapperInterface|null $idMapper
  249.      *
  250.      * @throws \Exception
  251.      */
  252.     public function getFromWebserviceImport($wsElement$document null$params = [], $idMapper null)
  253.     {
  254.         $data $this->sanitizeWebserviceData($wsElement->value);
  255.         if ($data->id !== null) {
  256.             $this->type $data->type;
  257.             $this->subtype $data->subtype;
  258.             if (is_numeric($data->id)) {
  259.                 $id $data->id;
  260.                 if ($idMapper) {
  261.                     $id $idMapper->getMappedId($data->type$data->id);
  262.                 }
  263.                 $this->id $id;
  264.                 if ($this->type == 'asset') {
  265.                     $this->Asset::getById($id);
  266.                     if (!$this->instanceof Asset) {
  267.                         if ($idMapper && $idMapper->ignoreMappingFailures()) {
  268.                             $idMapper->recordMappingFailure('document'$this->getDocumentId(), $this->type$this->id);
  269.                         } else {
  270.                             throw new \Exception('cannot get values from web service import - referenced asset with id [ '.$this->id.' ] is unknown');
  271.                         }
  272.                     }
  273.                 } elseif ($this->type == 'document') {
  274.                     $this->Document::getById($id);
  275.                     if (!$this->instanceof Document) {
  276.                         if ($idMapper && $idMapper->ignoreMappingFailures()) {
  277.                             $idMapper->recordMappingFailure('document'$this->getDocumentId(), $this->type$this->id);
  278.                         } else {
  279.                             throw new \Exception('cannot get values from web service import - referenced document with id [ '.$this->id.' ] is unknown');
  280.                         }
  281.                     }
  282.                 } elseif ($this->type == 'object') {
  283.                     $this->DataObject::getById($id);
  284.                     if (!$this->instanceof DataObject\AbstractObject) {
  285.                         if ($idMapper && $idMapper->ignoreMappingFailures()) {
  286.                             $idMapper->recordMappingFailure('document'$this->getDocumentId(), $this->type$this->id);
  287.                         } else {
  288.                             throw new \Exception('cannot get values from web service import - referenced object with id [ '.$this->id.' ] is unknown');
  289.                         }
  290.                     }
  291.                 } else {
  292.                     p_r($this);
  293.                     throw new \Exception('cannot get values from web service import - type is not valid');
  294.                 }
  295.             } else {
  296.                 throw new \Exception('cannot get values from web service import - id is not valid');
  297.             }
  298.         }
  299.     }
  300.     /**
  301.      * @return bool
  302.      */
  303.     public function checkValidity()
  304.     {
  305.         $sane true;
  306.         if ($this->id) {
  307.             $el Element\Service::getElementById($this->type$this->id);
  308.             if (!$el instanceof Element\ElementInterface) {
  309.                 $sane false;
  310.                 Logger::notice('Detected insane relation, removing reference to non existent '.$this->type.' with id ['.$this->id.']');
  311.                 $this->id null;
  312.                 $this->type null;
  313.                 $this->null;
  314.                 $this->subtype null;
  315.             }
  316.         }
  317.         return $sane;
  318.     }
  319.     /**
  320.      * @return array
  321.      */
  322.     public function __sleep()
  323.     {
  324.         $finalVars = [];
  325.         $parentVars parent::__sleep();
  326.         $blockedVars = ['o'];
  327.         foreach ($parentVars as $key) {
  328.             if (!in_array($key$blockedVars)) {
  329.                 $finalVars[] = $key;
  330.             }
  331.         }
  332.         return $finalVars;
  333.     }
  334.     /**
  335.      * this method is called by Document\Service::loadAllDocumentFields() to load all lazy loading fields
  336.      */
  337.     public function load()
  338.     {
  339.         if (!$this->o) {
  340.             $this->setElement();
  341.         }
  342.     }
  343.     /**
  344.      * @param int $id
  345.      *
  346.      * @return Document\Editable\Renderlet
  347.      */
  348.     public function setId($id)
  349.     {
  350.         $this->id $id;
  351.         return $this;
  352.     }
  353.     /**
  354.      * @return int
  355.      */
  356.     public function getId()
  357.     {
  358.         return (int) $this->id;
  359.     }
  360.     /**
  361.      * @param Asset|Document|Object $o
  362.      *
  363.      * @return Document\Editable\Renderlet
  364.      */
  365.     public function setO($o)
  366.     {
  367.         $this->$o;
  368.         return $this;
  369.     }
  370.     /**
  371.      * @return Asset|Document|Object
  372.      */
  373.     public function getO()
  374.     {
  375.         return $this->o;
  376.     }
  377.     /**
  378.      * @param string $subtype
  379.      *
  380.      * @return Document\Editable\Renderlet
  381.      */
  382.     public function setSubtype($subtype)
  383.     {
  384.         $this->subtype $subtype;
  385.         return $this;
  386.     }
  387.     /**
  388.      * @return string
  389.      */
  390.     public function getSubtype()
  391.     {
  392.         return $this->subtype;
  393.     }
  394.     /**
  395.      * Rewrites id from source to target, $idMapping contains
  396.      * array(
  397.      *  "document" => array(
  398.      *      SOURCE_ID => TARGET_ID,
  399.      *      SOURCE_ID => TARGET_ID
  400.      *  ),
  401.      *  "object" => array(...),
  402.      *  "asset" => array(...)
  403.      * )
  404.      *
  405.      * @param array $idMapping
  406.      */
  407.     public function rewriteIds($idMapping)
  408.     {
  409.         $type = (string) $this->type;
  410.         if ($type && array_key_exists($this->type$idMapping) and array_key_exists($this->getId(), $idMapping[$this->type])) {
  411.             $this->setId($idMapping[$this->type][$this->getId()]);
  412.             $this->setO(null);
  413.         }
  414.     }
  415. }
  416. class_alias(Renderlet::class, 'Pimcore\Model\Document\Tag\Renderlet');