private function getParentValue($object, $key) { $parent = Object_Service::hasInheritableParentObject($object); $getter = "get" . ucfirst($key); if ($parent) { $value = $parent->{$getter}(); if ($value) { $result = new stdClass(); $result->value = $value; $result->id = $parent->getId(); return $result; } else { return $this->getParentValue($parent, $key); } } }
/** * @return mixed */ public function getValueFromParent($key) { $parent = Object_Service::hasInheritableParentObject($this->getObject()); if (!empty($parent)) { $containerGetter = "get" . ucfirst($this->fieldname); $brickGetter = "get" . ucfirst($this->getType()); $getter = "get" . ucfirst($key); if ($parent->{$containerGetter}()->{$brickGetter}()) { return $parent->{$containerGetter}()->{$brickGetter}()->{$getter}(); } } return null; }
/** * gets recursively attribute data from parent and fills objectData and metaData * * @param $object * @param $key * @param $fielddefinition * @return void */ 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") and $fielddefinition->getLazyLoading() and !$fielddefinition instanceof Object_Class_Data_ObjectsMetadata) { //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 = array(); if ($fielddefinition instanceof Object_Class_Data_Href) { $data = $relations[0]; } else { foreach ($relations as $rel) { if ($fielddefinition instanceof Object_Class_Data_Objects) { $data[] = array($rel["id"], $rel["path"], $rel["subtype"]); } else { $data[] = array($rel["id"], $rel["path"], $rel["type"], $rel["subtype"]); } } } $result->objectData = $data; $result->metaData['objectid'] = $baseObject->getId(); $result->metaData['inherited'] = $level != 0; } else { $value = null; if (!empty($item)) { $value = $fielddefinition->getDataForEditmode($item->{$valueGetter}(), $baseObject); } if (empty($value) && !empty($parent)) { $parentItem = $parent->{"get" . ucfirst($this->getName())}()->{$getter}(); if (!empty($parentItem)) { return $this->getDataForField($parentItem, $key, $fielddefinition, $level + 1, $parent, $getter, $objectFromVersion); } } $result->objectData = $value; $result->metaData['objectid'] = $baseObject->getId(); $result->metaData['inherited'] = $level != 0; } return $result; }