private function getDataForField($item, $key, $fielddefinition, $level, $baseObject, $getter, $objectFromVersion)
{
$result = new \stdClass();
$parent = Object\Service::hasInheritableParentObject($baseObject);
$valueGetter = "get" . ucfirst($key);
// relations but not for objectsMetadata, because they have additional data which cannot be loaded directly from the DB
if (!$objectFromVersion && method_exists($fielddefinition, "getLazyLoading") && $fielddefinition->getLazyLoading() && !$fielddefinition instanceof Object\ClassDefinition\Data\ObjectsMetadata && !$fielddefinition instanceof Object\ClassDefinition\Data\MultihrefMetadata) {
//lazy loading data is fetched from DB differently, so that not every relation object is instantiated
if ($fielddefinition->isRemoteOwner()) {
$refKey = $fielddefinition->getOwnerFieldName();
$refId = $fielddefinition->getOwnerClassId();
} else {
$refKey = $key;
}
$relations = $item->getRelationData($refKey, !$fielddefinition->isRemoteOwner(), $refId);
if (empty($relations) && !empty($parent)) {
$parentItem = $parent->{"get" . ucfirst($this->getName())}();
if (!empty($parentItem)) {
$parentItem = $parentItem->{$getter}();
if ($parentItem) {
return $this->getDataForField($parentItem, $key, $fielddefinition, $level + 1, $parent, $getter, $objectFromVersion);
}
}
}
$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"]];
}
}
}
$result->objectData = $data;
$result->metaData['objectid'] = $baseObject->getId();
$result->metaData['inherited'] = $level != 0;
} else {
$editmodeValue = null;
if (!empty($item)) {
$fieldValue = $item->{$valueGetter}();
$editmodeValue = $fielddefinition->getDataForEditmode($fieldValue, $baseObject);
}
if ($fielddefinition->isEmpty($fieldValue) && !empty($parent)) {
$backup = Object\AbstractObject::getGetInheritedValues();
Object\AbstractObject::setGetInheritedValues(true);
$parentItem = $parent->{"get" . ucfirst($this->getName())}()->{$getter}();
Object\AbstractObject::setGetInheritedValues($backup);
if (!empty($parentItem)) {
return $this->getDataForField($parentItem, $key, $fielddefinition, $level + 1, $parent, $getter, $objectFromVersion);
}
}
$result->objectData = $editmodeValue;
$result->metaData['objectid'] = $baseObject->getId();
$result->metaData['inherited'] = $level != 0;
}
return $result;
}