ew_base/Classes/ViewHelpers/Array/ExplodeViewHelper.php
2024-12-26 21:44:19 +01:00

85 lines
2.5 KiB
PHP
Executable File

<?php
declare(strict_types=1);
/*
* This file is developed by evoWeb.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*/
namespace Evoweb\EwBase\ViewHelpers\Array;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
/**
* Explode ViewHelper
*
* Explodes a string by $glue.
*
* {data.header -> ewb:iterator.explode(glue: 'constant:LF')}
*
* <ewb:iterator.explode content="{data.header}" as="as" glue="constant:LF">
* <span>{as}</span>
* </ewb:iterator.explode>
*/
class ExplodeViewHelper extends AbstractViewHelper
{
protected 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 function render(): mixed
{
$content = $this->arguments['content'] ?? $this->renderChildren();
$glue = $this->resolveGlue($this->arguments);
$content = call_user_func_array($this->method, [$glue, $content]);
$as = $this->arguments['as'];
if ($as !== null) {
$templateVariableContainer = $this->renderingContext->getVariableProvider();
$templateVariableContainer->add($as, $content);
$output = $this->renderChildren();
$templateVariableContainer->remove($as);
} else {
$output = $content;
}
return $output;
}
protected 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;
}
}