View source
<?php
namespace Drupal\cheeseburger_menu\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Drupal\facets\Exception\Exception;
use Drupal\system\Entity\Menu;
use Drupal\block\Entity\Block;
use Drupal\taxonomy\Entity\Term;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\commerce_store\Entity\Store;
class renderCheeseburgerMenuBlock extends ControllerBase {
public function content(Request $request) {
$block_id = $request->request
->get('block_id');
$route_id = $request->request
->get('route_id');
$page_type = $request->request
->get('page_type');
$current_route = $request->request
->get('current_route');
$block = \Drupal\block\Entity\Block::load($block_id);
if (!$block) {
return new Response('<div>No such block</div>');
}
$config = $block
->get('settings');
$tree = $this
->render_tree($route_id, $page_type, $current_route, $config);
$renderer = \Drupal::service('renderer');
$rendered_tree = $renderer
->render($tree);
return new Response($rendered_tree);
}
public function render_tree($route_id, $page_type, $current_route, $config) {
$menus_appear = isset($config['menus_appear']) ? $config['menus_appear'] : [];
$menus_weight = isset($config['menus_weight']) ? $config['menus_weight'] : [];
$menus_title = isset($config['menus_title']) ? $config['menus_title'] : [];
$taxonomy_appear = isset($config['taxonomy_appear']) ? $config['taxonomy_appear'] : [];
$taxonomy_weight = isset($config['taxonomy_weight']) ? $config['taxonomy_weight'] : [];
$taxonomy_title = isset($config['taxonomy_title']) ? $config['taxonomy_title'] : [];
$cart = [];
$cart['appear'] = isset($config['cart_appear']) ? $config['cart_appear'] : FALSE;
$cart['weight'] = isset($config['cart_weight']) ? $config['cart_weight'] : 0;
$phone['appear'] = isset($config['phone_appear']) ? $config['phone_appear'] : FALSE;
$phone['weight'] = isset($config['phone_weight']) ? $config['phone_weight'] : 0;
$phone['store'] = isset($config['phone_store']) ? $config['phone_store'] : FALSE;
$phone['number'] = isset($config['phone_number']) ? $config['phone_number'] : '';
$language_switcher = isset($config['lang_switcher']) ? $config['lang_switcher'] : FALSE;
$language_switcher_weight = isset($config['lang_switcher_weight']) ? $config['lang_switcher_weight'] : 0;
$headerHeight = isset($config['headerHeight']) ? $config['headerHeight'] : 0;
$headerPadding = isset($config['headerPadding']) ? $config['headerPadding'] : 0;
$moduleHandler = \Drupal::service('module_handler');
$menu_ids = $this
->getAllMenuLinkId();
$taxonomy_term_ids = $this
->getAllTaxonomyTermIds();
$tree = [];
$titles = [];
foreach ($menus_appear as $key => $menu) {
$helpArray = [];
if ($menus_title[$key] === TRUE || $menus_title[$key] === FALSE) {
$helpArray['title'] = array_search($key, $menu_ids);
}
else {
$helpArray['title'] = $menus_title[$key];
}
$helpArray['class'] = $key;
$helpArray['weight'] = $menus_weight[$key];
$titles[] = $helpArray;
}
foreach ($taxonomy_appear as $key => $taxonomy) {
$helpArray = [];
if ($taxonomy_title[$key] === TRUE || $taxonomy_title[$key] === FALSE) {
$helpArray['title'] = array_search($key, $taxonomy_term_ids);
}
else {
$helpArray['title'] = $taxonomy_title[$key];
}
$helpArray['class'] = $key;
$helpArray['weight'] = $taxonomy_weight[$key];
$titles[] = $helpArray;
}
if ($cart['appear']) {
$helpArray = [];
$helpArray['title'] = $this
->t('Cart');
$helpArray['class'] = 'cart';
$helpArray['url'] = '/cart';
$helpArray['weight'] = $cart['weight'];
$titles[] = $helpArray;
}
if ($phone['appear']) {
if ($phone['store'] == 0) {
$phone_number = $phone['number'];
}
else {
if ($moduleHandler
->moduleExists('commerce_store')) {
$store = Store::load($phone['store']);
try {
$phone_number = current($store
->get('field_phone')
->getValue())['value'];
} catch (\Exception $exception) {
$phone_number = FALSE;
}
$phone_number = str_replace(' ', '', $phone_number);
}
else {
$phone_number = FALSE;
}
}
if ($phone_number != FALSE) {
$helpArray = [];
$helpArray['title'] = $this
->t('Phone');
$helpArray['class'] = 'phone';
$helpArray['url'] = 'tel:' . $phone_number;
$helpArray['weight'] = $phone['weight'];
$titles[] = $helpArray;
}
}
$titles = $this
->bubbleSortWeight($titles);
$tree[] = [
'#theme' => 'hierarchical_navigation',
'#tree' => $titles,
'#weight' => -100,
];
$trees = [];
foreach ($menus_appear as $key => $menu) {
if ($menus_title[$key] === TRUE) {
$title = array_search($key, $menu_ids);
}
elseif ($menus_title[$key] === FALSE) {
$title = FALSE;
}
else {
$title = $menus_title[$key];
}
$trees[] = [
'#theme' => 'hierarchical_menu',
'#menu_tree' => $this
->getMenuTree($key),
'#route_id' => $route_id,
'#page_type' => $page_type,
'#title' => $title,
'#machine_name' => $key,
'#current_url' => $current_route,
'#cache' => [
'max-age' => 0,
],
'#attached' => [
'library' => [
'cheeseburger_menu/cheeseburger_menu',
],
'drupalSettings' => [
'collapsibleMenu' => 1,
'interactiveParentMenu' => 0,
'headerHeight' => $headerHeight,
'headerPadding' => $headerPadding,
'breakpoints' => $config['breakpoints'],
'activeBreakpoints' => [],
],
],
'weight' => $menus_weight[$key],
];
}
foreach ($taxonomy_appear as $key => $taxonomy) {
if ($taxonomy_title[$key] === TRUE) {
$title = array_search($key, $taxonomy_term_ids);
}
elseif ($taxonomy_title[$key] === FALSE) {
$title = FALSE;
}
else {
$title = $taxonomy_title[$key];
}
$entityTypeManager = \Drupal::service('entity_type.manager');
$vocabulary_tree = $entityTypeManager
->getStorage('taxonomy_term')
->loadTree($key);
$vocabulary_tree_array = [];
foreach ($vocabulary_tree as $item) {
$term = Term::load($item->tid);
try {
$icon = $term
->get('field_icon');
if (!empty($icon
->getValue())) {
$icon = $term
->get('field_icon')->entity
->getFileUri();
$icon = file_create_url($icon);
}
else {
$icon = '';
}
} catch (\Exception $exception) {
$icon = '';
}
$vocabulary_tree_array[] = [
'id' => $item->tid,
'name' => $term
->getName(),
'url' => $term
->url(),
'parents' => $item->parents,
'interactive_parent' => 1,
'type' => 'taxonomy_term',
'icon' => $icon,
];
}
$vocabulary_tree = $this
->generateTree($vocabulary_tree_array);
$trees[] = [
'#theme' => 'hierarchical_menu',
'#menu_tree' => $vocabulary_tree,
'#route_id' => $route_id,
'#page_type' => $page_type,
'#title' => $title,
'#machine_name' => $key,
'#current_url' => $current_route,
'#cache' => [
'max-age' => 0,
],
'#attached' => [
'library' => [
'cheeseburger_menu/cheeseburger_menu',
],
'drupalSettings' => [
'collapsibleMenu' => 1,
'interactiveParentMenu' => 0,
'headerHeight' => $headerHeight,
'headerPadding' => $headerPadding,
'breakpoints' => $config['breakpoints'],
'activeBreakpoints' => [],
],
],
'weight' => $taxonomy_weight[$key],
];
}
if ($language_switcher == 1) {
$languageManager = \Drupal::service('language_manager');
$current_language = $languageManager
->getCurrentLanguage()
->getId();
$languageTree = [];
$languages = $languageManager
->getLanguages();
foreach ($languages as $language) {
$languageTree[] = [
'name' => $language
->getName(),
'id' => $language
->getId(),
'url' => $language
->isDefault() ? '/' : '/' . $language
->getId(),
'type' => 'language',
];
}
$title = 'Language';
$trees[] = [
'#theme' => 'hierarchical_menu',
'#menu_tree' => $languageTree,
'#route_id' => $current_language,
'#page_type' => 'language',
'#title' => $title,
'#machine_name' => 'language_switcher',
'#current_url' => $current_route,
'#cache' => [
'max-age' => 0,
],
'#attached' => [
'library' => [
'cheeseburger_menu/cheeseburger_menu',
],
'drupalSettings' => [
'collapsibleMenu' => 1,
'interactiveParentMenu' => 0,
'headerHeight' => $headerHeight,
'headerPadding' => $headerPadding,
'breakpoints' => $config['breakpoints'],
'activeBreakpoints' => [],
],
],
'weight' => $language_switcher_weight,
];
}
if ($config['css_default']) {
$tree['#attached']['library'][] = 'cheeseburger_menu/cheeseburger_menu.css';
}
$trees = $this
->bubbleSortWeight($trees);
foreach ($trees as $key => $iterator) {
unset($trees[$key]['weight']);
}
$tree = array_merge($tree, $trees);
return $tree;
}
public function getMenuTree($menu) {
$menu_tree = \Drupal::menuTree();
$tree = $menu_tree
->load($menu, new \Drupal\Core\Menu\MenuTreeParameters());
$tree = $menu_tree
->transform($tree, []);
$menu_build = $menu_tree
->build($tree);
$menu_tree_formatted = [];
if (array_key_exists('#items', $menu_build)) {
if (is_iterable($menu_build['#items'])) {
foreach ($menu_build['#items'] as $menu_data) {
if ($menu_data['url']
->isRouted()) {
$help_array = [];
$help_array['subitem'] = $this
->findChildren($menu_data['below']);
$help_array['name'] = $menu_data['title'];
try {
$help_array['id'] = $menu_data['url']
->getRouteParameters();
} catch (\Exception $exception) {
$help_array['id'][0] = NULL;
}
if (reset($help_array['id']) != NULL) {
$help_array['type'] = key($help_array['id']);
$help_array['id'] = reset($help_array['id']);
}
else {
try {
$help_array['id'] = $menu_data['url']
->getRouteName();
} catch (\Exception $exception) {
$help_array['id'] = NULL;
}
if ($help_array['id'] == "user.page") {
$user = \Drupal::currentUser();
$help_array['id'] = $user != NULL ? $user
->id() : $user;
$help_array['type'] = 'user';
}
else {
$help_array['type'] = 'view';
}
}
try {
$route_name = $menu_data['url']
->getRouteName();
} catch (\Exception $exception) {
$route_name = NULL;
}
if ($route_name != NULL) {
$url = \Drupal\Core\Url::fromRoute($menu_data['url']
->getRouteName(), $menu_data['url']
->getRouteParameters());
$help_array['url'] = $url
->toString();
}
else {
$help_array['url'] = '';
}
$menu_tree_formatted[] = $help_array;
}
}
}
}
return $menu_tree_formatted;
}
public function findChildren($menu) {
$menu_tree_formatted = [];
if (is_iterable($menu)) {
foreach ($menu as $menu_data) {
if ($menu_data['url']
->isRouted()) {
$help_array = [];
$help_array['subitem'] = $this
->findChildren($menu_data['below']);
$help_array['name'] = $menu_data['title'];
try {
$help_array['id'] = $menu_data['url']
->getRouteParameters();
} catch (\Exception $exception) {
$help_array['id'][0] = NULL;
}
if (reset($help_array['id']) != NULL) {
$help_array['type'] = key($help_array['id']);
$help_array['id'] = reset($help_array['id']);
}
else {
try {
$help_array['id'] = $menu_data['url']
->getRouteName();
} catch (\Exception $exception) {
$help_array['id'] = NULL;
}
if ($help_array['id'] == "user.page") {
$user = \Drupal::currentUser();
$help_array['id'] = $user != NULL ? $user
->id() : $user;
$help_array['type'] = 'user';
}
else {
$help_array['type'] = 'view';
}
}
try {
$route_name = $menu_data['url']
->getRouteName();
} catch (\Exception $exception) {
$route_name = NULL;
}
if ($route_name != NULL) {
$url = \Drupal\Core\Url::fromRoute($menu_data['url']
->getRouteName(), $menu_data['url']
->getRouteParameters());
$help_array['url'] = $url
->toString();
}
else {
$help_array['url'] = '';
}
$menu_tree_formatted[] = $help_array;
}
}
}
return $menu_tree_formatted;
}
public function getAllMenuLinkNames() {
$all_menus = Menu::loadMultiple();
$menus = [];
foreach ($all_menus as $id => $menu) {
$menus[$id] = $menu
->label();
}
asort($menus);
return $menus;
}
public function getAllMenuLinkId() {
$all_menus = Menu::loadMultiple();
$menus = [];
foreach ($all_menus as $id => $menu) {
$menus[$menu
->label()] = $id;
}
asort($menus);
return $menus;
}
public function getAllTaxonomyTermNames() {
$all_taxonomies = \Drupal::entityTypeManager()
->getStorage('taxonomy_vocabulary')
->loadMultiple();
$menus = [];
foreach ($all_taxonomies as $id => $menu) {
$menus[$id] = $menu
->label();
}
asort($menus);
return $menus;
}
public function getAllTaxonomyTermIds() {
$all_taxonomies = \Drupal::entityTypeManager()
->getStorage('taxonomy_vocabulary')
->loadMultiple();
$menus = [];
foreach ($all_taxonomies as $id => $menu) {
$menus[$menu
->label()] = $id;
}
asort($menus);
return $menus;
}
public function placeBlockContent($block_id) {
$block = Block::load($block_id);
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;
}
public function generateTree($array, $parent = 0) {
$tree = [];
foreach ($array as $item) {
if (reset($item['parents']) == $parent) {
$item['subitem'] = isset($item['subitem']) ? $item['subitem'] : $this
->generateTree($array, $item['id']);
$tree[] = $item;
}
}
return $tree;
}
public function getLinkFromTid($tid) {
$term = Term::load($tid);
return $term
->url();
}
public function bubbleSortWeight($sort) {
do {
$change = FALSE;
for ($i = 0; $i < count($sort) - 1; $i++) {
if ($sort[$i]['weight'] > $sort[$i + 1]['weight']) {
$temp = $sort[$i];
$sort[$i] = $sort[$i + 1];
$sort[$i + 1] = $temp;
$change = TRUE;
}
}
} while ($change == TRUE);
return $sort;
}
public function returnBreakpointsForDefaultTheme() {
$theme_handler = \Drupal::service('theme_handler');
$breakpoint_manager = \Drupal::service('breakpoint.manager');
$groups = $breakpoint_manager
->getGroups();
$list = [];
foreach ($groups as $group) {
if (is_object($group)) {
try {
$breakpoints = $breakpoint_manager
->getBreakpointsByGroup($group
->__toString());
foreach ($breakpoints as $key => $breakpoint) {
if ($breakpoint
->getProvider() == $theme_handler
->getDefault()) {
$list[$key]['mediaQuery'] = $breakpoint
->getMediaQuery();
$list[$key]['label'] = $breakpoint
->getLabel();
if (is_object($list[$key]['label'])) {
$list[$key]['label'] = $list[$key]['label']
->__toString();
}
}
}
} catch (Exception $exception) {
}
}
else {
try {
$breakpoints = $breakpoint_manager
->getBreakpointsByGroup($group);
foreach ($breakpoints as $key => $breakpoint) {
if ($breakpoint
->getProvider() == $theme_handler
->getDefault()) {
$list[$key]['mediaQuery'] = $breakpoint
->getMediaQuery();
$list[$key]['label'] = $breakpoint
->getLabel();
if (is_object($list[$key]['label'])) {
$list[$key]['label'] = $list[$key]['label']
->__toString();
}
}
}
} catch (Exception $exception) {
}
}
}
return $list;
}
}