| Current Path : /var/www/v3.cesa.co.za/src/UserBundle/Util/ |
| Current File : /var/www/v3.cesa.co.za/src/UserBundle/Util/CCEStudentDisplayOrder.php |
<?php
namespace App\UserBundle\Util;
use Doctrine\ORM\QueryBuilder;
/**
* Standard CCEStudent list ordering: KnownAs, else FirstName, then Surname.
*/
final class CCEStudentDisplayOrder
{
public static function sqlOrderByDisplayName(string $tableAlias = 'CCEStudents'): string
{
$alias = preg_replace('/[^A-Za-z0-9_]/', '', $tableAlias);
if ($alias === '') {
$alias = 'CCEStudents';
}
return 'CASE WHEN ' . $alias . '.KnownAs IS NULL OR TRIM(' . $alias . '.KnownAs) = \'\''
. ' THEN ' . $alias . '.FirstName ELSE ' . $alias . '.KnownAs END, '
. $alias . '.Surname';
}
public static function applyToQueryBuilder(QueryBuilder $qb, string $alias = 's'): void
{
$qb->addSelect(
'CASE WHEN ' . $alias . '.known_as IS NULL OR TRIM(' . $alias . '.known_as) = \'\''
. ' THEN ' . $alias . '.first_name ELSE ' . $alias . '.known_as END AS HIDDEN _studentSortPrimary'
);
$qb->addOrderBy('_studentSortPrimary', 'ASC');
$qb->addOrderBy($alias . '.surname', 'ASC');
}
/**
* @param object $left
* @param object $right
*/
public static function compareObjects($left, $right): int
{
$cmp = strcasecmp(self::getObjectSortPrimaryName($left), self::getObjectSortPrimaryName($right));
if ($cmp !== 0) {
return $cmp;
}
return strcasecmp(self::getObjectSortSurname($left), self::getObjectSortSurname($right));
}
/**
* @param array<int, array<string, mixed>> $rows
*/
public static function sortRowsWithStudentObject(array &$rows, string $studentKey = 'student'): void
{
if (count($rows) <= 1) {
return;
}
usort(
$rows,
static function (array $left, array $right) use ($studentKey): int {
$studentLeft = $left[$studentKey] ?? null;
$studentRight = $right[$studentKey] ?? null;
if (!is_object($studentLeft) || !is_object($studentRight)) {
return 0;
}
return self::compareObjects($studentLeft, $studentRight);
}
);
}
/**
* @param object $object
*/
public static function getObjectSortPrimaryName($object): string
{
if (is_object($object) && method_exists($object, 'getKnownAs')) {
$knownAs = trim((string) $object->getKnownAs());
if ($knownAs !== '') {
return $knownAs;
}
}
if (is_object($object) && method_exists($object, 'getFirstName')) {
return trim((string) $object->getFirstName());
}
return '';
}
/**
* @param object $object
*/
public static function getObjectSortSurname($object): string
{
if (is_object($object) && method_exists($object, 'getSurname')) {
return trim((string) $object->getSurname());
}
return '';
}
}