Select other computed token error

Created on 24 March 2023, almost 2 years ago

With a multipage form, using a computed token field containing a token for a 'Select Other element', get the following error:

Warning: Array to string conversion in Drupal\webform\Utility\WebformOptionsHelper::getOptionText() (line 131 of modules\contrib\webform\src\Utility\WebformOptionsHelper.php).

Drupal\webform\Utility\WebformOptionsHelper::getOptionText(Array, Array, ) (Line: 411)
Drupal\webform\Plugin\WebformElement\OptionsBase->formatTextItem(Array, Object, Array) (Line: 1374)
Drupal\webform\Plugin\WebformElementBase->format('Text', Array, Object, Array) (Line: 1331)
Drupal\webform\Plugin\WebformElementBase->formatText(Array, Object, Array) (Line: 234)
Drupal\webform\Plugin\WebformElementManager->invokeMethod('formatText', Array, Object, Array) (Line: 1073)
_webform_token_get_submission_value('field_610', Array, Object, Object, Object) (Line: 743)

Changing the field to a standard Select (without Other), the error goes away.

🐛 Bug report
Status

Active

Version

6.2

Component

Code

Created by

🇬🇧United Kingdom alangallery

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Merge Requests

Comments & Activities

  • Issue created by @alangallery
  • Please provide the yaml of a minimal form that exhibits the bug.

  • 🇬🇧United Kingdom alangallery

    Thanks cilefen

    Creating a simple multi-paged test form with select other element didn't give errors, but adding a conditional visibility to the select other element did. So it seems to be related to have conditions in the form.

    The form I'm creating has lots of visibility/required conditions on elements, but not actually on the select other element.

    first_page:
      '#type': wizard_page
      '#title': 'First page'
      standard_select_question:
        '#type': select
        '#title': 'Standard select question'
        '#options': yes_no
        '#required': true
    second_page:
      '#type': wizard_page
      '#title': 'Second page'
      do_you_want_to_answer_the_next_question:
        '#type': select
        '#title': 'Do you want to answer the next question'
        '#options': yes_no
      select_with_other_question:
        '#type': select_other
        '#title': 'Select with other question'
        '#options': yes_no
        '#other__option_label': Other
        '#other__placeholder': 'Please enter the preferred pronoun'
        '#states':
          visible:
            ':input[name="do_you_want_to_answer_the_next_question"]':
              value: 'Yes'
    third_page:
      '#type': wizard_page
      '#title': 'Third page'
      computed_tokens:
        '#type': computed_token
        '#title': 'Computed tokens'
        '#mode': text
        '#template': '"[webform_submission:values:standard_select_question]","[webform_submission:values:do_you_want_to_answer_the_next_question]","[webform_submission:values:select_with_other_question]"'
        '#store': true
  • 🇬🇧United Kingdom alangallery

    Further information - if rendering token as raw value [webform_submission:values:select_with_other_question:raw]

    Get two errors showing on form:
    User error: "select" is an invalid render array key in Drupal\Core\Render\Element::children() (line 98 of core\lib\Drupal\Core\Render\Element.php).

    User error: "other" is an invalid render array key in Drupal\Core\Render\Element::children() (line 98 of core\lib\Drupal\Core\Render\Element.php).

    Both regarding the token [webform_submission:values:select_with_other_question:raw]

    _webform_token_get_submission_value('select_with_other_question:raw', Array, Object, Object, Object) (Line: 743)
    webform_tokens('webform_submission', Array, Array, Array, Object)
  • I ran into this issue too. Doing some debugging with XDebug, it seems the error is coming from Drupal\webform\Plugin\WebformElement\OptionsBase::formatTextItem/formatHtmlItem. The call to getValue is returning an array of ["select" => [...], "other" => "..."] for some reason, but only when called from inside a computed token/computed twig field and when the select element is conditionally visible.

    When the select element isn't conditional/when the token is in the confirmation page, it seems to be returning a string (either the option selected, or the value of the Other field), as expected.

    I was able to do an ugly workaround by using a computed twig field, by detecting if it's an array and returning an empty string, otherwise computing the token:

    {{ data.select_element is iterable ? '' : webform_token('[webform_submission:values:select_element]', webform_submission) }}

  • 🇺🇸United States jrockowitz Brooklyn, NY

    The attached webform replicates the issue using the elements from #3.

  • Merge request !469Issue #3350275: Select other computed token error → (Closed) created by odensc
  • Open on Drupal.org →
    Core: 10.1.4 + Environment: PHP 8.2 & MySQL 8
    last update 10 months ago
    Waiting for branch to pass
  • Pipeline finished with Failed
    10 months ago
    Total: 1819s
    #173899
  • Open on Drupal.org →
    Core: 10.1.4 + Environment: PHP 8.2 & MySQL 8
    last update 10 months ago
    Waiting for branch to pass
  • Pipeline finished with Success
    10 months ago
    Total: 3139s
    #173913
  • Status changed to Needs review 10 months ago
  • @jrockowitz Thanks for the repro config.

    I've submitted an MR with tests that fixes this issue. Interestingly, there was already code to handle a similar bug in OptionsBase::getElementSelectorInputValue, from issue #3000202 . I pulled that code out to an overriden getValue function which should fix the bug for all code paths including OptionsBase::formatTextItem/formatHtmlItem mentioned above, which is the source of the error in this issue.

  • We've now been using the fix in MR #469 in production for a month without any errors, and have been able to remove our workarounds. It'd be great if someone else could test and change this issue to RTBC!

  • 🇫🇷France jmaxant

    Tested today, works on a clean install & ran "test-only changes" job, which shows coverage. Everything looks fine by me !
    I'll change it to RTBC shortly if no one else does in the meantime.

  • Status changed to RTBC 9 months ago
  • Pipeline finished with Success
    8 months ago
    Total: 329s
    #222991
  • Pipeline finished with Canceled
    8 months ago
    Total: 111s
    #223484
  • Status changed to Needs work 4 months ago
  • 🇨🇦Canada Liam Morland Ontario, CA 🇨🇦

    Please reroll for 6.3.x.

  • Pipeline finished with Canceled
    4 months ago
    Total: 76s
    #338109
  • Pipeline finished with Canceled
    4 months ago
    Total: 117s
    #338114
  • Pipeline finished with Canceled
    4 months ago
    Total: 206s
    #338113
  • Pipeline finished with Failed
    4 months ago
    Total: 5041s
    #338116
  • 🇨🇦Canada Liam Morland Ontario, CA 🇨🇦

    Thanks for the reroll.

    There is no need to make a new merge request. You can just force-push to the branch of existing one.

  • Thanks for the tip, I tried a force push and changed the target branch of the MR to 6.3.x, but the MR was showing all of the changes from my fast-forward merge of 6.3.x in the diff for some reason and I couldn't get it to refresh.

    Side note, the `WebformElementSignatureTest::testSignature` test is showing as a failure but it appears unrelated as the same thing is happening on other MRs.

  • Pipeline finished with Success
    3 months ago
    Total: 197s
    #363022
  • Pipeline finished with Failed
    3 months ago
    Total: 203s
    #366105
  • Pipeline finished with Failed
    3 months ago
    Total: 671s
    #366109
  • Pipeline finished with Skipped
    3 months ago
    #366911
  • Pipeline finished with Success
    about 2 months ago
    Total: 1030s
    #395835
  • Pipeline finished with Skipped
    about 2 months ago
    #396036
  • Pipeline finished with Failed
    about 2 months ago
    Total: 66s
    #402145
  • Pipeline finished with Failed
    about 2 months ago
    #402149
  • Status changed to RTBC about 1 month ago
  • I rerolled the MR again and made a small change to use array_key_exists instead of isset to fix a rare edge-case where ['select' => null, 'other' => null] which can happen in some complex wizard forms with conditional _other fields.

    @liam morland, Appreciate you taking the time to look at this issue earlier. Is there anything else I can do to get it in a mergeable state? Thanks!

  • Pipeline finished with Success
    about 1 month ago
    Total: 402s
    #409658
  • 🇮🇹Italy nessollo

    I started to have this ussue after uprading core from 10.2 to 10.3.

    Using Webform 6.2.3
    Upgrading webform did not solved the problem

    InvalidArgumentException: "select" is an invalid render array key. Value should be an array but got a string. in Drupal\Core\Render\Element::children() (linea 97 di /var/www/crm/testing/crmdev.wikimedia.it/web/core/lib/Drupal/Core/Render/Element.php).

    #0 /var/www/crm/testing/crmdev.wikimedia.it/web/core/lib/Drupal/Core/Render/Renderer.php(462): Drupal\Core\Render\Element::children()
    #1 /var/www/crm/testing/crmdev.wikimedia.it/web/core/lib/Drupal/Core/Render/Renderer.php(248): Drupal\Core\Render\Renderer->doRender()
    #2 /var/www/crm/testing/crmdev.wikimedia.it/web/core/lib/Drupal/Core/Render/Renderer.php(165): Drupal\Core\Render\Renderer->render()
    #3 /var/www/crm/testing/crmdev.wikimedia.it/web/core/lib/Drupal/Core/Render/Renderer.php(638): Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}()
    #4 /var/www/crm/testing/crmdev.wikimedia.it/web/core/lib/Drupal/Core/Render/Renderer.php(164): Drupal\Core\Render\Renderer->executeInRenderContext()
    #5 /var/www/crm/testing/crmdev.wikimedia.it/web/core/lib/Drupal/Core/Render/Renderer.php(174): Drupal\Core\Render\Renderer->renderInIsolation()
    #6 /var/www/crm/testing/crmdev.wikimedia.it/web/modules/contrib/webform/webform.tokens.inc(1077): Drupal\Core\Render\Renderer->renderPlain()
    #7 /var/www/crm/testing/crmdev.wikimedia.it/web/modules/contrib/webform/webform.tokens.inc(743): _webform_token_get_submission_value()
    #8 [internal function]: webform_tokens()

  • 🇨🇦Canada Liam Morland Ontario, CA 🇨🇦

    @#18 Does the patch in the merge request fix it for you?

Production build 0.71.5 2024