Procházet zdrojové kódy

order filter

master
Daniel před 10 měsíci
rodič
revize
3149142f0b
1 změnil soubory, kde provedl 74 přidání a 69 odebrání
  1. +74
    -69
      httpdocs/src/Filter/CustomJsonOrderFilter.php

+ 74
- 69
httpdocs/src/Filter/CustomJsonOrderFilter.php Zobrazit soubor

@@ -23,94 +23,99 @@ class CustomJsonOrderFilter extends AbstractFilter
if (!is_array($orderData) || !isset($orderData['active']) || !isset($orderData['direction'])) {
return;
}
$field = $orderData['active'];

$direction = strtoupper($orderData['direction']) === 'DESC' ? 'DESC' : 'ASC';
$listColDefinition = $orderData['listColDefinition'];
$field = $listColDefinition['field'];
if (array_key_exists('sortingFieldName', $listColDefinition)) {
$field = $listColDefinition['sortingFieldName'];
}
$sortingSubResource = $listColDefinition['sortingSubResource'] ?? null;
$countSortSubresource = $listColDefinition['countSortSubresource'] ?? false;
$countSortSubresourceValue = $listColDefinition['countSortSubresourceValue'] ?? null;
$countSortSubresourceField = $listColDefinition['countSortSubresourceField'] ?? $field;

$countSortFilterSubResource = $listColDefinition['countSortFilterSubResource'] ?? null;
$countSortFilterSubresourceField = $listColDefinition['countSortFilterSubresourceField'] ?? null;
$countSortFilterSubresourceValue = $listColDefinition['countSortFilterSubresourceValue'] ?? null;

$rootAlias = $queryBuilder->getRootAliases()[0];

if ($sortingSubResource) {
$subResources = explode('.', $sortingSubResource);
$currentAlias = $rootAlias;

foreach ($subResources as $index => $subResource) {
$joinAlias = $queryNameGenerator->generateJoinAlias($subResource);
$queryBuilder->leftJoin(sprintf('%s.%s', $currentAlias, $subResource), $joinAlias);
$currentAlias = $joinAlias;
if (array_key_exists('listColDefinition', $orderData)) {
$listColDefinition = $orderData['listColDefinition'];
$field = $listColDefinition['field'];
if (array_key_exists('sortingFieldName', $listColDefinition)) {
$field = $listColDefinition['sortingFieldName'];
}
$sortingSubResource = $listColDefinition['sortingSubResource'] ?? null;
$countSortSubresource = $listColDefinition['countSortSubresource'] ?? false;
$countSortSubresourceValue = $listColDefinition['countSortSubresourceValue'] ?? null;
$countSortSubresourceField = $listColDefinition['countSortSubresourceField'] ?? $field;

$countSortFilterSubResource = $listColDefinition['countSortFilterSubResource'] ?? null;
$countSortFilterSubresourceField = $listColDefinition['countSortFilterSubresourceField'] ?? null;
$countSortFilterSubresourceValue = $listColDefinition['countSortFilterSubresourceValue'] ?? null;

if ($sortingSubResource) {
$subResources = explode('.', $sortingSubResource);
$currentAlias = $rootAlias;

foreach ($subResources as $index => $subResource) {
$joinAlias = $queryNameGenerator->generateJoinAlias($subResource);
$queryBuilder->leftJoin(sprintf('%s.%s', $currentAlias, $subResource), $joinAlias);
$currentAlias = $joinAlias;
}

if ($countSortSubresource === true) {
$countAlias = $queryNameGenerator->generateParameterName('count');

$subQuery = $queryBuilder->getEntityManager()->createQueryBuilder()
->select('COUNT(sub)')
->from($resourceClass, 'main')
->join(sprintf('main.%s', $sortingSubResource), 'sub');

if ($countSortSubresourceValue !== null && $countSortSubresourceField !== null) {
$paramName = $queryNameGenerator->generateParameterName($countSortSubresourceField);

if (is_array($countSortSubresourceValue)) {
$conditions = [];
foreach ($countSortSubresourceValue as $index => $value) {
$isNegation = strpos($value, '!') === 0;
$actualValue = $isNegation ? substr($value, 1) : $value;
$individualParamName = $paramName . '_' . $index;
if ($countSortSubresource === true) {
$countAlias = $queryNameGenerator->generateParameterName('count');

$subQuery = $queryBuilder->getEntityManager()->createQueryBuilder()
->select('COUNT(sub)')
->from($resourceClass, 'main')
->join(sprintf('main.%s', $sortingSubResource), 'sub');

if ($countSortSubresourceValue !== null && $countSortSubresourceField !== null) {
$paramName = $queryNameGenerator->generateParameterName($countSortSubresourceField);

if (is_array($countSortSubresourceValue)) {
$conditions = [];
foreach ($countSortSubresourceValue as $index => $value) {
$isNegation = strpos($value, '!') === 0;
$actualValue = $isNegation ? substr($value, 1) : $value;
$individualParamName = $paramName . '_' . $index;

if ($isNegation) {
$conditions[] = sprintf('sub.%s != :%s', $countSortSubresourceField, $individualParamName);
} else {
$conditions[] = sprintf('sub.%s = :%s', $countSortSubresourceField, $individualParamName);
}
$subQuery->setParameter($individualParamName, $actualValue);
}
$subQuery->andWhere($subQuery->expr()->orX(...$conditions));
} else {
$isNegation = strpos($countSortSubresourceValue, '!') === 0;
$actualValue = $isNegation ? substr($countSortSubresourceValue, 1) : $countSortSubresourceValue;

if ($isNegation) {
$conditions[] = sprintf('sub.%s != :%s', $countSortSubresourceField, $individualParamName);
$subQuery->andWhere(sprintf('sub.%s != :%s', $countSortSubresourceField, $paramName));
} else {
$conditions[] = sprintf('sub.%s = :%s', $countSortSubresourceField, $individualParamName);
$subQuery->andWhere(sprintf('sub.%s = :%s', $countSortSubresourceField, $paramName));
}
$subQuery->setParameter($individualParamName, $actualValue);
}
$subQuery->andWhere($subQuery->expr()->orX(...$conditions));
} else {
$isNegation = strpos($countSortSubresourceValue, '!') === 0;
$actualValue = $isNegation ? substr($countSortSubresourceValue, 1) : $countSortSubresourceValue;

if ($isNegation) {
$subQuery->andWhere(sprintf('sub.%s != :%s', $countSortSubresourceField, $paramName));
} else {
$subQuery->andWhere(sprintf('sub.%s = :%s', $countSortSubresourceField, $paramName));
$subQuery->setParameter($paramName, $actualValue);
}
$subQuery->setParameter($paramName, $actualValue);
}
}

// Additional filtering on countSortFilterSubResource
if ($countSortFilterSubResource && $countSortFilterSubresourceField && $countSortFilterSubresourceValue !== null) {
$filterJoinAlias = $queryNameGenerator->generateJoinAlias($countSortFilterSubResource);
$filterParamName = $queryNameGenerator->generateParameterName($countSortFilterSubresourceField);
// Additional filtering on countSortFilterSubResource
if ($countSortFilterSubResource && $countSortFilterSubresourceField && $countSortFilterSubresourceValue !== null) {
$filterJoinAlias = $queryNameGenerator->generateJoinAlias($countSortFilterSubResource);
$filterParamName = $queryNameGenerator->generateParameterName($countSortFilterSubresourceField);

$subQuery->join(sprintf('sub.%s', $countSortFilterSubResource), $filterJoinAlias)
->andWhere(sprintf('%s.%s = :%s OR %s.%s IS NULL', $filterJoinAlias, $countSortFilterSubresourceField, $filterParamName, $filterJoinAlias, $countSortFilterSubresourceField))
->setParameter($filterParamName, $countSortFilterSubresourceValue);
}
$subQuery->join(sprintf('sub.%s', $countSortFilterSubResource), $filterJoinAlias)
->andWhere(sprintf('%s.%s = :%s OR %s.%s IS NULL', $filterJoinAlias, $countSortFilterSubresourceField, $filterParamName, $filterJoinAlias, $countSortFilterSubresourceField))
->setParameter($filterParamName, $countSortFilterSubresourceValue);
}

$subQuery->andWhere($subQuery->expr()->eq('main.id', $rootAlias . '.id'));
$subQuery->andWhere($subQuery->expr()->eq('main.id', $rootAlias . '.id'));

$queryBuilder->addSelect(sprintf('(%s) as HIDDEN %s', $subQuery->getDQL(), $countAlias))
->orderBy($countAlias, $direction);
$queryBuilder->addSelect(sprintf('(%s) as HIDDEN %s', $subQuery->getDQL(), $countAlias))
->orderBy($countAlias, $direction);

// Bind the parameter for the main query
foreach ($subQuery->getParameters() as $parameter) {
$queryBuilder->setParameter($parameter->getName(), $parameter->getValue(), $parameter->getType());
// Bind the parameter for the main query
foreach ($subQuery->getParameters() as $parameter) {
$queryBuilder->setParameter($parameter->getName(), $parameter->getValue(), $parameter->getType());
}
} else {
$queryBuilder->orderBy(sprintf('%s.%s', $currentAlias, $field), $direction);
}
} else {
$queryBuilder->orderBy(sprintf('%s.%s', $currentAlias, $field), $direction);
$queryBuilder->orderBy(sprintf('%s.%s', $rootAlias, $field), $direction);
}
} else {
$queryBuilder->orderBy(sprintf('%s.%s', $rootAlias, $field), $direction);


Načítá se…
Zrušit
Uložit