* {domainGroup.title}
* * {skill.name}
*
* */ class SkillGroupingViewHelper extends AbstractViewHelper { use CompileWithRenderStatic; protected $escapeOutput = false; public function initializeArguments() { $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', false, []); $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 $skillSet */ $skillSet = $arguments['skillSet']; $as = $arguments['as']; if ($skillSet) { $groups = self::group($skillSet->getSkills()); } else { $groups = self::group($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 { $domainTags = []; foreach ($skills as $skill) { $domainTags[] = isset($skill->toArray()['domainTag']) ? $skill->toArray()['domainTag']['title'] : "none"; } $domainTags = array_unique($domainTags); $result = []; foreach ($domainTags as $domainTag) { $result[] = [ 'title' => $domainTag, 'skills' => array_filter($skills, function (Skill $skill) use ($domainTag) { if (!isset($skill->toArray()['domainTag'])) { return $domainTag === "none"; } return $skill->toArray()['domainTag']['title'] === $domainTag; }) ]; } return $result; } }