vendor/pimcore/pimcore/models/Document/Editable/Block.php line 27

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\Document\Editable\Block\BlockName;
  19. use Pimcore\Model;
  20. use Pimcore\Tool\HtmlUtils;
  21. /**
  22.  * @method \Pimcore\Model\Document\Editable\Dao getDao()
  23.  */
  24. class Block extends Model\Document\Editable implements BlockInterface
  25. {
  26.     /**
  27.      * Contains an array of indices, which represent the order of the elements in the block
  28.      *
  29.      * @var array
  30.      */
  31.     public $indices = [];
  32.     /**
  33.      * Current step of the block while iteration
  34.      *
  35.      * @var int
  36.      */
  37.     public $current 0;
  38.     /**
  39.      * @var string[]
  40.      */
  41.     public $suffixes = [];
  42.     /**
  43.      * @see EditableInterface::getType
  44.      *
  45.      * @return string
  46.      */
  47.     public function getType()
  48.     {
  49.         return 'block';
  50.     }
  51.     /**
  52.      * @see EditableInterface::getData
  53.      *
  54.      * @return mixed
  55.      */
  56.     public function getData()
  57.     {
  58.         return $this->indices;
  59.     }
  60.     /**
  61.      * @see EditableInterface::admin
  62.      */
  63.     public function admin()
  64.     {
  65.         // nothing to do
  66.         return '';
  67.     }
  68.     /**
  69.      * @see EditableInterface::frontend
  70.      */
  71.     public function frontend()
  72.     {
  73.         // nothing to do
  74.         return '';
  75.     }
  76.     /**
  77.      * @see EditableInterface::setDataFromResource
  78.      *
  79.      * @param mixed $data
  80.      *
  81.      * @return $this
  82.      */
  83.     public function setDataFromResource($data)
  84.     {
  85.         $this->indices = \Pimcore\Tool\Serialize::unserialize($data);
  86.         return $this;
  87.     }
  88.     /**
  89.      * @see EditableInterface::setDataFromEditmode
  90.      *
  91.      * @param mixed $data
  92.      *
  93.      * @return $this
  94.      */
  95.     public function setDataFromEditmode($data)
  96.     {
  97.         $this->indices $data;
  98.         return $this;
  99.     }
  100.     /**
  101.      * @return $this
  102.      */
  103.     public function setDefault()
  104.     {
  105.         if (empty($this->indices) && isset($this->config['default']) && $this->config['default']) {
  106.             for ($i 0$i intval($this->config['default']); $i++) {
  107.                 $this->indices[$i] = $i 1;
  108.             }
  109.         }
  110.         return $this;
  111.     }
  112.     /**
  113.      * Loops through the block
  114.      *
  115.      * @return bool
  116.      */
  117.     public function loop()
  118.     {
  119.         $manual false;
  120.         if (($this->config['manual'] ?? false) == true) {
  121.             $manual true;
  122.         }
  123.         $this->setDefault();
  124.         if ($this->current 0) {
  125.             if (!$manual) {
  126.                 $this->blockDestruct();
  127.                 $this->blockEnd();
  128.             }
  129.         } else {
  130.             if (!$manual) {
  131.                 $this->start();
  132.             }
  133.         }
  134.         if ($this->current count($this->indices) && $this->current $this->config['limit']) {
  135.             if (!$manual) {
  136.                 $this->blockConstruct();
  137.                 $this->blockStart();
  138.             }
  139.             return true;
  140.         } else {
  141.             if (!$manual) {
  142.                 $this->end();
  143.             }
  144.             return false;
  145.         }
  146.     }
  147.     /**
  148.      * @inheritDoc
  149.      */
  150.     protected function getEditmodeElementAttributes(array $options): array
  151.     {
  152.         $attributes parent::getEditmodeElementAttributes($options);
  153.         $attributes array_merge($attributes, [
  154.             'name' => $this->getName(),
  155.             'type' => $this->getType(),
  156.         ]);
  157.         return $attributes;
  158.     }
  159.     /**
  160.      * Is executed at the beginning of the loop and setup some general settings
  161.      *
  162.      * @return $this
  163.      */
  164.     public function start()
  165.     {
  166.         $options $this->getEditmodeOptions();
  167.         $this->outputEditmodeOptions($options);
  168.         // set name suffix for the whole block element, this will be added to all child elements of the block
  169.         $this->getBlockState()->pushBlock(BlockName::createFromEditable($this));
  170.         $attributes $this->getEditmodeElementAttributes($options);
  171.         $attributeString HtmlUtils::assembleAttributeString($attributes);
  172.         $this->outputEditmode('<div ' $attributeString '>');
  173.         return $this;
  174.     }
  175.     /**
  176.      * Is executed at the end of the loop and removes the settings set in start()
  177.      */
  178.     public function end()
  179.     {
  180.         $this->current 0;
  181.         // remove the current block which was set by $this->start()
  182.         $this->getBlockState()->popBlock();
  183.         $this->outputEditmode('</div>');
  184.     }
  185.     /**
  186.      * Called before the block is rendered
  187.      */
  188.     public function blockConstruct()
  189.     {
  190.         // set the current block suffix for the child elements (0, 1, 3, ...)
  191.         // this will be removed in blockDestruct
  192.         $this->getBlockState()->pushIndex($this->indices[$this->current]);
  193.     }
  194.     /**
  195.      * Called when the block was rendered
  196.      */
  197.     public function blockDestruct()
  198.     {
  199.         $this->getBlockState()->popIndex();
  200.     }
  201.     /**
  202.      * Is called evertime a new iteration starts (new entry of the block while looping)
  203.      *
  204.      * @param bool $showControls
  205.      */
  206.     public function blockStart($showControls true)
  207.     {
  208.         $attr $this->getBlockAttributes();
  209.         $outerAttributes = [
  210.             'key' => $this->indices[$this->current],
  211.         ];
  212.         $oAttr HtmlUtils::assembleAttributeString($outerAttributes);
  213.         // outer element
  214.         $this->outputEditmode('<div class="pimcore_block_entry" ' $oAttr ' ' $attr '>');
  215.         if ($showControls) {
  216.             $this->blockControls();
  217.         }
  218.     }
  219.     /**
  220.      * Custom position of button controls between blockStart -> blockEnd
  221.      */
  222.     public function blockControls()
  223.     {
  224.         $attr $this->getBlockAttributes();
  225.         $this->outputEditmode('<div class="pimcore_block_buttons" ' $attr '>');
  226.         $this->outputEditmode('<div class="pimcore_block_amount" ' $attr '></div>');
  227.         $this->outputEditmode('<div class="pimcore_block_plus" ' $attr '></div>');
  228.         $this->outputEditmode('<div class="pimcore_block_minus" ' $attr '></div>');
  229.         $this->outputEditmode('<div class="pimcore_block_up" ' $attr '></div>');
  230.         $this->outputEditmode('<div class="pimcore_block_down" ' $attr '></div>');
  231.         $this->outputEditmode('<div class="pimcore_block_clear" ' $attr '></div>');
  232.         $this->outputEditmode('</div>'); // .pimcore_block_buttons
  233.         $this->current++;
  234.     }
  235.     /**
  236.      * Is called evertime a new iteration ends (new entry of the block while looping)
  237.      */
  238.     public function blockEnd()
  239.     {
  240.         // close outer element
  241.         $this->outputEditmode('</div>');
  242.     }
  243.     /**
  244.      * @param array $config
  245.      *
  246.      * @return $this
  247.      */
  248.     public function setConfig($config)
  249.     {
  250.         if (empty($config['limit'])) {
  251.             $config['limit'] = 1000000;
  252.         }
  253.         $this->config $config;
  254.         return $this;
  255.     }
  256.     /**
  257.      * Return the amount of block elements
  258.      *
  259.      * @return int
  260.      */
  261.     public function getCount()
  262.     {
  263.         return count($this->indices);
  264.     }
  265.     /**
  266.      * Return current iteration step
  267.      *
  268.      * @return int
  269.      */
  270.     public function getCurrent()
  271.     {
  272.         return $this->current 1;
  273.     }
  274.     /**
  275.      * Return current index
  276.      *
  277.      * @return int
  278.      */
  279.     public function getCurrentIndex()
  280.     {
  281.         return $this->indices[$this->getCurrent()];
  282.     }
  283.     /**
  284.      * If object was serialized, set the counter back to 0
  285.      */
  286.     public function __wakeup()
  287.     {
  288.         $this->current 0;
  289.     }
  290.     /**
  291.      * @return bool
  292.      */
  293.     public function isEmpty()
  294.     {
  295.         return !(bool) count($this->indices);
  296.     }
  297.     /**
  298.      * @deprecated
  299.      *
  300.      * @param Model\Webservice\Data\Document\Element $wsElement
  301.      * @param Model\Document\PageSnippet $document
  302.      * @param array $params
  303.      * @param Model\Webservice\IdMapperInterface|null $idMapper
  304.      *
  305.      * @throws \Exception
  306.      */
  307.     public function getFromWebserviceImport($wsElement$document null$params = [], $idMapper null)
  308.     {
  309.         $data $this->sanitizeWebserviceData($wsElement->value);
  310.         if (($data->indices === null or is_array($data->indices)) and ($data->current == null or is_numeric($data->current))) {
  311.             $this->indices $data->indices;
  312.             $this->current $data->current;
  313.         } else {
  314.             throw new \Exception('cannot get  values from web service import - invalid data');
  315.         }
  316.     }
  317.     /**
  318.      * @return Block\Item[]
  319.      */
  320.     public function getElements()
  321.     {
  322.         $document $this->getDocument();
  323.         // https://github.com/pimcore/pimcore/issues/6629
  324.         if (!$document instanceof Model\Document\PageSnippet) {
  325.             return [];
  326.         }
  327.         $parentBlockNames $this->getParentBlockNames();
  328.         $parentBlockNames[] = $this->getName();
  329.         $list = [];
  330.         foreach ($this->getData() as $index) {
  331.             $list[] = new Block\Item($document$parentBlockNames, (int)$index);
  332.         }
  333.         return $list;
  334.     }
  335.     /**
  336.      * @return string
  337.      */
  338.     private function getBlockAttributes(): string
  339.     {
  340.         $attributes = [
  341.             'data-name' => $this->getName(),
  342.             'data-real-name' => $this->getRealName(),
  343.         ];
  344.         return HtmlUtils::assembleAttributeString($attributes);
  345.     }
  346. }
  347. class_alias(Block::class, 'Pimcore\Model\Document\Tag\Block');