ewb:iterator.explode(glue: 'constant:LF')} * * * {as} * */ class ExplodeViewHelper extends AbstractViewHelper { use CompileWithRenderStatic; protected static string $method = 'explode'; public function initializeArguments(): void { $this->registerArgument( 'as', 'string', 'Template variable name to assign; if not specified the ViewHelper returns the variable instead.', ); $this->registerArgument('content', 'string', 'String to be exploded by glue'); $this->registerArgument( 'glue', 'string', 'String used as glue in the string to be exploded. Use glue value of "constant:NAMEOFCONSTANT" ' . '(fx "constant:LF" for linefeed as glue)', false, ',' ); } public static function renderStatic( array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext ): mixed { $content = $arguments['content'] ?? $renderChildrenClosure(); $glue = static::resolveGlue($arguments); $content = call_user_func_array(static::$method, [$glue, $content]); $as = $arguments['as']; if ($as !== null) { $templateVariableContainer = $renderingContext->getVariableProvider(); $templateVariableContainer->add($as, $content); $output = $renderChildrenClosure(); $templateVariableContainer->remove($as); } else { $output = $content; } return $output; } protected static function resolveGlue(array $arguments): string { $glue = $arguments['glue']; if (str_contains($glue, ':') && strlen($glue) > 1) { // glue contains a special type identifier, resolve the actual glue [$type, $value] = explode(':', $glue); $glue = match ($type) { 'constant' => constant($value), default => $value, }; } return $glue; } }