MicroFrameWork/kernel/EntityRelation.php

279 lines
9.5 KiB
PHP
Raw Permalink Normal View History

2024-11-20 15:30:29 +03:00
<?php
namespace kernel;
2024-11-25 15:17:41 +03:00
use Illuminate\Database\Eloquent\Model;
2024-11-20 15:30:29 +03:00
use kernel\helpers\Debug;
use kernel\models\Option;
2024-11-20 16:48:13 +03:00
use kernel\modules\option\service\OptionService;
use kernel\services\ModuleService;
2024-11-20 15:30:29 +03:00
class EntityRelation
{
2024-11-20 16:48:13 +03:00
protected ModuleService $moduleService;
public function __construct()
{
$this->moduleService = new ModuleService();
}
2024-11-27 16:19:19 +03:00
public static function getEntityList(): array
2024-11-20 15:30:29 +03:00
{
2024-11-20 16:48:13 +03:00
$list = [];
2024-11-27 16:19:19 +03:00
$moduleService = new ModuleService();
$activeModules = $moduleService->getActiveModules();
2024-11-20 16:48:13 +03:00
foreach ($activeModules as $module) {
if (isset($module['type']) and $module['type'] === "entity") {
2024-12-02 14:15:01 +03:00
$list[$module['slug']] = $module['slug'];
2024-11-20 16:48:13 +03:00
}
}
return $list;
}
public function getAdditionalPropertyList(): array
{
$list = [];
$activeModules = $this->moduleService->getActiveModules();
foreach ($activeModules as $module) {
if (isset($module['type']) and $module['type'] === "additional_property") {
$list[] = $module['slug'];
2024-11-20 15:30:29 +03:00
}
2024-11-20 16:48:13 +03:00
}
return $list;
}
2024-12-02 14:15:01 +03:00
public static function getEntitiesRelations(): array|bool
2024-11-20 16:48:13 +03:00
{
$entity_relations = OptionService::getItem("entity_relations");
if ($entity_relations) {
return json_decode($entity_relations, true);
}
return false;
}
2024-11-20 15:30:29 +03:00
2024-11-21 13:00:21 +03:00
public static function removePropertyFromEntityRelations(string $entity, string $property): bool
2024-11-20 16:48:13 +03:00
{
2024-11-21 11:47:13 +03:00
$entity_relations_info = Option::where("key", "entity_relations")->first();
if ($entity_relations_info) {
$entity_relations = json_decode($entity_relations_info->value, true);
if ($entity_relations[$entity]) {
2024-12-02 14:15:01 +03:00
$propertyKey = array_search($property, $entity_relations[$entity]);
if ($entity_relations[$entity][$propertyKey] === $property) {
unset($entity_relations[$entity][$propertyKey]);
$entity_relations[$entity] = array_values($entity_relations[$entity]);
if (empty($entity_relations[$entity])) {
unset($entity_relations[$entity]);
}
2024-11-21 11:47:13 +03:00
$entity_relations_info->value = json_encode($entity_relations, JSON_UNESCAPED_UNICODE);
$entity_relations_info->save();
return true;
}
}
}
2024-11-20 16:48:13 +03:00
2024-11-21 11:47:13 +03:00
return false;
2024-11-20 16:48:13 +03:00
}
2024-11-21 13:00:21 +03:00
public static function removePropertyRelation(string $property): bool
{
$entity_relations_info = Option::where("key", "entity_relations")->first();
if ($entity_relations_info) {
$entity_relations = json_decode($entity_relations_info->value, true);
2024-11-28 16:25:51 +03:00
foreach ($entity_relations as $entity => $entity_relation) {
2024-11-21 13:00:21 +03:00
if (in_array($property, $entity_relation)) {
$index = array_search($property, $entity_relation);
unset($entity_relations[$entity][$index]);
}
}
$entity_relations_info->value = json_encode($entity_relations, JSON_UNESCAPED_UNICODE);
$entity_relations_info->save();
return true;
}
return false;
}
public static function removeEntityRelation(string $entity): bool
{
$entity_relations_info = Option::where("key", "entity_relations")->first();
if ($entity_relations_info) {
$entity_relations = json_decode($entity_relations_info->value, true);
if (isset($entity_relations[$entity])) {
unset($entity_relations[$entity]);
$entity_relations_info->value = json_encode($entity_relations, JSON_UNESCAPED_UNICODE);
$entity_relations_info->save();
return true;
}
}
return false;
}
2024-11-20 16:48:13 +03:00
public function getEntityRelationsBySlug(string $slug)
{
$entityRelations = $this->getEntitiesRelations();
if ($entityRelations) {
2024-11-28 16:25:51 +03:00
if (isset($entityRelations[$slug])) {
2024-11-20 16:48:13 +03:00
return $entityRelations[$slug];
}
2024-11-20 15:30:29 +03:00
}
2024-12-03 12:13:18 +03:00
return [];
2024-11-20 15:30:29 +03:00
}
2024-11-29 16:54:35 +03:00
public static function addEntityRelation(string $entity, string $property): bool
2024-11-20 15:30:29 +03:00
{
$entity_relations_info = Option::where("key", "entity_relations")->first();
if ($entity_relations_info) {
$entity_relations = json_decode($entity_relations_info->value, true);
2024-11-21 11:47:13 +03:00
if (isset($entity_relations[$entity])) {
$entity_relations[$entity][] = $property;
} else {
2024-12-02 14:15:01 +03:00
$entity_relations[$entity][] = $property;
2024-11-20 15:30:29 +03:00
}
$entity_relations_info->value = json_encode($entity_relations, JSON_UNESCAPED_UNICODE);
$entity_relations_info->save();
return true;
}
return false;
}
2024-11-20 16:48:13 +03:00
public function getAdditionalPropertyClassBySlug(string $slug)
{
$module = $this->moduleService->getModuleInfoBySlug($slug);
if (isset($module['module_class'])) {
return new $module['module_class']();
}
return false;
}
2024-11-25 15:17:41 +03:00
public function renderFormInputsBySlug(string $entity, string $slug, Model $model): void
2024-11-20 16:48:13 +03:00
{
$moduleClass = $this->getAdditionalPropertyClassBySlug($slug);
if ($moduleClass and method_exists($moduleClass, "formInputs")) {
2024-11-25 15:17:41 +03:00
$moduleClass->formInputs($entity, $model);
2024-11-20 16:48:13 +03:00
}
}
2024-11-25 15:17:41 +03:00
public function renderEntityAdditionalPropertyFormBySlug(string $entity, Model $model = null): void
2024-11-20 16:48:13 +03:00
{
2024-11-25 15:17:41 +03:00
$relations = $this->getEntityRelationsBySlug($entity);
2024-11-28 16:25:51 +03:00
if ($relations) {
foreach ($relations as $relation) {
2024-11-25 15:17:41 +03:00
$this->renderFormInputsBySlug($entity, $relation, $model);
2024-11-20 16:48:13 +03:00
}
}
}
2024-11-21 13:00:21 +03:00
2024-11-25 15:17:41 +03:00
public function saveEntityRelationBySlug(string $slug, string $entity, Model $model, Request $request): void
2024-11-21 13:00:21 +03:00
{
$moduleClass = $this->getAdditionalPropertyClassBySlug($slug);
if ($moduleClass and method_exists($moduleClass, "saveInputs")) {
2024-11-27 14:15:55 +03:00
$moduleClass->saveInputs($entity, $model, $request);
2024-11-21 13:00:21 +03:00
}
}
2024-11-25 15:17:41 +03:00
public function saveEntityRelation(string $entity, Model $model, Request $request): void
2024-11-21 13:00:21 +03:00
{
$relations = $this->getEntityRelationsBySlug($entity);
2024-11-28 16:25:51 +03:00
if ($relations) {
foreach ($relations as $relation) {
2024-11-25 15:17:41 +03:00
$this->saveEntityRelationBySlug($relation, $entity, $model, $request);
2024-11-21 13:00:21 +03:00
}
}
}
2024-11-27 17:11:06 +03:00
public function getEntityAdditionalProperty(string $entity, Model $model): array
{
$relations = $this->getEntityRelationsBySlug($entity);
2024-11-28 16:25:51 +03:00
if ($relations) {
2024-11-28 12:15:30 +03:00
$relationsArr = [];
2024-11-28 16:25:51 +03:00
foreach ($relations as $relation) {
2024-11-27 17:11:06 +03:00
$moduleClass = $this->getAdditionalPropertyClassBySlug($relation);
if ($moduleClass and method_exists($moduleClass, "getItems")) {
2024-11-28 12:15:30 +03:00
$relationsArr[$relation] = $moduleClass->getItems($entity, $model);
2024-11-27 17:11:06 +03:00
}
}
2024-11-28 12:15:30 +03:00
return $relationsArr;
2024-11-27 17:11:06 +03:00
}
return [];
}
2024-11-28 15:34:57 +03:00
2024-11-28 16:25:51 +03:00
public function getAdditionalPropertyByEntityId(string $entity, string $entity_id, string $additionalPropertySlug): string
{
$moduleClass = $this->getAdditionalPropertyClassBySlug($additionalPropertySlug);
if ($moduleClass and method_exists($moduleClass, "getItem")) {
return $moduleClass->getItem($entity, $entity_id);
}
return "";
}
2024-11-28 15:34:57 +03:00
public function deleteEntityRelationBySlug(string $slug, string $entity, Model $model): void
{
$moduleClass = $this->getAdditionalPropertyClassBySlug($slug);
if ($moduleClass and method_exists($moduleClass, "deleteItems")) {
$moduleClass->deleteItems($entity, $model);
}
}
public function deleteEntityRelation(string $entity, Model $model): void
{
$relations = $this->getEntityRelationsBySlug($entity);
2024-11-28 16:25:51 +03:00
if ($relations) {
foreach ($relations as $relation) {
2024-11-28 15:34:57 +03:00
$this->deleteEntityRelationBySlug($relation, $entity, $model);
}
}
}
2024-12-02 14:15:01 +03:00
public static function getEntityByProperty(string $data): array
{
$entityRelations = self::getEntitiesRelations();
$entities = [];
foreach ($entityRelations as $entity => $property) {
if (in_array($data, $property)) {
$entities[] = $entity;
}
}
return $entities;
}
2024-12-02 16:25:28 +03:00
public static function configurationEntitiesByProperty(array|null $entities, string $property): void
{
$entityRelations = self::getEntitiesRelations();
if (isset($entities)) {
foreach ($entities as $entity) {
if (!isset($entityRelations[$entity])) {
EntityRelation::addEntityRelation($entity, $property);
}
}
foreach ($entityRelations as $entity => $additionalProperty) {
if (in_array($entity, $entities)) {
if (!in_array($property, $additionalProperty)) {
EntityRelation::addEntityRelation($entity, $property);
}
} else {
if (in_array($property, $additionalProperty)) {
EntityRelation::removePropertyFromEntityRelations($entity, $property);
}
}
}
} else {
foreach ($entityRelations as $entity => $additionalProperty) {
EntityRelation::removePropertyFromEntityRelations($entity, $property);
}
}
}
2024-11-20 15:30:29 +03:00
}