3 namespace Drupal\menu_ui\Form;
5 use Drupal\Core\DependencyInjection\ClassResolverInterface;
6 use Drupal\Core\Form\FormBase;
7 use Drupal\Core\Form\FormStateInterface;
8 use Drupal\Core\Menu\MenuLinkInterface;
9 use Symfony\Component\DependencyInjection\ContainerInterface;
12 * Defines a generic edit form for all menu link plugin types.
14 * The menu link plugin defines which class defines the corresponding form.
18 * @see \Drupal\Core\Menu\MenuLinkInterface::getFormClass()
20 class MenuLinkEditForm extends FormBase {
25 * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
27 protected $classResolver;
30 * Constructs a MenuLinkEditForm object.
32 * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver
35 public function __construct(ClassResolverInterface $class_resolver) {
36 $this->classResolver = $class_resolver;
42 public static function create(ContainerInterface $container) {
44 $container->get('class_resolver')
51 public function getFormId() {
52 return 'menu_link_edit';
58 * @param \Drupal\Core\Menu\MenuLinkInterface $menu_link_plugin
59 * 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'] = [
64 '#value' => $menu_link_plugin->getPluginId(),
66 $class_name = $menu_link_plugin->getFormClass();
67 $form['#plugin_form'] = $this->classResolver->getInstanceFromDefinition($class_name);
68 $form['#plugin_form']->setMenuLinkInstance($menu_link_plugin);
70 $form += $form['#plugin_form']->buildConfigurationForm($form, $form_state);
72 $form['actions'] = ['#type' => 'actions'];
73 $form['actions']['submit'] = [
75 '#value' => $this->t('Save'),
76 '#button_type' => 'primary',
84 public function validateForm(array &$form, FormStateInterface $form_state) {
85 $form['#plugin_form']->validateConfigurationForm($form, $form_state);
91 public function submitForm(array &$form, FormStateInterface $form_state) {
92 $link = $form['#plugin_form']->submitConfigurationForm($form, $form_state);
94 $this->messenger()->addStatus($this->t('The menu link has been saved.'));
95 $form_state->setRedirect(
96 'entity.menu.edit_form',
97 ['menu' => $link->getMenuName()]