aboutsummaryrefslogtreecommitdiffstats
path: root/admin
diff options
context:
space:
mode:
authorplegall <plg@piwigo.org>2010-07-23 21:33:56 +0000
committerplegall <plg@piwigo.org>2010-07-23 21:33:56 +0000
commit1448b42df0e076d09e8eb6c8bf9c8cebd212596a (patch)
tree1e13c16b1a59db81a524d3ed4bf53c3dd1812e2c /admin
parent361ef07c3cf12235cea64c5c9b3a3402623619cb (diff)
feature 408: ability to automatically sort sub-categories. The number of SQL
queries is constant, no matter the deepth of your tree. + refactor to avoid duplicate code (ascending/desceding should be only a single parameter in a function, not 20 lines of duplicated code) git-svn-id: http://piwigo.org/svn/trunk@6698 68402e56-0260-453c-a942-63ccdbb3a9ee
Diffstat (limited to '')
-rw-r--r--admin/cat_list.php123
-rw-r--r--admin/themes/default/default-layout.css5
-rw-r--r--admin/themes/default/template/cat_list.tpl32
3 files changed, 102 insertions, 58 deletions
diff --git a/admin/cat_list.php b/admin/cat_list.php
index 662edbc88..7afc21db4 100644
--- a/admin/cat_list.php
+++ b/admin/cat_list.php
@@ -55,11 +55,30 @@ if (!empty($_POST) or isset($_GET['delete']))
*/
function save_categories_order($categories)
{
+ $current_rank_for_id_uppercat = array();
$current_rank = 0;
+
$datas = array();
- foreach ($categories as $id)
+ foreach ($categories as $category)
{
- array_push($datas, array('id' => $id, 'rank' => ++$current_rank));
+ if (is_array($category))
+ {
+ $id = $category['id'];
+ $id_uppercat = $category['id_uppercat'];
+
+ if (!isset($current_rank_for_id_uppercat[$id_uppercat]))
+ {
+ $current_rank_for_id_uppercat[$id_uppercat] = 0;
+ }
+ $current_rank = ++$current_rank_for_id_uppercat[$id_uppercat];
+ }
+ else
+ {
+ $id = $category;
+ $current_rank++;
+ }
+
+ array_push($datas, array('id' => $id, 'rank' => $current_rank));
}
$fields = array('primary' => array('id'), 'update' => array('rank'));
mass_updates(CATEGORIES_TABLE, $fields, $datas);
@@ -111,59 +130,69 @@ else if (isset($_POST['submitAdd']))
// save manual category ordering
else if (isset($_POST['submitOrder']))
{
- asort($_POST['catOrd'], SORT_NUMERIC);
- save_categories_order(array_keys($_POST['catOrd']));
+ if ('manual' == $_POST['order_type'])
+ {
+ asort($_POST['catOrd'], SORT_NUMERIC);
+ save_categories_order(array_keys($_POST['catOrd']));
- array_push(
- $page['infos'],
- l10n('Categories manual order was saved')
- );
-}
-// sort categories alpha-numerically
-else if (isset($_POST['submitOrderAlphaNum']))
-{
- $query = '
-SELECT id, name
+ array_push(
+ $page['infos'],
+ l10n('Categories manual order was saved')
+ );
+ }
+ else
+ {
+ $query = '
+SELECT id
FROM '.CATEGORIES_TABLE.'
WHERE id_uppercat '.
(!isset($_GET['parent_id']) ? 'IS NULL' : '= '.$_GET['parent_id']).'
;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $categories[ $row['id'] ] = strtolower($row['name']);
- }
-
- asort($categories, SORT_REGULAR);
- save_categories_order(array_keys($categories));
-
- array_push(
- $page['infos'],
- l10n('Categories ordered alphanumerically')
- );
-}
-// sort categories alpha-numerically reverse
-else if (isset($_POST['submitOrderAlphaNumReverse']))
-{
- $query = '
-SELECT id, name
+ $category_ids = array_from_query($query, 'id');
+
+ if (isset($_POST['recursive']))
+ {
+ $category_ids = get_subcat_ids($category_ids);
+ }
+
+ $categories = array();
+ $names = array();
+ $id_uppercats = array();
+
+ $query = '
+SELECT id, name, id_uppercat
FROM '.CATEGORIES_TABLE.'
- WHERE id_uppercat '.
- (!isset($_GET['parent_id']) ? 'IS NULL' : '= '.$_GET['parent_id']).'
+ WHERE id IN ('.implode(',', $category_ids).')
;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $categories[ $row['id'] ] = strtolower($row['name']);
+ $result = pwg_query($query);
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ array_push(
+ $categories,
+ array(
+ 'id' => $row['id'],
+ 'id_uppercat' => $row['id_uppercat'],
+ )
+ );
+ array_push(
+ $names,
+ $row['name']
+ );
+ }
+
+ array_multisort(
+ $names,
+ SORT_REGULAR,
+ 'asc' == $_POST['ascdesc'] ? SORT_ASC : SORT_DESC,
+ $categories
+ );
+ save_categories_order($categories);
+
+ array_push(
+ $page['infos'],
+ l10n('Categories automatically sorted')
+ );
}
-
- arsort($categories, SORT_REGULAR);
- save_categories_order(array_keys($categories));
-
- array_push(
- $page['infos'],
- l10n('Categories ordered alphanumerically reverse')
- );
}
// +-----------------------------------------------------------------------+
diff --git a/admin/themes/default/default-layout.css b/admin/themes/default/default-layout.css
index 344818541..7f44314c8 100644
--- a/admin/themes/default/default-layout.css
+++ b/admin/themes/default/default-layout.css
@@ -69,6 +69,11 @@ TABLE.plugins ul.pluginsActions {
TABLE.plugins ul.pluginsActions li { display: inline; }
/* categoryOrdering */
+FORM#categoryOrdering .orderParams {
+ line-height:30px;
+ margin-bottom:10px;
+}
+
SELECT.categoryList {
width: 100%;
}
diff --git a/admin/themes/default/template/cat_list.tpl b/admin/themes/default/template/cat_list.tpl
index a1702a0d7..69e599502 100644
--- a/admin/themes/default/template/cat_list.tpl
+++ b/admin/themes/default/template/cat_list.tpl
@@ -18,6 +18,13 @@
document.getElementsByName('catOrd[' + cat[1] + ']')[0].value = i;
}
});
+
+ jQuery("input[name=order_type]").click(function () {ldelim}
+ jQuery("#automatic_order_params").hide();
+ if (jQuery("input[name=order_type]:checked").val() == "automatic") {ldelim}
+ jQuery("#automatic_order_params").show();
+ }
+ });
});
</script>
@@ -39,12 +46,21 @@
{if count($categories) }
<form id="categoryOrdering" action="{$F_ACTION}" method="post">
- <p>
- <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+ <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+
+ <div class="orderParams">
<input class="submit" name="submitOrder" type="submit" value="{'Save order'|@translate}" {$TAG_INPUT_ENABLED}>
- <input class="submit" name="submitOrderAlphaNum" type="submit" value="{'Order alphanumerically'|@translate}" {$TAG_INPUT_ENABLED}>
- <input class="submit" name="submitOrderAlphaNumReverse" type="submit" value="{'Order alphanumerically reverse'|@translate}" {$TAG_INPUT_ENABLED}>
- </p>
+ <label><input type="radio" name="order_type" value="manual" checked="checked"> {'manual order'|@translate}</label>
+ <label><input type="radio" name="order_type" value="automatic"> {'automatic order'|@translate}</label>
+ <span id="automatic_order_params" style="display:none">
+ <select name="ascdesc">
+ <option value="asc">{'ascending'|@translate}</option>
+ <option value="desc">{'descending'|@translate}</option>
+ </select>
+ <label><input type="checkbox" name="recursive"> {'apply to sub-categories'|@translate}</label>
+ </span>
+ </div>
+
<ul class="categoryUl">
{foreach from=$categories item=category}
@@ -85,11 +101,5 @@
</li>
{/foreach}
</ul>
- <p>
- <input class="submit" name="submitOrder" type="submit" value="{'Save order'|@translate}" {$TAG_INPUT_ENABLED}>
- <input class="submit" name="submitOrderAlphaNum" type="submit" value="{'Order alphanumerically'|@translate}" {$TAG_INPUT_ENABLED}>
- <input class="submit" name="submitOrderAlphaNumReverse" type="submit" value="{'Order alphanumerically reverse'|@translate}" {$TAG_INPUT_ENABLED}>
- </p>
-
</form>
{/if}