Skip to content

Using a Dropdown field of user type #1120

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions