aboutsummaryrefslogtreecommitdiffstats
path: root/include/functions_category.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'include/functions_category.inc.php')
-rw-r--r--include/functions_category.inc.php122
1 files changed, 122 insertions, 0 deletions
diff --git a/include/functions_category.inc.php b/include/functions_category.inc.php
index d22cbba93..c7f60e812 100644
--- a/include/functions_category.inc.php
+++ b/include/functions_category.inc.php
@@ -480,4 +480,126 @@ SELECT image_id
return $image_id;
}
+/**
+ * Get computed array of categories, that means cache data of all categories
+ * available for the current user (count_categories, count_images, etc.).
+ *
+ * @param array &$userdata
+ * @param int $filter_days number of recent days to filter on or null
+ * @return array
+ */
+function get_computed_categories(&$userdata, $filter_days=null)
+{
+ $query = 'SELECT c.id AS cat_id, id_uppercat';
+ // Count by date_available to avoid count null
+ $query .= ',
+ MAX(date_available) AS date_last, COUNT(date_available) AS nb_images
+FROM '.CATEGORIES_TABLE.' as c
+ LEFT JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.category_id = c.id
+ LEFT JOIN '.IMAGES_TABLE.' AS i
+ ON ic.image_id = i.id
+ AND i.level<='.$userdata['level'];
+
+ if ( isset($filter_days) )
+ {
+ $query .= ' AND i.date_available > '.pwg_db_get_recent_period_expression($filter_days);
+ }
+
+ if ( !empty($userdata['forbidden_categories']) )
+ {
+ $query.= '
+ WHERE c.id NOT IN ('.$userdata['forbidden_categories'].')';
+ }
+
+ $query.= '
+ GROUP BY c.id';
+
+ $result = pwg_query($query);
+
+ $userdata['last_photo_date'] = null;
+ $cats = array();
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $row['user_id'] = $userdata['id'];
+ $row['nb_categories'] = 0;
+ $row['count_categories'] = 0;
+ $row['count_images'] = (int)$row['nb_images'];
+ $row['max_date_last'] = $row['date_last'];
+ if ($row['date_last'] > $userdata['last_photo_date'])
+ {
+ $userdata['last_photo_date'] = $row['date_last'];
+ }
+
+ $cats[$row['cat_id']] = $row;
+ }
+
+ foreach ($cats as $cat)
+ {
+ if ( !isset( $cat['id_uppercat'] ) )
+ continue;
+
+ $parent = & $cats[ $cat['id_uppercat'] ];
+ $parent['nb_categories']++;
+
+ do
+ {
+ $parent['count_images'] += $cat['nb_images'];
+ $parent['count_categories']++;
+
+ if ((empty($parent['max_date_last'])) or ($parent['max_date_last'] < $cat['date_last']))
+ {
+ $parent['max_date_last'] = $cat['date_last'];
+ }
+
+ if ( !isset( $parent['id_uppercat'] ) )
+ break;
+ $parent = & $cats[$parent['id_uppercat']];
+ }
+ while (true);
+ unset($parent);
+ }
+
+ if ( isset($filter_days) )
+ {
+ foreach ($cats as $category)
+ {
+ if (empty($category['max_date_last']))
+ {
+ remove_computed_category($cats, $category);
+ }
+ }
+ }
+ return $cats;
+}
+
+/**
+ * Removes a category from computed array of categories and updates counters.
+ *
+ * @param array &$cats
+ * @param array $cat category to remove
+ */
+function remove_computed_category(&$cats, $cat)
+{
+ if ( isset($cats[$cat['id_uppercat']]) )
+ {
+ $parent = &$cats[ $cat['id_uppercat'] ];
+ $parent['nb_categories']--;
+
+ do
+ {
+ $parent['count_images'] -= $cat['nb_images'];
+ $parent['count_categories'] -= 1+$cat['count_categories'];
+
+ if ( !isset($cats[$parent['id_uppercat']]) )
+ {
+ break;
+ }
+ $parent = &$cats[$parent['id_uppercat']];
+ }
+ while (true);
+ }
+
+ unset($cats[$cat['cat_id']]);
+}
+
?> \ No newline at end of file