From 257808402bed53e44bc8705d22e4d05f99fc37da Mon Sep 17 00:00:00 2001 From: plegall Date: Tue, 31 May 2011 20:25:40 +0000 Subject: merge r11152 from branch 2.2 to trunk feature 1622 added: pwg.categories.getList is now able to return a tree with the new "tree_output" option. Only compatible with json/php output formats. git-svn-id: http://piwigo.org/svn/trunk@11155 68402e56-0260-453c-a942-63ccdbb3a9ee --- include/functions_category.inc.php | 30 +++++++++++++++++++++ include/ws_functions.inc.php | 54 +++++++++++++++++++++++++++----------- ws.php | 3 ++- 3 files changed, 71 insertions(+), 16 deletions(-) diff --git a/include/functions_category.inc.php b/include/functions_category.inc.php index 8a0179418..44cefb0b5 100644 --- a/include/functions_category.inc.php +++ b/include/functions_category.inc.php @@ -533,4 +533,34 @@ SELECT image_id return $image_id; } + +/** + * create a tree from a flat list of categories, no recursivity for high speed + */ +function categories_flatlist_to_tree($categories) +{ + $tree = array(); + $key_of_cat = array(); + + foreach ($categories as $key => &$node) + { + $key_of_cat[$node['id']] = $key; + + if (!isset($node['id_uppercat'])) + { + $tree[$key] = &$node; + } + else + { + if (!isset($categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories'])) + { + $categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories'] = array(); + } + + $categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories'][$key] = &$node; + } + } + + return $tree; +} ?> \ No newline at end of file diff --git a/include/ws_functions.inc.php b/include/ws_functions.inc.php index 16d2f7dd4..98828fcb8 100644 --- a/include/ws_functions.inc.php +++ b/include/ws_functions.inc.php @@ -432,6 +432,22 @@ function ws_categories_getList($params, &$service) { global $user,$conf; + if ($params['tree_output']) + { + if (!isset($_GET['format']) or !in_array($_GET['format'], array('php', 'json'))) + { + // the algorithm used to build a tree from a flat list of categories + // keeps original array keys, which is not compatible with + // PwgNamedArray. + // + // PwgNamedArray is useful to define which data is an attribute and + // which is an element in the XML output. The "hierarchy" output is + // only compatible with json/php output. + + return new PwgError(405, "The tree_output option is only compatible with json/php output formats"); + } + } + $where = array('1=1'); $join_type = 'INNER'; $join_user = $user['id']; @@ -471,7 +487,7 @@ function ws_categories_getList($params, &$service) } $query = ' -SELECT id, name, permalink, uppercats, global_rank, +SELECT id, name, permalink, uppercats, global_rank, id_uppercat, comment, nb_images, count_images AS total_nb_images, date_last, max_date_last, count_categories AS nb_categories @@ -514,21 +530,29 @@ SELECT id, name, permalink, uppercats, global_rank, array_push($cats, $row); } usort($cats, 'global_rank_compare'); - return array( - 'categories' => new PwgNamedArray( - $cats, - 'category', - array( - 'id', - 'url', - 'nb_images', - 'total_nb_images', - 'nb_categories', - 'date_last', - 'max_date_last', + + if ($params['tree_output']) + { + return categories_flatlist_to_tree($cats); + } + else + { + return array( + 'categories' => new PwgNamedArray( + $cats, + 'category', + array( + 'id', + 'url', + 'nb_images', + 'total_nb_images', + 'nb_categories', + 'date_last', + 'max_date_last', + ) ) - ) - ); + ); + } } /** diff --git a/ws.php b/ws.php index d1d774899..939489582 100644 --- a/ws.php +++ b/ws.php @@ -81,8 +81,9 @@ function ws_addDefaultMethods( $arr ) 'cat_id' => array('default'=>0), 'recursive' => array('default'=>false), 'public' => array('default'=>false), + 'tree_output' => array('default'=>false), ), - 'retrieves a list of categories' ); + 'retrieves a list of categories (tree_output option only compatible with json/php output format' ); $service->addMethod('pwg.images.addComment', 'ws_images_addComment', array( -- cgit v1.2.3