MenuReferenceFormatter.php in Menu Reference Render (Formatter) 8.2
File
src/Plugin/Field/FieldFormatter/MenuReferenceFormatter.php
View source
<?php
namespace Drupal\menu_reference_render\Plugin\Field\FieldFormatter;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceFormatterBase;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Menu\MenuTreeParameters;
class MenuReferenceFormatter extends EntityReferenceFormatterBase {
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = [];
foreach ($this
->getEntitiesToView($items, $langcode) as $entity) {
$menu_name = $entity
->get('id');
$menu_tree = \Drupal::menuTree();
$menu_active_trail = \Drupal::service('menu.active_trail');
if ($this
->getSetting('expand_all_items')) {
$parameters = new MenuTreeParameters();
$active_trail = $menu_active_trail
->getActiveTrailIds($menu_name);
$parameters
->setActiveTrail($active_trail);
}
else {
$parameters = $menu_tree
->getCurrentRouteMenuTreeParameters($menu_name);
}
$tree = $menu_tree
->load($menu_name, $parameters);
$manipulators = [
[
'callable' => 'menu.default_tree_manipulators:checkNodeAccess',
],
[
'callable' => 'menu.default_tree_manipulators:checkAccess',
],
[
'callable' => 'menu.default_tree_manipulators:generateIndexAndSort',
],
];
$tree = $menu_tree
->transform($tree, $manipulators);
$elements[] = $menu_tree
->build($tree);
}
return $elements;
}
public static function defaultSettings() {
$settings = parent::defaultSettings();
$settings['expand_all_items'] = FALSE;
return $settings;
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$form = parent::settingsForm($form, $form_state);
$form['expand_all_items'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Expand all menu items'),
'#default_value' => $this
->getSetting('expand_all_items'),
'#description' => $this
->t('Override the option found on each menu link used for expanding children and instead display the whole menu tree as expanded.'),
];
return $form;
}
public function settingsSummary() {
$summary = parent::settingsSummary();
if ($this
->getSetting('expand_all_items')) {
$summary[] = $this
->t('All menu items expanded');
}
return $summary;
}
public static function isApplicable(FieldDefinitionInterface $field_definition) {
return $field_definition
->getFieldStorageDefinition()
->getSetting('target_type') == 'menu';
}
protected function checkAccess(EntityInterface $entity) {
return $entity
->access('view label', NULL, TRUE);
}
}