diff --git a/application/Espo/Core/Entities/TreeItem.php b/application/Espo/Core/Entities/CategoryTreeItem.php similarity index 96% rename from application/Espo/Core/Entities/TreeItem.php rename to application/Espo/Core/Entities/CategoryTreeItem.php index 0f70bc7847..0e6c436a38 100644 --- a/application/Espo/Core/Entities/TreeItem.php +++ b/application/Espo/Core/Entities/CategoryTreeItem.php @@ -22,7 +22,7 @@ namespace Espo\Core\Entities; -class TreeItem extends \Espo\Core\ORM\Entity +class CategoryTreeItem extends \Espo\Core\ORM\Entity { public function toArray() { diff --git a/application/Espo/Core/Repositories/CategoryTree.php b/application/Espo/Core/Repositories/CategoryTree.php new file mode 100644 index 0000000000..6e2030c444 --- /dev/null +++ b/application/Espo/Core/Repositories/CategoryTree.php @@ -0,0 +1,95 @@ +getEntityManager()->getPDO(); + $query = $this->getEntityManager()->getQuery(); + + $parentId = $entity->get('parentId'); + $pathsTableName = $query->toDb($entity->getEntityType() . 'Path'); + + if ($entity->isNew()) { + if ($parentId) { + $sql = " + INSERT INTO `".$pathsTableName."` (ascendor_id, descendor_id) + SELECT ascendor_id, ".$pdo->quote($entity->id)." + FROM `".$pathsTableName."` + WHERE descendor_id = ".$pdo->quote($parentId)." + UNION ALL + SELECT ".$pdo->quote($entity->id).", ".$pdo->quote($entity->id)." + "; + } else { + $sql = " + INSERT INTO `".$pathsTableName."` (ascendor_id, descendor_id) + VALUES + (".$pdo->quote($entity->id).", ".$pdo->quote($entity->id).") + "; + } + $pdo->query($sql); + } else { + if ($entity->isFieldChanged('parentId')) { + $sql = " + DELETE a FROM `".$pathsTableName."` AS a + JOIN `".$pathsTableName."` AS d ON a.descendor_id = d.descendor_id + LEFT JOIN `".$pathsTableName."` AS x ON x.ascendor_id = d.ascendor_id AND x.descendor_id = a.ascendor_id + WHERE d.ascendor_id = ".$pdo->quote($entity->id)." AND x.ascendor_id IS NULL + "; + $pdo->query($sql); + if (!empty($parentId)) { + $sql = " + INSERT INTO `".$pathsTableName."` (ascendor_id, descendor_id) + SELECT supertree.ascendor_id, subtree.descendor_id + FROM `".$pathsTableName."` AS supertree + JOIN `".$pathsTableName."` AS subtree + WHERE + subtree.ascendor_id = ".$pdo->quote($entity->id)." AND + supertree.descendor_id = ".$pdo->quote($parentId)." + "; + $pdo->query($sql); + } + } + } + } + + public function afterRemove(Entity $entity, $options) + { + parent::afterRemove($entity, $options); + + $pdo = $this->getEntityManager()->getPDO(); + $query = $this->getEntityManager()->getQuery(); + + $pathsTableName = $query->toDb($entity->getEntityType() . 'Path'); + + $sql = "DELETE FROM `".$pathsTableName."` WHERE descendor_id = ".$pdo->quote($entity->id).""; + $pdo->query($sql); + } +} + diff --git a/application/Espo/Core/Templates/Entities/CategoryTree.php b/application/Espo/Core/Templates/Entities/CategoryTree.php index 19aa667a3d..6239ec10e3 100644 --- a/application/Espo/Core/Templates/Entities/CategoryTree.php +++ b/application/Espo/Core/Templates/Entities/CategoryTree.php @@ -22,7 +22,7 @@ namespace Espo\Core\Templates\Entities; -class CategoryTree extends \Espo\Core\Entities\TreeItem +class CategoryTree extends \Espo\Core\Entities\CategoryTreeItem { } diff --git a/application/Espo/Core/Templates/Metadata/CategoryTree/entityDefs.json b/application/Espo/Core/Templates/Metadata/CategoryTree/entityDefs.json index c82f30b321..09a1e59d18 100644 --- a/application/Espo/Core/Templates/Metadata/CategoryTree/entityDefs.json +++ b/application/Espo/Core/Templates/Metadata/CategoryTree/entityDefs.json @@ -81,7 +81,7 @@ } }, "additionalTables": { - "{entityType}Paths": { + "{entityType}Path": { "fields": { "id": { "type": "id", @@ -90,7 +90,7 @@ "autoincrement": true, "unique" : true }, - "ascendorId" + "ascendorId": { "type": "varchar", "len": "100", "index": true diff --git a/application/Espo/Core/Templates/Repositories/CategoryTree.php b/application/Espo/Core/Templates/Repositories/CategoryTree.php index 414745e8c1..b8d99aeeda 100644 --- a/application/Espo/Core/Templates/Repositories/CategoryTree.php +++ b/application/Espo/Core/Templates/Repositories/CategoryTree.php @@ -23,7 +23,7 @@ namespace Espo\Core\Templates\Repositories; -class CategoryTree extends \Espo\Core\ORM\Repositories\RDB +class CategoryTree extends \Espo\Core\Repositories\CategoryTree { }