|
|
@@ -78,74 +78,104 @@ class GetAllViewHelper extends OtAbstractViewHelper {
|
|
|
$organizationId = $this->arguments['organizationId'];
|
|
|
$groupByInstruments = $this->arguments['groupByInstruments'];
|
|
|
|
|
|
- try {
|
|
|
- // Get members of the structure
|
|
|
- $collection = $this->memberRepository->findByOrganizationId($organizationId);
|
|
|
- $members = $collection->getMembers();
|
|
|
- } catch (ApiRequestException $e) {
|
|
|
- OtLogger::error(sprintf('API Error: %s', $e->getMessage()));
|
|
|
- $members = [];
|
|
|
+ if ($groupByInstruments) {
|
|
|
+ $members = $this->getMembersAsGroups($organizationId);
|
|
|
+ } else {
|
|
|
+ $members = $this->getMembersAsSimpleList($organizationId);
|
|
|
}
|
|
|
|
|
|
- // Sort by instrument (conductor first), then alphabetically by name
|
|
|
- usort($members,
|
|
|
- static function($a, $b) {
|
|
|
- if ($a->getInstrument() === 'CONDUCTOR') {
|
|
|
- return -1;
|
|
|
- }
|
|
|
+ $variables = [$as => $members];
|
|
|
+ return $this->renderChildrenWithVariables($variables);
|
|
|
+ }
|
|
|
|
|
|
- if ($b->getInstrument() === 'CONDUCTOR') {
|
|
|
- return 1;
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * Return the organization members as a simple array, sorted by name
|
|
|
+ *
|
|
|
+ * @param int $organizationId
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ private function getMembersAsSimpleList(int $organizationId): array
|
|
|
+ {
|
|
|
+ $members = $this->getMembers($organizationId);
|
|
|
+ usort(
|
|
|
+ $members,
|
|
|
+ static function ($m1, $m2) { return strcmp($m1->getName(), $m2->getName()); }
|
|
|
+ );
|
|
|
+ return $members;
|
|
|
+ }
|
|
|
|
|
|
- if ($a->getInstrument() !== $b->getInstrument()) {
|
|
|
- return strcmp($a->getInstrument(), $b->getInstrument());
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * Return the organization members as an array of the form :
|
|
|
+ * [
|
|
|
+ * 'Instrument 1' => [Member1, Member2, ...],
|
|
|
+ * 'Instrument 2' => [Member3, ...],
|
|
|
+ * ]
|
|
|
+ *
|
|
|
+ * Instruments keys are translated and sorted alphabetically, except for CONDUCTOR which shall appear first
|
|
|
+ * Group members are sorted by name
|
|
|
+ *
|
|
|
+ * @param int $organizationId
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ private function getMembersAsGroups(int $organizationId): array
|
|
|
+ {
|
|
|
+ $members = $this->getMembers($organizationId);
|
|
|
|
|
|
- if ($a->getName() !== $b->getName()) {
|
|
|
- return strcmp($a->getName(), $b->getName());
|
|
|
- }
|
|
|
+ $stack = ['CONDUCTOR' => []];
|
|
|
+ $conductors = [];
|
|
|
|
|
|
- return 0;
|
|
|
+ foreach ($members as $member) {
|
|
|
+ if ($member->getInstrument() === 'CONDUCTOR') {
|
|
|
+ $conductors[] = $member;
|
|
|
+ continue;
|
|
|
}
|
|
|
- );
|
|
|
|
|
|
- if ($groupByInstruments && !empty($members)) {
|
|
|
-
|
|
|
- // Instruments to display in first place (next will be sorted alphabetically)
|
|
|
- $stack1 = ['CONDUCTOR' => []];
|
|
|
-
|
|
|
- $stack2 = [];
|
|
|
- foreach ($members as $member) {
|
|
|
- // If that Instrument exist in stack1: put it in this one
|
|
|
- if (array_key_exists($member->getInstrument(), $stack1)) {
|
|
|
- $stack1[$member->getInstrument()][] = $member;
|
|
|
- } else {
|
|
|
- // Create the new array if needed in stack2, then put the member in it
|
|
|
- if (!array_key_exists($member->getInstrument(), $stack2)) {
|
|
|
- $stack2[$member->getInstrument()] = [];
|
|
|
- }
|
|
|
- $stack2[$member->getInstrument()][] = $member;
|
|
|
- }
|
|
|
+ $instrument = ucfirst($this->translate($member->getInstrument()));
|
|
|
+ if (!array_key_exists($instrument, $stack)) {
|
|
|
+ $stack[$instrument] = [$member];
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
- // remove empty instruments in stack 1
|
|
|
- $stack1 = array_filter($stack1);
|
|
|
+ $stack[$instrument][] = $member;
|
|
|
+ }
|
|
|
+
|
|
|
+ // remove empty instruments in stack 1
|
|
|
+ $stack = array_filter($stack);
|
|
|
|
|
|
- // sort by instrument stack2
|
|
|
- ksort($stack2);
|
|
|
+ // sort by instrument stack2
|
|
|
+ ksort($stack);
|
|
|
|
|
|
- $members = array_merge($stack1, $stack2);
|
|
|
+ // sort groups by name
|
|
|
+ foreach (array_values($stack) as $group) {
|
|
|
+ usort(
|
|
|
+ $group,
|
|
|
+ static function ($m1, $m2) { return strcmp($m1->getName(), $m2->getName()); }
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
- $variables = [$as => $members];
|
|
|
- return $this->renderChildrenWithVariables($variables);
|
|
|
+ // Add the conductors in first pos
|
|
|
+ if ($conductors) {
|
|
|
+ $stack = [ucfirst($this->translate('CONDUCTOR')) => $conductors] + $stack;
|
|
|
+ }
|
|
|
+
|
|
|
+ return $stack;
|
|
|
+ }
|
|
|
+
|
|
|
+ private function getMembers(int $organizationId): array
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ // Get members of the structure
|
|
|
+ return $this->memberRepository->findByOrganizationId($organizationId)->getMembers();
|
|
|
+ } catch (ApiRequestException $e) {
|
|
|
+ OtLogger::error(sprintf('API Error: %s', $e->getMessage()));
|
|
|
+ return [];
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param MemberRepository $memberRepository
|
|
|
*/
|
|
|
- public function injectMemberRepository(MemberRepository $memberRepository)
|
|
|
+ public function injectMemberRepository(MemberRepository $memberRepository): void
|
|
|
{
|
|
|
$this->memberRepository = $memberRepository;
|
|
|
}
|