MenuLinkEditForm.php 2.63 KB
Newer Older
1 2 3 4 5 6
<?php

namespace Drupal\menu_ui\Form;

use Drupal\Core\DependencyInjection\ClassResolverInterface;
use Drupal\Core\Form\FormBase;
7
use Drupal\Core\Form\FormStateInterface;
8 9 10 11 12 13 14 15
use Drupal\Core\Menu\MenuLinkInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Defines a generic edit form for all menu link plugin types.
 *
 * The menu link plugin defines which class defines the corresponding form.
 *
16 17
 * @internal
 *
18 19 20 21 22
 * @see \Drupal\Core\Menu\MenuLinkInterface::getFormClass()
 */
class MenuLinkEditForm extends FormBase {

  /**
23
   * The class resolver.
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
   *
   * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
   */
  protected $classResolver;

  /**
   * Constructs a MenuLinkEditForm object.
   *
   * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver
   *   The class resolver.
   */
  public function __construct(ClassResolverInterface $class_resolver) {
    $this->classResolver = $class_resolver;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('class_resolver')
    );
  }

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

  /**
   * {@inheritdoc}
   *
   * @param \Drupal\Core\Menu\MenuLinkInterface $menu_link_plugin
   *   The plugin instance to use for this form.
   */
61
  public function buildForm(array $form, FormStateInterface $form_state, MenuLinkInterface $menu_link_plugin = NULL) {
62
    $form['menu_link_id'] = [
63 64
      '#type' => 'value',
      '#value' => $menu_link_plugin->getPluginId(),
65
    ];
66 67 68 69 70 71
    $class_name = $menu_link_plugin->getFormClass();
    $form['#plugin_form'] = $this->classResolver->getInstanceFromDefinition($class_name);
    $form['#plugin_form']->setMenuLinkInstance($menu_link_plugin);

    $form += $form['#plugin_form']->buildConfigurationForm($form, $form_state);

72 73
    $form['actions'] = ['#type' => 'actions'];
    $form['actions']['submit'] = [
74 75 76
      '#type' => 'submit',
      '#value' => $this->t('Save'),
      '#button_type' => 'primary',
77
    ];
78 79 80 81 82 83
    return $form;
  }

  /**
   * {@inheritdoc}
   */
84
  public function validateForm(array &$form, FormStateInterface $form_state) {
85 86 87 88 89 90
    $form['#plugin_form']->validateConfigurationForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
91
  public function submitForm(array &$form, FormStateInterface $form_state) {
92 93 94
    $link = $form['#plugin_form']->submitConfigurationForm($form, $form_state);

    drupal_set_message($this->t('The menu link has been saved.'));
95
    $form_state->setRedirect(
96
      'entity.menu.edit_form',
97
      ['menu' => $link->getMenuName()]
98 99 100 101
    );
  }

}