/** * @param $object \Object_Abstract * @param array $activeGroups * @return array */ public function recursiveGetActiveGroupsIds($object, $activeGroups = []) { if (!$object) { return; } $getter = "get" . ucfirst($this->getName()); /** @var $classificationStore Object\Classificationstore */ $classificationStore = $object->{$getter}(); $activeGroupIds = $classificationStore->getActiveGroups(); if ($activeGroupIds) { foreach ($activeGroupIds as $groupId => $enabled) { if ($enabled) { $activeGroups[$groupId] = $enabled; } } } $class = $object->getClass(); $inheritanceAllowed = $class->getAllowInherit(); if ($inheritanceAllowed) { $parent = Object\Service::hasInheritableParentObject($object); if ($parent) { $activeGroups = $this->recursiveGetActiveGroupsIds($parent, $activeGroups); } } return $activeGroups; }
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; }
/** * @param bool $forEditMode * @return array */ public function getProperties($forEditMode = false) { $result = array(); $object = Object::getById($this->objectId); if (!$object) { throw new \Exception('Object with Id ' . $this->objectId . ' not found'); } $objectName = $object->getKey(); $internalKeys = array(); foreach ($this->arr as $pair) { $pair["inherited"] = false; $pair["source"] = $object->getId(); $pair["groupId"] = Object\KeyValue\KeyConfig::getById($pair['key'])->getGroup(); $result[] = $pair; $internalKeys[] = $pair["key"]; } $blacklist = $internalKeys; $parent = Object\Service::hasInheritableParentObject($object); while ($parent) { $kv = $parent->getKeyvaluepairs(); $parentProperties = $kv ? $kv->getInternalProperties() : []; $addedKeys = array(); foreach ($parentProperties as $parentPair) { $parentKeyId = $parentPair["key"]; $parentValue = $parentPair["value"]; if (in_array($parentKeyId, $blacklist)) { continue; } if ($this->multivalent && !$forEditMode && in_array($parentKeyId, $internalKeys)) { continue; } $add = true; for ($i = 0; $i < count($result); ++$i) { $resultPair = $result[$i]; $resultKey = $resultPair["key"]; $existingPair = null; if ($resultKey == $parentKeyId) { if ($this->multivalent && !in_array($resultKey, $blacklist)) { } else { $add = false; } // if the parent's key is already in the (internal) result list then // we don't add it => not inherited. if (!$this->multivalent) { $add = false; if (empty($resultPair["altSource"])) { $resultPair["altSource"] = $parent->getId(); $resultPair["altValue"] = $parentPair["value"]; } } $result[$i] = $resultPair; } if (!$this->multivalent) { break; } } $addedKeys[] = $parentPair["key"]; if ($add) { $parentPair["inherited"] = true; $parentPair["source"] = $parent->getId(); $parentPair["altSource"] = $parent->getId(); $parentPair["altValue"] = $parentPair["value"]; $parentPair["groupId"] = Object\KeyValue\KeyConfig::getById($parentPair['key'])->getGroup(); $result[] = $parentPair; } } foreach ($parentProperties as $parentPair) { $parentKeyId = $parentPair["key"]; $blacklist[] = $parentKeyId; } $parent = Object\Service::hasInheritableParentObject($parent); } return $result; }
/** * @param $data * @param $object * @param $fieldData * @param $metaData * @param int $level * @return array */ private function doGetDataForEditMode($data, $object, &$fieldData, &$metaData, $level = 1) { $class = $object->getClass(); $inheritanceAllowed = $class->getAllowInherit(); $inherited = false; foreach ($data->getItems() as $language => $values) { foreach ($this->getFieldDefinitions() as $fd) { $key = $fd->getName(); $fdata = $values[$fd->getName()]; if (!isset($fieldData[$language][$key]) || $fd->isEmpty($fieldData[$language][$key])) { // never override existing data $fieldData[$language][$key] = $fdata; if (!$fd->isEmpty($fdata)) { $metaData[$language][$key] = array("inherited" => $level > 1, "objectid" => $object->getId()); } } } } if ($inheritanceAllowed) { // check if there is a parent with the same type $parent = Object\Service::hasInheritableParentObject($object); if ($parent) { // same type, iterate over all language and all fields and check if there is something missing $validLanguages = Tool::getValidLanguages(); $foundEmptyValue = false; foreach ($validLanguages as $language) { $fieldDefinitions = $this->getFieldDefinitions(); foreach ($fieldDefinitions as $fd) { $key = $fd->getName(); if ($fd->isEmpty($fieldData[$language][$key])) { $foundEmptyValue = true; $inherited = true; $metaData[$language][$key] = array("inherited" => true, "objectid" => $parent->getId()); } } } if ($foundEmptyValue) { // still some values are passing, ask the parent $parentData = $parent->getLocalizedFields(); $parentResult = $this->doGetDataForEditMode($parentData, $parent, $fieldData, $metaData, $level + 1); } } } $result = array("data" => $fieldData, "metaData" => $metaData, "inherited" => $inherited); return $result; }
/** * @param $data * @param $getter * @param $objectFromVersion * @param int $level * @return array */ private function doGetDiffDataForEditmode($data, $getter, $objectFromVersion, $level = 0) { $parent = Object\Service::hasInheritableParentObject($data->getObject()); $item = $data->{$getter}(); if (!$item && !empty($parent)) { $data = $parent->{"get" . ucfirst($this->getName())}(); return $this->doGetDiffDataForEditmode($data, $getter, $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; } $result = array(); foreach ($collectionDef->getFieldDefinitions() as $fd) { $fieldData = $this->getDiffDataForField($item, $fd->getName(), $fd, $level, $data->getObject(), $getter, $objectFromVersion); //$fd->getDataForEditmode($item->{$fd->getName()}); $diffdata = array(); foreach ($fieldData as $subdata) { $diffdata["field"] = $this->getName(); $diffdata["key"] = $this->getName() . "~" . $fd->getName(); $diffdata["value"] = $subdata["value"]; $diffdata["type"] = $subdata["type"]; $diffdata["disabled"] = $subdata["disabled"]; // this is not needed anymoe unset($subdata["type"]); unset($subdata["value"]); $diffdata["title"] = $this->getName() . " / " . $subdata["title"]; $brickdata = array("brick" => substr($getter, 3), "name" => $fd->getName(), "subdata" => $subdata); $diffdata["data"] = $brickdata; } $result[] = $diffdata; } return $result; }
/** * Get all Variants Differences * * @return array */ public function getVariantDifferences() { $master = $this; $parent = Object\Service::hasInheritableParentObject($this); if ($parent) { $master = $parent; } return \CoreShop\Tool\Service::getDimensions($master); }