[warning] Trying to access array offset on value of type bool PluginBase.php:187

Created on 9 February 2023, over 1 year ago
Updated 1 June 2023, about 1 year ago

Problem/Motivation

This problem is caused by Views Plugins that do not correctly define the options array as specified in the documentation for the defineOptions() function in the Drupal\views\Plugin\views\PluginBase class.

Steps to reproduce

  1. Create a views plugin that does not implement the correct options array structure.
  2. Try to use that plugin.
  3. Observe PHP warnings.

Proposed resolution

As a result of this being caused by contrib or custom Views plugins, updates to the output of the offending Views plugin's defineOptions() functions should be made so that they follow the prescribed array structure instead of updating Drupal core.

Recommend changing issue status to Closed (won't fix).

🐛 Bug report
Status

Needs work

Version

11.0 🔥

Component
Views 

Last updated about 3 hours ago

Created by

🇮🇳India sumeet-biswal

Live updates comments and jobs are added and updated live.
  • Needs tests

    The change is currently missing an automated test that fails when run with the original code, and succeeds when the bug has been fixed.

Sign in to follow issues

Comments & Activities

  • Issue created by @sumeet-biswal
  • Status changed to Postponed: needs info over 1 year ago
  • 🇺🇸United States cilefen

    We get defensive patches like this a lot. But to have it merged we need steps to reproduce and an understanding of the root cause.

  • 🇺🇸United States kenrbnsn New Jersey
  • 🇺🇸United States alfattal Minnesota

    I had the same issue with a view that has an exposed boolean filter. The patch in #2 fixed the issue for me. Here is a full trace for the error message:

    Warning: Trying to access array offset on value of type bool in Drupal\views\Plugin\views\PluginBase->setOptionDefaults() (line 187 of core/modules/views/src/Plugin/views/PluginBase.php).
    
    Drupal\views\Plugin\views\PluginBase->setOptionDefaults(Array, Array) (Line: 141)
    Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
    Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 95)
    Drupal\views\Plugin\views\filter\FilterPluginBase->init(Object, Object, Array) (Line: 894)
    Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('filter') (Line: 1045)
    Drupal\views\ViewExecutable->_initHandler('filter', Array) (Line: 903)
    Drupal\views\ViewExecutable->initHandlers() (Line: 2318)
    Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697)
    Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632)
    Drupal\views\ViewExecutable->executeDisplay('vita_search_block', Array) (Line: 81)
    Drupal\views\Element\View::preRenderViewElement(Array) (Line: 59)
    Drupal\views\Plugin\Block\ViewsBlock->build() (Line: 106)
    Drupal\layout_builder\EventSubscriber\BlockComponentRenderArray->onBuildRender(Object, 'section_component.build.render_array', Object)
    call_user_func(Array, Object, 'section_component.build.render_array', Object) (Line: 142)
    Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'section_component.build.render_array') (Line: 90)
    Drupal\layout_builder\SectionComponent->toRenderArray(Array, ) (Line: 88)
    Drupal\layout_builder\Section->toRenderArray(Array) (Line: 316)
    Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay->buildSections(Object) (Line: 275)
    Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay->buildMultiple(Array) (Line: 340)
    Drupal\Core\Entity\EntityViewBuilder->buildComponents(Array, Array, Array, 'full') (Line: 24)
    Drupal\node\NodeViewBuilder->buildComponents(Array, Array, Array, 'full') (Line: 282)
    Drupal\Core\Entity\EntityViewBuilder->buildMultiple(Array) (Line: 239)
    Drupal\Core\Entity\EntityViewBuilder->build(Array)
    call_user_func_array(Array, Array) (Line: 101)
    Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
    Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
    Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
    Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
    Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
    Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 243)
    Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
    Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
    Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
    call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
    Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
    Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
    Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 68)
    Drupal\simple_oauth\HttpMiddleware\BasicAuthSwap->handle(Object, 1, 1) (Line: 58)
    Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
    Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 106)
    Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 85)
    Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 50)
    Drupal\ban\BanMiddleware->handle(Object, 1, 1) (Line: 270)
    Drupal\shield\ShieldMiddleware->bypass(Object, 1, 1) (Line: 137)
    Drupal\shield\ShieldMiddleware->handle(Object, 1, 1) (Line: 48)
    Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
    Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
    Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 718)
    Drupal\Core\DrupalKernel->handle(Object) (Line: 19)

    It worth mentioning the issue didn't break the views functionality as it was still returning results as expected.

  • Status changed to Needs review about 1 year ago
  • 🇨🇦Canada rbrownell Ottawa, Ontario, Canada

    This is a very difficult issue to reproduce as it relies on a views plugin improperly defining one or more options.

    Prior to Drupal 9.5, Views did not expect every options value to be an associative array. This particular error occurs when an option is defined in a Views plugin that has a Boolean value without being nested within an associative array with an item with the key default.

    For example, in the most recent version of the Search API Location Views module (8.x-1.0-alpha3) an option with key require is defined within the defineOptions() function as:

    $options['require'] = FALSE;
    

    This does not follow the prescribed structure found in the PluginBase parent class which reads:

      /**
       * Information about options for all kinds of purposes will be held here.
       * @code
       * 'option_name' => array(
       *  - 'default' => default value,
       *  - 'contains' => (optional) array of items this contains, with its own
       *      defaults, etc. If contains is set, the default will be ignored and
       *      assumed to be array().
       *  ),
       * @endcode
       *
       * @return array
       *   Returns the options of this handler/plugin.
       */
      protected function defineOptions() {
    

    In the example above the correct way of implementing this option is:

    $options['require'] = ['default' = FALSE];
    

    As a result of this, in order to resolve this situation, updates to the output of the offending Views plugin's defineOptions() functions should be made to follow the prescribed array structure instead of updating Drupal core.

    Recommend changing issue status to Closed (won't fix).

  • 🇨🇦Canada rbrownell Ottawa, Ontario, Canada
  • Status changed to Needs work about 1 year ago
  • 🇺🇸United States smustgrave

    Think it should be investigated why it is sometimes a boolean, don't want to put a patch over a larger problem.

    The step "Create a views plugin that does not implement the correct options array structure." makes me think it was a user error.

    As a bug will need test case showing the issue.

Production build 0.69.0 2024