Feature Issue ID 0000601: Filter all public pages with only recent elements

Last draft before final development.
There a icon for global mode and one other for local mode.

Counters are not good, filter on images are not everywhere applied, moment to update cache are not optimized, ...

Go to http://forum.phpwebgallery.net/viewtopic.php?id=9490


git-svn-id: http://piwigo.org/svn/trunk@1651 68402e56-0260-453c-a942-63ccdbb3a9ee
This commit is contained in:
rub 2006-12-13 00:05:16 +00:00
parent 5e9a4b02be
commit 5046b3c210
10 changed files with 161 additions and 47 deletions

View file

@ -55,7 +55,7 @@ SELECT
ON id = cat_id and user_id = '.$user['id'].' ON id = cat_id and user_id = '.$user['id'].'
WHERE id_uppercat '. WHERE id_uppercat '.
(!isset($page['category']) ? 'is NULL' : '= '.$page['category']); (!isset($page['category']) ? 'is NULL' : '= '.$page['category']);
if ($page['filter_mode']) if ($page['filter_local_mode'])
{ {
$query.= ' $query.= '
AND max_date_last > SUBDATE( AND max_date_last > SUBDATE(
@ -85,7 +85,7 @@ while ($row = mysql_fetch_assoc($result))
SELECT image_id SELECT image_id
FROM '.CATEGORIES_TABLE.' AS c INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic FROM '.CATEGORIES_TABLE.' AS c INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic
ON ic.category_id = c.id'; ON ic.category_id = c.id';
if ($page['filter_mode']) if ($page['filter_local_mode'] or $user['filter_global_mode'])
{ {
$query.= ' $query.= '
INNER JOIN '.IMAGES_TABLE.' AS i on ic.image_id = i.id '; INNER JOIN '.IMAGES_TABLE.' AS i on ic.image_id = i.id ';
@ -93,7 +93,7 @@ SELECT image_id
$query.= ' $query.= '
WHERE uppercats REGEXP \'(^|,)'.$row['id'].'(,|$)\' WHERE uppercats REGEXP \'(^|,)'.$row['id'].'(,|$)\'
AND c.id NOT IN ('.$user['forbidden_categories'].')'; AND c.id NOT IN ('.$user['forbidden_categories'].')';
if ($page['filter_mode']) if ($page['filter_local_mode'] or $user['filter_global_mode'])
{ {
$query.= ' $query.= '
AND i.date_available > SUBDATE( AND i.date_available > SUBDATE(
@ -117,7 +117,7 @@ SELECT representative_picture_id
ON id = cat_id and user_id = '.$user['id'].' ON id = cat_id and user_id = '.$user['id'].'
WHERE uppercats REGEXP \'(^|,)'.$row['id'].'(,|$)\' WHERE uppercats REGEXP \'(^|,)'.$row['id'].'(,|$)\'
AND representative_picture_id IS NOT NULL'; AND representative_picture_id IS NOT NULL';
if ($page['filter_mode']) if ($page['filter_local_mode'] or $user['filter_global_mode'])
{ {
$query.= ' $query.= '
AND max_date_last > SUBDATE( AND max_date_last > SUBDATE(

View file

@ -47,7 +47,7 @@ if (count($selection) > 0)
SELECT * SELECT *
FROM '.IMAGES_TABLE.' FROM '.IMAGES_TABLE.'
WHERE id IN ('.implode(',', $selection).')'; WHERE id IN ('.implode(',', $selection).')';
if ($page['filter_mode']) if ($page['filter_local_mode'] or $user['filter_global_mode'])
{ {
$query.= ' $query.= '
AND date_available > SUBDATE( AND date_available > SUBDATE(

View file

@ -67,7 +67,7 @@ SELECT ';
$query.= ' $query.= '
FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.' FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
ON id = cat_id and user_id = '.$user['id']; ON id = cat_id and user_id = '.$user['id'];
if ($page['filter_mode']) if ($page['filter_local_mode'])
{ {
$query.= ' $query.= '
where max_date_last > SUBDATE( where max_date_last > SUBDATE(
@ -75,8 +75,8 @@ where max_date_last > SUBDATE(
} }
else else
{ {
// Always expand when filter_mode is activated // Always expand when filter_local_mode is activated
if (!$user['expand']) if (!$user['expand'] and !$user['filter_global_mode'])
{ {
$query.= ' $query.= '
WHERE (id_uppercat is NULL'; WHERE (id_uppercat is NULL';

View file

@ -143,11 +143,12 @@ function setup_style($style)
return new Template(PHPWG_ROOT_PATH.'template/'.$style); return new Template(PHPWG_ROOT_PATH.'template/'.$style);
} }
function build_user( $user_id, $use_cache ) function build_user( $user_id, $use_cache, $filter_global_mode = false )
{ {
global $conf; global $conf;
$user['id'] = $user_id; $user['id'] = $user_id;
$user = array_merge( $user, getuserdata($user_id, $use_cache) ); $user = array_merge( $user, getuserdata($user_id, $use_cache, $filter_global_mode) );
if ( $user['id'] == $conf['guest_id']) if ( $user['id'] == $conf['guest_id'])
{ {
$user['is_the_guest']=true; $user['is_the_guest']=true;
@ -166,6 +167,7 @@ function build_user( $user_id, $use_cache )
{ {
$user['is_the_guest']=false; $user['is_the_guest']=false;
} }
// calculation of the number of picture to display per page // calculation of the number of picture to display per page
$user['nb_image_page'] = $user['nb_image_line'] * $user['nb_line_page']; $user['nb_image_page'] = $user['nb_image_line'] * $user['nb_line_page'];
@ -196,7 +198,7 @@ function build_user( $user_id, $use_cache )
* @param boolean use_cache * @param boolean use_cache
* @param array * @param array
*/ */
function getuserdata($user_id, $use_cache) function getuserdata($user_id, $use_cache, $filter_global_mode = false )
{ {
global $conf; global $conf;
@ -265,17 +267,21 @@ SELECT ui.*, uc.*
if ($use_cache) if ($use_cache)
{ {
$userdata['filter_global_mode'] = $filter_global_mode;
if (!isset($userdata['need_update']) if (!isset($userdata['need_update'])
or !is_bool($userdata['need_update']) or !is_bool($userdata['need_update'])
or $userdata['need_update'] == true) or $userdata['need_update'] == true
or $filter_global_mode // not optimize condition RubTag
)
{ {
$userdata['forbidden_categories'] = $userdata['forbidden_categories'] =
calculate_permissions($userdata['id'], $userdata['status']); calculate_permissions($userdata['id'], $userdata['status']);
update_user_cache_categories($userdata['id'], $userdata['forbidden_categories']); update_user_cache_categories($userdata);
// Set need update are done // Set need update are done
$userdata['need_update'] = false; $userdata['need_update'] = $userdata['filter_global_mode']; // for draft always update RubTag
$query = ' $query = '
SELECT COUNT(DISTINCT(image_id)) as total SELECT COUNT(DISTINCT(image_id)) as total
@ -492,25 +498,58 @@ function compute_branch_cat_data(&$cats, &$list_cat_id, &$level, &$ref_level)
/** /**
* update data of user_cache_categories * update data of user_cache_categories
* *
* @param int user_id * @param array userdata
* @return null * @return null
*/ */
function update_user_cache_categories($user_id, $user_forbidden_categories) function update_user_cache_categories(&$userdata)
{ {
// delete user cache // delete user cache
$query = ' $query = '
DELETE FROM '.USER_CACHE_CATEGORIES_TABLE.' DELETE FROM '.USER_CACHE_CATEGORIES_TABLE.'
WHERE user_id = '.$user_id.' WHERE user_id = '.$userdata['id'].'
;'; ;';
pwg_query($query); pwg_query($query);
$query = ' /*$query = '
SELECT id cat_id, date_last max_date_last, nb_images count_images, global_rank SELECT id cat_id, date_last max_date_last, nb_images count_images, global_rank
FROM '.CATEGORIES_TABLE; FROM '.CATEGORIES_TABLE;
if ($user_forbidden_categories != '') if ($userdata['forbidden_categories'] != '')
{ {
$query.= ' $query.= '
WHERE id NOT IN ('.$user_forbidden_categories.')'; WHERE id NOT IN ('.$userdata['forbidden_categories'].')';
}
$query.= ';';*/
$query = '
SELECT c.id cat_id, date_last max_date_last, nb_images count_images, global_rank';
if (!$userdata['filter_global_mode'])
{
$query.= '
FROM '.CATEGORIES_TABLE.' as C';
}
else
{
// Count by date_available to avoid count null
$query.= ', count(date_available) filtered_count_images, max(date_available) max_date_available
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.date_available > SUBDATE(
CURRENT_DATE,INTERVAL '.$userdata['recent_period'].' DAY)';
}
if ($userdata['forbidden_categories'] != '')
{
$query.= '
WHERE C.id NOT IN ('.$userdata['forbidden_categories'].')';
}
if ($userdata['filter_global_mode'])
{
$query.= '
GROUP BY c.id';
} }
$query.= ';'; $query.= ';';
@ -519,8 +558,13 @@ SELECT id cat_id, date_last max_date_last, nb_images count_images, global_rank
$cats = array(); $cats = array();
while ($row = mysql_fetch_assoc($result)) while ($row = mysql_fetch_assoc($result))
{ {
$row['user_id'] = $user_id; $row['user_id'] = $userdata['id'];
$row['count_categories'] = 0; $row['count_categories'] = 0;
if ($userdata['filter_global_mode'])
{
$row['count_images'] = $row['filtered_count_images'];
$row['max_date_last'] = $row['max_date_available'];
}
$cats += array($row['cat_id'] => $row); $cats += array($row['cat_id'] => $row);
} }
usort($cats, 'global_rank_compare'); usort($cats, 'global_rank_compare');
@ -548,6 +592,27 @@ SELECT id cat_id, date_last max_date_last, nb_images count_images, global_rank
$level = 1; $level = 1;
compute_branch_cat_data($cats, $list_cat_id, $level, $ref_level); compute_branch_cat_data($cats, $list_cat_id, $level, $ref_level);
if ($userdata['filter_global_mode'])
{
$forbidden_cats = array();
$forbidden_cats = explode(',', $userdata['forbidden_categories']);
$cat_tmp = $cats;
$cats = array();
foreach ($cat_tmp as $cat_id => $category)
{
if (empty($category['max_date_last']))
{
array_push($forbidden_cats, $category['cat_id']);
}
else
{
array_push($cats, $category);
}
}
$userdata['forbidden_categories'] = implode(',', array_unique($forbidden_cats));
}
include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
mass_inserts mass_inserts
( (

View file

@ -69,8 +69,20 @@ if ($conf['apache_authentication'] and isset($_SERVER['REMOTE_USER']))
$user['id'] = get_userid($_SERVER['REMOTE_USER']); $user['id'] = get_userid($_SERVER['REMOTE_USER']);
} }
} }
if (isset($_GET['filter_global_mode']))
{
$user['filter_global_mode'] = ($_GET['filter_global_mode'] == 'start');
pwg_set_session_var('filter_global_mode', $user['filter_global_mode']);
}
else
{
$user['filter_global_mode'] = pwg_get_session_var('filter_global_mode', false);
}
$user = build_user( $user['id'], $user = build_user( $user['id'],
( defined('IN_ADMIN') and IN_ADMIN ) ? false : true // use cache ? ( defined('IN_ADMIN') and IN_ADMIN ) ? false : true, // use cache ?
$user['filter_global_mode'] // filter_global_mode ?
); );
?> ?>

View file

@ -106,31 +106,64 @@ if (isset($page['cat_nb_images']) and $page['cat_nb_images'] > 0)
$template_title.= ' ['.$page['cat_nb_images'].']'; $template_title.= ' ['.$page['cat_nb_images'].']';
} }
if (isset($_GET['filter_mode'])) if (isset($_GET['filter_local_mode']))
{ {
$page['filter_mode'] = ($_GET['filter_mode'] == 'start'); $page['filter_local_mode'] = ($_GET['filter_local_mode'] == 'start');
pwg_set_session_var('filter_mode', $page['filter_mode']);
} }
else else
{ {
$page['filter_mode'] = pwg_get_session_var('filter_mode', false); $page['filter_local_mode'] = pwg_get_session_var('filter_local_mode', false);
} }
if ($page['filter_mode']) $page['filter_local_mode'] = (($page['filter_local_mode']) and
($page['section'] == 'categories') and
(!isset($page['chronology_field'])));
pwg_set_session_var('filter_local_mode', $page['filter_local_mode']);
if ($page['filter_local_mode'])
{ {
$template->assign_block_vars( $template->assign_block_vars(
'stop_filter_mode', 'stop_filter_local_mode',
array( array(
'URL' => add_url_params(duplicate_index_url(array(), array('start')), array('filter_mode' => 'stop')) 'URL' => add_url_params(duplicate_index_url(array(), array('start')), array('filter_local_mode' => 'stop'))
) )
); );
} }
else else
{ {
$template->assign_block_vars( $template->assign_block_vars(
'start_filter_mode', 'start_filter_local_mode',
array( array(
'URL' => add_url_params(duplicate_index_url(array(), array('start')), array('filter_mode' => 'start')) 'URL' => add_url_params(duplicate_index_url(array(), array('start')), array('filter_local_mode' => 'start'))
)
);
}
if (isset($_GET['filter_global_mode']))
{
$user['filter_global_mode'] = ($_GET['filter_global_mode'] == 'start');
pwg_set_session_var('filter_global_mode', $user['filter_global_mode']);
}
else
{
$user['filter_global_mode'] = pwg_get_session_var('filter_global_mode', false);
}
if ($user['filter_global_mode'])
{
$template->assign_block_vars(
'stop_filter_global_mode',
array(
'URL' => add_url_params(duplicate_index_url(array(), array('start')), array('filter_global_mode' => 'stop'))
)
);
}
else
{
$template->assign_block_vars(
'start_filter_global_mode',
array(
'URL' => add_url_params(duplicate_index_url(array(), array('start')), array('filter_global_mode' => 'start'))
) )
); );
} }

View file

@ -490,8 +490,10 @@ $lang['maxheight'] = 'Maximum height of the pictures';
$lang['maxheight_error'] = 'Maximum height must be a number superior to 50'; $lang['maxheight_error'] = 'Maximum height must be a number superior to 50';
$lang['maxwidth'] = 'Maximum width of the pictures'; $lang['maxwidth'] = 'Maximum width of the pictures';
$lang['maxwidth_error'] = 'Maximum width must be a number superior to 50'; $lang['maxwidth_error'] = 'Maximum width must be a number superior to 50';
$lang['start_filter_mode_hint'] = 'displays only recent elements'; $lang['start_filter_local_mode_hint'] = '[local] displays only recent elements';
$lang['stop_filter_mode_hint'] = 'return to display all elements'; $lang['stop_filter_local_mode_hint'] = '[local] return to display all elements';
$lang['start_filter_global_mode_hint'] = '[global] displays only recent elements';
$lang['stop_filter_global_mode_hint'] = '[global] return to display all elements';
$lang['mode_created_hint'] = 'displays a calendar by creation date'; $lang['mode_created_hint'] = 'displays a calendar by creation date';
$lang['mode_normal_hint'] = 'return to normal view mode'; $lang['mode_normal_hint'] = 'return to normal view mode';
$lang['mode_posted_hint'] = 'displays a calendar by date posted'; $lang['mode_posted_hint'] = 'displays a calendar by date posted';

View file

@ -490,9 +490,11 @@ $lang['maxheight'] = 'Hauteur maximum des images';
$lang['maxheight_error'] = 'La hauteur maximum des images doit être supérieure à 50'; $lang['maxheight_error'] = 'La hauteur maximum des images doit être supérieure à 50';
$lang['maxwidth'] = 'Largeur maximum des images'; $lang['maxwidth'] = 'Largeur maximum des images';
$lang['maxwidth_error'] = 'La largeur des images doit être supérieure à 50'; $lang['maxwidth_error'] = 'La largeur des images doit être supérieure à 50';
$lang['start_filter_local_mode_hint'] = '[local] afficher que les éléments récents';
$lang['stop_filter_local_mode_hint'] = '[local] retourner à l\'affichage de tous les éléments';
$lang['start_filter_global_mode_hint'] = '[global] afficher que les éléments récents';
$lang['stop_filter_global_mode_hint'] = '[global] retourner à l\'affichage de tous les éléments';
$lang['mode_created_hint'] = 'afficher un calendrier par date de création'; $lang['mode_created_hint'] = 'afficher un calendrier par date de création';
$lang['start_filter_mode_hint'] = 'afficher que les éléments récents';
$lang['stop_filter_mode_hint'] = 'retourner à l\'affichage de tous les éléments';
$lang['mode_normal_hint'] = 'retourner à la vue normale'; $lang['mode_normal_hint'] = 'retourner à la vue normale';
$lang['mode_posted_hint'] = 'afficher un calendrier par date d\'ajout'; $lang['mode_posted_hint'] = 'afficher un calendrier par date d\'ajout';
$lang['month'][10] = 'Octobre'; $lang['month'][10] = 'Octobre';

View file

@ -27,12 +27,12 @@
<li><a href="{search_rules.URL}" style="border:none;" onclick="popuphelp(this.href); return false;" title="{lang:Search rules}"><img src="{pwg_root}{themeconf:icon_dir}/search_rules.png" class="button" alt="(?)"></a></li> <li><a href="{search_rules.URL}" style="border:none;" onclick="popuphelp(this.href); return false;" title="{lang:Search rules}"><img src="{pwg_root}{themeconf:icon_dir}/search_rules.png" class="button" alt="(?)"></a></li>
<!-- END search_rules --> <!-- END search_rules -->
<!-- BEGIN start_filter_mode --> <!-- BEGIN start_filter_local_mode -->
<li><a href="{start_filter_mode.URL}" title="{lang:start_filter_mode_hint}"><img src="{pwg_root}{themeconf:icon_dir}/start_filter_mode.png" class="button" alt="{lang:start_filter_mode_hint}"></a></li> <li><a href="{start_filter_local_mode.URL}" title="{lang:start_filter_local_mode_hint}"><img src="{pwg_root}{themeconf:icon_dir}/start_filter_mode.png" class="button" alt="{lang:start_filter_local_mode_hint}"></a></li>
<!-- END start_filter_mode --> <!-- END start_filter_local_mode -->
<!-- BEGIN stop_filter_mode --> <!-- BEGIN stop_filter_local_mode -->
<li><a href="{stop_filter_mode.URL}" title="{lang:stop_filter_mode_hint}"><img src="{pwg_root}{themeconf:icon_dir}/stop_filter_mode.png" class="button" alt="{lang:stop_filter_mode_hint}"></a></li> <li><a href="{stop_filter_local_mode.URL}" title="{lang:stop_filter_local_mode_hint}"><img src="{pwg_root}{themeconf:icon_dir}/stop_filter_mode.png" class="button" alt="{lang:stop_filter_local_mode_hint}"></a></li>
<!-- END stop_filter_mode --> <!-- END stop_filter_local_mode -->
<!-- BEGIN mode_normal --> <!-- BEGIN mode_normal -->
<li><a href="{mode_normal.URL}" title="{lang:mode_normal_hint}"><img src="{pwg_root}{themeconf:icon_dir}/normal_mode.png" class="button" alt="{lang:mode_normal_hint}"></a></li> <li><a href="{mode_normal.URL}" title="{lang:mode_normal_hint}"><img src="{pwg_root}{themeconf:icon_dir}/normal_mode.png" class="button" alt="{lang:mode_normal_hint}"></a></li>

View file

@ -13,12 +13,12 @@
</dl> </dl>
<!-- END links --> <!-- END links -->
<dl id="mbCategories"> <dl id="mbCategories">
<!-- BEGIN start_filter_mode --> <!-- BEGIN start_filter_global_mode -->
<a href="{start_filter_mode.URL}" title="{lang:start_filter_mode_hint}"><img src="{pwg_root}{themeconf:icon_dir}/start_filter_mode.png" class="buttonmenu" alt="{lang:start_filter_mode_hint}"></a> <a href="{start_filter_global_mode.URL}" title="{lang:start_filter_global_mode_hint}"><img src="{pwg_root}{themeconf:icon_dir}/start_filter_mode.png" class="buttonmenu" alt="{lang:start_filter_global_mode_hint}"></a>
<!-- END start_filter_mode --> <!-- END start_filter_global_mode -->
<!-- BEGIN stop_filter_mode --> <!-- BEGIN stop_filter_global_mode -->
<a href="{stop_filter_mode.URL}" title="{lang:stop_filter_mode_hint}"><img src="{pwg_root}{themeconf:icon_dir}/stop_filter_mode.png" class="buttonmenu" alt="{lang:stop_filter_mode_hint}"></a> <a href="{stop_filter_global_mode.URL}" title="{lang:stop_filter_global_mode_hint}"><img src="{pwg_root}{themeconf:icon_dir}/stop_filter_mode.png" class="buttonmenu" alt="{lang:stop_filter_global_mode_hint}"></a>
<!-- END stop_filter_mode --> <!-- END stop_filter_global_mode -->
<dt><a href="{U_HOME}">{lang:Categories}</a></dt> <dt><a href="{U_HOME}">{lang:Categories}</a></dt>
<dd> <dd>
{MENU_CATEGORIES_CONTENT} {MENU_CATEGORIES_CONTENT}