Problem/Motivation
After installing Ciivic Theme, the user/x page was throwing this error:
The website encountered an unexpected error. Try again later.
TypeError: trim(): Argument #1 ($string) must be of type string, array given in trim() (line 1202 of /app/vendor/twig/twig/src/Extension/CoreExtension.php).
Twig\Extension\CoreExtension::trim() (Line: 70)
__TwigTemplate_36e03f6549d5af72865f0c414d519792->{closure}()
iterator_to_array() (Line: 53)
__TwigTemplate_36e03f6549d5af72865f0c414d519792->doDisplay() (Line: 402)
Twig\Template->yield() (Line: 77)
__TwigTemplate_78669e3f548ae0d08d01d9e91f08bbc1->{closure}()
iterator_to_array() (Line: 74)
__TwigTemplate_78669e3f548ae0d08d01d9e91f08bbc1->doDisplay() (Line: 402)
Twig\Template->yield() (Line: 170)
__TwigTemplate_c45de4997cde0b7ed6a86ae096c68ace->{closure}()
iterator_to_array() (Line: 167)
__TwigTemplate_c45de4997cde0b7ed6a86ae096c68ace->doDisplay() (Line: 402)
Twig\Template->yield() (Line: 301)
__TwigTemplate_443c3c868d2d328429df37755376aac1->block_breadcrumb_block() (Line: 446)
Twig\Template->yieldBlock() (Line: 132)
__TwigTemplate_443c3c868d2d328429df37755376aac1->doDisplay() (Line: 402)
Twig\Template->yield() (Line: 44)
__TwigTemplate_2c51b6ddc275d32cc88d44bba9564bc8->doDisplay() (Line: 402)
Twig\Template->yield() (Line: 386)
Twig\Template->render() (Line: 51)
Twig\TemplateWrapper->render() (Line: 35)
Drupal\Core\Template\TwigThemeEngine->renderTemplate() (Line: 428)
Drupal\Core\Theme\ThemeManager->render() (Line: 500)
Drupal\Core\Render\Renderer->doRender() (Line: 253)
Drupal\Core\Render\Renderer->doRenderRoot() (Line: 143)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 634)
Drupal\Core\Render\Renderer::Drupal\Core\Render\{closure}()
Fiber->resume() (Line: 649)
Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 142)
Drupal\Core\Render\Renderer->renderInIsolation() (Line: 169)
Drupal\Core\Render\Renderer->doRenderPlaceholder() (Line: 760)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}()
Fiber->resume() (Line: 771)
Drupal\Core\Render\Renderer->replacePlaceholders() (Line: 265)
Drupal\Core\Render\Renderer->doRenderRoot() (Line: 143)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 634)
Drupal\Core\Render\Renderer::Drupal\Core\Render\{closure}()
Fiber->resume() (Line: 649)
Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 142)
Drupal\Core\Render\Renderer->renderInIsolation() (Line: 113)
Drupal\Core\Render\Renderer->renderRoot() (Line: 253)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->renderPlaceholders() (Line: 93)
Drupal\Core\Render\HtmlResponseAttachmentsProcessor->processAttachments() (Line: 45)
Drupal\Core\EventSubscriber\HtmlResponseSubscriber->onRespond() (Line: 246)
Symfony\Component\EventDispatcher\EventDispatcher::Symfony\Component\EventDispatcher\{closure}() (Line: 206)
Symfony\Component\EventDispatcher\EventDispatcher->callListeners() (Line: 56)
Symfony\Component\EventDispatcher\EventDispatcher->dispatch() (Line: 216)
Symfony\Component\HttpKernel\HttpKernel->filterResponse() (Line: 204)
Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 118)
Drupal\page_cache\StackMiddleware\PageCache->pass() (Line: 92)
Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 263)
Drupal\shield\ShieldMiddleware->bypass() (Line: 219)
Drupal\shield\ShieldMiddleware->handle() (Line: 50)
Drupal\ban\BanMiddleware->handle() (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 53)
Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 54)
Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 745)
Drupal\Core\DrupalKernel->handle() (Line: 19)
I asked my friendly neighbourhood robot what the problem was and they replied thusly:
The error trim(): Argument #1 ($string) must be of type string, array given happens because:
1. Drupal’s Link::getText() can return a render array – On user pages (e.g. /user/1), breadcrumb link text (like the username) can be a render array instead of a string.
2. The theme was passing that array through – In banner.inc, when $link_text was an array, the code stored it directly in 'text':
'text' => is_array($link_text) ? $link_text : Xss::filter((string) $link_text),
3. Twig’s trim filter received an array – That text value is passed to the link component → text-icon component, which does text|trim|split(' ') in text-icon.twig line 36. When text is an array, trim() fails.
Steps to reproduce
Install Civic theme on GovCMS Drupal 11
visit user/x page
Proposed resolution
I will update the issue with a PR showing the proposed solution
Comments
Comment #3
richardgaunt commentedComment #4
richardgaunt commented@danielgry Fix is in, no specific testing except visiting the `user` page once logged in.
Comment #5
richardgaunt commentedComment #6
richardgaunt commented