From 4b2697169115b7e803c5ef3eafcac3798b7655a6 Mon Sep 17 00:00:00 2001 From: Guillaume Heurtier <guillaume.heurtier@maarch.org> Date: Mon, 28 Dec 2020 16:07:59 +0100 Subject: [PATCH] FEAT #15673 TIME 0:10 added subentities_id keyword --- src/app/entity/models/EntityModelAbstract.php | 20 +++++++++++ .../controllers/PreparedClauseController.php | 35 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/app/entity/models/EntityModelAbstract.php b/src/app/entity/models/EntityModelAbstract.php index a86b751dd53..93f81468a6c 100755 --- a/src/app/entity/models/EntityModelAbstract.php +++ b/src/app/entity/models/EntityModelAbstract.php @@ -242,6 +242,26 @@ abstract class EntityModelAbstract return $entities; } + public static function getEntityChildrenById(array $args) + { + ValidatorModel::notEmpty($args, ['id']); + ValidatorModel::intVal($args, ['id']); + + $aReturn = DatabaseModel::select([ + 'select' => ['id'], + 'table' => ['entities'], + 'where' => ['parent_entity_id in (select entity_id from entities where id = ?)'], + 'data' => [$args['id']] + ]); + + $entities = [$args['id']]; + foreach ($aReturn as $value) { + $entities = array_merge($entities, EntityModel::getEntityChildrenById(['id' => $value['id']])); + } + + return $entities; + } + public static function getEntityChildrenSubLevel(array $aArgs) { ValidatorModel::notEmpty($aArgs, ['entitiesId']); diff --git a/src/core/controllers/PreparedClauseController.php b/src/core/controllers/PreparedClauseController.php index 0b51e434d2f..44535830569 100755 --- a/src/core/controllers/PreparedClauseController.php +++ b/src/core/controllers/PreparedClauseController.php @@ -118,6 +118,41 @@ class PreparedClauseController $clause = str_replace("@all_entities", $allEntitiesClause, $clause); } + $total = preg_match_all("|@subentities_id\[([^\]]*)\]|", $clause, $subEntities, PREG_PATTERN_ORDER); + if ($total > 0) { + for ($i = 0; $i < $total; $i++) { + $aEntities = []; + $tmpSubEntities = str_replace("'", '', $subEntities[1][$i]); + if (preg_match('/,/', $tmpSubEntities)) { + $aEntities = preg_split('/,/', $tmpSubEntities); + } else { + $aEntities[] = $tmpSubEntities; + } + + $allSubEntities = []; + foreach ($aEntities as $entity) { + if (!empty($entity)) { + $subEntitiesForEntity = EntityModel::getEntityChildrenById(['id' => trim($entity)]); + unset($subEntitiesForEntity[0]); + $allSubEntities = array_merge($allSubEntities, $subEntitiesForEntity); + } + } + + $allSubEntitiesClause = ''; + foreach ($allSubEntities as $key => $allSubEntity) { + if ($key > 0) { + $allSubEntitiesClause .= ", "; + } + $allSubEntitiesClause .= "'{$allSubEntity}'"; + } + if (empty($allSubEntitiesClause)) { + $allSubEntitiesClause = "''"; + } + + $clause = preg_replace("|@subentities_id\[[^\]]*\]|", $allSubEntitiesClause, $clause, 1); + } + } + $total = preg_match_all("|@subentities\[('[^\]]*')\]|", $clause, $subEntities, PREG_PATTERN_ORDER); if ($total > 0) { for ($i = 0; $i < $total; $i++) { -- GitLab