/** * @param $data * @param $allowedBrickType * @param $objectFromVersion * @param int $level * @return array */ private function doGetDataForEditmode($getter, $data, $allowedBrickType, $objectFromVersion, $level = 0) { $parent = Object\Service::hasInheritableParentObject($data->getObject()); $item = $data->{$getter}(); if (!$item && !empty($parent)) { $data = $parent->{"get" . ucfirst($this->getName())}(); return $this->doGetDataForEditmode($getter, $data, $allowedBrickType, $objectFromVersion, $level + 1); } if (!$item instanceof Object\Objectbrick\Data\AbstractData) { return null; } try { $collectionDef = Object\Objectbrick\Definition::getByKey($item->getType()); } catch (\Exception $e) { return null; } $brickData = array(); $brickMetaData = array(); $inherited = false; foreach ($collectionDef->getFieldDefinitions() as $fd) { if ($fd instanceof CalculatedValue) { $fieldData = new Object\Data\CalculatedValue($fd->getName()); $fieldData->setContextualData("objectbrick", $this->getName(), $allowedBrickType, $fd->getName(), null, null, $fd); $fieldData = $fd->getDataForEditmode($fieldData, $data->getObject()); $brickData[$fd->getName()] = $fieldData; } else { $fieldData = $this->getDataForField($item, $fd->getName(), $fd, $level, $data->getObject(), $getter, $objectFromVersion); //$fd->getDataForEditmode($item->{$fd->getName()}); $brickData[$fd->getName()] = $fieldData->objectData; } $brickMetaData[$fd->getName()] = $fieldData->metaData; if ($fieldData->metaData['inherited'] == true) { $inherited = true; } } $editmodeDataItem = array("data" => $brickData, "type" => $item->getType(), "metaData" => $brickMetaData, "inherited" => $inherited); return $editmodeDataItem; }
/** * gets recursively attribute data from parent and fills objectData and metaData * * @param $object * @param $key * @param $fielddefinition * @return void */ 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 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 = array(); if ($fielddefinition instanceof Object\ClassDefinition\Data\Href) { $data = $relations[0]; } else { foreach ($relations as $rel) { if ($fielddefinition instanceof Object\ClassDefinition\Data\Objects) { $data[] = array($rel["id"], $rel["path"], $rel["subtype"]); } else { $data[] = array($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; } } } }
/** * @param $name * @param null $language * @return */ public function getLocalizedValue($name, $language = null, $ignoreFallbackLanguage = false) { $data = null; $language = $this->getLanguage($language); $fieldDefinition = $this->getObject()->getClass()->getFieldDefinition("localizedfields")->getFieldDefinition($name); if ($fieldDefinition instanceof Model\Object\ClassDefinition\Data\CalculatedValue) { $valueData = new Model\Object\Data\CalculatedValue($fieldDefinition->getName()); $valueData->setContextualData("localizedfield", "localizedfields", null, $language); $data = Service::getCalculatedFieldValue($this->getObject(), $valueData); return $data; } if ($this->languageExists($language)) { if (array_key_exists($name, $this->items[$language])) { $data = $this->items[$language][$name]; } } // check for inherited value $doGetInheritedValues = AbstractObject::doGetInheritedValues(); if ($fieldDefinition->isEmpty($data) && $doGetInheritedValues) { $object = $this->getObject(); $class = $object->getClass(); $allowInherit = $class->getAllowInherit(); if ($allowInherit) { if ($object->getParent() instanceof AbstractObject) { $parent = $object->getParent(); while ($parent && $parent->getType() == "folder") { $parent = $parent->getParent(); } if ($parent && ($parent->getType() == "object" || $parent->getType() == "variant")) { if ($parent->getClassId() == $object->getClassId()) { $method = "getLocalizedfields"; if (method_exists($parent, $method)) { $localizedFields = $parent->getLocalizedFields(); if ($localizedFields instanceof Localizedfield) { if ($localizedFields->object->getId() != $this->object->getId()) { $data = $localizedFields->getLocalizedValue($name, $language, true); } } } } } } } } // check for fallback value if ($fieldDefinition->isEmpty($data) && !$ignoreFallbackLanguage && self::doGetFallbackValues()) { foreach (Tool::getFallbackLanguagesFor($language) as $l) { if ($this->languageExists($l)) { if (array_key_exists($name, $this->items[$l])) { $data = $this->getLocalizedValue($name, $l); } } } } if ($fieldDefinition && method_exists($fieldDefinition, "preGetData")) { $data = $fieldDefinition->preGetData($this, array("data" => $data, "language" => $language, "name" => $name)); } return $data; }
/** * @see Object\ClassDefinition\Data::getDataForEditmode * @param string $data * @param null|Model\Object\AbstractObject $object * @param mixed $params * @return string */ public function getDataForEditmode($data, $object = null, $params = []) { $fieldData = []; $metaData = []; if (!$data instanceof Object\Classificationstore) { return []; } $result = $this->doGetDataForEditMode($data, $object, $fieldData, $metaData, 1); // replace the real data with the data for the editmode foreach ($result["data"] as $language => &$groups) { foreach ($groups as $groupId => &$keys) { foreach ($keys as $keyId => &$keyValue) { $keyConfig = Object\Classificationstore\DefinitionCache::get($keyId); $fd = Object\Classificationstore\Service::getFieldDefinitionFromKeyConfig($keyConfig); $keyValue = $fd->getDataForEditmode($keyValue, $object, $params); } } } $activeGroupIds = $this->recursiveGetActiveGroupsIds($object); $validLanguages = $this->getValidLanguages(); foreach ($validLanguages as $language) { foreach ($activeGroupIds as $groupId => $enabled) { if (!$enabled) { continue; } $relation = new Object\Classificationstore\KeyGroupRelation\Listing(); $relation->setCondition("type = 'calculatedValue' and groupId = " . $relation->quote($groupId)); $relation = $relation->load(); foreach ($relation as $key) { $keyId = $key->getKeyId(); $childDef = Object\Classificationstore\Service::getFieldDefinitionFromKeyConfig($key); $childData = new Object\Data\CalculatedValue($this->getName()); $childData->setContextualData("classificationstore", $this->getName(), null, $language, $groupId, $keyId, $childDef); $childData = $childDef->getDataForEditmode($childData, $object, $params); $result["data"][$language][$groupId][$keyId] = $childData; } } } $result["activeGroups"] = $data->getActiveGroups(); $result["groupCollectionMapping"] = $data->getGroupCollectionMappings(); return $result; }
/** * @see Object\ClassDefinition\Data::getDataForEditmode * @param string $data * @param null|Model\Object\AbstractObject $object * @return string */ public function getDataForEditmode($data, $object = null) { $fieldData = array(); $metaData = array(); if (!$data instanceof Object\Localizedfield) { return array(); } $result = $this->doGetDataForEditMode($data, $object, $fieldData, $metaData, 1); // replace the real data with the data for the editmode foreach ($result["data"] as $language => &$data) { foreach ($data as $key => &$value) { $fieldDefinition = $this->getFielddefinition($key); if (!$fieldDefinition instanceof CalculatedValue) { $value = $fieldDefinition->getDataForEditmode($value, $object); } } } if ($this->hasChilds()) { $childs = $this->getChilds(); $validLanguages = Tool::getValidLanguages(); foreach ($childs as $childDef) { if ($childDef instanceof CalculatedValue) { foreach ($validLanguages as $language) { $childData = new Object\Data\CalculatedValue($childDef->getName()); $childData->setContextualData("localizedfield", $this->getName(), null, $language); $childData = $childDef->getDataForEditmode($childData, $object); $result["data"][$language][$childDef->getName()] = $childData; } } } } return $result; }
/** * @see Object\ClassDefinition\Data::getDataForEditmode * @param string $data * @param null|Model\Object\AbstractObject $object * @return string */ public function getDataForEditmode($data, $object = null) { $editmodeData = array(); $idx = -1; if ($data instanceof Object\Fieldcollection) { foreach ($data as $item) { $idx++; if (!$item instanceof Object\Fieldcollection\Data\AbstractData) { continue; } try { $collectionDef = Object\Fieldcollection\Definition::getByKey($item->getType()); } catch (\Exception $e) { continue; } $collectionData = array(); foreach ($collectionDef->getFieldDefinitions() as $fd) { if ($fd instanceof CalculatedValue) { $data = new Object\Data\CalculatedValue($fd->getName()); $data->setContextualData("fieldcollection", $this->getName(), $idx, null, null, null, $fd); $data = $fd->getDataForEditmode($data, $object); $collectionData[$fd->getName()] = $data; } else { $collectionData[$fd->getName()] = $fd->getDataForEditmode($item->{$fd->getName()}, $object); } } $editmodeData[] = array("data" => $collectionData, "type" => $item->getType()); } } return $editmodeData; }
/** * @see Object\ClassDefinition\Data::getDataForEditmode * @param string $data * @param null|Model\Object\AbstractObject $object * @param mixed $params * @return string */ public function getDataForEditmode($data, $object = null, $params = []) { $fieldData = []; $metaData = []; if (!$data instanceof Object\Localizedfield) { return []; } $result = $this->doGetDataForEditMode($data, $object, $fieldData, $metaData, 1); // replace the real data with the data for the editmode foreach ($result["data"] as $language => &$data) { foreach ($data as $key => &$value) { $fieldDefinition = $this->getFielddefinition($key); if ($fieldDefinition instanceof CalculatedValue) { $childData = new Object\Data\CalculatedValue($fieldDefinition->getName()); $childData->setContextualData("localizedfield", $this->getName(), null, $language); $value = $fieldDefinition->getDataForEditmode($childData, $object, $params); } else { $value = $fieldDefinition->getDataForEditmode($value, $object, $params); } } } return $result; }
/** * @param $keyId * @param $groupId * @param string $language * @param bool|false $ignoreFallbackLanguage * @return null */ public function getLocalizedKeyValue($groupId, $keyId, $language = "default", $ignoreFallbackLanguage = false, $ignoreDefaultLanguage = false) { $oid = $this->object->getId(); $keyConfig = Model\Object\Classificationstore\DefinitionCache::get($keyId); if ($keyConfig->getType() == "calculatedValue") { $data = new Model\Object\Data\CalculatedValue($this->getFieldname()); $childDef = Model\Object\Classificationstore\Service::getFieldDefinitionFromKeyConfig($keyConfig); $data->setContextualData("classificationstore", $this->getFieldname(), null, $language, $groupId, $keyId, $childDef); $data = Model\Object\Service::getCalculatedFieldValueForEditMode($this->getObject(), $data); return $data; } $fieldDefinition = Model\Object\Classificationstore\Service::getFieldDefinitionFromKeyConfig($keyConfig); $language = $this->getLanguage($language); $data = null; if (array_key_exists($groupId, $this->items) && array_key_exists($keyId, $this->items[$groupId]) && array_key_exists($language, $this->items[$groupId][$keyId])) { $data = $this->items[$groupId][$keyId][$language]; } // check for fallback value if ($fieldDefinition->isEmpty($data) && !$ignoreFallbackLanguage && self::doGetFallbackValues()) { $data = $this->getFallbackValue($groupId, $keyId, $language, $fieldDefinition); } if ($fieldDefinition->isEmpty($data) && !$ignoreDefaultLanguage && $language != "default") { $data = $this->items[$groupId][$keyId]["default"]; } // check for inherited value $doGetInheritedValues = AbstractObject::doGetInheritedValues(); if ($fieldDefinition->isEmpty($data) && $doGetInheritedValues) { $object = $this->getObject(); $class = $object->getClass(); $allowInherit = $class->getAllowInherit(); if ($allowInherit) { if ($object->getParent() instanceof AbstractObject) { $parent = $object->getParent(); while ($parent && $parent->getType() == "folder") { $parent = $parent->getParent(); } if ($parent && ($parent->getType() == "object" || $parent->getType() == "variant")) { if ($parent->getClassId() == $object->getClassId()) { $method = "getLocalizedfields"; if (method_exists($parent, $method)) { $getter = "get" . ucfirst($this->fieldname); $classificationStore = $parent->{$getter}(); if ($classificationStore instanceof Classificationstore) { if ($classificationStore->object->getId() != $this->object->getId()) { $data = $classificationStore->getLocalizedKeyValue($groupId, $keyId, $language, false); } } } } } } } } if ($fieldDefinition && method_exists($fieldDefinition, "preGetData")) { $data = $fieldDefinition->preGetData($this, array("data" => $data, "language" => $language, "name" => $groupId . "-" . $keyId)); } return $data; }
/** * @see Object\ClassDefinition\Data::getDataForEditmode * @param string $data * @param null|Model\Object\AbstractObject $object * @param mixed $params * @return string */ public function getDataForEditmode($data, $object = null, $params = []) { $editmodeData = []; $idx = -1; if ($data instanceof Object\Fieldcollection) { foreach ($data as $item) { $idx++; if (!$item instanceof Object\Fieldcollection\Data\AbstractData) { continue; } try { $collectionDef = Object\Fieldcollection\Definition::getByKey($item->getType()); } catch (\Exception $e) { continue; } $collectionData = []; foreach ($collectionDef->getFieldDefinitions() as $fd) { if (!$fd instanceof CalculatedValue) { $collectionData[$fd->getName()] = $fd->getDataForEditmode($item->{$fd->getName()}, $object, $params); } } $calculatedChilds = []; self::collectCalculatedValueItems($collectionDef->getFieldDefinitions(), $calculatedChilds); if ($calculatedChilds) { foreach ($calculatedChilds as $fd) { $data = new Object\Data\CalculatedValue($fd->getName()); $data->setContextualData("fieldcollection", $this->getName(), $idx, null, null, null, $fd); $data = $fd->getDataForEditmode($data, $object, $params); $collectionData[$fd->getName()] = $data; } } $editmodeData[] = ["data" => $collectionData, "type" => $item->getType(), "oIndex" => $idx]; } } return $editmodeData; }