GetAllViewHelper.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. namespace Opentalent\OtTemplating\ViewHelpers\Members;
  3. use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
  4. use Opentalent\OtTemplating\Domain\Repository\MemberRepository;
  5. use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  6. /**
  7. * This view helper provides an array named according to the 'as' variable
  8. * and which contains the members of the structure classed by intrument
  9. *
  10. * {namespace ot=Opentalent\OtTemplating\ViewHelpers}
  11. *
  12. * <ot:members.getAll as="members"
  13. * organizationId="{settings.organizationId}">
  14. * <f:debug>{members}</f:debug>
  15. * </ot:members.getAll>
  16. *
  17. * @package Opentalent\OtTemplating\ViewHelpers
  18. */
  19. class GetAllViewHelper extends AbstractViewHelper {
  20. use TemplateVariableViewHelperTrait;
  21. /**
  22. * >> Required to prevent typo3 to escape the html output
  23. * @var boolean
  24. */
  25. protected $escapeOutput = false;
  26. /**
  27. * @var \Opentalent\OtTemplating\Domain\Repository\MemberRepository
  28. *
  29. */
  30. protected $memberRepository;
  31. public function initializeArguments()
  32. {
  33. $this->registerArgument(
  34. 'as',
  35. 'string',
  36. 'Name of the returned array',
  37. true
  38. );
  39. $this->registerArgument(
  40. 'organizationId',
  41. 'integer',
  42. 'Id of the current structure',
  43. true
  44. );
  45. }
  46. /**
  47. * @return string
  48. */
  49. public function render()
  50. {
  51. // Get current settings
  52. $as = $this->arguments['as'];
  53. $organizationId = $this->arguments['organizationId'];
  54. // Get members of the structure
  55. $members = $this->memberRepository->findByOrganizationId($organizationId);
  56. // Sort alphabetically by name
  57. usort($members, function($a, $b) {return strcmp($a->getName(), $b->getName());});
  58. // Instruments to display in first place (next will be sorted alphabetically)
  59. $stack1 = ['CONDUCTOR' => []];
  60. $stack2 = [];
  61. foreach ($members as $member) {
  62. // If that Instrument exist in stack1: put it in this one
  63. if (array_key_exists($member->getInstrument(), $stack1)) {
  64. array_push($stack1[$member->getInstrument()], $member);
  65. } else {
  66. // Create the new array if needed in stack2, then put the member in it
  67. if (!array_key_exists($member->getInstrument(), $stack2)) {
  68. $stack2[$member->getInstrument()] = [];
  69. }
  70. array_push($stack2[$member->getInstrument()], $member);
  71. }
  72. }
  73. // remove empty instruments in stack 1
  74. $stack1 = array_filter($stack1);
  75. // sort by instrument stack2
  76. ksort($stack2);
  77. $membersByInstrument = array_merge($stack1, $stack2);
  78. $variables = [$as => $membersByInstrument];
  79. return $this->renderChildrenWithVariables($variables);
  80. }
  81. /**
  82. * @param \Opentalent\OtTemplating\Domain\Repository\MemberRepository $memberRepository
  83. */
  84. public function injectMemberRepository(MemberRepository $memberRepository)
  85. {
  86. $this->memberRepository = $memberRepository;
  87. }
  88. }