private function getDataForField($object, $key, $fielddefinition, $objectFromVersion, $level = 0)
{
$parent = Object\Service::hasInheritableParentObject($object);
$getter = "get" . ucfirst($key);
// relations but not for objectsMetadata, because they have additional data which cannot be loaded directly from the DB
// nonownerobjects should go in there anyway (regardless if it a version or not), so that the values can be loaded
if (!$objectFromVersion && $fielddefinition instanceof Object\ClassDefinition\Data\Relations\AbstractRelations && $fielddefinition->getLazyLoading() && !$fielddefinition instanceof Object\ClassDefinition\Data\ObjectsMetadata && !$fielddefinition instanceof Object\ClassDefinition\Data\MultihrefMetadata || $fielddefinition instanceof Object\ClassDefinition\Data\Nonownerobjects) {
//lazy loading data is fetched from DB differently, so that not every relation object is instantiated
$refId = null;
if ($fielddefinition->isRemoteOwner()) {
$refKey = $fielddefinition->getOwnerFieldName();
$refClass = Object\ClassDefinition::getByName($fielddefinition->getOwnerClassName());
if ($refClass) {
$refId = $refClass->getId();
}
} else {
$refKey = $key;
}
$relations = $object->getRelationData($refKey, !$fielddefinition->isRemoteOwner(), $refId);
if (empty($relations) && !empty($parent)) {
$this->getDataForField($parent, $key, $fielddefinition, $objectFromVersion, $level + 1);
} else {
$data = [];
if ($fielddefinition instanceof Object\ClassDefinition\Data\Href) {
$data = $relations[0];
} else {
foreach ($relations as $rel) {
if ($fielddefinition instanceof Object\ClassDefinition\Data\Objects) {
$data[] = [$rel["id"], $rel["path"], $rel["subtype"]];
} else {
$data[] = [$rel["id"], $rel["path"], $rel["type"], $rel["subtype"]];
}
}
}
$this->objectData[$key] = $data;
$this->metaData[$key]['objectid'] = $object->getId();
$this->metaData[$key]['inherited'] = $level != 0;
}
} else {
$fieldData = $object->{$getter}();
$isInheritedValue = false;
if ($fielddefinition instanceof Object\ClassDefinition\Data\CalculatedValue) {
$fieldData = new Object\Data\CalculatedValue($fielddefinition->getName());
$fieldData->setContextualData("object", null, null, null);
$value = $fielddefinition->getDataForEditmode($fieldData, $object, $objectFromVersion);
} else {
$value = $fielddefinition->getDataForEditmode($fieldData, $object, $objectFromVersion);
}
// following some exceptions for special data types (localizedfields, objectbricks)
if ($value && ($fieldData instanceof Object\Localizedfield || $fieldData instanceof Object\Classificationstore)) {
// make sure that the localized field participates in the inheritance detection process
$isInheritedValue = $value["inherited"];
}
if ($fielddefinition instanceof Object\ClassDefinition\Data\Objectbricks && is_array($value)) {
// make sure that the objectbricks participate in the inheritance detection process
foreach ($value as $singleBrickData) {
if ($singleBrickData["inherited"]) {
$isInheritedValue = true;
}
}
}
if ($fielddefinition->isEmpty($fieldData) && !empty($parent)) {
$this->getDataForField($parent, $key, $fielddefinition, $objectFromVersion, $level + 1);
} else {
$isInheritedValue = $isInheritedValue || $level != 0;
$this->metaData[$key]['objectid'] = $object->getId();
$this->objectData[$key] = $value;
$this->metaData[$key]['inherited'] = $isInheritedValue;
if ($isInheritedValue && !$fielddefinition->isEmpty($fieldData) && !$this->isInheritableField($fielddefinition)) {
$this->objectData[$key] = null;
$this->metaData[$key]['inherited'] = false;
$this->metaData[$key]['hasParentValue'] = true;
}
}
}
}