Skip to content
This repository has been archived by the owner on Dec 27, 2023. It is now read-only.

Commit

Permalink
fix(Tinebase CRA) _setRelationsByVirtualProps was buggy, fixed it
Browse files Browse the repository at this point in the history
Change-Id: I237c265f619caa0515ec4374a256b239d6aa1b16
Reviewed-on: http://gerrit.tine20.com/customers/18703
Tested-by: Jenkins CI (http://ci.tine20.com/) <tine20-jenkins@metaways.de>
Reviewed-by: Paul Mehrer <p.mehrer@metaways.de>
  • Loading branch information
paulmhh committed Dec 15, 2020
1 parent db53b83 commit 9c81915
Showing 1 changed file with 26 additions and 23 deletions.
49 changes: 26 additions & 23 deletions tine20/Tinebase/Controller/Record/Abstract.php
Expand Up @@ -1406,15 +1406,6 @@ protected function _setRelationsByVirtualProps(Tinebase_Record_Interface $record
$addRelations = [];
$removeRelations = [];

if (null !== $record->relations) {
if (is_array($record->relations)) {
$record->relations = new Tinebase_Record_RecordSet(Tinebase_Model_Relation::class, $record->relations);
}
$relationsNull = false;
} else {
$relationsNull = true;
}

foreach (array_keys($mc->getVirtualFields()) as $virtualField) {
if (!isset($properties[$virtualField][TMCC::CONFIG][TMCC::TYPE]) || (TMCC::TYPE_RELATION !==
$properties[$virtualField][TMCC::CONFIG][TMCC::TYPE] && TMCC::TYPE_RELATIONS !==
Expand All @@ -1432,50 +1423,62 @@ protected function _setRelationsByVirtualProps(Tinebase_Record_Interface $record
}

if (null === $record->{$virtualField}) {
if (!$relationsNull && $existingRelations->count() > 0) {
if ($existingRelations->count() > 0) {
$addRelations[] = $existingRelations;
}
continue;
}

$toAdd = new Tinebase_Record_RecordSet(Tinebase_Model_Relation::class);
foreach ($record->{$virtualField} as $item) {
if (is_array($item)) {
$item = $item['id'];
}
if (null === ($existingRel = $existingRelations->find('related_id', $item))) {
$relationsModified = true;
$addRelations[] = new Tinebase_Model_Relation([
'related_model' => $model,
'related_backend' => Tinebase_Model_Relation::DEFAULT_RECORD_BACKEND,
'related_id' => $item,
'related_degree' => $degree,
'type' => $type,
], true);
$toAdd->addRecord(new Tinebase_Model_Relation([
'related_model' => $model,
'related_backend' => Tinebase_Model_Relation::DEFAULT_RECORD_BACKEND,
'related_id' => $item,
'related_degree' => $degree,
'type' => $type,
], true));
} else {
$existingRelations->removeById($existingRel->getId());
}
}

if ($toAdd->count() > 0) {
$addRelations[] = $toAdd;
}
if ($existingRelations->count() > 0) {
$relationsModified = true;
$removeRelations[] = $existingRelations;
}
}

if ($relationsModified) {
if ($relationsNull) {
if (null !== $record->relations) {
if (is_array($record->relations)) {
$record->relations = new Tinebase_Record_RecordSet(Tinebase_Model_Relation::class, $record->relations);
}
} else {
if (null !== $currentRecord) {
$record->relations = $currentRecord->relations;
$record->relations = clone $currentRecord->relations;
} else {
$record->relations = new Tinebase_Record_RecordSet(Tinebase_Model_Relation::class);
}
}

/** @var Tinebase_Record_RecordSet $add */
foreach ($addRelations as $add) {
if ($add instanceof Tinebase_Record_RecordSet) {
$record->relations->mergeById($add);
} else {
$record->relations->addRecord($add);
$firstRecord = $add->getFirstRecord();
$existingRelations = $record->relations->filter('related_model', $firstRecord->related_model)
->filter('type', $firstRecord->type)->filter('degree', $firstRecord->degree);
foreach ($add as $toAdd) {
if ($existingRelations->find('related_id', $toAdd->related_id) === null) {
$record->relations->addRecord($toAdd);
}
}
}

Expand Down

0 comments on commit 9c81915

Please sign in to comment.