Skip to content

Using a Dropdown field of user type #1120

@tograss

Description

@tograss

Code of Conduct

  • I agree to follow this project's Code of Conduct

Is there an existing issue for this?

  • I have searched the existing issues

GLPI Version

11.0.4

Plugin version

1.23.2

Bug description

Adding a dropdown field of type User leads to a rendering bug after the first safe. Problem is that value is a """" which gets json_decoded in line 1282 in fields.class.php into "" . But the dropdown rendering requires a array.

Adding

if ($field['multiple'] && !is_array($value)) {
                // Value may be set:
                // - either from a default value in DB (it will be a JSON string),
                // - either from a previous input (it will be an array).
                //
                // -> Decode it only if it is not already an array.
                
                $value = json_decode((string) $value);
                // next lines are added
                if ($value === '' && $field['default_value'] !== ''){
                    $value = json_decode((string) $field['default_value']);
                }

            }

However, I'm unsure if this is the right place to fix or if the fix should be when saving in the DB.

Relevant log output

[2026-01-28 08:32:46] glpi.WARNING:   *** Warning: foreach() argument must be of type array|object, string given at User.php line 4322
  Backtrace :
  ./src/User.php:4322                                
  ...ication/View/Extension/ItemtypeExtension.php:99 User::dropdown()
  ...es/2a/2ac79fe58a63fdcaa029675a4efa656f.php:2151 Glpi\Application\View\Extension\ItemtypeExtension->getItemtypeDropdown()
  .../twig/twig/src/Extension/CoreExtension.php:2110 __TwigTemplate_534115b72f7af60d98f579846620a899->{closure}()
  ...es/2a/2ac79fe58a63fdcaa029675a4efa656f.php:2148 Twig\Extension\CoreExtension::captureOutput()
  .../twig/twig/src/Extension/CoreExtension.php:2110 __TwigTemplate_534115b72f7af60d98f579846620a899->{closure}()
  ...es/2a/2ac79fe58a63fdcaa029675a4efa656f.php:2088 Twig\Extension\CoreExtension::captureOutput()
  ...tes/19/198fdeb1cfbeab86c99611ed31f2e5a0.php:320 __TwigTemplate_534115b72f7af60d98f579846620a899->macro_dropdownField()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_085e46df890ee3d7994796efb90b2fc1->doDisplay()
  ./vendor/twig/twig/src/Template.php:358            Twig\Template->yield()
  ./vendor/twig/twig/src/Template.php:373            Twig\Template->display()
  ./vendor/twig/twig/src/TemplateWrapper.php:51      Twig\Template->render()
  .../Glpi/Application/View/TemplateRenderer.php:170 Twig\TemplateWrapper->render()
  ./plugins/fields/inc/field.class.php:1287          Glpi\Application\View\TemplateRenderer->render()
  ./plugins/fields/inc/field.class.php:893           PluginFieldsField::prepareHtmlFields()
  ./plugins/fields/inc/field.class.php:993           PluginFieldsField::showDomContainer()
  ./src/Plugin.php:1820                              PluginFieldsField::showForTab()
  ...plication/View/Extension/PluginExtension.php:74 Plugin::doHook()
  ...ates/35/353a01b8da7f197e65f5961d189994f0.php:61 Glpi\Application\View\Extension\PluginExtension->callPluginHook()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_d3ab1baba93d9d491e32993e5cc10dcf->doDisplay()
  ./vendor/twig/twig/src/Template.php:358            Twig\Template->yield()
  ./vendor/twig/twig/src/Template.php:373            Twig\Template->display()
  ./vendor/twig/twig/src/TemplateWrapper.php:51      Twig\Template->render()
  .../twig/twig/src/Extension/CoreExtension.php:1520 Twig\TemplateWrapper->render()
  ...tes/8f/8f4b377bc136a9dcfbd1c7dc0f04038b.php:153 Twig\Extension\CoreExtension::include()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_31b19364c29f7ba72f426f70f74206ee->doDisplay()
  ...ates/e7/e7ce6492a8168574be228272d1666526.php:52 Twig\Template->yield()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_7c059720945e5036507b1c5b4afaa8c2->doDisplay()
  ./vendor/twig/twig/src/Template.php:358            Twig\Template->yield()
  ./vendor/twig/twig/src/TemplateWrapper.php:61      Twig\Template->display()
  .../Glpi/Application/View/TemplateRenderer.php:188 Twig\TemplateWrapper->display()
  ./src/Contract.php:173                             Glpi\Application\View\TemplateRenderer->display()
  ./src/CommonGLPI.php:683                           Contract->showForm()
  ./ajax/common.tabs.php:108                         CommonGLPI::displayStandardTab()
  ...Glpi/Controller/LegacyFileLoadController.php:64 require()
  ./vendor/symfony/http-kernel/HttpKernel.php:181    Glpi\Controller\LegacyFileLoadController->__invoke()
  ./vendor/symfony/http-kernel/HttpKernel.php:76     Symfony\Component\HttpKernel\HttpKernel->handleRaw()
  ./vendor/symfony/http-kernel/Kernel.php:197        Symfony\Component\HttpKernel\HttpKernel->handle()
  ./public/index.php:70                              Symfony\Component\HttpKernel\Kernel->handle()

[2026-01-28 08:32:46] glpi.CRITICAL:   *** Uncaught PHP Exception Twig\Error\RuntimeError: "An exception has been thrown during the rendering of a template ("array_combine(): Argument #1 ($keys) must be of type array, string given") in "@fields/fields.html.twig" at line 142." at fields.html.twig line 142
  Backtrace :
  ./plugins/fields/templates/fields.html.twig:142    
  ./vendor/twig/twig/src/Template.php:358            Twig\Template->yield()
  ./vendor/twig/twig/src/Template.php:373            Twig\Template->display()
  ./vendor/twig/twig/src/TemplateWrapper.php:51      Twig\Template->render()
  .../Glpi/Application/View/TemplateRenderer.php:170 Twig\TemplateWrapper->render()
  ./plugins/fields/inc/field.class.php:1287          Glpi\Application\View\TemplateRenderer->render()
  ./plugins/fields/inc/field.class.php:893           PluginFieldsField::prepareHtmlFields()
  ./plugins/fields/inc/field.class.php:993           PluginFieldsField::showDomContainer()
  ./src/Plugin.php:1820                              PluginFieldsField::showForTab()
  ...plication/View/Extension/PluginExtension.php:74 Plugin::doHook()
  ...ates/35/353a01b8da7f197e65f5961d189994f0.php:61 Glpi\Application\View\Extension\PluginExtension->callPluginHook()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_d3ab1baba93d9d491e32993e5cc10dcf->doDisplay()
  ./vendor/twig/twig/src/Template.php:358            Twig\Template->yield()
  ./vendor/twig/twig/src/Template.php:373            Twig\Template->display()
  ./vendor/twig/twig/src/TemplateWrapper.php:51      Twig\Template->render()
  .../twig/twig/src/Extension/CoreExtension.php:1520 Twig\TemplateWrapper->render()
  ...tes/8f/8f4b377bc136a9dcfbd1c7dc0f04038b.php:153 Twig\Extension\CoreExtension::include()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_31b19364c29f7ba72f426f70f74206ee->doDisplay()
  ...ates/e7/e7ce6492a8168574be228272d1666526.php:52 Twig\Template->yield()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_7c059720945e5036507b1c5b4afaa8c2->doDisplay()
  ./vendor/twig/twig/src/Template.php:358            Twig\Template->yield()
  ./vendor/twig/twig/src/TemplateWrapper.php:61      Twig\Template->display()
  .../Glpi/Application/View/TemplateRenderer.php:188 Twig\TemplateWrapper->display()
  ./src/Contract.php:173                             Glpi\Application\View\TemplateRenderer->display()
  ./src/CommonGLPI.php:683                           Contract->showForm()
  ./ajax/common.tabs.php:108                         CommonGLPI::displayStandardTab()
  ...Glpi/Controller/LegacyFileLoadController.php:64 require()
  ./vendor/symfony/http-kernel/HttpKernel.php:181    Glpi\Controller\LegacyFileLoadController->__invoke()
  ./vendor/symfony/http-kernel/HttpKernel.php:76     Symfony\Component\HttpKernel\HttpKernel->handleRaw()
  ./vendor/symfony/http-kernel/Kernel.php:197        Symfony\Component\HttpKernel\HttpKernel->handle()
  ./public/index.php:70                              Symfony\Component\HttpKernel\Kernel->handle()
  Previous: array_combine(): Argument #1 ($keys) must be of type array, string given
  ./src/Html.php:4590                                
  ./src/Html.php:4590                                array_combine()
  ./src/User.php:4379                                Html::jsAjaxDropdown()
  ...ication/View/Extension/ItemtypeExtension.php:99 User::dropdown()
  ...es/2a/2ac79fe58a63fdcaa029675a4efa656f.php:2151 Glpi\Application\View\Extension\ItemtypeExtension->getItemtypeDropdown()
  .../twig/twig/src/Extension/CoreExtension.php:2110 __TwigTemplate_534115b72f7af60d98f579846620a899->{closure}()
  ...es/2a/2ac79fe58a63fdcaa029675a4efa656f.php:2148 Twig\Extension\CoreExtension::captureOutput()
  .../twig/twig/src/Extension/CoreExtension.php:2110 __TwigTemplate_534115b72f7af60d98f579846620a899->{closure}()
  ...es/2a/2ac79fe58a63fdcaa029675a4efa656f.php:2088 Twig\Extension\CoreExtension::captureOutput()
  ...tes/19/198fdeb1cfbeab86c99611ed31f2e5a0.php:320 __TwigTemplate_534115b72f7af60d98f579846620a899->macro_dropdownField()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_085e46df890ee3d7994796efb90b2fc1->doDisplay()
  ./vendor/twig/twig/src/Template.php:358            Twig\Template->yield()
  ./vendor/twig/twig/src/Template.php:373            Twig\Template->display()
  ./vendor/twig/twig/src/TemplateWrapper.php:51      Twig\Template->render()
  .../Glpi/Application/View/TemplateRenderer.php:170 Twig\TemplateWrapper->render()
  ./plugins/fields/inc/field.class.php:1287          Glpi\Application\View\TemplateRenderer->render()
  ./plugins/fields/inc/field.class.php:893           PluginFieldsField::prepareHtmlFields()
  ./plugins/fields/inc/field.class.php:993           PluginFieldsField::showDomContainer()
  ./src/Plugin.php:1820                              PluginFieldsField::showForTab()
  ...plication/View/Extension/PluginExtension.php:74 Plugin::doHook()
  ...ates/35/353a01b8da7f197e65f5961d189994f0.php:61 Glpi\Application\View\Extension\PluginExtension->callPluginHook()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_d3ab1baba93d9d491e32993e5cc10dcf->doDisplay()
  ./vendor/twig/twig/src/Template.php:358            Twig\Template->yield()
  ./vendor/twig/twig/src/Template.php:373            Twig\Template->display()
  ./vendor/twig/twig/src/TemplateWrapper.php:51      Twig\Template->render()
  .../twig/twig/src/Extension/CoreExtension.php:1520 Twig\TemplateWrapper->render()
  ...tes/8f/8f4b377bc136a9dcfbd1c7dc0f04038b.php:153 Twig\Extension\CoreExtension::include()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_31b19364c29f7ba72f426f70f74206ee->doDisplay()
  ...ates/e7/e7ce6492a8168574be228272d1666526.php:52 Twig\Template->yield()
  ./vendor/twig/twig/src/Template.php:402            __TwigTemplate_7c059720945e5036507b1c5b4afaa8c2->doDisplay()
  ./vendor/twig/twig/src/Template.php:358            Twig\Template->yield()
  ./vendor/twig/twig/src/TemplateWrapper.php:61      Twig\Template->display()
  .../Glpi/Application/View/TemplateRenderer.php:188 Twig\TemplateWrapper->display()
  ./src/Contract.php:173                             Glpi\Application\View\TemplateRenderer->display()
  ./src/CommonGLPI.php:683                           Contract->showForm()
  ./ajax/common.tabs.php:108                         CommonGLPI::displayStandardTab()
  ...Glpi/Controller/LegacyFileLoadController.php:64 require()
  ./vendor/symfony/http-kernel/HttpKernel.php:181    Glpi\Controller\LegacyFileLoadController->__invoke()
  ./vendor/symfony/http-kernel/HttpKernel.php:76     Symfony\Component\HttpKernel\HttpKernel->handleRaw()
  ./vendor/symfony/http-kernel/Kernel.php:197        Symfony\Component\HttpKernel\HttpKernel->handle()
  ./public/index.php:70                              Symfony\Component\HttpKernel\Kernel->handle()

Steps To reproduce

  • Add a user drop down field to i.e contracts
  • go to a contract
  • change something and save
  • reload and observe the bug

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions