vendor/pimcore/pimcore/models/DataObject/ClassDefinition/Data/Link.php line 103

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\DataObject\ClassDefinition\Data;
  15. use Pimcore\Model\Asset;
  16. use Pimcore\Model\DataObject;
  17. use Pimcore\Model\DataObject\ClassDefinition\Data;
  18. use Pimcore\Model\Document;
  19. use Pimcore\Model\Element;
  20. use Pimcore\Normalizer\NormalizerInterface;
  21. use Pimcore\Tool\Serialize;
  22. class Link extends Data implements ResourcePersistenceAwareInterfaceQueryResourcePersistenceAwareInterfaceTypeDeclarationSupportInterfaceEqualComparisonInterfaceVarExporterInterfaceNormalizerInterfaceIdRewriterInterface
  23. {
  24.     use DataObject\Traits\SimpleComparisonTrait;
  25.     use Extension\ColumnType;
  26.     use Extension\QueryColumnType;
  27.     use DataObject\Traits\ObjectVarTrait;
  28.     /**
  29.      * Static type of this element
  30.      *
  31.      * @internal
  32.      *
  33.      * @var string
  34.      */
  35.     public $fieldtype 'link';
  36.     /**
  37.      * Type for the column to query
  38.      *
  39.      * @internal
  40.      *
  41.      * @var string
  42.      */
  43.     public $queryColumnType 'text';
  44.     /**
  45.      * Type for the column
  46.      *
  47.      * @internal
  48.      *
  49.      * @var string
  50.      */
  51.     public $columnType 'text';
  52.     /**
  53.      * @see ResourcePersistenceAwareInterface::getDataForResource
  54.      *
  55.      * @param DataObject\Data\Link|null $data
  56.      * @param null|DataObject\Concrete $object
  57.      * @param mixed $params
  58.      *
  59.      * @return string|null
  60.      */
  61.     public function getDataForResource($data$object null$params = [])
  62.     {
  63.         if ($data instanceof DataObject\Data\Link) {
  64.             $data = clone $data;
  65.             $data->_setOwner(null);
  66.             $data->_setOwnerFieldname('');
  67.             $data->_setOwnerLanguage(null);
  68.             if ($data->getLinktype() === 'internal' && !$data->getPath()) {
  69.                 $data->setLinktype(null);
  70.                 $data->setInternalType(null);
  71.                 if ($data->isEmpty()) {
  72.                     return null;
  73.                 }
  74.             }
  75.             $params['resetInvalidFields'] = true;
  76.             $this->checkValidity($datatrue$params);
  77.             return Serialize::serialize($data);
  78.         }
  79.         return null;
  80.     }
  81.     /**
  82.      * @see ResourcePersistenceAwareInterface::getDataFromResource
  83.      *
  84.      * @param string $data
  85.      * @param null|DataObject\Concrete $object
  86.      * @param mixed $params
  87.      *
  88.      * @return DataObject\Data\Link|null
  89.      */
  90.     public function getDataFromResource($data$object null$params = [])
  91.     {
  92.         $link Serialize::unserialize($data);
  93.         if ($link instanceof DataObject\Data\Link) {
  94.             if (isset($params['owner'])) {
  95.                 $link->_setOwner($params['owner']);
  96.                 $link->_setOwnerFieldname($params['fieldname']);
  97.                 $link->_setOwnerLanguage($params['language'] ?? null);
  98.             }
  99.             $params['resetInvalidFields'] = true;
  100.             $this->checkValidity($linktrue$params);
  101.             return $link;
  102.         }
  103.         return null;
  104.     }
  105.     /**
  106.      * @see QueryResourcePersistenceAwareInterface::getDataForQueryResource
  107.      *
  108.      * @param DataObject\Data\Link $data
  109.      * @param null|DataObject\Concrete $object
  110.      * @param mixed $params
  111.      *
  112.      * @return string
  113.      */
  114.     public function getDataForQueryResource($data$object null$params = [])
  115.     {
  116.         return $this->getDataForResource($data$object$params);
  117.     }
  118.     /**
  119.      * @see Data::getDataForEditmode
  120.      *
  121.      * @param DataObject\Data\Link|null $data
  122.      * @param null|DataObject\Concrete $object
  123.      * @param mixed $params
  124.      *
  125.      * @return array|null
  126.      */
  127.     public function getDataForEditmode($data$object null$params = [])
  128.     {
  129.         if (!$data instanceof DataObject\Data\Link) {
  130.             return null;
  131.         }
  132.         $dataArray $data->getObjectVars();
  133.         $dataArray['path'] = $data->getPath();
  134.         return $dataArray;
  135.     }
  136.     /**
  137.      * @param DataObject\Data\Link|null $data
  138.      * @param null|DataObject\Concrete $object
  139.      * @param mixed $params
  140.      *
  141.      * @return array|null
  142.      */
  143.     public function getDataForGrid($data$object null$params = [])
  144.     {
  145.         return $this->getDataForEditmode($data$object$params);
  146.     }
  147.     /**
  148.      * @see Data::getDataFromEditmode
  149.      *
  150.      * @param array $data
  151.      * @param null|DataObject\Concrete $object
  152.      * @param mixed $params
  153.      *
  154.      * @return DataObject\Data\Link|null
  155.      */
  156.     public function getDataFromEditmode($data$object null$params = [])
  157.     {
  158.         $link = new DataObject\Data\Link();
  159.         $link->setValues($data);
  160.         if ($link->isEmpty()) {
  161.             return null;
  162.         }
  163.         return $link;
  164.     }
  165.     /**
  166.      * @param array $data
  167.      * @param null|DataObject\Concrete $object
  168.      * @param mixed $params
  169.      *
  170.      * @return DataObject\Data\Link|null
  171.      */
  172.     public function getDataFromGridEditor($data$object null$params = [])
  173.     {
  174.         return $this->getDataFromEditmode($data$object$params);
  175.     }
  176.     /**
  177.      * @see Data::getVersionPreview
  178.      *
  179.      * @param DataObject\Data\Link|null $data
  180.      * @param null|DataObject\Concrete $object
  181.      * @param mixed $params
  182.      *
  183.      * @return string
  184.      */
  185.     public function getVersionPreview($data$object null$params = [])
  186.     {
  187.         return (string) $data;
  188.     }
  189.     /**
  190.      * {@inheritdoc}
  191.      */
  192.     public function checkValidity($data$omitMandatoryCheck false$params = [])
  193.     {
  194.         if ($data instanceof DataObject\Data\Link) {
  195.             if ((int)$data->getInternal() > 0) {
  196.                 if ($data->getInternalType() == 'document') {
  197.                     $doc Document::getById($data->getInternal());
  198.                     if (!$doc instanceof Document) {
  199.                         if (isset($params['resetInvalidFields']) && $params['resetInvalidFields']) {
  200.                             $data->setInternalType(null);
  201.                             $data->setInternal(null);
  202.                         } else {
  203.                             throw new Element\ValidationException('invalid internal link, referenced document with id [' $data->getInternal() . '] does not exist');
  204.                         }
  205.                     }
  206.                 } elseif ($data->getInternalType() == 'asset') {
  207.                     $asset Asset::getById($data->getInternal());
  208.                     if (!$asset instanceof Asset) {
  209.                         if (isset($params['resetInvalidFields']) && $params['resetInvalidFields']) {
  210.                             $data->setInternalType(null);
  211.                             $data->setInternal(null);
  212.                         } else {
  213.                             throw new Element\ValidationException('invalid internal link, referenced document with id [' $data->getInternal() . '] does not exist');
  214.                         }
  215.                     }
  216.                 }
  217.             }
  218.         } elseif ($data !== null) {
  219.             throw new Element\ValidationException('Expected DataObject\\Data\\Link or null');
  220.         }
  221.     }
  222.     /**
  223.      * @param DataObject\Data\Link|null $data
  224.      *
  225.      * @return array
  226.      */
  227.     public function resolveDependencies($data)
  228.     {
  229.         $dependencies = [];
  230.         if ($data instanceof DataObject\Data\Link && $data->getInternal()) {
  231.             if ((int)$data->getInternal() > 0) {
  232.                 if ($data->getInternalType() == 'document') {
  233.                     if ($doc Document::getById($data->getInternal())) {
  234.                         $key 'document_' $doc->getId();
  235.                         $dependencies[$key] = [
  236.                             'id' => $doc->getId(),
  237.                             'type' => 'document',
  238.                         ];
  239.                     }
  240.                 } elseif ($data->getInternalType() == 'asset') {
  241.                     if ($asset Asset::getById($data->getInternal())) {
  242.                         $key 'asset_' $asset->getId();
  243.                         $dependencies[$key] = [
  244.                             'id' => $asset->getId(),
  245.                             'type' => 'asset',
  246.                         ];
  247.                     }
  248.                 } elseif ($data->getInternalType() == 'object') {
  249.                     if ($object DataObject\Concrete::getById($data->getInternal())) {
  250.                         $key 'object_' $object->getId();
  251.                         $dependencies[$key] = [
  252.                             'id' => $object->getId(),
  253.                             'type' => 'object',
  254.                         ];
  255.                     }
  256.                 }
  257.             }
  258.         }
  259.         return $dependencies;
  260.     }
  261.     /**
  262.      * {@inheritdoc}
  263.      */
  264.     public function getCacheTags($data, array $tags = [])
  265.     {
  266.         if ($data instanceof DataObject\Data\Link && $data->getInternal()) {
  267.             if ((int)$data->getInternal() > 0) {
  268.                 $tag Element\Service::getElementCacheTag($data->getInternalType(), $data->getInternal());
  269.                 $tags[$tag] = $tag;
  270.             }
  271.         }
  272.         return $tags;
  273.     }
  274.     /**
  275.      * {@inheritdoc}
  276.      */
  277.     public function getForCsvExport($object$params = [])
  278.     {
  279.         $data $this->getDataFromObjectParam($object$params);
  280.         if ($data instanceof DataObject\Data\Link) {
  281.             return base64_encode(Serialize::serialize($data));
  282.         }
  283.         return '';
  284.     }
  285.     /**
  286.      * {@inheritdoc}
  287.      */
  288.     public function getDataForSearchIndex($object$params = [])
  289.     {
  290.         $data $this->getDataFromObjectParam($object$params);
  291.         if ($data instanceof DataObject\Data\Link) {
  292.             return $data->getText();
  293.         }
  294.         return '';
  295.     }
  296.     /**
  297.      * {@inheritdoc}
  298.      */
  299.     public function isDiffChangeAllowed($object$params = [])
  300.     {
  301.         return true;
  302.     }
  303.     /** Generates a pretty version preview (similar to getVersionPreview) can be either HTML or
  304.      * a image URL. See the https://github.com/pimcore/object-merger bundle documentation for details
  305.      *
  306.      * @param DataObject\Data\Link|null $data
  307.      * @param DataObject\Concrete|null $object
  308.      * @param mixed $params
  309.      *
  310.      * @return string|null
  311.      */
  312.     public function getDiffVersionPreview($data$object null$params = [])
  313.     {
  314.         if ($data instanceof DataObject\Data\Link) {
  315.             if ($data->getText()) {
  316.                 return $data->getText();
  317.             } elseif ($data->getDirect()) {
  318.                 return $data->getDirect();
  319.             }
  320.         }
  321.         return null;
  322.     }
  323.     /**
  324.      * { @inheritdoc }
  325.      */
  326.     public function rewriteIds(/** mixed */ $container/** array */ $idMapping/** array */ $params = []) /** :mixed */
  327.     {
  328.         $data $this->getDataFromObjectParam($container$params);
  329.         if ($data instanceof DataObject\Data\Link && $data->getLinktype() == 'internal') {
  330.             $id $data->getInternal();
  331.             $type $data->getInternalType();
  332.             if (array_key_exists($type$idMapping) && array_key_exists($id$idMapping[$type])) {
  333.                 $data->setInternal($idMapping[$type][$id]);
  334.             }
  335.         }
  336.         return $data;
  337.     }
  338.     /**
  339.      *
  340.      * @param DataObject\Data\Link|null $oldValue
  341.      * @param DataObject\Data\Link|null $newValue
  342.      *
  343.      * @return bool
  344.      */
  345.     public function isEqual($oldValue$newValue): bool
  346.     {
  347.         if ($oldValue === null && $newValue === null) {
  348.             return true;
  349.         }
  350.         if ($oldValue instanceof DataObject\Data\Link) {
  351.             $oldValue $oldValue->getObjectVars();
  352.             //clear OwnerawareTrait fields
  353.             unset($oldValue['_owner']);
  354.             unset($oldValue['_fieldname']);
  355.             unset($oldValue['_language']);
  356.         }
  357.         if ($newValue instanceof DataObject\Data\Link) {
  358.             $newValue $newValue->getObjectVars();
  359.             //clear OwnerawareTrait fields
  360.             unset($newValue['_owner']);
  361.             unset($newValue['_fieldname']);
  362.             unset($newValue['_language']);
  363.         }
  364.         return $this->isEqualArray($oldValue$newValue);
  365.     }
  366.     /**
  367.      * {@inheritdoc}
  368.      */
  369.     public function getParameterTypeDeclaration(): ?string
  370.     {
  371.         return '?\\' DataObject\Data\Link::class;
  372.     }
  373.     /**
  374.      * {@inheritdoc}
  375.      */
  376.     public function getReturnTypeDeclaration(): ?string
  377.     {
  378.         return '?\\' DataObject\Data\Link::class;
  379.     }
  380.     /**
  381.      * {@inheritdoc}
  382.      */
  383.     public function getPhpdocInputType(): ?string
  384.     {
  385.         return '\\' DataObject\Data\Link::class . '|null';
  386.     }
  387.     /**
  388.      * {@inheritdoc}
  389.      */
  390.     public function getPhpdocReturnType(): ?string
  391.     {
  392.         return '\\' DataObject\Data\Link::class . '|null';
  393.     }
  394.     /**
  395.      * {@inheritdoc}
  396.      */
  397.     public function normalize($value$params = [])
  398.     {
  399.         if ($value instanceof DataObject\Data\Link) {
  400.             return $value->getObjectVars();
  401.         }
  402.         return null;
  403.     }
  404.     /**
  405.      * {@inheritdoc}
  406.      */
  407.     public function denormalize($value$params = [])
  408.     {
  409.         if (is_array($value)) {
  410.             $link = new DataObject\Data\Link();
  411.             $link->setValues($value);
  412.             return $link;
  413.         } elseif ($value instanceof DataObject\Data\Link) {
  414.             return $value;
  415.         }
  416.         return null;
  417.     }
  418. }