vendor/pimcore/pimcore/models/Document/Editable/Area.php line 29

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\Editable;
  15. use Pimcore\Document\Editable\Block\BlockName;
  16. use Pimcore\Document\Editable\EditableHandler;
  17. use Pimcore\Extension\Document\Areabrick\AreabrickManagerInterface;
  18. use Pimcore\Extension\Document\Areabrick\EditableDialogBoxInterface;
  19. use Pimcore\Model;
  20. use Pimcore\Templating\Renderer\EditableRenderer;
  21. use Pimcore\Tool\HtmlUtils;
  22. /**
  23.  * @method \Pimcore\Model\Document\Editable\Dao getDao()
  24.  */
  25. class Area extends Model\Document\Editable
  26. {
  27.     /**
  28.      * {@inheritdoc}
  29.      */
  30.     public function getType()
  31.     {
  32.         return 'area';
  33.     }
  34.     /**
  35.      * {@inheritdoc}
  36.      */
  37.     public function getData()
  38.     {
  39.         return null;
  40.     }
  41.     /**
  42.      * {@inheritdoc}
  43.      */
  44.     public function admin()
  45.     {
  46.         $attributes $this->getEditmodeElementAttributes();
  47.         $attributeString HtmlUtils::assembleAttributeString($attributes);
  48.         $this->outputEditmode('<div ' $attributeString '>');
  49.         $this->frontend();
  50.         $this->outputEditmode('</div>');
  51.     }
  52.     /**
  53.      * @param array $config
  54.      * @param EditableRenderer $editableRenderer
  55.      * @param string $dialogId
  56.      */
  57.     private function renderDialogBoxEditables(array $configEditableRenderer $editableRendererstring $dialogId)
  58.     {
  59.         if (isset($config['items']) && is_array($config['items'])) {
  60.             // layout component
  61.             foreach ($config['items'] as $child) {
  62.                 $this->renderDialogBoxEditables($child$editableRenderer$dialogId);
  63.             }
  64.         } elseif (isset($config['name']) && isset($config['type'])) {
  65.             $editable $editableRenderer->getEditable($this->getDocument(), $config['type'], $config['name'], $config['config'] ?? []);
  66.             if (!$editable instanceof Model\Document\Editable) {
  67.                 throw new \Exception(sprintf('Invalid editable type "%s" configured for Dialog Box'$config['type']));
  68.             }
  69.             $editable->setInDialogBox($dialogId);
  70.             $editable->addConfig('dialogBoxConfig'$config);
  71.             $this->outputEditmode($editable->render());
  72.         } elseif (is_array($config) && isset($config[0])) {
  73.             foreach ($config as $item) {
  74.                 $this->renderDialogBoxEditables($item$editableRenderer$dialogId);
  75.             }
  76.         }
  77.     }
  78.     private function buildInfoObject(): Area\Info
  79.     {
  80.         $config $this->getConfig();
  81.         // create info object and assign it to the view
  82.         try {
  83.             $info = new Area\Info();
  84.             $info->setId($config['type']);
  85.             $info->setEditable($this);
  86.             $info->setIndex(0);
  87.         } catch (\Exception $e) {
  88.             $info null;
  89.         }
  90.         $params = [];
  91.         if (isset($config['params']) && is_array($config['params']) && array_key_exists($config['type'], $config['params'])) {
  92.             if (is_array($config['params'][$config['type']])) {
  93.                 $params $config['params'][$config['type']];
  94.             }
  95.         }
  96.         if (isset($config['globalParams'])) {
  97.             $params array_merge($config['globalParams'], (array)$params);
  98.         }
  99.         $info->setParams($params);
  100.         return $info;
  101.     }
  102.     /**
  103.      * {@inheritdoc}
  104.      */
  105.     public function frontend()
  106.     {
  107.         $config $this->getConfig();
  108.         // TODO inject area handler via DI when editables are built by container
  109.         $editableHandler \Pimcore::getContainer()->get(EditableHandler::class);
  110.         // don't show disabled bricks
  111.         if (!$editableHandler->isBrickEnabled($this$config['type'] && ($config['dontCheckEnabled'] ?? false) !== true)) {
  112.             return;
  113.         }
  114.         // push current block name
  115.         $blockState $this->getBlockState();
  116.         $blockState->pushBlock(BlockName::createFromEditable($this));
  117.         // create info object and assign it to the view
  118.         $info $this->buildInfoObject();
  119.         // start at first index
  120.         $blockState->pushIndex(1);
  121.         $areabrickManager \Pimcore::getContainer()->get(AreabrickManagerInterface::class);
  122.         $dialogConfig null;
  123.         $brick $areabrickManager->getBrick($this->config['type']);
  124.         $info $this->buildInfoObject();
  125.         if ($this->getEditmode() && $brick instanceof EditableDialogBoxInterface) {
  126.             $dialogConfig $brick->getEditableDialogBoxConfiguration($this$info);
  127.             if ($dialogConfig->getItems()) {
  128.                 $dialogConfig->setId('dialogBox-' $this->getName());
  129.             } else {
  130.                 $dialogConfig null;
  131.             }
  132.         }
  133.         if ($dialogConfig) {
  134.             $attributes $this->getEditmodeElementAttributes();
  135.             $dialogAttributes = [
  136.                 'data-dialog-id' => $dialogConfig->getId(),
  137.             ];
  138.             $dialogAttributes HtmlUtils::assembleAttributeString($dialogAttributes);
  139.             $this->outputEditmode('<div class="pimcore_area_dialog" data-name="' $attributes['data-name'] . '" data-real-name="' $attributes['data-real-name'] . '" ' $dialogAttributes '></div>');
  140.         }
  141.         $params = [];
  142.         if (isset($config['params']) && is_array($config['params']) && array_key_exists($config['type'], $config['params'])) {
  143.             if (is_array($config['params'][$config['type']])) {
  144.                 $params $config['params'][$config['type']];
  145.             }
  146.         }
  147.         $info->setParams($params);
  148.         if ($dialogConfig) {
  149.             $editableRenderer \Pimcore::getContainer()->get(EditableRenderer::class);
  150.             $this->outputEditmode('<template id="dialogBoxConfig-' $dialogConfig->getId() . '">' \json_encode($dialogConfig) . '</template>');
  151.             $this->renderDialogBoxEditables($dialogConfig->getItems(), $editableRenderer$dialogConfig->getId());
  152.         }
  153.         echo $editableHandler->renderAreaFrontend($info);
  154.         // remove current block and index from stack
  155.         $blockState->popIndex();
  156.         $blockState->popBlock();
  157.     }
  158.     /**
  159.      * {@inheritdoc}
  160.      */
  161.     public function setDataFromResource($data)
  162.     {
  163.         return $this;
  164.     }
  165.     /**
  166.      * {@inheritdoc}
  167.      */
  168.     public function setDataFromEditmode($data)
  169.     {
  170.         return $this;
  171.     }
  172.     /**
  173.      * {@inheritdoc}
  174.      */
  175.     public function isEmpty()
  176.     {
  177.         return false;
  178.     }
  179.     /**
  180.      * Gets an element from the referenced brick. E.g. if you have an area "myArea" which defines "gallery-single-images"
  181.      * as used areabrick and this areabrick defines a block "gallery", you can use $area->getElement('gallery') to get
  182.      * an instance of the block element.
  183.      *
  184.      * @param string $name
  185.      *
  186.      * @return Model\Document\Editable
  187.      */
  188.     public function getElement(string $name)
  189.     {
  190.         $document $this->getDocument();
  191.         $parentBlockNames $this->getParentBlockNames();
  192.         $parentBlockNames[] = $this->getName();
  193.         $id Model\Document\Editable::buildChildEditableName($name'area'$parentBlockNames1);
  194.         $editable $document->getEditable($id);
  195.         if ($editable) {
  196.             $editable->setParentBlockNames($parentBlockNames);
  197.         }
  198.         return $editable;
  199.     }
  200. }