diff --git a/core/lib/Drupal/Core/Template/TwigExtension.php b/core/lib/Drupal/Core/Template/TwigExtension.php index 9d6dd1a4467..693da9a2ae5 100644 --- a/core/lib/Drupal/Core/Template/TwigExtension.php +++ b/core/lib/Drupal/Core/Template/TwigExtension.php @@ -534,7 +534,7 @@ class TwigExtension extends \Twig_Extension { * * @param \Twig_Environment $env * A Twig_Environment instance. - * @param mixed[]|\Traversable $value + * @param mixed[]|\Traversable|NULL $value * The pieces to join. * @param string $glue * The delimiter with which to join the string. Defaults to an empty string. @@ -545,10 +545,14 @@ class TwigExtension extends \Twig_Extension { * The strings joined together. */ public function safeJoin(\Twig_Environment $env, $value, $glue = '') { + if ($value instanceof \Traversable) { + $value = iterator_to_array($value, false); + } + return implode($glue, array_map(function($item) use ($env) { // If $item is not marked safe then it will be escaped. return $this->escapeFilter($env, $item, 'html', NULL, TRUE); - }, $value)); + }, (array) $value)); } } diff --git a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php index 6b9525ea6e8..cb09022c430 100644 --- a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php +++ b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php @@ -200,6 +200,20 @@ class TwigExtensionTest extends UnitTestCase { ]; $result = $twig_extension->safeJoin($twig_environment, $items, '
'); $this->assertEquals('<em>will be escaped</em>
will be markup
will be rendered', $result); + + // Ensure safe_join Twig filter supports Traversable variables. + $items = new \ArrayObject([ + 'will be escaped', + $markup, + ['#markup' => 'will be rendered'], + ]); + $result = $twig_extension->safeJoin($twig_environment, $items, ', '); + $this->assertEquals('<em>will be escaped</em>, will be markup, will be rendered', $result); + + // Ensure safe_join Twig filter supports empty variables. + $items = NULL; + $result = $twig_extension->safeJoin($twig_environment, $items, '
'); + $this->assertEmpty($result); } /**