bundles/SalesAppBundle/Model/Document/Page.php line 21

Open in your IDE?
  1. <?php
  2. namespace SalesAppBundle\Model\Document;
  3. use Pimcore\Log\Simple;
  4. use Pimcore\Model\Asset\Image;
  5. use SalesAppBundle\Model\DataObject\Category;
  6. use Pimcore\Model\DataObject;
  7. use Pimcore\Model\DataObject\ShareItem;
  8. use Pimcore\Model\Document\Page as BasePage;
  9. use Pimcore\Model\Document\Editable\Area;
  10. use Pimcore\Model\Document\Editable\Areablock;
  11. use Pimcore\Model\Document;
  12. use Pimcore\Model\Element\Tag;
  13. use SalesAppBundle\Service\DataObject\DataComponents\Formatter\Image\SalesAppHotspotImageDataFormatter;
  14. use SalesAppBundle\Service\DataObject\DataComponents\Formatter\Image\SalesAppImageDataFormatter;
  15. use SalesAppBundle\Service\DataObject\DataComponents\Formatter\Image\SalesAppImageGalleryDataFormatter;
  16. use SalesAppBundle\Service\DataObject\DataComponents\Formatter\Relation\SalesAppDocumentDataFormatter;
  17. use WebAppBundle\Service\DataObject\DataObjectApiManager;
  18. class Page extends BasePage
  19. {
  20.     public function serializeData($language null)
  21.     {
  22.         $service = new Document\Service();
  23.         $translations $service->getTranslations($this);
  24.         $document $this;
  25.         $localizedDocument = (array_key_exists($language$translations)) ? Document::getById($translations[$language]) : null;
  26.         if($localizedDocument) {
  27.             $document $localizedDocument;
  28.         }
  29.         $backgroundImage $document->hasEditable('show-background-image') ? $document->getEditable('show-background-image')?->frontend() : 0;
  30.         $page = array(
  31.             'type' => 'page',
  32.             'id' => $document->getId(),
  33.             'previewData' => array(
  34.                 'title' =>
  35.                     ($document->getEditable('preview-title'))
  36.                         ? $document->getEditable('preview-title')->getValue()
  37.                         : "",
  38.             ),
  39.             'new' => ($document->getProperty('new')) ? $document->getProperty('new') : false,
  40.             'hidden' => ($document->getProperty('hidden')) ? $document->getProperty('hidden') : false,
  41.             'metadata' => array(
  42.                 'createdAt' => $document->getCreationDate(),
  43.                 'modifiedAt' => $document->getModificationDate(),
  44.                 'tags' => array()
  45.             ),
  46.             'openAs' => ($document->getEditable('open-as'))
  47.                 ? $document->getEditable('open-as')->getData()
  48.                 : "default",
  49.             'columns' => 1,
  50.             'contentElements' => array(),
  51.             'showBackgroundImage' => $backgroundImage,
  52.         );
  53.         $tags Tag::getTagsForElement('document'$document->getId());
  54.         foreach ($tags as $tag) {
  55.             $page['metadata']['tags'][] = $tag->getName();
  56.         }
  57.         /** @var Image $imageData */
  58.         $imageData = ($document->getEditable('preview-image')?->getImage()) ?: null;
  59.         $page['previewData']['image'] = array();
  60.         if($imageData) {
  61.             $page['previewData']['image'] = $imageData->serializeData($languagetrue);
  62.         }
  63.         // page media item
  64.         $pageMediaItem $document->getEditable('pageMediaItem');
  65.         if($pageMediaItem && $pageMediaItem->getCount() > 0) {
  66.             $page['columns'] = 2;
  67.             foreach ($pageMediaItem->getData() as $mediaItem) {
  68.                 $page['contentElements'][] =
  69.                     $this->serializeBrickData(
  70.                         $document,
  71.                         'pageMediaItem',
  72.                         $mediaItem['type'],
  73.                         $mediaItem['key'],
  74.                         0,
  75.                         $language
  76.                     );
  77.             }
  78.         }
  79.         // Content
  80.         $contentElements $document->getEditable('contentElements');
  81.         if($contentElements instanceof Areablock) {
  82.             foreach ($contentElements->getData() as $contentElement) {
  83.                 $page['contentElements'][] =
  84.                     $this->serializeBrickData(
  85.                         $document,
  86.                         'contentElements',
  87.                         $contentElement['type'],
  88.                         $contentElement['key'],
  89.                         ($page['columns'] == 1),
  90.                         $language
  91.                     );
  92.             }
  93.         } elseif($contentElements instanceof Area) {
  94.             if($contentElements->getElement('url')) {
  95.                 $page['contentElements'][] = $this->serializeBrickData(
  96.                     $document,
  97.                     'contentElements',
  98.                     'externalSite',
  99.                     1,
  100.                     0,
  101.                     $language
  102.                 );
  103.             } elseif (($contentElements->getElement('document'))) {
  104.                 $page['contentElements'][] = $this->serializeBrickData(
  105.                     $document,
  106.                     'contentElements',
  107.                     'document',
  108.                     1,
  109.                     0,
  110.                     $language
  111.                 );
  112.             } elseif (($contentElements->getElement('integratedApp'))) {
  113.                 $page['contentElements'][] = $this->serializeBrickData(
  114.                     $document,
  115.                     'contentElements',
  116.                     'integratedApp',
  117.                     1,
  118.                     0,
  119.                     $language
  120.                 );
  121.             } elseif (($contentElements->getElement('productTile'))) {
  122.                 $page['contentElements'][] = $this->serializeBrickData(
  123.                     $document,
  124.                     'contentElements',
  125.                     'productTile',
  126.                     1,
  127.                     0,
  128.                     $language
  129.                 );
  130.             }
  131.         }
  132.         return $page;
  133.     }
  134.     public function serializeBrickData($document$element$type$key$col 0$language null)
  135.     {
  136.         $serializedData = array();
  137.         switch ($type) {
  138.             case 'headline':
  139.                 $serializedData = array(
  140.                     'type' => 'headline',
  141.                     'mimeType' => "text/plain",
  142.                     'value' => $document->getEditable($element ':' $key "." $type)->getValue()
  143.                 );
  144.                 break;
  145.             case 'subHeadline':
  146.                 $serializedData = array(
  147.                     'type' => 'subHeadline',
  148.                     'mimeType' => "text/plain",
  149.                     'value' => $document->getEditable($element ':' $key "." $type)->getValue()
  150.                 );
  151.                 break;
  152.             case 'subline':
  153.                 $serializedData = array(
  154.                     'type' => 'subline',
  155.                     'mimeType' => "text/plain",
  156.                     'value' => $document->getEditable($element ':' $key "." $type)->getValue()
  157.                 );
  158.                 break;
  159.             case 'text':
  160.                 $serializedData = array(
  161.                     'type' => 'text',
  162.                     'mimeType' => "text/html",
  163.                     'value' => $document->getEditable($element ':' $key "." $type)->getValue()
  164.                 );
  165.                 break;
  166.             case 'image':
  167.                 $serializedData = array(
  168.                     'type' => 'image',
  169.                     'mimeType' => "image",
  170.                     'layout' => ($document->getEditable($element ':' $key ".layout"))
  171.                         ? $document->getEditable($element ':' $key ".layout")->getValue()
  172.                         : "default",
  173.                     'title' => ($document->getEditable($element ':' $key ".title"))
  174.                         ? $document->getEditable($element ':' $key ".title")->getValue()
  175.                         : ""
  176.                 );
  177.                 $imageElement $document->getEditable($element ':' $key "." $type);
  178.                 $serializedData['value'] = $imageElement?->getImage()?->serializeData($language);
  179.                 break;
  180.             case 'video':
  181.                 $serializedData = array(
  182.                     'type' => 'video',
  183.                     'mimeType' => "video",
  184.                     'layout' => ($document->getEditable($element ':' $key ".layout"))
  185.                         ? $document->getEditable($element ':' $key ".layout")->getValue()
  186.                         : "default",
  187.                     'controls' => ($document->getEditable($element ':' $key ".controls"))
  188.                         ? $document->getEditable($element ':' $key ".controls")->isChecked()
  189.                         : false,
  190.                     'autoplay' => ($document->getEditable($element ':' $key ".autoplay"))
  191.                         ? $document->getEditable($element ':' $key ".autoplay")->isChecked()
  192.                         : false,
  193.                     'loop' => ($document->getEditable($element ':' $key ".loop"))
  194.                         ? $document->getEditable($element ':' $key ".loop")->isChecked()
  195.                         : false,
  196.                     'muted' => ($document->getEditable($element ':' $key ".muted"))
  197.                         ? $document->getEditable($element ':' $key ".muted")->isChecked()
  198.                         : false,
  199.                     'value' => $document->getEditable($element ':' $key "." $type)->getVideoAsset()->serializeData($language),
  200.                     'poster' => ($document->getEditable($element ':' $key "." $type)->getPosterAsset())
  201.                         ? $document->getEditable($element ':' $key "." $type)->getPosterAsset()->serializeData($language)
  202.                         : null
  203.                 );
  204.                 break;
  205.             case 'textImage':
  206.                 $serializedData = array(
  207.                     'type' => 'textImage',
  208.                     'mimeType' => "multipart/mixed",
  209.                     'imagePosition' => ($document->getEditable($element ':' $key ".image-position"))
  210.                         ? $document->getEditable($element ':' $key ".image-position")->getValue()
  211.                         : "left",
  212.                     'text' => $document->serializeBrickData($document$element"text"$key),
  213.                     'image' => $document->serializeBrickData($document$element"image"$key)
  214.                 );
  215.                 break;
  216.             case 'externalSite':
  217.                 $serializedData = array(
  218.                     'type' => 'externalSite',
  219.                     'mimeType' => "text/plain",
  220.                     'value' => $document->getEditable($element ':' $key ".url")->getValue()
  221.                 );
  222.                 break;
  223.             case 'document':
  224.                 $docElement $document->getEditable($element ':' $key "." $type)->getElement();
  225.                 $serializedData = array(
  226.                     'type' => 'document',
  227.                     'mimeType' => "document",
  228.                     'value' => $docElement $docElement->serializeData($language) : null
  229.                 );
  230.                 break;
  231.             case 'hotspot':
  232.                 $serializedData = array(
  233.                     'type' => 'hotspot',
  234.                     'mimeType' => "hotspot",
  235.                     'layout' => ($document->getEditable($element ':' $key ".layout"))
  236.                         ? $document->getEditable($element ':' $key ".layout")->getValue()
  237.                         : "default",
  238.                     'video' => null,
  239.                     'hotspots' => array()
  240.                 );
  241.                 $imageElement $document->getEditable($element ':' $key ".image");
  242.                 $serializedData['image'] = $imageElement->getImage()->serializeData($language);
  243.                 if($imageElement->getHotspots() && count($imageElement->getHotspots()) > 0) {
  244.                     $serializedData['hotspots'] = $imageElement->getHotspots();
  245.                 }
  246.                 $videoElement $this->getEditable($element ':' $key ".video");
  247.                 if($videoElement->getVideoAsset()) {
  248.                     $serializedData['video'] = $videoElement->getVideoAsset()->serializeData($language);
  249.                 }
  250.                 break;
  251.             case 'facts':
  252.                 $serializedData = array(
  253.                     'type' => 'facts',
  254.                     'mimeType' => "facts",
  255.                     'values' => array()
  256.                 );
  257.                 $factsElement $document->getEditable($element ':' $key "." $type);
  258.                 foreach ($factsElement->getElements() as $factElement) {
  259.                     $serializedData['values'][] =
  260.                         array(
  261.                             "label" => $factElement->getInput('label')->getValue(),
  262.                             "value" => (float) $factElement->getNumeric('value')->getValue(),
  263.                             "prefix" => $factElement->getInput('prefix')->getValue(),
  264.                             "suffix" => $factElement->getInput('suffix')->getValue(),
  265.                             "decimalPlaces" => (int) $factElement->getNumeric('decimalPlaces')->getValue(),
  266.                             "startValue" => (float) $factElement->getNumeric('startValue')->getValue(),
  267.                         );
  268.                 }
  269.                 break;
  270.             case 'teaserBox':
  271.                 $serializedData = array(
  272.                     'type' => 'teaserBox',
  273.                     'mimeType' => "teaserBox",
  274.                     'teasers' => array()
  275.                 );
  276.                 $teasersElement $document->getEditable($element ':' $key "." $type);
  277.                 foreach ($teasersElement->getElements() as $teaserElement) {
  278.                     if(is_object($teaserElement->getImage('image')->getImage())) {
  279.                         $serializedData['teasers'][] =
  280.                             array(
  281.                                 "image" => $teaserElement->getImage('image')->getImage()->serializeData($language),
  282.                                 "title" => $teaserElement->getInput('title')->getValue(),
  283.                                 "link" => ($teaserElement->getRelation('link')->getElement())
  284.                                     ? $teaserElement->getRelation('link')->getElement()->getId()
  285.                                     : null
  286.                             );
  287.                     }
  288.                 }
  289.                 break;
  290.             case 'button':
  291.                 $serializedData = array(
  292.                     'type' => 'button',
  293.                     'mimeType' => "text/plain",
  294.                     'link' => ($document->getEditable($element ':' $key ".link"))
  295.                         ? $document->getEditable($element ':' $key ".link")?->getElement()?->getId()
  296.                         : null,
  297.                     'title' => ($document->getEditable($element ':' $key ".title"))
  298.                         ? $document->getEditable($element ':' $key ".title")?->getValue()
  299.                         : "",
  300.                 );
  301.                 break;
  302.             case 'youtube':
  303.                 $serializedData = array(
  304.                     'type' => 'youtube',
  305.                     'mimeType' => "text/plain",
  306.                     'value' => $document->getEditable($element ':' $key "." $type)->getValue()
  307.                 );
  308.                 break;
  309.             case 'slider':
  310.                 $serializedData = array(
  311.                     'type' => 'slider',
  312.                     'mimeType' => "multipart/mixed",
  313.                     'values' => array(),
  314.                     'layout' => ($document->getEditable($element ':' $key ".layout"))
  315.                         ? $document->getEditable($element ':' $key ".layout")->getValue()
  316.                         : "default",
  317.                     'title' => ($document->getEditable($element ':' $key ".title"))
  318.                         ? $document->getEditable($element ':' $key ".title")->getValue()
  319.                         : ""
  320.                 );
  321.                 $sliderElement $document->getEditable($element ':' $key ".values");
  322.                 foreach ($sliderElement->getElements() as $sliderElement) {
  323.                     if(is_object($sliderElement->getImage('image')->getImage())) {
  324.                         $serializedData['values'][] =
  325.                             $sliderElement->getImage('image')->getImage()->serializeData($language);
  326.                     }
  327.                 }
  328.                 break;
  329.             case 'integratedApp':
  330.                 $serializedData = array(
  331.                     'type' => 'integratedApp',
  332.                     'mimeType' => "application/zip",
  333.                     'value' => $document->getEditable($element ':' $key "." $type)->getElement()->serializeData($language)
  334.                 );
  335.                 break;
  336.             case 'productTile':
  337.                 $apiManager = new DataObjectApiManager();
  338.                 $contentElements $document->getEditable('contentElements');
  339.                 /** @var Document\Editable\Relation $productTileEditable */
  340.                 $productTileEditable $contentElements->getElement('productTile');
  341.                 /** @var DataObject\ProductTile $productTile */
  342.                 $productTile $productTileEditable->getElement();
  343.                 $params = [
  344.                     'formatters' => [
  345.                         'mainImage' => new SalesAppHotspotImageDataFormatter(),
  346.                         'teaserImage' => new SalesAppHotspotImageDataFormatter(),
  347.                         'ogImage' => new SalesAppHotspotImageDataFormatter(),
  348.                         'twitterImage' => new SalesAppHotspotImageDataFormatter(),
  349.                         'sliderImages' => new SalesAppImageGalleryDataFormatter(),
  350.                         'detailImages' => new SalesAppImageGalleryDataFormatter(),
  351.                         'image' => new SalesAppImageDataFormatter(),
  352.                         'brochures' => new SalesAppDocumentDataFormatter(),
  353.                         'caseStudies' => new SalesAppDocumentDataFormatter(),
  354.                     ]
  355.                 ];
  356.                 $serializedData = [
  357.                     'type' => 'productTile',
  358.                     'mimeType' => "application/json"
  359.                 ];
  360.                 if ($productTile) {
  361.                     $serializedData['productTile'] = $apiManager->getDataObjectData($productTile$language, [], [], $params);
  362.                 } else {
  363.                     $serializedData['productTile'] = [];
  364.                 }
  365.                 break;
  366.         }
  367.         $serializedData['col'] = $col;
  368.         return $serializedData;
  369.     }
  370.     public function getShareableData($bookmarkListId$language)
  371.     {
  372.         $shareableData $this->getEditable('preview-title');
  373.         if($this->getEditable('web-reference-url')) {
  374.             if($this->getEditable('web-reference-url') != "") {
  375.                 $shareableData '<a href="' $this->getEditable('web-reference-url') . '">' $shareableData '</a>';
  376.             } else {
  377.                 $shareableData null;
  378.             }
  379.         } elseif($this->getEditable('contentElements:1.url')) {
  380.             if($this->getEditable('contentElements:1.url') != "") {
  381.                 $shareableData '<a href="' $this->getEditable('contentElements:1.url') . '">' $shareableData '</a>';
  382.             } else {
  383.                 $shareableData null;
  384.             }
  385.         } elseif($this->getEditable('contentElements:1.document')) {
  386.             $newShareItem = new ShareItem();
  387.             $newShareItem->setUid(bin2hexrandom_bytes(24) ));
  388.             $expiryDate = new \DateTime();
  389.             $expiryDate->modify('+14 days');
  390.             $newShareItem->setExpiryDate($expiryDate);
  391.             $newShareItem->setPage($this);
  392.             $newShareItem->setParentId($bookmarkListId);
  393.             $newShareItem->setKey(\Pimcore\File::getValidFilename(
  394.                 "shareItem_" $newShareItem->getUid())
  395.             );
  396.             $newShareItem->setPublished(true);
  397.             $newShareItem->save();
  398.             $shareableData '<a href="' \Pimcore\Tool::getHostUrl('https') . '/share/' $newShareItem->getUid() . '">' $shareableData '</a>';
  399.         } else {
  400.             $shareableData null;
  401.         }
  402.         return $shareableData;
  403.     }
  404.     public function getPlainShareableData($bookmarkListId$language): ?string
  405.     {
  406.         $shareableData $this->getEditable('preview-title');
  407.         if($this->getEditable('web-reference-url')) {
  408.             if($this->getEditable('web-reference-url') != "") {
  409.                 // $shareableData = '<a href="' . $this->getElement('web-reference-url') . '">' . $shareableData . '</a>';
  410.                 $shareableData $shareableData.': '.$this->getEditable('web-reference-url').' %0D%0A';
  411.             } else {
  412.                 $shareableData null;
  413.             }
  414.         } elseif($this->getEditable('contentElements:1.url')) {
  415.             if($this->getEditable('contentElements:1.url') != "") {
  416.                 // $shareableData = '<a href="' . $this->getElement('contentElements:1.url') . '">' . $shareableData . '</a>';
  417.                 $shareableData $shareableData.': '.$this->getEditable('contentElements:1.url').' %0D%0A';
  418.             } else {
  419.                 $shareableData null;
  420.             }
  421.         } elseif($this->getEditable('contentElements:1.document')) {
  422.             $newShareItem = new ShareItem();
  423.             $newShareItem->setUid(bin2hexrandom_bytes(24) ));
  424.             $expiryDate = new \DateTime();
  425.             $expiryDate->modify('+14 days');
  426.             $newShareItem->setExpiryDate($expiryDate);
  427.             $newShareItem->setPage($this);
  428.             $newShareItem->setParentId($bookmarkListId);
  429.             $newShareItem->setKey(\Pimcore\File::getValidFilename(
  430.                 "shareItem_" $newShareItem->getUid())
  431.             );
  432.             $newShareItem->setPublished(true);
  433.             $newShareItem->save();
  434.             //$shareableData = '<a href="' . \Pimcore\Tool::getHostUrl('https') . '/share/' . $newShareItem->getUid() . '">' . $shareableData . '</a>';
  435.             $shareableData $shareableData.': '.\Pimcore\Tool::getHostUrl('https') . '/share/' $newShareItem->getUid().' %0D%0A';
  436.         } else {
  437.             $shareableData null;
  438.         }
  439.         return $shareableData;
  440.     }
  441.     public function getContextList() {
  442.         $contexts = array();
  443.         $dependencies $this->getDependencies();
  444.         foreach ($dependencies->getRequiredBy() as $requiredBy) {
  445.             if($requiredBy['type'] == 'object') {
  446.                 $object DataObject::getById($requiredBy['id']);
  447.                 if($object instanceof Category) {
  448.                     $def $object->getClass()->getFieldDefinition("contexts");
  449.                     $refKey $def->getOwnerFieldName();
  450.                     $refId $def->getOwnerClassId();
  451.                     $nonOwnerRelations $object->getRelationData($refKeyfalse$refId);
  452.                     foreach($nonOwnerRelations as $nonOwnerRelation) {
  453.                         if($nonOwnerRelation['subtype'] == "Context") {
  454.                             $contexts[$nonOwnerRelation['id']] = $nonOwnerRelation['id'];
  455.                         }
  456.                     }
  457.                 }
  458.             }
  459.         }
  460.         return $contexts;
  461.     }
  462. }