/pimcore/models/Object/Objectbrick/Data/Resource.php

https://github.com/timglabisch/pimcore · PHP · 228 lines · 137 code · 49 blank · 42 comment · 29 complexity · 29a9be19bdd0354fa974bad65cad23a6 MD5 · raw file

  1. <?php
  2. /**
  3. * Pimcore
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://www.pimcore.org/license
  11. *
  12. * @category Pimcore
  13. * @package Object_Objectbrick
  14. * @copyright Copyright (c) 2009-2013 pimcore GmbH (http://www.pimcore.org)
  15. * @license http://www.pimcore.org/license New BSD License
  16. */
  17. class Object_Objectbrick_Data_Resource extends Pimcore_Model_Resource_Abstract {
  18. /**
  19. * @var Object_Concrete_Resource_InheritanceHelper
  20. */
  21. protected $inheritanceHelper = null;
  22. /**
  23. * @param Object_Concrete $object
  24. * @return void
  25. */
  26. public function save (Object_Concrete $object) {
  27. // HACK: set the pimcore admin mode to false to get the inherited values from parent if this source one is empty
  28. $inheritedValues = Object_Abstract::doGetInheritedValues();
  29. $storetable = $this->model->getDefinition()->getTableName($object->getClass(), false);
  30. $querytable = $this->model->getDefinition()->getTableName($object->getClass(), true);
  31. $this->inheritanceHelper = new Object_Concrete_Resource_InheritanceHelper($object->getClassId(), "o_id", $storetable, $querytable);
  32. Object_Abstract::setGetInheritedValues(false);
  33. $fd = $this->model->getDefinition()->getFieldDefinitions();
  34. $data = array();
  35. $data["o_id"] = $object->getId();
  36. $data["fieldname"] = $this->model->getFieldname();
  37. // remove all relations
  38. try {
  39. $this->db->delete("object_relations_" . $object->getClassId(), "src_id = " . $object->getId() . " AND ownertype = 'objectbrick' AND ownername = '" . $this->model->getFieldname() . "' AND (position = '" . $this->model->getType() . "' OR position IS NULL OR position = '')");
  40. } catch(Exception $e) {
  41. Logger::warning("Error during removing old relations: " . $e);
  42. }
  43. foreach ($fd as $key => $value) {
  44. $getter = "get" . ucfirst($value->getName());
  45. if (method_exists($value, "save")) {
  46. // for fieldtypes which have their own save algorithm eg. objects, multihref, ...
  47. $value->save($this->model);
  48. } else if ($value->getColumnType()) {
  49. if (is_array($value->getColumnType())) {
  50. $insertDataArray = $value->getDataForResource($this->model->$getter(), $object);
  51. $data = array_merge($data, $insertDataArray);
  52. } else {
  53. $insertData = $value->getDataForResource($this->model->$getter(), $object);
  54. $data[$key] = $insertData;
  55. }
  56. }
  57. }
  58. $this->db->insertOrUpdate($storetable, $data);
  59. // get data for query table
  60. // $tableName = $this->model->getDefinition()->getTableName($object->getClass(), true);
  61. // this is special because we have to call each getter to get the inherited values from a possible parent object
  62. Object_Abstract::setGetInheritedValues(true);
  63. $objectVars = get_object_vars($this->model);
  64. $data = array();
  65. $data["o_id"] = $object->getId();
  66. $data["fieldname"] = $this->model->getFieldname();
  67. $this->inheritanceHelper->resetFieldsToCheck();
  68. $oldData = $this->db->fetchRow("SELECT * FROM " . $querytable . " WHERE o_id = ?", $object->getId());
  69. foreach ($objectVars as $key => $value) {
  70. $fd = $this->model->getDefinition()->getFieldDefinition($key);
  71. if ($fd) {
  72. if ($fd->getQueryColumnType()) {
  73. //exclude untouchables if value is not an array - this means data has not been loaded
  74. $method = "get" . $key;
  75. $insertData = $fd->getDataForQueryResource($this->model->$method(), $object);
  76. if (is_array($insertData)) {
  77. $data = array_merge($data, $insertData);
  78. }
  79. else {
  80. $data[$key] = $insertData;
  81. }
  82. //get changed fields for inheritance
  83. if($fd->isRelationType()) {
  84. if (is_array($insertData)) {
  85. $doInsert = false;
  86. foreach($insertData as $insertDataKey => $insertDataValue) {
  87. if($oldData[$insertDataKey] != $insertDataValue) {
  88. $doInsert = true;
  89. }
  90. }
  91. if($doInsert) {
  92. $this->inheritanceHelper->addRelationToCheck($key, array_keys($insertData));
  93. }
  94. } else {
  95. if($oldData[$key] != $insertData) {
  96. $this->inheritanceHelper->addRelationToCheck($key);
  97. }
  98. }
  99. } else {
  100. if (is_array($insertData)) {
  101. foreach($insertData as $insertDataKey => $insertDataValue) {
  102. if($oldData[$insertDataKey] != $insertDataValue) {
  103. $this->inheritanceHelper->addFieldToCheck($insertDataKey);
  104. }
  105. }
  106. } else {
  107. if($oldData[$key] != $insertData) {
  108. $this->inheritanceHelper->addFieldToCheck($key);
  109. }
  110. }
  111. }
  112. }
  113. }
  114. }
  115. $this->db->insertOrUpdate($querytable, $data);
  116. $this->inheritanceHelper->doUpdate($object->getId());
  117. $this->inheritanceHelper->resetFieldsToCheck();
  118. // HACK: see a few lines above!
  119. Object_Abstract::setGetInheritedValues($inheritedValues);
  120. }
  121. /**
  122. * @param Object_Concrete $object
  123. * @return void
  124. */
  125. public function delete(Object_Concrete $object) {
  126. // update data for store table
  127. $tableName = $this->model->getDefinition()->getTableName($object->getClass(), false);
  128. $this->db->delete($tableName, $this->db->quoteInto("o_id = ?", $object->getId()));
  129. // update data for query table
  130. $tableName = $this->model->getDefinition()->getTableName($object->getClass(), true);
  131. $this->db->delete($tableName, $this->db->quoteInto("o_id = ?", $object->getId()));
  132. //update data for relations table
  133. $this->db->delete("object_relations_" . $object->getClassId(), "src_id = " . $object->getId() . " AND ownertype = 'objectbrick' AND ownername = '" . $this->model->getFieldname() . "' AND position = '" . $this->model->getType() . "'");
  134. }
  135. /**
  136. * @param string $field
  137. * @return array
  138. */
  139. public function getRelationData($field, $forOwner, $remoteClassId) {
  140. $id = $this->model->getObject()->getId();
  141. if ($remoteClassId) {
  142. $classId = $remoteClassId;
  143. } else {
  144. $classId = $this->model->getObject()->getClassId();
  145. }
  146. $params = array($field, $id, $field, $id, $field, $id);
  147. $dest = "dest_id";
  148. $src = "src_id";
  149. if (!$forOwner) {
  150. $dest = "src_id";
  151. $src = "dest_id";
  152. }
  153. $relations = $this->db->fetchAll("SELECT r." . $dest . " as dest_id, r." . $dest . " as id, r.type, o.o_className as subtype, concat(o.o_path ,o.o_key) as path , r.index
  154. FROM objects o, object_relations_" . $classId . " r
  155. WHERE r.fieldname= ?
  156. AND r.ownertype = 'objectbrick'
  157. AND r." . $src . " = ?
  158. AND o.o_id = r." . $dest . "
  159. AND r.type='object'
  160. UNION SELECT r." . $dest . " as dest_id, r." . $dest . " as id, r.type, a.type as subtype, concat(a.path,a.filename) as path, r.index
  161. FROM assets a, object_relations_" . $classId . " r
  162. WHERE r.fieldname= ?
  163. AND r.ownertype = 'objectbrick'
  164. AND r." . $src . " = ?
  165. AND a.id = r." . $dest . "
  166. AND r.type='asset'
  167. UNION SELECT r." . $dest . " as dest_id, r." . $dest . " as id, r.type, d.type as subtype, concat(d.path,d.key) as path, r.index
  168. FROM documents d, object_relations_" . $classId . " r
  169. WHERE r.fieldname= ?
  170. AND r.ownertype = 'objectbrick'
  171. AND r." . $src . " = ?
  172. AND d.id = r." . $dest . "
  173. AND r.type='document'
  174. ORDER BY `index` ASC", $params);
  175. if (is_array($relations) and count($relations) > 0) {
  176. return $relations;
  177. } else return array();
  178. }
  179. }