Commit fbe37854 authored by catch's avatar catch
Browse files

Issue #3337882 by dcam, enaznin, tirupati_singh, pameeela, catch, smustgrave:...

Issue #3337882 by dcam, enaznin, tirupati_singh, pameeela, catch, smustgrave: Deleted menus are not removed from content type config

(cherry picked from commit 1127f443)
parent 5176cb2d
Loading
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -292,6 +292,38 @@ public function formNodeTypeFormAlter(&$form, FormStateInterface $form_state) :
    $form['#entity_builders'][] = 'menu_ui_form_node_type_form_builder';
  }

  /**
   * Implements hook_ENTITY_TYPE_delete().
   */
  #[Hook('menu_delete')]
  public function menuDelete(EntityInterface $entity): void {
    if (!$this->entityTypeManager->hasDefinition('node_type')) {
      return;
    }

    // Remove the menu from content type third party settings.
    $menu_id = $entity->id();
    $parent_prefix = $menu_id . ':';
    $storage = $this->entityTypeManager->getStorage('node_type');
    foreach ($storage->loadMultiple() as $content_type) {
      $third_party_settings = $original_third_party_settings = $content_type->getThirdPartySettings('menu_ui');
      if (isset($third_party_settings['available_menus']) && in_array($menu_id, $third_party_settings['available_menus'])) {
        $key = array_search($menu_id, $third_party_settings['available_menus']);
        if ($key !== FALSE) {
          unset($third_party_settings['available_menus'][$key]);
        }
        $content_type->setThirdPartySetting('menu_ui', 'available_menus', $third_party_settings['available_menus']);
      }
      if (isset($third_party_settings['parent']) && substr($third_party_settings['parent'], 0, strlen($parent_prefix)) == $parent_prefix) {
        $third_party_settings['parent'] = '';
        $content_type->setThirdPartySetting('menu_ui', 'parent', $third_party_settings['parent']);
      }
      if ($third_party_settings != $original_third_party_settings) {
        $content_type->save();
      }
    }
  }

  /**
   * Implements hook_system_breadcrumb_alter().
   */
+86 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\Tests\menu_ui\Kernel;

use Drupal\KernelTests\KernelTestBase;
use Drupal\menu_ui\Hook\MenuUiHooks;
use Drupal\node\Entity\NodeType;
use Drupal\system\Entity\Menu;

/**
 * Tests the menu_delete hook.
 *
 * @group menu_ui
 */
class MenuDeleteTest extends KernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = ['node', 'menu_ui', 'system'];

  /**
   * @covers \Drupal\menu_ui\Hook\MenuUiHooks::menuDelete
   * @dataProvider providerMenuDelete
   */
  public function testMenuDelete($settings, $expected): void {
    $menu = Menu::create([
      'id' => 'mock',
      'label' => $this->randomMachineName(16),
      'description' => 'Description text',
    ]);
    $menu->save();
    $content_type = NodeType::create([
      'status' => TRUE,
      'dependencies' => [
        'module' => ['menu_ui'],
      ],
      'third_party_settings' => [
        'menu_ui' => $settings,
      ],
      'name' => 'Test type',
      'type' => 'test_type',
    ]);
    $content_type->save();
    $this->assertEquals($settings['available_menus'], $content_type->getThirdPartySetting('menu_ui', 'available_menus'));
    $this->assertEquals($settings['parent'], $content_type->getThirdPartySetting('menu_ui', 'parent'));

    $hooks = new MenuUiHooks(\Drupal::entityTypeManager());
    $hooks->menuDelete($menu);

    $content_type = NodeType::load('test_type');
    $this->assertEquals($expected['available_menus'], $content_type->getThirdPartySetting('menu_ui', 'available_menus'));
    $this->assertEquals($expected['parent'], $content_type->getThirdPartySetting('menu_ui', 'parent'));
  }

  /**
   * Provides data for testMenuDelete().
   */
  public static function providerMenuDelete(): array {
    return [
      [
        ['available_menus' => ['mock'], 'parent' => 'mock:'],
        ['available_menus' => [], 'parent' => ''],
      ],
      [
        ['available_menus' => ['mock'], 'parent' => 'mock:menu_link_content:e0cd7689-016e-43e4-af8f-7ce82801ab95'],
        ['available_menus' => [], 'parent' => ''],
      ],
      [
        ['available_menus' => ['main', 'mock'], 'parent' => 'mock:'],
        ['available_menus' => ['main'], 'parent' => ''],
      ],
      [
        ['available_menus' => ['main'], 'parent' => 'main:'],
        ['available_menus' => ['main'], 'parent' => 'main:'],
      ],
      [
        ['available_menus' => ['main'], 'parent' => 'main:menu_link_content:e0cd7689-016e-43e4-af8f-7ce82801ab95'],
        ['available_menus' => ['main'], 'parent' => 'main:menu_link_content:e0cd7689-016e-43e4-af8f-7ce82801ab95'],
      ],
    ];
  }

}