vendor/pimcore/pimcore/models/Document/Link.php line 26

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;
  15. use Pimcore\Logger;
  16. use Pimcore\Model;
  17. use Pimcore\Model\Asset;
  18. use Pimcore\Model\Document;
  19. /**
  20.  * @method \Pimcore\Model\Document\Link\Dao getDao()
  21.  */
  22. class Link extends Model\Document
  23. {
  24.     use Model\Element\Traits\ScheduledTasksTrait;
  25.     /**
  26.      * Contains the ID of the internal ID
  27.      *
  28.      * @internal
  29.      *
  30.      * @var int|null
  31.      */
  32.     protected $internal;
  33.     /**
  34.      * Contains the type of the internal ID
  35.      *
  36.      * @internal
  37.      *
  38.      * @var string|null
  39.      */
  40.     protected $internalType;
  41.     /**
  42.      * Contains object of linked Document|Asset|DataObject
  43.      *
  44.      * @internal
  45.      *
  46.      * @var Model\Element\ElementInterface|null
  47.      */
  48.     protected $object;
  49.     /**
  50.      * Contains the direct link as plain text
  51.      *
  52.      * @internal
  53.      *
  54.      * @var string
  55.      */
  56.     protected string $direct '';
  57.     /**
  58.      * Type of the link (internal/direct)
  59.      *
  60.      * @internal
  61.      *
  62.      * @var string
  63.      */
  64.     protected string $linktype 'internal';
  65.     /**
  66.      * {@inheritdoc}
  67.      */
  68.     protected string $type 'link';
  69.     /**
  70.      * path of the link
  71.      *
  72.      * @internal
  73.      *
  74.      * @var string
  75.      */
  76.     protected string $href '';
  77.     /**
  78.      * {@inheritdoc}
  79.      */
  80.     protected function resolveDependencies(): array
  81.     {
  82.         $dependencies parent::resolveDependencies();
  83.         if ($this->getLinktype() === 'internal') {
  84.             $element $this->getElement();
  85.             if ($element instanceof Document || $element instanceof Asset) {
  86.                 $key $this->getInternalType() . '_' $element->getId();
  87.                 $dependencies[$key] = [
  88.                     'id' => $element->getId(),
  89.                     'type' => $this->getInternalType(),
  90.                 ];
  91.             }
  92.         }
  93.         return $dependencies;
  94.     }
  95.     /**
  96.      * {@inheritdoc}
  97.      */
  98.     public function getCacheTags(array $tags = []): array
  99.     {
  100.         $tags parent::getCacheTags($tags);
  101.         if ($this->getLinktype() === 'internal') {
  102.             $element $this->getElement();
  103.             if ($element instanceof Document || $element instanceof Asset) {
  104.                 if ($element->getId() != $this->getId() && !array_key_exists($element->getCacheTag(), $tags)) {
  105.                     $tags $element->getCacheTags($tags);
  106.                 }
  107.             }
  108.         }
  109.         return $tags;
  110.     }
  111.     /**
  112.      * Returns the plain text path of the link
  113.      *
  114.      * @return string
  115.      */
  116.     public function getHref()
  117.     {
  118.         $path '';
  119.         if ($this->getLinktype() === 'internal') {
  120.             $element $this->getElement();
  121.             if ($element instanceof Document || $element instanceof Asset) {
  122.                 $path $element->getFullPath();
  123.             } else {
  124.                 if ($element instanceof Model\DataObject\Concrete) {
  125.                     if ($linkGenerator $element->getClass()->getLinkGenerator()) {
  126.                         $path $linkGenerator->generate(
  127.                             $element,
  128.                             [
  129.                                 'document' => $this,
  130.                                 'context' => $this,
  131.                             ]
  132.                         );
  133.                     }
  134.                 }
  135.             }
  136.         } else {
  137.             $path $this->getDirect();
  138.         }
  139.         $this->href $path;
  140.         return $path;
  141.     }
  142.     /**
  143.      * Returns the plain text path of the link needed for the editmode
  144.      *
  145.      * @return string
  146.      */
  147.     public function getRawHref()
  148.     {
  149.         $rawHref '';
  150.         if ($this->getLinktype() === 'internal') {
  151.             $element $this->getElement();
  152.             if (
  153.                 $element instanceof Document ||
  154.                 $element instanceof Asset ||
  155.                 $element instanceof Model\DataObject\Concrete
  156.             ) {
  157.                 $rawHref $element->getFullPath();
  158.             }
  159.         } else {
  160.             $rawHref $this->getDirect();
  161.         }
  162.         return $rawHref;
  163.     }
  164.     /**
  165.      * Returns the path of the link including the anchor and parameters
  166.      *
  167.      * @return string
  168.      */
  169.     public function getLink()
  170.     {
  171.         $path $this->getHref();
  172.         $parameters $this->getProperty('navigation_parameters');
  173.         if (strlen($parameters) > 0) {
  174.             $path .= '?' str_replace('?'''$parameters);
  175.         }
  176.         $anchor $this->getProperty('navigation_anchor');
  177.         if (strlen($anchor) > 0) {
  178.             $path .= '#' str_replace('#'''$anchor);
  179.         }
  180.         return $path;
  181.     }
  182.     /**
  183.      * Returns the id of the internal document|asset which is linked
  184.      *
  185.      * @return int
  186.      */
  187.     public function getInternal()
  188.     {
  189.         return $this->internal;
  190.     }
  191.     /**
  192.      * Returns the direct link (eg. http://www.pimcore.org/test)
  193.      *
  194.      * @return string
  195.      */
  196.     public function getDirect()
  197.     {
  198.         return $this->direct;
  199.     }
  200.     /**
  201.      * Returns the type of the link (internal/direct)
  202.      *
  203.      * @return string
  204.      */
  205.     public function getLinktype()
  206.     {
  207.         return $this->linktype;
  208.     }
  209.     /**
  210.      * @param int $internal
  211.      *
  212.      * @return $this
  213.      */
  214.     public function setInternal($internal)
  215.     {
  216.         if (!empty($internal)) {
  217.             $this->internal = (int) $internal;
  218.             $this->setObjectFromId();
  219.         } else {
  220.             $this->internal null;
  221.         }
  222.         return $this;
  223.     }
  224.     /**
  225.      * @param string $direct
  226.      *
  227.      * @return $this
  228.      */
  229.     public function setDirect($direct)
  230.     {
  231.         $this->direct $direct;
  232.         return $this;
  233.     }
  234.     /**
  235.      * @param string $linktype
  236.      *
  237.      * @return $this
  238.      */
  239.     public function setLinktype($linktype)
  240.     {
  241.         $this->linktype $linktype;
  242.         return $this;
  243.     }
  244.     /**
  245.      * @return string|null
  246.      */
  247.     public function getInternalType()
  248.     {
  249.         return $this->internalType;
  250.     }
  251.     /**
  252.      * @param string|null $type
  253.      *
  254.      * @return $this
  255.      */
  256.     public function setInternalType($type)
  257.     {
  258.         $this->internalType $type;
  259.         return $this;
  260.     }
  261.     /**
  262.      * @return Model\Element\ElementInterface|null
  263.      */
  264.     public function getElement()
  265.     {
  266.         if ($this->object instanceof Model\Element\ElementInterface) {
  267.             return $this->object;
  268.         }
  269.         if ($this->setObjectFromId()) {
  270.             return $this->object;
  271.         }
  272.         return null;
  273.     }
  274.     /**
  275.      * @param Model\Element\ElementInterface|null $element
  276.      *
  277.      * @return $this
  278.      */
  279.     public function setElement($element)
  280.     {
  281.         $this->object $element;
  282.         return $this;
  283.     }
  284.     /**
  285.      * @deprecated use getElement() instead, will be removed in Pimcore 11
  286.      *
  287.      * @return Model\Element\ElementInterface|null
  288.      */
  289.     public function getObject()
  290.     {
  291.         trigger_deprecation(
  292.             'pimcore/pimcore',
  293.             '10.0',
  294.             'The Link::getObject() method is deprecated, use Link::getElement() instead.'
  295.         );
  296.         return $this->getElement();
  297.     }
  298.     /**
  299.      * @deprecated use getElement() instead, will be removed in Pimcore 11
  300.      *
  301.      * @param Model\Element\ElementInterface $object
  302.      *
  303.      * @return $this
  304.      */
  305.     public function setObject($object)
  306.     {
  307.         trigger_deprecation(
  308.             'pimcore/pimcore',
  309.             '10.0',
  310.             'The Link::setObject() method is deprecated, use Link::setElement() instead.'
  311.         );
  312.         return $this->setElement($object);
  313.     }
  314.     /**
  315.      * @return Model\Element\ElementInterface|null
  316.      */
  317.     private function setObjectFromId()
  318.     {
  319.         try {
  320.             if ($this->internal) {
  321.                 if ($this->internalType == 'document') {
  322.                     if ($this->getId() == $this->internal) {
  323.                         throw new \Exception('Prevented infinite redirection loop: attempted to linking "' $this->getKey() . '" to itself. ');
  324.                     }
  325.                     $this->object Document::getById($this->internal);
  326.                 } elseif ($this->internalType == 'asset') {
  327.                     $this->object Asset::getById($this->internal);
  328.                 } elseif ($this->internalType == 'object') {
  329.                     $this->object Model\DataObject\Concrete::getById($this->internal);
  330.                 }
  331.             }
  332.         } catch (\Exception $e) {
  333.             Logger::warn((string) $e);
  334.             $this->internalType '';
  335.             $this->internal null;
  336.             $this->object null;
  337.         }
  338.         return $this->object;
  339.     }
  340.     /**
  341.      * returns the ready-use html for this link
  342.      *
  343.      * @return string
  344.      */
  345.     public function getHtml()
  346.     {
  347.         $attributes = [
  348.             'class',
  349.             'target',
  350.             'title',
  351.             'accesskey',
  352.             'tabindex',
  353.             'rel' => 'relation',
  354.         ];
  355.         $link $this->getLink();
  356.         $link .= $this->getProperty('navigation_parameters') . $this->getProperty('navigation_anchor');
  357.         $attribs = [];
  358.         foreach ($attributes as $key => $name) {
  359.             $key is_numeric($key) ? $name $key;
  360.             $value $this->getProperty('navigation_' $name);
  361.             if ($value) {
  362.                 $attribs[] = $key '="' $value '"';
  363.             }
  364.         }
  365.         return '<a href="' $link '" ' implode(' '$attribs) . '>' htmlspecialchars($this->getProperty('navigation_name')) . '</a>';
  366.     }
  367.     /**
  368.      * {@inheritdoc}
  369.      */
  370.     protected function update($params = [])
  371.     {
  372.         parent::update($params);
  373.         $this->saveScheduledTasks();
  374.     }
  375.     /**
  376.      * @return array
  377.      */
  378.     public function __sleep()
  379.     {
  380.         $finalVars = [];
  381.         $parentVars parent::__sleep();
  382.         $blockedVars = ['object'];
  383.         foreach ($parentVars as $key) {
  384.             if (!in_array($key$blockedVars)) {
  385.                 $finalVars[] = $key;
  386.             }
  387.         }
  388.         return $finalVars;
  389.     }
  390. }