hasInheritableParentObject() public static method

public static hasInheritableParentObject ( Concrete $object ) : AbstractObject | null
$object Concrete
return AbstractObject | null
コード例 #1
0
 /**
  * @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;
 }
コード例 #2
0
 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);
         }
     }
 }
コード例 #3
0
 /**
  * @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;
 }
コード例 #4
0
 /**
  * @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;
 }
コード例 #5
0
 /**
  * @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;
 }
コード例 #6
0
ファイル: Objectbricks.php プロジェクト: sfie/pimcore
 /**
  * @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;
 }
コード例 #7
0
 /**
  * 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);
 }