vendor/pimcore/pimcore/models/Document/Editable/Snippet.php line 32

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\Cache;
  19. use Pimcore\Document\Editable\EditableHandlerInterface;
  20. use Pimcore\Model;
  21. use Pimcore\Model\Document;
  22. use Pimcore\Model\Site;
  23. use Pimcore\Targeting\Document\DocumentTargetingConfigurator;
  24. use Pimcore\Tool\DeviceDetector;
  25. use Pimcore\Tool\Frontend;
  26. /**
  27.  * @method \Pimcore\Model\Document\Editable\Dao getDao()
  28.  */
  29. class Snippet extends Model\Document\Editable
  30. {
  31.     /**
  32.      * Contains the ID of the linked snippet
  33.      *
  34.      * @var int
  35.      */
  36.     public $id;
  37.     /**
  38.      * Contains the object for the snippet
  39.      *
  40.      * @var Document\Snippet
  41.      */
  42.     public $snippet;
  43.     /**
  44.      * @see EditableInterface::getType
  45.      *
  46.      * @return string
  47.      */
  48.     public function getType()
  49.     {
  50.         return 'snippet';
  51.     }
  52.     /**
  53.      * @see EditableInterface::getData
  54.      *
  55.      * @return mixed
  56.      */
  57.     public function getData()
  58.     {
  59.         return $this->id;
  60.     }
  61.     /**
  62.      * @param int $id
  63.      */
  64.     public function setId($id)
  65.     {
  66.         $this->id $id;
  67.     }
  68.     /**
  69.      * @return int
  70.      */
  71.     public function getId()
  72.     {
  73.         return (int) $this->id;
  74.     }
  75.     /**
  76.      * Converts the data so it's suitable for the editmode
  77.      *
  78.      * @return mixed
  79.      */
  80.     public function getDataEditmode()
  81.     {
  82.         if ($this->snippet instanceof Document\Snippet) {
  83.             return [
  84.                 'id' => $this->id,
  85.                 'path' => $this->snippet->getFullPath(),
  86.             ];
  87.         }
  88.         return null;
  89.     }
  90.     /**
  91.      * @see EditableInterface::frontend
  92.      *
  93.      * @return string
  94.      */
  95.     public function frontend()
  96.     {
  97.         // TODO inject services via DI when tags are built through container
  98.         $container = \Pimcore::getContainer();
  99.         $editableHandler $container->get(EditableHandlerInterface::class);
  100.         $targetingConfigurator $container->get(DocumentTargetingConfigurator::class);
  101.         if (!$editableHandler->supports($this->view)) {
  102.             return '';
  103.         }
  104.         if (!$this->snippet instanceof Document\Snippet) {
  105.             return '';
  106.         }
  107.         if (!$this->snippet->isPublished()) {
  108.             return '';
  109.         }
  110.         // apply best matching target group (if any)
  111.         $targetingConfigurator->configureTargetGroup($this->snippet);
  112.         $params $this->config;
  113.         $params['document'] = $this->snippet;
  114.         // check if output-cache is enabled, if so, we're also using the cache here
  115.         $cacheKey null;
  116.         $cacheConfig = \Pimcore\Tool\Frontend::isOutputCacheEnabled();
  117.         if ((isset($params['cache']) && $params['cache'] === true) || $cacheConfig) {
  118.             // cleanup params to avoid serializing Element\ElementInterface objects
  119.             $cacheParams $params;
  120.             array_walk($cacheParams, function (&$value$key) {
  121.                 if ($value instanceof Model\Element\ElementInterface) {
  122.                     $value $value->getId();
  123.                 }
  124.             });
  125.             // TODO is this enough for cache or should we disable caching completely?
  126.             if ($this->snippet->getUseTargetGroup()) {
  127.                 $cacheParams['target_group'] = $this->snippet->getUseTargetGroup();
  128.             }
  129.             $cacheParams['webp'] = Frontend::hasWebpSupport();
  130.             if (Site::isSiteRequest()) {
  131.                 $cacheParams['siteId'] = Site::getCurrentSite()->getId();
  132.             }
  133.             $cacheKey 'tag_snippet__' md5(serialize($cacheParams));
  134.             if ($content Cache::load($cacheKey)) {
  135.                 return $content;
  136.             }
  137.         }
  138.         $content $editableHandler->renderAction(
  139.             $this->view,
  140.             $this->snippet->getController(),
  141.             $this->snippet->getAction(),
  142.             $this->snippet->getModule(),
  143.             $params
  144.         );
  145.         // write contents to the cache, if output-cache is enabled
  146.         if (isset($params['cache']) && $params['cache'] === true) {
  147.             Cache::save($content$cacheKey, ['output']);
  148.         } elseif ($cacheConfig && !DeviceDetector::getInstance()->wasUsed()) {
  149.             Cache::save($content$cacheKey, ['output''output_inline'], $cacheConfig['lifetime']);
  150.         }
  151.         return $content;
  152.     }
  153.     /**
  154.      * @see EditableInterface::setDataFromResource
  155.      *
  156.      * @param mixed $data
  157.      *
  158.      * @return $this
  159.      */
  160.     public function setDataFromResource($data)
  161.     {
  162.         if (intval($data) > 0) {
  163.             $this->id $data;
  164.             $this->snippet Document\Snippet::getById($this->id);
  165.         }
  166.         return $this;
  167.     }
  168.     /**
  169.      * @see EditableInterface::setDataFromEditmode
  170.      *
  171.      * @param mixed $data
  172.      *
  173.      * @return $this
  174.      */
  175.     public function setDataFromEditmode($data)
  176.     {
  177.         if (intval($data) > 0) {
  178.             $this->id $data;
  179.             $this->snippet Document\Snippet::getById($this->id);
  180.         }
  181.         return $this;
  182.     }
  183.     /**
  184.      * @return bool
  185.      */
  186.     public function isEmpty()
  187.     {
  188.         $this->load();
  189.         if ($this->snippet instanceof Document\Snippet) {
  190.             return false;
  191.         }
  192.         return true;
  193.     }
  194.     /**
  195.      * @return array
  196.      */
  197.     public function resolveDependencies()
  198.     {
  199.         $dependencies = [];
  200.         if ($this->snippet instanceof Document\Snippet) {
  201.             $key 'document_' $this->snippet->getId();
  202.             $dependencies[$key] = [
  203.                 'id' => $this->snippet->getId(),
  204.                 'type' => 'document',
  205.             ];
  206.         }
  207.         return $dependencies;
  208.     }
  209.     /**
  210.      * @deprecated
  211.      *
  212.      * @param Model\Webservice\Data\Document\Element $wsElement
  213.      * @param Model\Document\PageSnippet $document
  214.      * @param array $params
  215.      * @param Model\Webservice\IdMapperInterface|null $idMapper
  216.      *
  217.      * @throws \Exception
  218.      */
  219.     public function getFromWebserviceImport($wsElement$document null$params = [], $idMapper null)
  220.     {
  221.         $data $this->sanitizeWebserviceData($wsElement->value);
  222.         if ($data->id !== null) {
  223.             $this->id $data->id;
  224.             if (is_numeric($this->id)) {
  225.                 $this->snippet Document\Snippet::getById($this->id);
  226.                 if (!$this->snippet instanceof Document\Snippet) {
  227.                     throw new \Exception('cannot get values from web service import - referenced snippet with id [ ' $this->id ' ] is unknown');
  228.                 }
  229.             } else {
  230.                 throw new \Exception('cannot get values from web service import - id is not valid');
  231.             }
  232.         }
  233.     }
  234.     /**
  235.      * @return array
  236.      */
  237.     public function __sleep()
  238.     {
  239.         $finalVars = [];
  240.         $parentVars parent::__sleep();
  241.         $blockedVars = ['snippet'];
  242.         foreach ($parentVars as $key) {
  243.             if (!in_array($key$blockedVars)) {
  244.                 $finalVars[] = $key;
  245.             }
  246.         }
  247.         return $finalVars;
  248.     }
  249.     /**
  250.      * this method is called by Document\Service::loadAllDocumentFields() to load all lazy loading fields
  251.      */
  252.     public function load()
  253.     {
  254.         if (!$this->snippet && $this->id) {
  255.             $this->snippet Document\Snippet::getById($this->id);
  256.         }
  257.     }
  258.     /**
  259.      * Rewrites id from source to target, $idMapping contains
  260.      * array(
  261.      *  "document" => array(
  262.      *      SOURCE_ID => TARGET_ID,
  263.      *      SOURCE_ID => TARGET_ID
  264.      *  ),
  265.      *  "object" => array(...),
  266.      *  "asset" => array(...)
  267.      * )
  268.      *
  269.      * @param array $idMapping
  270.      */
  271.     public function rewriteIds($idMapping)
  272.     {
  273.         $id $this->getId();
  274.         if (array_key_exists('document'$idMapping) && array_key_exists($id$idMapping['document'])) {
  275.             $this->id $idMapping['document'][$id];
  276.         }
  277.     }
  278.     /**
  279.      * @param Document\Snippet $snippet
  280.      */
  281.     public function setSnippet($snippet)
  282.     {
  283.         if ($snippet instanceof Document\Snippet) {
  284.             $this->id $snippet->getId();
  285.             $this->snippet $snippet;
  286.         }
  287.     }
  288.     /**
  289.      * @return Document\Snippet
  290.      */
  291.     public function getSnippet()
  292.     {
  293.         $this->load();
  294.         return $this->snippet;
  295.     }
  296. }
  297. class_alias(Snippet::class, 'Pimcore\Model\Document\Tag\Snippet');