Uninstalling a module providing display extenders causes fatal errors

Created on 15 December 2015, about 9 years ago
Updated 17 October 2023, about 1 year ago

Problem/Motivation

If you define a Display Extender plugin in a module and enable it, then uninstall that module, you are unable to load any pages. You get a "Drupal\Component\Plugin\Exception\PluginNotFoundException" error.

The same thing will occur if a module defines an input filter and then that module is uninstalled. If you go to a page with processed text using a format that filter was enabled in, then it will error out with a plugin not found exception.

While we can check uninstall requirements on a per-module basis, having core do this would make much more sense and prevent the dreaded WSOD as more modules get tried and uninstalled.

Proposed resolution

Simplest fix would be in DisplayPluginBase.php:165:

if ($plugin = $manager->createInstance($extender)) {

Change to:

if ($manager->hasDefinition($extender) && $plugin = $manager->createInstance($extender)) {

The other, more involved but possible better option would be to define a default fallback plugin for display extenders, and possibly any other Views plugins that can be defined and cause this problem.

What may be the best solution is to include these plugins, along with any others in the uninstall validator. Perhaps a new method in DefaultPluginManager (or even a trait for plugin managers to include) that allows each plugin manager to perform a check if it can be safely removed or not.

eg for the views handler:

 public function uninstallRequirements($module_name) {

  foreach ($definitions as $definition) {
      if ($definition['provider'] == $module_name && $config->get('views.settings.display_extenders' . $definition['id'])) {
          //Throw an exception or return an explanation of why this module can not be uninstalled.
     }
  }
}

For Filters it would have to loop through each formatter config entity and check if that filter is enabled.

Recommended workaround

Until this bug is fixed, any module implementing display extenders should implement hook_uninstall() to require removing dependencies on it from existing views.

Remaining tasks

<!-- See https://drupal.org/core-mentoring/novice-tasks for tips on identifying novice tasks. Delete or add "Novice" from the Novice? column in the table below as appropriate. Uncomment tasks as the issue advances. Update the Complete? column to indicate when they are done, and maybe reference the comment number where they were done. -->

User interface changes

API changes

Data model changes

πŸ› Bug report
Status

Needs work

Version

11.0 πŸ”₯

Component
ViewsΒ  β†’

Last updated about 4 hours ago

Created by

πŸ‡ΊπŸ‡ΈUnited States Jamie Holly

Live updates comments and jobs are added and updated live.
  • Triaged core major

    There is consensus among core maintainers that this is a major issue. Only core committers should add this tag.

Sign in to follow issues

Comments & Activities

Not all content is available!

It's likely this issue predates Contrib.social: some issue and comment data are missing.

  • πŸ‡¬πŸ‡§United Kingdom catch

    There are several hundred sites that need to uninstall the views_ajax_get module in 10.1. It doesn't implement the hook_uninstall() workaround. Bumping to critical since this leaves sites hosed.

  • πŸ‡―πŸ‡΅Japan tyler36 Osaka

    This bug prevents Gutenberg module from being uninstalled when using webprofiler module. See #3261040

Production build 0.71.5 2024