85 lines
2.5 KiB
PHP
Executable File
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;
|
|
}
|
|
}
|