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.
| Comment | File | Size | Author |
|---|---|---|---|
| #26 | diff.png | 220.67 KB | odensc |
| #6 | webform.webform.issue_3350275.yml | 5.91 KB | jrockowitz |
Issue fork webform-3350275
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #2
cilefen commentedPlease provide the yaml of a minimal form that exhibits the bug.
Comment #3
alangallery commentedThanks 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 having 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.
Minimal form with bug:
Comment #4
alangallery commentedFurther 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]
Comment #5
odenscI 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) }}Comment #6
jrockowitz commentedThe attached webform replicates the issue using the elements from #3.
Comment #8
odensc@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 overridengetValuefunction which should fix the bug for all code paths includingOptionsBase::formatTextItem/formatHtmlItemmentioned above, which is the source of the error in this issue.Comment #9
odenscWe'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!
Comment #10
jmaxant commentedTested 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.
Comment #11
jmaxant commentedComment #12
liam morlandPlease reroll for 6.3.x.
Comment #15
liam morlandThanks for the reroll.
There is no need to make a new merge request. You can just force-push to the branch of existing one.
Comment #16
odenscThanks 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.
Comment #17
odenscI rerolled the MR again and made a small change to use
array_key_existsinstead ofissetto 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!
Comment #18
nessollo commentedI 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()
Comment #19
liam morland@#18 Does the patch in the merge request fix it for you?
Comment #20
nessollo commentedSame issue here.
The problem started upgrading core from 10.2 to 10.3+
Upgrading core or webform did not solve the problem.
The issue affect only some form.
Comment #21
liam morlandTests are not passing.
Comment #22
joelpittet@liam morland the test failure doesn't appear related, is there anyway to be sure that this is not an unrelated test failure (I've been seeing a bunch that I had to fix in my projects). I will re-run the test but I wonder if we can see branch tests too to confirm it's not related.
Comment #23
liam morlandThe branch tests are passing now. I just re-ran the test to see if it passes this time.
Comment #24
joelpittetAh thanks, well let's put this back to RTBC shall we ;) It wouldn't let me do the retest for some reason... maybe too used to the permissions on other modules
Comment #25
liam morlandI have rebased and tests are passing. The main thing this merge request is doing is creating
OptionsBase::getValue(). It also changesOptionsBase::getElementSelectorInputValue()but I don't see anything in the comments on this issue explaining why that change is needed.Comment #26
odenscHi @liam morland:
Thanks for rebasing! Here's a description of the change from comment #8:
Basically, the change to
OptionsBase::getElementSelectorInputValueis just moving some of its code into the new overloadedgetValuefunction. SincegetElementSelectorInputValuecallsgetRawValuewhich ultimately callsgetValue, the behavior is the same.It doesn't help that GitLab shows the diff a little bit weird by comingling the function headers together. Here's a better visual diff of the actual change:

Comment #29
liam morlandThanks. That explanation is what was missing in my understanding.