Example #1
0
 /**
  * @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;
 }
Example #4
0
 /**
  * @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;
 }
Example #5
0
 /**
  * @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;
 }
Example #7
0
 /**
  * @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;
 }
Example #8
0
 /**
  * @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;
 }
Example #9
0
 /**
  * @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;
 }