/** * @param Object_Concrete $object * @return void */ public function save(Object_Concrete $object) { // HACK: set the pimcore admin mode to false to get the inherited values from parent if this source one is empty $inheritedValues = Object_Abstract::doGetInheritedValues(); $storetable = $this->model->getDefinition()->getTableName($object->getClass(), false); $querytable = $this->model->getDefinition()->getTableName($object->getClass(), true); $this->inheritanceHelper = new Object_Concrete_Resource_InheritanceHelper($object->getClassId(), "o_id", $storetable, $querytable); $this->createDataRows($object); Object_Abstract::setGetInheritedValues(false); $fd = $this->model->getDefinition()->getFieldDefinitions(); $data = array(); $data["o_id"] = $object->getId(); $data["fieldname"] = $this->model->getFieldname(); // remove all relations try { $this->db->delete("object_relations_" . $object->getClassId(), "src_id = " . $object->getId() . " AND ownertype = 'objectbrick' AND ownername = '" . $this->model->getFieldname() . "'"); } catch (Exception $e) { Logger::warning("Error during removing old relations: " . $e); } foreach ($fd as $key => $value) { $getter = "get" . ucfirst($value->getName()); if (method_exists($fd, "save")) { // for fieldtypes which have their own save algorithm eg. objects, multihref, ... $value->save($this->model); } else { if ($value->getColumnType()) { if (is_array($value->getColumnType())) { $insertDataArray = $value->getDataForResource($this->model->{$getter}(), $object); $data = array_merge($data, $insertDataArray); } else { $insertData = $value->getDataForResource($this->model->{$getter}(), $object); $data[$key] = $insertData; } } else { if (method_exists($value, "save")) { // for fieldtypes which have their own save algorithm eg. fieldcollections $value->save($this->model); } } } } $this->db->update($storetable, $data, $this->db->quoteInto("o_id = ?", $object->getId())); // get data for query table // $tableName = $this->model->getDefinition()->getTableName($object->getClass(), true); // this is special because we have to call each getter to get the inherited values from a possible parent object Object_Abstract::setGetInheritedValues(true); $objectVars = get_object_vars($this->model); $data = array(); $data["o_id"] = $object->getId(); $data["fieldname"] = $this->model->getFieldname(); $this->inheritanceHelper->resetFieldsToCheck(); $oldData = $this->db->fetchRow("SELECT * FROM " . $querytable . " WHERE o_id = ?", $object->getId()); foreach ($objectVars as $key => $value) { $fd = $this->model->getDefinition()->getFieldDefinition($key); if ($fd) { if ($fd->getQueryColumnType()) { //exclude untouchables if value is not an array - this means data has not been loaded if (!is_array($this->model->{$key})) { $method = "get" . $key; $insertData = $fd->getDataForQueryResource($this->model->{$method}(), $object); if (is_array($insertData)) { $data = array_merge($data, $insertData); } else { $data[$key] = $insertData; } //get changed fields for inheritance if ($fd->isRelationType()) { if (is_array($insertData)) { $doInsert = false; foreach ($insertData as $insertDataKey => $insertDataValue) { if ($oldData[$insertDataKey] != $insertDataValue) { $doInsert = true; } } if ($doInsert) { $this->inheritanceHelper->addRelationToCheck($key, array_keys($insertData)); } } else { if ($oldData[$key] != $insertData) { $this->inheritanceHelper->addRelationToCheck($key); } } } else { if (is_array($insertData)) { foreach ($insertData as $insertDataKey => $insertDataValue) { if ($oldData[$insertDataKey] != $insertDataValue) { $this->inheritanceHelper->addFieldToCheck($insertDataKey); } } } else { if ($oldData[$key] != $insertData) { $this->inheritanceHelper->addFieldToCheck($key); } } } } else { Logger::debug("Excluding untouchable query value for object - objectbrick [ " . $object->getId() . " ] key [ {$key} ] because it has not been loaded"); } } } } $this->db->update($querytable, $data, "o_id = " . $object->getId()); $this->inheritanceHelper->doUpdate($object->getId()); $this->inheritanceHelper->resetFieldsToCheck(); // HACK: see a few lines above! Object_Abstract::setGetInheritedValues($inheritedValues); }
/** * @param Object_Concrete $object * @return void */ public function save($object, $params = array()) { $getter = "get" . ucfirst($this->getName()); $objectsMetadata = $object->{$getter}(); $classId = null; $objectId = null; if ($object instanceof Object_Concrete) { $objectId = $object->getId(); $classId = $object->getClassId(); $class = $object->getClass(); } else { if ($object instanceof Object_Fieldcollection_Data_Abstract) { $objectId = $object->getObject()->getId(); $classId = $object->getObject()->getClassId(); $class = $object->getObject()->getClass(); } else { if ($object instanceof Object_Localizedfield) { $objectId = $object->getObject()->getId(); $classId = $object->getObject()->getClassId(); $class = $object->getObject()->getClass(); } else { if ($object instanceof Object_Objectbrick_Data_Abstract) { $objectId = $object->getObject()->getId(); $classId = $object->getObject()->getClassId(); $class = $object->getObject()->getClass(); } } } } $table = "object_metadata_" . $classId; $db = Pimcore_Resource::get(); if (!empty($objectsMetadata)) { $objectsMetadata[0]->getResource()->createOrUpdateTable($class); } $db->delete($table, $db->quoteInto("o_id = ?", $objectId) . " AND " . $db->quoteInto("fieldname = ?", $this->getName())); if (!empty($objectsMetadata)) { foreach ($objectsMetadata as $meta) { $meta->save($object); } } parent::save($object, $params); }
/** * @param Object_Concrete|Object_Fieldcollection_Data_Abstract|Object_Localizedfield $object * @return null | array */ public function load($object, $params = array()) { $db = Pimcore_Resource::get(); $data = null; if ($object instanceof Object_Concrete) { if (!method_exists($this, "getLazyLoading") or !$this->getLazyLoading() or $params["force"]) { $relations = $db->fetchAll("SELECT * FROM object_relations_" . $object->getClassId() . " WHERE src_id = ? AND fieldname = ? AND ownertype = 'object'", array($object->getO_id(), $this->getName())); } else { return null; } } else { if ($object instanceof Object_Fieldcollection_Data_Abstract) { $relations = $db->fetchAll("SELECT * FROM object_relations_" . $object->getObject()->getClassId() . " WHERE src_id = ? AND fieldname = ? AND ownertype = 'fieldcollection' AND ownername = ? AND position = ?", array($object->getObject()->getId(), $this->getName(), $object->getFieldname(), $object->getIndex())); } else { if ($object instanceof Object_Localizedfield) { $relations = $db->fetchAll("SELECT * FROM object_relations_" . $object->getObject()->getClassId() . " WHERE src_id = ? AND fieldname = ? AND ownertype = 'localizedfield' AND ownername = 'localizedfield' AND position = ?", array($object->getObject()->getId(), $this->getName(), $params["language"])); } else { if ($object instanceof Object_Objectbrick_Data_Abstract) { $relations = $db->fetchAll("SELECT * FROM object_relations_" . $object->getObject()->getClassId() . " WHERE src_id = ? AND fieldname = ? AND ownertype = 'objectbrick' AND ownername = ? AND position = ?", array($object->getObject()->getId(), $this->getName(), $object->getFieldname(), $object->getType())); // THIS IS KIND A HACK: it's necessary because of this bug PIMCORE-1454 and therefore cannot be removed if (count($relations) < 1) { $relations = $db->fetchAll("SELECT * FROM object_relations_" . $object->getObject()->getClassId() . " WHERE src_id = ? AND fieldname = ? AND ownertype = 'objectbrick' AND ownername = ? AND (position IS NULL OR position = '')", array($object->getObject()->getId(), $this->getName(), $object->getFieldname())); } // HACK END } } } } // using PHP sorting to order the relations, because "ORDER BY index ASC" in the queries above will cause a // filesort in MySQL which is extremly slow especially when there are millions of relations in the database usort($relations, function ($a, $b) { if ($a["index"] == $b["index"]) { return 0; } return $a["index"] < $b["index"] ? -1 : 1; }); $data = $this->getDataFromResource($relations); return $data; }
/** * @param Object_Concrete|Object_Fieldcollection_Data_Abstract|Object_Localizedfield $object * @return null | array */ public function load($object, $params = array()) { $db = Pimcore_Resource::get(); if ($object instanceof Object_Concrete) { if (!method_exists($this, "getLazyLoading") or !$this->getLazyLoading() or $params["force"]) { $relations = $db->fetchAll("SELECT * FROM object_relations_" . $object->getClassId() . " WHERE src_id = ? AND fieldname = ? AND ownertype = 'object' ORDER BY `index` ASC", array($object->getO_id(), $this->getName())); return $this->getDataFromResource($relations); } else { return null; } } else { if ($object instanceof Object_Fieldcollection_Data_Abstract) { $relations = $db->fetchAll("SELECT * FROM object_relations_" . $object->getObject()->getClassId() . " WHERE src_id = ? AND fieldname = ? AND ownertype = 'fieldcollection' AND ownername = ? AND position = ? ORDER BY `index` ASC", array($object->getObject()->getId(), $this->getName(), $object->getFieldname(), $object->getIndex())); return $this->getDataFromResource($relations); } else { if ($object instanceof Object_Localizedfield) { $relations = $db->fetchAll("SELECT * FROM object_relations_" . $object->getObject()->getClassId() . " WHERE src_id = ? AND fieldname = ? AND ownertype = 'localizedfield' AND ownername = 'localizedfield' AND position = ? ORDER BY `index` ASC", array($object->getObject()->getId(), $this->getName(), $params["language"])); return $this->getDataFromResource($relations); } else { if ($object instanceof Object_Objectbrick_Data_Abstract) { $relations = $db->fetchAll("SELECT * FROM object_relations_" . $object->getObject()->getClassId() . " WHERE src_id = ? AND fieldname = ? AND ownertype = 'objectbrick' AND ownername = ? ORDER BY `index` ASC", array($object->getObject()->getId(), $this->getName(), $object->getFieldname())); return $this->getDataFromResource($relations); } } } } }