doghouse_menu-3.0.x-dev/modules/doghouse_megamenu/src/Plugin/Block/DoghouseMegaMenuBlock.php

modules/doghouse_megamenu/src/Plugin/Block/DoghouseMegaMenuBlock.php
<?php

namespace Drupal\doghouse_megamenu\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Entity\EntityTypeManager;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Menu\MenuLinkTreeInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Menu\MenuLinkManagerInterface;

/**
 * Provides a 'DoghouseMegaMenuBlock' block.
 *
 * @Block(
 *  id = "doghouse_mega_menu_block",
 *  admin_label = @Translation("Doghouse mega menu block"),
 * )
 */
class DoghouseMegaMenuBlock extends BlockBase implements ContainerFactoryPluginInterface {

    /**
     * Drupal\Core\Menu\MenuLinkTreeInterface definition.
     *
     * @var \Drupal\Core\Menu\MenuLinkTreeInterface
     */
    protected $menuLinkTree;

    /**
     * Drupal\Core\Menu\MenuLinkManagerInterface definition.
     *
     * @var \Drupal\Core\Menu\MenuLinkManagerInterface
    */
    protected $menuLinkManager;

    /**
     * @var \Drupal\Core\Entity\EntityTypeManager
     */
    private $entityTypeManager;

    /**
     * Constructs a new DoghouseMegaMenuBlock object.
     *
     * @param array $configuration
     *   A configuration array containing information about the plugin instance.
     * @param string $plugin_id
     *   The plugin_id for the plugin instance.
     * @param string $plugin_definition
     *   The plugin implementation definition.
     * @param \Drupal\Core\Menu\MenuLinkTreeInterface $menu_link_tree
     *   The MenuLinkTreeInterface definition.
     * @param \Drupal\Core\Menu\MenuLinkManagerInterface $menuLinkManager
     *   The EntityTypeManager definition.
     * @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager
     */
    public function __construct(
        array $configuration,
        $plugin_id,
        $plugin_definition,
        MenuLinkTreeInterface $menu_link_tree,
        MenuLinkManagerInterface $menuLinkManager,
        EntityTypeManager $entity_type_manager
    ) {
        parent::__construct($configuration, $plugin_id, $plugin_definition);
        $this->menuLinkTree = $menu_link_tree;
        $this->menuLinkManager = $menuLinkManager;
        $this->entityTypeManager = $entity_type_manager;
    }

    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
        return new static(
            $configuration,
            $plugin_id,
            $plugin_definition,
            $container->get('menu.link_tree'),
            $container->get('plugin.manager.menu.link'),
            $container->get('entity_type.manager')
        );
    }

    /**
     * {@inheritdoc}
     */
    public function defaultConfiguration() {
        return [
            'menu' => '',
        ] + parent::defaultConfiguration();
    }

    /**
     * {@inheritdoc}
     */
    public function blockForm($form, FormStateInterface $form_state) {
        $menuOptions = $this->entityTypeManager->getStorage('menu')->getQuery()->execute();
        $form['menu'] = [
            '#type' => 'select',
            '#title' => $this->t('Menu'),
            '#options' => $menuOptions,
            '#default_value' => $this->configuration['menu'],
        ];

        return $form;
    }

    /**
     * {@inheritdoc}
     */
    public function blockSubmit($form, FormStateInterface $form_state) {
        $this->configuration['menu'] = $form_state->getValue('menu');
    }

    private function loadMenuTrue() {
        $menu_name = $this->configuration['menu'];
        $parameters = $this->menuLinkTree->getCurrentRouteMenuTreeParameters($menu_name);
        $tree = $this->menuLinkTree->load($menu_name, $parameters);
        $manipulators = [
            ['callable' => 'menu.default_tree_manipulators:checkAccess'],
            ['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'],
        ];
        return $this->menuLinkTree->transform($tree, $manipulators);
    }

    public function buildMegaMenu($tree, $builtMenu) {
        $menu = [
            '#theme' => 'doghouse_mega_menu_block',
            '#attributes' => [
                'class' => [
                    'doghouse-megamenu',
                ],
            ],
            '#items' => [],
        ];

        foreach ($tree as $dataMenu => $tree_element) {
            $link = $tree_element->link;
            $options = $link->getOptions();
            $id = $link->getPluginId();
            $definition = $tree_element->link->getPluginDefinition();

            // Skip links that are disabled.
            if ($definition['enabled'] == 0) {
                continue;
            }

            $menu['#items'][$id] = [
                'menu_item' => $builtMenu['#items'][$id],
            ];

            if (!empty($options['megamenu_block_id'])) {
                $block = $this->entityTypeManager->getStorage('block_content')->load($options['megamenu_block_id']);
                $rendered = $this->entityTypeManager->getViewBuilder($block->getEntityTypeId())->view($block, 'full');
                $menu['#items'][$id]['block'] = $rendered;
            }
        }

        return $menu;
    }

    /**
     * {@inheritdoc}
     */
    public function build() {
        $tree = $this->loadMenuTrue();
        $builtMenu = $this->menuLinkTree->build($tree);
        foreach ($builtMenu['#items'] as &$item) {
            $options = $item['url']->getOptions();
            $options = array_merge(['attributes' => []], $options);
            $item['url']->setOptions($options);
        }
        $megamenu = $this->buildMegaMenu($tree, $builtMenu);
        return $megamenu;
    }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc