diff --git a/model/DataObject.php b/model/DataObject.php index 90fbe5bf6..01fac1146 100644 --- a/model/DataObject.php +++ b/model/DataObject.php @@ -679,13 +679,7 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity * @return array The data as a map. */ public function toMap() { - foreach ($this->record as $key => $value) { - if (strlen($key) > 5 && substr($key, -5) == '_Lazy') { - $this->loadLazyFields($value); - break; - } - } - + $this->loadLazyFields(); return $this->record; } @@ -847,13 +841,16 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity * if they are not already marked as changed. */ public function forceChange() { + // Ensure lazy fields loaded + $this->loadLazyFields(); + // $this->record might not contain the blank values so we loop on $this->inheritedDatabaseFields() as well $fieldNames = array_unique(array_merge(array_keys($this->record), array_keys($this->inheritedDatabaseFields()))); foreach($fieldNames as $fieldName) { if(!isset($this->changed[$fieldName])) $this->changed[$fieldName] = 1; // Populate the null values in record so that they actually get written - if(!$this->$fieldName) $this->record[$fieldName] = null; + if(!isset($this->record[$fieldName])) $this->record[$fieldName] = null; } // @todo Find better way to allow versioned to write a new version after forceChange @@ -1954,13 +1951,24 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity } /** - * Loads all the stub fields than an initial lazy load didn't load fully. + * Loads all the stub fields that an initial lazy load didn't load fully. * * @param tableClass Base table to load the values from. Others are joined as required. + * Not specifying a tableClass will load all lazy fields from all tables. */ protected function loadLazyFields($tableClass = null) { - // Smarter way to work out the tableClass? Should the functionality in toMap and getField be moved into here? - if (!$tableClass) $tableClass = $this->ClassName; + if (!$tableClass) { + $loaded = array(); + + foreach ($this->record as $key => $value) { + if (strlen($key) > 5 && substr($key, -5) == '_Lazy' && !array_key_exists($value, $loaded)) { + $this->loadLazyFields($value); + $loaded[$value] = $value; + } + } + + return; + } $dataQuery = new DataQuery($tableClass);