Index: units/helpers/category_helper.php =================================================================== --- units/helpers/category_helper.php (revision 13951) +++ units/helpers/category_helper.php (working copy) @@ -387,31 +387,43 @@ */ function _getChildren($parent_category_id, $language_count) { - $id_field = $this->Application->getUnitOption('c', 'IDField'); + static $items_by_parent = null, $parent_mapping = null; - // get category children + parent category - $sql = 'SELECT * - FROM '.$this->Application->getUnitOption('c', 'TableName').' - WHERE ParentId = '.$parent_category_id.' OR '.$id_field.' = '.$parent_category_id.' - ORDER BY Priority DESC'; - $categories = $this->Conn->Query($sql, $id_field); + if ( !isset($items_by_parent) ) { + $fields = $items_by_parent = Array (); - $parent_data = $categories[$parent_category_id]; - unset($categories[$parent_category_id]); + for ($i = 1; $i <= $language_count; $i++) { + $fields[] = 'l' . $i . '_Name'; + } - // no children for this category - $data = Array ('id' => $parent_data[$id_field], 'children' => false, 'ThemeId' => $parent_data['ThemeId']); - for ($i = 1; $i <= $language_count; $i++) { - $data['l'.$i.'_Name'] = $parent_data['l'.$i.'_Name']; - } + $sql = 'SELECT CategoryId AS id, ' . implode(', ', $fields) . ', ParentId, ThemeId + FROM ' . $this->Application->getUnitOption('c', 'TableName') . ' + ORDER BY Priority DESC'; + $items = $this->Conn->Query($sql, 'id'); - if (!$categories) { - // no children - return $data; + foreach ($items as $item_id => $item_data) { + $item_parent_id = $item_data['ParentId']; + unset($item_data['ParentId']); + + if ( !array_key_exists($item_parent_id, $items_by_parent) ) { + $items_by_parent[$item_parent_id] = Array (); + } + + $item_data['children'] = false; + $parent_mapping[$item_id] = $item_parent_id; + $items_by_parent[$item_parent_id][$item_id] = $item_data; + } } - // category has children + $data = $items_by_parent[ $parent_mapping[$parent_category_id] ][$parent_category_id]; + $categories = array_key_exists($parent_category_id, $items_by_parent) ? $items_by_parent[$parent_category_id] : Array (); + foreach ($categories as $category_id => $category_data) { + if ($category_id == $parent_category_id) { + // don't process myself - prevents recursion + continue; + } + $data['children'][$category_id] = $this->_getChildren($category_id, $language_count); }