move the paths used into options

This commit is contained in:
AD7six 2012-01-10 00:48:15 +01:00
parent 7b640b8123
commit 442d889f99
2 changed files with 23 additions and 14 deletions

View file

@ -2813,11 +2813,11 @@ class Model extends Object implements CakeEventListener {
return $query; return $query;
} elseif ($state === 'after') { } elseif ($state === 'after') {
return Set::nest($results, array( return Set::nest($results, array(
'alias' => $this->alias, 'alias' => $this->alias,
'primaryKey' => $this->primaryKey, 'key' => $this->primaryKey,
'parent' => 'parent_id', 'parent' => 'parent_id',
'children' => 'children' 'children' => 'children'
)); ));
} }
} }

View file

@ -1121,9 +1121,11 @@ class Set {
* @param mixed $data * @param mixed $data
* @param array $options Options are: * @param array $options Options are:
* alias - the first array key to look for * alias - the first array key to look for
* primaryKey - the key to use to identify the rows * key - the key to use to identify the rows
* parentId - the key to use to identify the parent * parentId - the key to use to identify the parent
* children - the key name to use in the resultset for children * children - the key name to use in the resultset for children
* idPath - the path to a key that identifies each entry
* parentPath - the path to a key that identifies the parent of each entry
* @return array of results, nested * @return array of results, nested
* @link * @link
*/ */
@ -1134,35 +1136,42 @@ class Set {
$options = array( $options = array(
'alias' => key(current($data)), 'alias' => key(current($data)),
'primaryKey' => 'id', 'key' => 'id',
'parentId' => 'parent_id', 'parentId' => 'parent_id',
'children' => 'children' 'children' => 'children',
) + $options; ) + $options;
if (empty($options['idPath'])) {
$options['idPath'] = '/' . $options['alias'] . '/' . $options['key'];
}
if (empty($options['parentPath'])) {
$options['parentPath'] = '/' . $options['alias'] . '/' . $options['parentId'];
}
$return = $idMap = array(); $return = $idMap = array();
$ids = Set::extract($data, '{n}.' . $options['alias'] . '.' . $options['primaryKey']); $ids = Set::extract($data, $options['idPath']);
foreach ($data as $result) { foreach ($data as $result) {
$result[$options['children']] = array(); $result[$options['children']] = array();
$id = $result[$options['alias']][$options['primaryKey']]; $id = $result[$options['alias']][$options['key']];
if (isset($result[$options['alias']][$options['parentId']])) { if (isset($result[$options['alias']][$options['parentId']])) {
$parentId = $result[$options['alias']][$options['parentId']]; $parentId = $result[$options['alias']][$options['parentId']];
} else { } else {
$parentId = null; $parentId = null;
} }
if (isset($idMap[$id]['children'])) { if (isset($idMap[$id][$options['children']])) {
$idMap[$id] = array_merge($result, (array)$idMap[$id]); $idMap[$id] = array_merge($result, (array)$idMap[$id]);
} else { } else {
$idMap[$id] = array_merge($result, array('children' => array())); $idMap[$id] = array_merge($result, array($options['children'] => array()));
} }
if (!$parentId || !in_array($parentId, $ids)) { if (!$parentId || !in_array($parentId, $ids)) {
$return[] =& $idMap[$id]; $return[] =& $idMap[$id];
} else { } else {
$idMap[$parentId]['children'][] =& $idMap[$id]; $idMap[$parentId][$options['children']][] =& $idMap[$id];
} }
} }
if (count($return) > 1) { if (count($return) > 1) {
$ids = array_unique(Set::extract('/' . $options['alias'] . '/' . $options['parentId'], $return)); $ids = array_unique(Set::extract($options['parentPath'], $return));
if (count($ids) > 1) { if (count($ids) > 1) {
$root = $return[0][$options['alias']][$options['parentId']]; $root = $return[0][$options['alias']][$options['parentId']];
foreach ($return as $key => $value) { foreach ($return as $key => $value) {