/** * Fetches and return all the data that need to be sideloaded * for a specific source DataObject or DataList. * * @param DataObject|DataList $dataSource The source data to fetch sideloaded records for * @return array A map of relation names with their data */ protected function getSideloadData($dataSource) { $data = array(); if ($dataSource instanceof DataObject) { $has_one = $dataSource->stat('has_one'); $has_many = $dataSource->stat('has_many'); $many_many = $dataSource->stat('many_many'); $belongs_many_many = $dataSource->stat('belongs_many_many'); $relationsMap = array(); if (is_array($has_one)) { $relationsMap = array_merge($relationsMap, $has_one); } if (is_array($has_many)) { $relationsMap = array_merge($relationsMap, $has_many); } if (is_array($many_many)) { $relationsMap = array_merge($relationsMap, $many_many); } if (is_array($belongs_many_many)) { $relationsMap = array_merge($relationsMap, $belongs_many_many); } // if a single DataObject get the data for each relation foreach ($this->sideloadedRecords[$dataSource->ClassName] as $relationName) { $newData = $this->getEmbedData($dataSource, $relationName); if ($newData !== null) { // has_one are only simple array and we want arrays or array if (is_array($has_one) && in_array($relationName, $has_one)) { $newData = array($newData); } $relationClass = $relationsMap[$relationName]; $data[$relationClass] = $newData; } } } elseif ($dataSource instanceof DataList) { // if a list of DataObject, loop through each and merge all the data together foreach ($dataSource as $dataObjectSource) { $sideloadData = $this->getSideloadData($dataObjectSource); //combine sideloaded records foreach ($sideloadData as $class => $extraData) { if (!isset($data[$class])) { $data[$class] = array(); } // merge for list of records, push for individual record $arrayOfArrays = array_filter($extraData, 'is_array'); if (count($arrayOfArrays) == count($extraData)) { //print_r('array_merge'); $data[$class] = array_merge($data[$class], $extraData); } else { //print_r('array_push'); array_push($data[$class], $extraData); } } } // remove duplicates foreach ($data as $relationClass => $relationData) { $data[$relationClass] = array_unique($relationData, SORT_REGULAR); } } return $data; }