You are here

class MenuPositionRuleOrderForm in Menu Position 8

Class MenuPositionRuleOrderForm.

@package Drupal\menu_position\Form

Hierarchy

Expanded class hierarchy of MenuPositionRuleOrderForm

1 string reference to 'MenuPositionRuleOrderForm'
menu_position.routing.yml in ./menu_position.routing.yml
menu_position.routing.yml

File

src/Form/MenuPositionRuleOrderForm.php, line 19

Namespace

Drupal\menu_position\Form
View source
class MenuPositionRuleOrderForm extends FormBase {

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The menu link manager.
   *
   * @var \Drupal\Core\Menu\MenuLinkManagerInterface
   */
  protected $menu_link_manager;

  /**
   * The Route Builder.
   *
   * @var \Drupal\Core\Routing\RouteBuilderInterface
   */
  protected $route_builder;

  /**
   * {@inheritdoc}
   */
  public function __construct(MenuLinkManagerInterface $menu_link_manager, EntityTypeManagerInterface $entity_type_manager, RouteBuilderInterface $route_builder, MessengerInterface $messenger) {
    $this->entityTypeManager = $entity_type_manager;
    $this->menu_link_manager = $menu_link_manager;
    $this->route_builder = $route_builder;
    $this->messenger = $messenger;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static($container
      ->get('plugin.manager.menu.link'), $container
      ->get('entity_type.manager'), $container
      ->get('router.builder'), $container
      ->get('messenger'));
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'menu_position_rule_order_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {

    // Get all the rules.
    $query = $this->entityTypeManager
      ->getStorage('menu_position_rule')
      ->getQuery();
    $results = $query
      ->sort('weight')
      ->execute();
    $rules = $this->entityTypeManager
      ->getStorage('menu_position_rule')
      ->loadMultiple($results);

    // Menu Position rules order (tabledrag).
    $form['#tree'] = TRUE;
    $form['rules'] = [
      '#type' => 'table',
      '#empty' => $this
        ->t('No rules have been created yet.'),
      '#title' => $this
        ->t('Rules processing order'),
      '#header' => [
        $this
          ->t('Rule'),
        $this
          ->t('Affected Menu'),
        $this
          ->t('Enabled'),
        $this
          ->t('Weight'),
        $this
          ->t('Operations'),
      ],
      '#tabledrag' => [
        [
          'action' => 'order',
          'relationship' => 'sibling',
          'group' => 'rules-weight',
        ],
      ],
    ];

    // Display table of rules.
    foreach ($rules as $rule) {

      /* @var \Drupal\menu_position\Entity\MenuPositionRule $rule */

      /* @var \Drupal\menu_position\Plugin\Menu\MenuPositionLink $menu_link */
      $menu_link = $rule
        ->getMenuLinkPlugin();
      $parent = $this->menu_link_manager
        ->createInstance($menu_link
        ->getParent());

      // @todo Because we're in a loop, try to cache this unless the entity
      //   manager handles all that for us. At least only get the storage once?
      $menu = $this->entityTypeManager
        ->getStorage('menu')
        ->load($menu_link
        ->getMenuName());
      $form['rules'][$rule
        ->getId()] = [
        '#attributes' => [
          'class' => [
            'draggable',
          ],
        ],
        'title' => [
          '#markup' => '<strong>' . $rule
            ->getLabel() . '</strong> (' . $this
            ->t('Positioned under: %title', [
            '%title' => $parent
              ->getTitle(),
          ]) . ')',
        ],
        'menu_name' => [
          '#markup' => $menu
            ->label(),
        ],
        'enabled' => [
          '#type' => 'checkbox',
          '#default_value' => $rule
            ->getEnabled(),
        ],
        'weight' => [
          '#type' => 'weight',
          '#title' => $this
            ->t('Weight for @title', [
            '@title' => $rule
              ->getLabel(),
          ]),
          '#title_display' => 'invisible',
          '#default_value' => $rule
            ->getWeight(),
          '#delta' => ceil(count($rules) / 2),
          '#attributes' => [
            'class' => [
              'rules-weight',
            ],
          ],
        ],
        'operations' => [
          '#type' => 'dropbutton',
          '#links' => [
            'edit' => [
              'title' => $this
                ->t('Edit'),
              'url' => Url::fromRoute('entity.menu_position_rule.edit_form', [
                'menu_position_rule' => $rule
                  ->getId(),
              ]),
            ],
            'delete' => [
              'title' => $this
                ->t('Delete'),
              'url' => Url::fromRoute('entity.menu_position_rule.delete_form', [
                'menu_position_rule' => $rule
                  ->getId(),
              ]),
            ],
          ],
        ],
      ];
    }
    $form['actions']['#type'] = 'actions';
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this
        ->t('Save configuration'),
      '#button_type' => 'primary',
    ];

    // By default, render the form using theme_system_config_form().
    $form['#theme'] = 'system_config_form';
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $storage = $this->entityTypeManager
      ->getStorage('menu_position_rule');
    $values = $form_state
      ->getValue('rules');
    $rules = $storage
      ->loadMultiple(array_keys($values));
    foreach ($rules as $rule) {
      $value = $values[$rule
        ->getId()];
      $rule
        ->setEnabled((bool) $value['enabled']);
      $rule
        ->setWeight((double) $value['weight']);
      $storage
        ->save($rule);
    }

    // Flush appropriate menu cache.
    $this->route_builder
      ->rebuild();
    $this->messenger
      ->addMessage($this
      ->t('The new rules ordering has been applied.'));
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
FormBase::$configFactory protected property The config factory. 1
FormBase::$requestStack protected property The request stack. 1
FormBase::$routeMatch protected property The route match.
FormBase::config protected function Retrieves a configuration object.
FormBase::configFactory protected function Gets the config factory for this form. 1
FormBase::container private function Returns the service container.
FormBase::currentUser protected function Gets the current user.
FormBase::getRequest protected function Gets the request object.
FormBase::getRouteMatch protected function Gets the route match.
FormBase::logger protected function Gets the logger for a specific channel.
FormBase::redirect protected function Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait::redirect
FormBase::resetConfigFactory public function Resets the configuration factory.
FormBase::setConfigFactory public function Sets the config factory for this form.
FormBase::setRequestStack public function Sets the request stack object to use.
LinkGeneratorTrait::$linkGenerator protected property The link generator. 1
LinkGeneratorTrait::getLinkGenerator Deprecated protected function Returns the link generator.
LinkGeneratorTrait::l Deprecated protected function Renders a link to a route given a route name and its parameters.
LinkGeneratorTrait::setLinkGenerator Deprecated public function Sets the link generator service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MenuPositionRuleOrderForm::$entityTypeManager protected property The entity type manager.
MenuPositionRuleOrderForm::$menu_link_manager protected property The menu link manager.
MenuPositionRuleOrderForm::$route_builder protected property The Route Builder.
MenuPositionRuleOrderForm::buildForm public function Form constructor. Overrides FormInterface::buildForm
MenuPositionRuleOrderForm::create public static function Instantiates a new instance of this class. Overrides FormBase::create
MenuPositionRuleOrderForm::getFormId public function Returns a unique string identifying the form. Overrides FormInterface::getFormId
MenuPositionRuleOrderForm::submitForm public function Form submission handler. Overrides FormInterface::submitForm
MenuPositionRuleOrderForm::validateForm public function Form validation handler. Overrides FormBase::validateForm
MenuPositionRuleOrderForm::__construct public function
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
UrlGeneratorTrait::$urlGenerator protected property The url generator.
UrlGeneratorTrait::getUrlGenerator Deprecated protected function Returns the URL generator service.
UrlGeneratorTrait::setUrlGenerator Deprecated public function Sets the URL generator service.
UrlGeneratorTrait::url Deprecated protected function Generates a URL or path for a specific route based on the given parameters.