/** * @param Object_Concrete $object * @return array */ public function load(Object_Concrete $object) { $fieldDef = $object->getClass()->getFieldDefinition($this->model->getFieldname()); $values = array(); foreach ($fieldDef->getAllowedTypes() as $type) { try { $definition = Object_Objectbrick_Definition::getByKey($type); } catch (Exception $e) { continue; } $tableName = $definition->getTableName($object->getClass(), false); try { $results = $this->db->fetchAll("SELECT * FROM " . $tableName . " WHERE o_id = ? AND fieldname = ?", array($object->getId(), $this->model->getFieldname())); } catch (Exception $e) { $results = array(); } $allRelations = $this->db->fetchAll("SELECT * FROM object_relations_" . $object->getO_classId() . " WHERE src_id = ? AND ownertype = 'objectbrick' AND ownername = ?", array($object->getO_id(), $this->model->getFieldname())); $fieldDefinitions = $definition->getFieldDefinitions(); $brickClass = "Object_Objectbrick_Data_" . ucfirst($type); foreach ($results as $result) { $brick = new $brickClass($object); $brick->setFieldname($result["fieldname"]); $brick->setObject($object); foreach ($fieldDefinitions as $key => $fd) { /*if ($fd->isRelationType()) { $relations = array(); foreach ($allRelations as $relation) { if ($relation["fieldname"] == $key) { $relations[] = $relation; } } $brick->setValue( $key, $fd->getDataFromResource($relations)); }*/ if (method_exists($fd, "load")) { // datafield has it's own loader $value = $fd->load($brick); if ($value === 0 || !empty($value)) { $brick->setValue($key, $value); } } else { if (is_array($fd->getColumnType())) { $multidata = array(); foreach ($fd->getColumnType() as $fkey => $fvalue) { $multidata[$key . "__" . $fkey] = $result[$key . "__" . $fkey]; } $brick->setValue($key, $fd->getDataFromResource($multidata)); } else { $brick->setValue($key, $fd->getDataFromResource($result[$key])); } } } $setter = "set" . ucfirst($type); $this->model->{$setter}($brick); $values[] = $brick; } } return $values; }
public function save(Object_Concrete $object) { $tableName = $this->model->getDefinition()->getTableName($object->getClass()); $data = array("o_id" => $object->getId(), "index" => $this->model->getIndex(), "fieldname" => $this->model->getFieldname()); try { foreach ($this->model->getDefinition()->getFieldDefinitions() as $fd) { $getter = "get" . ucfirst($fd->getName()); if (method_exists($fd, "save")) { // for fieldtypes which have their own save algorithm eg. objects, multihref, ... $fd->save($this->model); } else { if ($fd->getColumnType()) { if (is_array($fd->getColumnType())) { $insertDataArray = $fd->getDataForResource($this->model->{$getter}(), $object); $data = array_merge($data, $insertDataArray); } else { $data[$fd->getName()] = $fd->getDataForResource($this->model->{$getter}(), $object); } } } } $this->db->insert($tableName, $data); } catch (Exception $e) { throw $e; } }
/** * @param mixed $data * @param Object_Concrete $ownerObject * @param array $blockedTags */ public function getCacheTags($data, $ownerObject, $tags = array()) { $tags = is_array($tags) ? $tags : array(); if ($data instanceof Document || $data instanceof Asset || $data instanceof Object_Abstract) { if (!array_key_exists($data->getCacheTag(), $tags)) { if (!$ownerObject instanceof Element_Interface || $data->getId() != $ownerObject->getId()) { $tags = $data->getCacheTags($tags); } } } return $tags; }
/** * @param Object_Concrete $object * @param array $toDelete * @param array $toAdd * @param string $ownerFieldName * @return void */ protected function processRemoteOwnerRelations($object, $toDelete, $toAdd, $ownerFieldName) { $getter = "get" . ucfirst($ownerFieldName); $setter = "set" . ucfirst($ownerFieldName); foreach ($toDelete as $id) { $owner = Object_Abstract::getById($id); //TODO: lock ?! if (method_exists($owner, $getter)) { $currentData = $owner->{$getter}(); if (is_array($currentData)) { for ($i = 0; $i < count($currentData); $i++) { if ($currentData[$i]->getId() == $object->getId()) { unset($currentData[$i]); $owner->{$setter}($currentData); $owner->save(); Logger::debug("Saved object id [ " . $owner->getId() . " ] by remote modification through [" . $object->getId() . "], Action: deleted [ " . $object->getId() . " ] from [ {$ownerFieldName}]"); break; } } } } } foreach ($toAdd as $id) { $owner = Object_Abstract::getById($id); //TODO: lock ?! if (method_exists($owner, $getter)) { $currentData = $owner->{$getter}(); $currentData[] = $object; $owner->{$setter}($currentData); $owner->save(); Logger::debug("Saved object id [ " . $owner->getId() . " ] by remote modification through [" . $object->getId() . "], Action: added [ " . $object->getId() . " ] to [ {$ownerFieldName} ]"); } } }
public function delete(Object_Concrete $object) { // empty or create all relevant tables $fieldDef = $object->getClass()->getFieldDefinition($this->model->getFieldname()); foreach ($fieldDef->getAllowedTypes() as $type) { try { $definition = Object_Fieldcollection_Definition::getByKey($type); } catch (Exception $e) { continue; } $tableName = $definition->getTableName($object->getClass()); try { $this->db->delete($tableName, $this->db->quoteInto("o_id = ?", $object->getId()) . " AND " . $this->db->quoteInto("fieldname = ?", $this->model->getFieldname())); } catch (Exception $e) { // create definition if it does not exist $definition->createUpdateTable($object->getClass()); } } // empty relation table $this->db->delete("object_relations_" . $object->getO_classId(), "ownertype = 'fieldcollection' AND " . $this->db->quoteInto("ownername = ?", $this->model->getFieldname()) . " AND " . $this->db->quoteInto("src_id = ?", $object->getId())); }
/** * @param mixed $data * @param Object_Concrete $ownerObject * @param array $blockedTags */ public function getCacheTags($data, $ownerObject, $tags = array()) { $tags = is_array($tags) ? $tags : array(); if (is_array($data) && count($data) > 0) { foreach ($data as $object) { if (!array_key_exists($object->getCacheTag(), $tags)) { if (!$ownerObject instanceof Element_Interface || $object->getId() != $ownerObject->getId()) { $tags = $object->getCacheTags($tags); } } } } return $tags; }
/** * @param Object_Concrete $object * @return void */ public function delete(Object_Concrete $object) { // update data for store table $tableName = $this->model->getDefinition()->getTableName($object->getClass(), false); $this->db->delete($tableName, $this->db->quoteInto("o_id = ?", $object->getId())); // update data for query table $tableName = $this->model->getDefinition()->getTableName($object->getClass(), true); $this->db->delete($tableName, $this->db->quoteInto("o_id = ?", $object->getId())); //update data for relations table $this->db->delete("object_relations_" . $object->getO_classId(), "src_id = " . $object->getId() . " AND ownertype = 'objectbrick' AND ownername = '" . $this->model->getFieldname() . "'"); }
/** * @param Object_Concrete $object * @return void */ public function delete($object) { $db = Pimcore_Resource::get(); $db->delete("object_metadata_" . $object->getO_classId(), $db->quoteInto("o_id = ?", $object->getId()) . " AND " . $db->quoteInto("fieldname = ?", $this->getName())); }