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/branches/2.2@11152 68402e56-0260-453c-a942-63ccdbb3a9ee
This commit is contained in:
plegall 2011-05-31 20:21:08 +00:00
parent 214cc4de49
commit 3197a76eda
3 changed files with 71 additions and 16 deletions

View file

@ -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;
}
?>

View file

@ -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,6 +530,13 @@ SELECT id, name, permalink, uppercats, global_rank,
array_push($cats, $row);
}
usort($cats, 'global_rank_compare');
if ($params['tree_output'])
{
return categories_flatlist_to_tree($cats);
}
else
{
return array(
'categories' => new PwgNamedArray(
$cats,
@ -529,6 +552,7 @@ SELECT id, name, permalink, uppercats, global_rank,
)
)
);
}
}
/**

3
ws.php
View file

@ -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(