* {domainGroup.title}
* * {skill.name}
*
* */ class SkillGroupingViewHelper extends AbstractViewHelper { use CompileWithRenderStatic; protected $escapeOutput = false; public function initializeArguments(): void { $this->registerArgument('skills', 'array', 'An array of skills to group', false, []); $this->registerArgument('skillSet', SkillSet::class, 'The skills of this skill set will be grouped'); $this->registerArgument('as', 'string', 'The name of the iteration variable', true); } public static function renderStatic( array $arguments, Closure $renderChildrenClosure, RenderingContextInterface $renderingContext ) { /** @var Skill[] $skills */ $skills = $arguments['skills']; /** @var SkillSet|null $skillSet */ $skillSet = $arguments['skillSet']; $as = $arguments['as']; $groups = self::group($skillSet ? $skillSet->getSkills() : $skills); $templateVariableContainer = $renderingContext->getVariableProvider(); $output = ''; foreach ($groups as $group) { $templateVariableContainer->add($as, $group); $output .= $renderChildrenClosure(); $templateVariableContainer->remove($as); } return $output; } /** * @param Skill[] $skills * @return array */ protected static function group(array $skills): array { $result = []; foreach ($skills as $skill) { $skillAsArray = $skill->toArray(); $domainTag = !empty($skillAsArray['domainTag']) ? $skillAsArray['domainTag'] : ['uid' => 0, 'title' => '']; if (!isset($result[$domainTag['uid']])) { $result[$domainTag['uid']] = [ 'uid' => $domainTag['uid'], 'title' => $domainTag['title'], 'skills' => [], ]; } $result[$domainTag['uid']]['skills'][] = $skill; } return $result; } }