- based on test_menu by grum (thanks to you) - integration of dynamic menu bar to pwg

- the menubar is composed now of dynamic blocks that can be ordered/hidden
- plugins can add their own blocks 


git-svn-id: http://piwigo.org/svn/trunk@2488 68402e56-0260-453c-a942-63ccdbb3a9ee
This commit is contained in:
rvelices
2008-08-28 00:32:39 +00:00
parent 7f956e71b9
commit abb2f22b2e
44 changed files with 1008 additions and 1718 deletions
+214
View File
@@ -0,0 +1,214 @@
<?php
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based picture gallery |
// +-----------------------------------------------------------------------+
// | Copyright(C) 2008 Piwigo Team http://piwigo.org |
// +-----------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation |
// | |
// | This program is distributed in the hope that it will be useful, but |
// | WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with this program; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
class BlockManager
{
protected $id;
protected $registered_blocks=array();
protected $display_blocks = array();
public function BlockManager($id)
{
$this->id = $id;
}
/** triggers an action that allows implementors of menu blocks to register the blocks*/
public function load_registered_blocks()
{
trigger_action('blockmanager_register_blocks', array(&$this) );
}
public function get_id()
{
return $this->id;
}
public function get_registered_blocks()
{
return $this->registered_blocks;
}
/** registers a block with this menu. usually called as a result of menubar_register_blocks action
* @param MenuBlock block
*/
public function register_block(&$block)
{
if ( isset($this->registered_blocks[$block->get_id()] ) )
{
trigger_error("Block '".$block->get_id()."' is already registered", E_USER_WARNING);
return false;
}
$this->registered_blocks[$block->get_id()] = &$block;
return true;
}
/** performs one time preparation of registered blocks for display;
* triggers the action menubar_prepare_display where implementors can
* reposition or hide blocks
*/
public function prepare_display()
{
global $conf;
$conf_id = 'blk_'.$this->id;
$mb_conf = isset($conf[$conf_id]) ? $conf[$conf_id] : array();
if ( !is_array($mb_conf) )
$mb_conf = @unserialize($mb_conf);
$idx = 1;
foreach( $this->registered_blocks as $id => $block )
{
$pos = isset( $mb_conf[$id] ) ? $mb_conf[$id] : $idx*50;
if ( $pos>0 )
{
$this->display_blocks[$id] = new DisplayBlock($block);
$this->display_blocks[$id]->set_position($pos);
}
$idx++;
}
$this->sort_blocks();
trigger_action( 'blockmanager_prepare_display', array(&$this) );
$this->sort_blocks();
}
/** returns true if the block whose id is hidden
* @param string block_id
*/
public function is_hidden($block_id)
{
return isset($this->display_blocks[$block_id]) ? false : true;
}
public function hide_block($block_id)
{
unset( $this->display_blocks[$block_id] );
}
public function &get_block($block_id)
{
$tmp = null;
if ( isset($this->display_blocks[$block_id]) )
{
return $this->display_blocks[$block_id];
}
return $tmp;
}
public function set_block_position($block_id, $position)
{
if ( isset($this->display_blocks[$block_id]) )
{
$this->display_blocks[$block_id]->set_position($position);
}
}
protected function sort_blocks()
{
uasort( $this->display_blocks, array('BlockManager', 'cmp_by_position') );
}
static protected function cmp_by_position($a, $b)
{
return $a->get_position() - $b->get_position();
}
public function apply($var, $file)
{
global $template;
$template->set_filename('menubar', $file);
trigger_action('blockmanager_apply', array(&$this) );
foreach( $this->display_blocks as $id=>$block)
{
if (empty($block->raw_content) and empty($block->template) )
{
$this->hide_block($id);
}
}
$this->sort_blocks();
$template->assign('blocks', $this->display_blocks);
$template->assign_var_from_handle($var, 'menubar');
}
}
/**
* Represents a menu block registered in a Menu object.
*/
class RegisteredBlock
{
protected $id;
protected $name;
protected $owner;
public function RegisteredBlock($id, $name, $owner)
{
$this->id = $id;
$this->name = $name;
$this->owner = $owner;
}
public function get_id() { return $this->id; }
public function get_name() { return $this->name; }
public function get_owner() { return $this->owner; }
}
/**
* Represents a menu block ready for display in the Menu object.
*/
class DisplayBlock
{
protected $_registeredBlock;
protected $_position;
protected $_title;
public $data;
public $template;
public $raw_content;
public function DisplayBlock($registeredBlock)
{
$this->_registeredBlock = &$registeredBlock;
}
public function &get_block() { return $this->_registeredBlock; }
public function get_position() { return $this->_position; }
public function set_position($position)
{
$this->_position = $position;
}
public function get_title()
{
if (isset($this->_title))
return $this->_title;
else
return $this->_registeredBlock->get_name();
}
public function set_title($title)
{
$this->_title = $title;
}
}
?>
+1
View File
@@ -283,5 +283,6 @@ add_event_handler('render_category_description', 'render_category_description');
add_event_handler('render_comment_content', 'htmlspecialchars');
add_event_handler('render_comment_content', 'parse_comment_content');
add_event_handler('render_comment_author', 'strip_tags');
add_event_handler('blockmanager_register_blocks', 'register_default_menubar_blocks', EVENT_HANDLER_PRIORITY_NEUTRAL-1);
trigger_action('init');
?>
+14
View File
@@ -772,4 +772,18 @@ function order_by_name($element_ids,$name)
return $ordered_element_ids;
}
/*event handler for menu*/
function register_default_menubar_blocks( $menu_ref_arr )
{
$menu = & $menu_ref_arr[0];
if ($menu->get_id() != 'menubar')
return;
$menu->register_block( new RegisteredBlock( 'mbLinks', 'Links', 'piwigo'));
$menu->register_block( new RegisteredBlock( 'mbCategories', 'Categories', 'piwigo'));
$menu->register_block( new RegisteredBlock( 'mbTags', 'Related tags', 'piwigo'));
$menu->register_block( new RegisteredBlock( 'mbSpecials', 'special_categories', 'piwigo'));
$menu->register_block( new RegisteredBlock( 'mbMenu', 'title_menu', 'piwigo'));
$menu->register_block( new RegisteredBlock( 'mbIdentification', 'identification', 'piwigo') );
}
?>
+251 -254
View File
@@ -25,281 +25,278 @@
* This file is included by the main page to show the menu bar
*
*/
$template->set_filenames(
array(
'menubar' => 'menubar.tpl',
)
);
trigger_action('loc_begin_menubar');
include_once(PHPWG_ROOT_PATH.'include/block.class.php');
$template->assign(
array(
'NB_PICTURE' => $user['nb_total_images'],
'MENU_CATEGORIES_CONTENT' => get_categories_menu(),
'U_CATEGORIES' => make_index_url(array('section' => 'categories')),
'U_LOST_PASSWORD' => get_root_url().'password.php',
'U_UPLOAD' => get_upload_menu_link()
)
);
initialize_menu();
//-------------------------------------------------------------- external links
foreach ($conf['links'] as $url => $url_data)
function initialize_menu()
{
if (!is_array($url_data))
global $page, $conf, $user, $template, $filter;
$menu = new BlockManager("menubar");
$menu->load_registered_blocks();
$menu->prepare_display();
//--------------------------------------------------------------- external links
if ( ($block=$menu->get_block('mbLinks')) and !empty($conf['links']) )
{
$url_data = array('label' => $url_data);
$data = array();
foreach ($conf['links'] as $url => $url_data)
{
if (!is_array($url_data))
{
$url_data = array('label' => $url_data);
}
if
(
(!isset($url_data['eval_visible']))
or
(eval($url_data['eval_visible']))
)
{
$tpl_var = array(
'URL' => $url,
'LABEL' => $url_data['label']
);
if (!isset($url_data['new_window']) or $url_data['new_window'])
{
$tpl_var['new_window'] =
array(
'NAME' => (isset($url_data['nw_name']) ? $url_data['nw_name'] : ''),
'FEATURES' => (isset($url_data['nw_features']) ? $url_data['nw_features'] : '')
);
}
$data[] = $tpl_var;
}
}
$block->template = 'menubar_links.tpl';
$block->data = $data;
}
if
(
(!isset($url_data['eval_visible']))
or
(eval($url_data['eval_visible']))
)
//-------------------------------------------------------------- categories
$block = $menu->get_block('mbCategories');
//------------------------------------------------------------------------ filter
if (!empty($conf['filter_pages']) and get_filter_page_value('used'))
{
$tpl_var = array(
'URL' => $url,
'LABEL' => $url_data['label']
);
if (!isset($url_data['new_window']) or $url_data['new_window'])
if ($filter['enabled'])
{
$tpl_var['new_window'] =
array(
'NAME' => (isset($url_data['nw_name']) ? $url_data['nw_name'] : ''),
'FEATURES' => (isset($url_data['nw_features']) ? $url_data['nw_features'] : '')
$template->assign(
'U_STOP_FILTER',
add_url_params(make_index_url(array()), array('filter' => 'stop'))
);
}
else
{
$template->assign(
'U_START_FILTER',
add_url_params(make_index_url(array()), array('filter' => 'start-recent-'.$user['recent_period']))
);
}
$template->append('links', $tpl_var);
}
}
//------------------------------------------------------------------------ filter
if (!empty($conf['filter_pages']) and get_filter_page_value('used'))
{
if ($filter['enabled'])
if ( $block!=null )
{
$block->data = array(
'NB_PICTURE' => $user['nb_total_images'],
'MENU_CATEGORIES_CONTENT' => get_categories_menu(),
'U_CATEGORIES' => make_index_url(array('section' => 'categories')),
'U_UPLOAD' => get_upload_menu_link()
);
$block->template = 'menubar_categories.tpl';
}
//------------------------------------------------------------------------ tags
$block = $menu->get_block('mbTags');
if ( $block!=null and 'tags'==@$page['section'] and !empty($page['items']) )
{
$tags = get_common_tags($page['items'],
$conf['menubar_tag_cloud_items_number'], $page['tag_ids']);
$tags = add_level_to_tags($tags);
foreach ($tags as $tag)
{
$block->data[] =
array_merge( $tag,
array(
'URL' => make_index_url(
array(
'tags' => array($tag)
)
),
'U_ADD' => make_index_url(
array(
'tags' => array_merge(
$page['tags'],
array($tag)
)
)
),
)
);
}
$block->template = 'menubar_tags.tpl';
}
//----------------------------------------------------------- special categories
if ( ($block = $menu->get_block('mbSpecials')) != null )
{
if ( !is_a_guest() )
{// favorites
$block->data['favorites'] =
array(
'URL' => make_index_url(array('section' => 'favorites')),
'TITLE' => l10n('favorite_cat_hint'),
'NAME' => l10n('favorite_cat')
);
}
$block->data['most_visited'] =
array(
'URL' => make_index_url(array('section' => 'most_visited')),
'TITLE' => l10n('most_visited_cat_hint'),
'NAME' => l10n('most_visited_cat')
);
if ($conf['rate'])
{
$block->data['best_rated'] =
array(
'URL' => make_index_url(array('section' => 'best_rated')),
'TITLE' => l10n('best_rated_cat_hint'),
'NAME' => l10n('best_rated_cat')
);
}
$block->data['random'] =
array(
'URL' => get_root_url().'random.php',
'TITLE' => l10n('random_cat_hint'),
'NAME' => l10n('random_cat'),
'REL'=> 'rel="nofollow"'
);
$block->data['recent_pics'] =
array(
'URL' => make_index_url(array('section' => 'recent_pics')),
'TITLE' => l10n('recent_pics_cat_hint'),
'NAME' => l10n('recent_pics_cat'),
);
$block->data['recent_cats'] =
array(
'URL' => make_index_url(array('section' => 'recent_cats')),
'TITLE' => l10n('recent_cats_cat_hint'),
'NAME' => l10n('recent_cats_cat'),
);
$block->data['calendar'] =
array(
'URL' =>
make_index_url(
array(
'chronology_field' => ($conf['calendar_datefield']=='date_available'
? 'posted' : 'created'),
'chronology_style'=> 'monthly',
'chronology_view' => 'calendar'
)
),
'TITLE' => l10n('calendar_hint'),
'NAME' => l10n('calendar'),
'REL'=> 'rel="nofollow"'
);
$block->template = 'menubar_specials.tpl';
}
//---------------------------------------------------------------------- summary
if ( ($block=$menu->get_block('mbMenu')) != null )
{
// tags link
$block->data['tags'] =
array(
'TITLE' => l10n('See available tags'),
'NAME' => l10n('Tags'),
'URL'=> get_root_url().'tags.php',
);
// search link
$block->data['search'] =
array(
'TITLE'=>l10n('hint_search'),
'NAME'=>l10n('Search'),
'URL'=> get_root_url().'search.php',
'REL'=> 'rel="search"'
);
// comments link
$block->data['comments'] =
array(
'TITLE'=>l10n('hint_comments'),
'NAME'=>l10n('comments'),
'URL'=> get_root_url().'comments.php',
);
// about link
$block->data['about'] =
array(
'TITLE' => l10n('about_page_title'),
'NAME' => l10n('About'),
'URL' => get_root_url().'about.php',
);
// notification
$block->data['rss'] =
array(
'TITLE'=>l10n('RSS feed'),
'NAME'=>l10n('Notification'),
'URL'=> get_root_url().'notification.php',
'REL'=> 'rel="nofollow"'
);
$block->template = 'menubar_menu.tpl';
}
//--------------------------------------------------------------- identification
if (is_a_guest())
{
$template->assign(
'U_STOP_FILTER',
add_url_params(make_index_url(array()), array('filter' => 'stop'))
array(
'U_LOGIN' => get_root_url().'identification.php',
'AUTHORIZE_REMEMBERING' => $conf['authorize_remembering']
)
);
if ($conf['allow_user_registration'])
{
$template->assign( 'U_REGISTER', get_root_url().'register.php');
}
}
else
{
$template->assign(
'U_START_FILTER',
add_url_params(make_index_url(array()), array('filter' => 'start-recent-'.$user['recent_period']))
);
}
}
$template->assign('USERNAME', $user['username']);
if (is_autorize_status(ACCESS_CLASSIC))
{
$template->assign('U_PROFILE', get_root_url().'profile.php');
}
//------------------------------------------------------------------------ tags
if ('tags' == @$page['section'])
{
// display tags associated to currently tagged items, less current tags
$tags = array();
if ( !empty($page['items']) )
// the logout link has no meaning with Apache authentication : it is not
// possible to logout with this kind of authentication.
if (!$conf['apache_authentication'])
{
$template->assign('U_LOGOUT', get_root_url().'?act=logout');
}
if (is_admin())
{
$template->assign('U_ADMIN', get_root_url().'admin.php');
}
}
if ( ($block=$menu->get_block('mbIdentification')) != null )
{
$tags = get_common_tags($page['items'],
$conf['menubar_tag_cloud_items_number'], $page['tag_ids']);
}
$tags = add_level_to_tags($tags);
foreach ($tags as $tag)
{
$template->append(
'related_tags',
array_merge( $tag,
array(
'URL' => make_index_url(
array(
'tags' => array($tag)
)
),
'U_ADD' => make_index_url(
array(
'tags' => array_merge(
$page['tags'],
array($tag)
)
)
),
)
)
);
$block->template = 'menubar_identification.tpl';
}
$menu->apply('MENUBAR', 'menubar.tpl' );
}
//---------------------------------------------------------- special categories
// favorites categories
if ( !is_a_guest() )
{
$template->append(
'special_categories',
array(
'URL' => make_index_url(array('section' => 'favorites')),
'TITLE' => l10n('favorite_cat_hint'),
'NAME' => l10n('favorite_cat')
));
}
// most visited
$template->append(
'special_categories',
array(
'URL' => make_index_url(array('section' => 'most_visited')),
'TITLE' => l10n('most_visited_cat_hint'),
'NAME' => l10n('most_visited_cat')
));
// best rated
if ($conf['rate'])
{
$template->append(
'special_categories',
array(
'URL' => make_index_url(array('section' => 'best_rated')),
'TITLE' => l10n('best_rated_cat_hint'),
'NAME' => l10n('best_rated_cat')
)
);
}
// random
$template->append(
'special_categories',
array(
'URL' => get_root_url().'random.php',
'TITLE' => l10n('random_cat_hint'),
'NAME' => l10n('random_cat'),
'REL'=> 'rel="nofollow"'
));
// recent pics
$template->append(
'special_categories',
array(
'URL' => make_index_url(array('section' => 'recent_pics')),
'TITLE' => l10n('recent_pics_cat_hint'),
'NAME' => l10n('recent_pics_cat'),
));
// recent cats
$template->append(
'special_categories',
array(
'URL' => make_index_url(array('section' => 'recent_cats')),
'TITLE' => l10n('recent_cats_cat_hint'),
'NAME' => l10n('recent_cats_cat'),
));
// calendar
$template->append(
'special_categories',
array(
'URL' =>
make_index_url(
array(
'chronology_field' => ($conf['calendar_datefield']=='date_available'
? 'posted' : 'created'),
'chronology_style'=> 'monthly',
'chronology_view' => 'calendar'
)
),
'TITLE' => l10n('calendar_hint'),
'NAME' => l10n('calendar'),
'REL'=> 'rel="nofollow"'
)
);
//--------------------------------------------------------------------- summary
if (is_a_guest())
{
$template->assign(
array(
'U_IDENTIFY' => get_root_url().'identification.php',
'AUTHORIZE_REMEMBERING' => $conf['authorize_remembering']
)
);
if ($conf['allow_user_registration'])
{
$template->assign( 'U_REGISTER', get_root_url().'register.php');
}
}
else
{
$template->assign('USERNAME', $user['username']);
if (is_autorize_status(ACCESS_CLASSIC))
{
$template->assign('U_PROFILE', get_root_url().'profile.php');
}
// the logout link has no meaning with Apache authentication : it is not
// possible to logout with this kind of authentication.
if (!$conf['apache_authentication'])
{
$template->assign('U_LOGOUT', get_root_url().'?act=logout');
}
if (is_admin())
{
$template->assign('U_ADMIN', get_root_url().'admin.php');
}
}
// tags link
$template->append(
'summaries',
array(
'TITLE' => l10n('See available tags'),
'NAME' => l10n('Tags'),
'U_SUMMARY'=> get_root_url().'tags.php',
)
);
// search link
$template->append(
'summaries',
array(
'TITLE'=>l10n('hint_search'),
'NAME'=>l10n('Search'),
'U_SUMMARY'=> get_root_url().'search.php',
'REL'=> 'rel="search"'
)
);
// comments link
$template->append(
'summaries',
array(
'TITLE'=>l10n('hint_comments'),
'NAME'=>l10n('comments'),
'U_SUMMARY'=> get_root_url().'comments.php',
)
);
// about link
$template->append(
'summaries',
array(
'TITLE' => l10n('about_page_title'),
'NAME' => l10n('About'),
'U_SUMMARY' => get_root_url().'about.php',
)
);
// notification
$template->append(
'summaries',
array(
'TITLE'=>l10n('RSS feed'),
'NAME'=>l10n('Notification'),
'U_SUMMARY'=> get_root_url().'notification.php',
'REL'=> 'rel="nofollow"'
)
);
trigger_action('loc_end_menubar');
$template->assign_var_from_handle('MENUBAR', 'menubar');
?>