aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/test_menu/menu.class.inc.php
diff options
context:
space:
mode:
authorgrum <grum@piwigo.org>2008-08-03 07:48:39 +0000
committergrum <grum@piwigo.org>2008-08-03 07:48:39 +0000
commit7ebed797262c7f3371ae1b16ed455f7e9879caf0 (patch)
tree7abef8d2994ae2efa66f38e3027369c7ac0e3926 /plugins/test_menu/menu.class.inc.php
parentee0af5d43d607ffb969a10e6a21e9df923651d52 (diff)
Asked by rvelices on this topic
http://forum.phpwebgallery.net/viewtopic.php?pid=92097#p92097 A plugin to integrate the menu class see test_menu directory A plugin to show how to use the menu class see AMenuManager directory And common classes needed for the AMenuManager plugin see grum_plugins_classes-2 directory See topic http://forum.phpwebgallery.net/viewtopic.php?pid=92637#p92637 for more informations git-svn-id: http://piwigo.org/svn/trunk@2466 68402e56-0260-453c-a942-63ccdbb3a9ee
Diffstat (limited to 'plugins/test_menu/menu.class.inc.php')
-rw-r--r--plugins/test_menu/menu.class.inc.php500
1 files changed, 500 insertions, 0 deletions
diff --git a/plugins/test_menu/menu.class.inc.php b/plugins/test_menu/menu.class.inc.php
new file mode 100644
index 000000000..d37a8345e
--- /dev/null
+++ b/plugins/test_menu/menu.class.inc.php
@@ -0,0 +1,500 @@
+<?php
+
+/* -----------------------------------------------------------------------------
+ class name: menu, blocks
+ class version: 1.0
+ date: 2008-07-25
+
+ ------------------------------------------------------------------------------
+ Author : Grum
+ email : grum@grum.dnsalias.com
+ website : http://photos.grum.dnsalias.com
+ PWG user : http://forum.phpwebgallery.net/profile.php?id=3706
+
+ << May the Little SpaceFrog be with you ! >>
+ ------------------------------------------------------------------------------
+
+ this classes provides base functions to manage the public gallery menu
+
+ ** The Section class **
+ This class allows you to easily make a section block for the menu
+ Public methods
+ get_id()
+ get_name()
+ get_template()
+ get_position()
+ get_tag()
+ get_items()
+ set_name($value)
+ set_template($value)
+ set_tag($value)
+ set_items($value)
+ items_count()
+ get()
+ Constructor
+ $id : section's id have to be unique in the menu
+ $name : section's name is displayed on the menu
+ $template : name of smarty template file ; if file doesn't exist, use of the
+ generic template
+ $tag : a facultative data ; use it as you want !
+ $items : items of the menu : no specfic structure because it depends of
+ the template model
+
+ ** The Menu class **
+ This class allows to easily manage the menu
+ Public methods
+ add($section_datas)
+ remove($id)
+ replace($section_datas)
+ clear()
+ section($id)
+ sections()
+ ids()
+ count()
+ register($id, $name, $position, $owner)
+ register_position($id, $position)
+ unregister($id)
+ registered()
+ apply()
+
+ How to use Menu class :
+ 1/ create an instance
+ $menu = new Menu();
+ instance have to be created by piwigo, plugin have to use of a global
+ variable
+
+ 2/ register your menu section
+ register a section allows to know sections even if $menu is not loaded
+ register a section allows to manage position into menu
+ register function only reference some information about section, it does
+ not create the section of menu (an only registered section is not
+ displayed in menu)
+ best place to register a section : when plugin is activated
+ when deactivate plugin, unregister the section
+
+ 3/ add section to menu
+ add a section allows to really create section into menu
+
+
+
+
+ ------------------------------------------------------------------------------
+ :: HISTORY
+
+ 1.0.0 - 2008-07-25
+ first lines of code...
+
+ --------------------------------------------------------------------------- */
+
+// theses constant ave to be adapted for a piwigo's integration
+define('MENU_TEMPLATES_DIR' , dirname(__FILE__));
+define('MENU_TEMPLATES_PATH' , MENU_TEMPLATES_DIR . '/menu_templates/');
+define('MENU_REGISTERED_PATH' ,
+ PHPWG_PLUGINS_PATH . basename(dirname(__FILE__)) . '/');
+
+
+class Menu
+{
+ protected $sections=array(); //array key is unique ID of sections
+ protected $registered_sections=array();
+ protected $registered_file="registered.dat";
+
+ public function Menu()
+ {
+ $this->load_registered();
+ }
+
+ /*
+ public functions
+ */
+ public function add($section_datas)
+ {
+ // add a section to the menu ; datas can be made with the Section class
+ if($this->section_is_valid($section_datas) and
+ !isset($this->sections[$section_datas['ID']]) )
+ {
+ $this->sections[$section_datas['ID']]=$section_datas;
+
+ if(isset($this->registered_sections[$section_datas['ID']]))
+ {
+ $this->sections[$section_datas['ID']]['POSITION']=$this->registered_sections[$section_datas['ID']]['POSITION'];
+ }
+ else
+ {
+ $this->sections[$section_datas['ID']]['POSITION']=0;
+ }
+ return(true);
+ }
+ return(false);
+ }
+
+ public function remove($id)
+ {
+ // remove a section from the menu
+ unset($this->sections[$id]);
+ }
+
+ public function replace($section_datas)
+ {
+ // replace an existing section description by another one
+ if($this->section_is_valid($section_datas) and
+ isset($this->sections[$section_datas['ID']]) )
+ {
+ $this->sections[$section_datas['ID']]=$section_datas;
+ return(true);
+ }
+ return(false);
+ }
+
+ public function clear()
+ {
+ // clear all sections of the menu
+ $this->sections=array();
+ }
+
+ public function section($id)
+ {
+ //return a section structure or false if requested ID not exists
+ if(isset($this->sections[$id]))
+ {
+ return($this->sections[$id]);
+ }
+ return(false);
+ }
+
+ public function sections()
+ {
+ //return all sections
+ return($this->sections);
+ }
+
+ public function ids()
+ {
+ //return all section's ids
+ return(array_keys($this->sections));
+ }
+
+ public function count()
+ {
+ //return number of sections
+ return(count($this->sections));
+ }
+
+ public function register($id, $name, $position, $owner)
+ {
+ /*
+ register section for menu ; register a section allows to know sections list
+ even if menu is not made (ie: we are in admin interface)
+
+ register a section is not adding a section : it's just for making a list of
+ potential sections.
+ you can add in the menu a section who is not registered
+
+ $id : section id
+ $name : name of section
+ $position : position of section
+ $owner : owner of section (piwigo or plugin's name)
+ */
+ if(!isset($this->registered_sections[$id]))
+ {
+ if($position<1)
+ {
+ $position=1;
+ }
+ $this->registered_sections[$id]=array(
+ 'NAME' => $name,
+ 'POSITION'=>$position,
+ 'OWNER' => $owner
+ );
+ $this->register_position($id, $position);
+ //$this->save_registered(); ==> made with register_position
+ return(true);
+ }
+ return(false);
+ }
+
+ public function unregister($id)
+ {
+ // just unregister a section from menu
+ if(isset($this->registered_sections[$id]))
+ {
+ unset($this->registered_sections[$id]);
+ $this->registered_sections=$this->renum_position($this->registered_sections);
+ $this->save_registered();
+ return(true);
+ }
+ return(false);
+ }
+
+ public function register_position($id, $position)
+ {
+ // register a new position for section
+ // if a section already have the same position, all section are shifted
+
+ // sort registered sections by position
+ $this->sort_registered();
+ //preparing sections
+ $incpos=false;
+ foreach($this->registered_sections as $key => $val)
+ {
+ if(($val['POSITION']==$position)and($key!=$id))
+ {
+ $incpos=true;
+ }
+ if(($incpos)and($key!=$id))
+ {
+ $this->registered_sections[$key]['POSITION']++;
+ }
+ }
+ //affect new position
+ $this->registered_sections[$id]['POSITION']=$position;
+ //sort
+ $this->sort_registered();
+ //renum positions
+ $this->registered_sections=$this->renum_position($this->registered_sections);
+ $this->save_registered();
+ }
+
+ public function registered()
+ {
+ // return list of registered sections
+ return($this->registered_sections);
+ }
+
+ public function apply()
+ {
+ //apply datas on the template
+ global $template;
+
+ $template->set_filenames(
+ array('menubar' => MENU_TEMPLATES_PATH.'menubar_main.tpl')
+ );
+
+ trigger_action('loc_begin_menubar');
+ $this->sort();
+ $template->assign('sections', $this->sections);
+ trigger_action('loc_end_menubar');
+
+ $template->assign_var_from_handle('MENUBAR', 'menubar');
+ }
+
+ /*
+ protected functions
+ */
+ protected function section_is_valid($section_datas)
+ {
+ if(is_array($section_datas) and
+ isset($section_datas['ID']) and
+ isset($section_datas['NAME']) and
+ isset($section_datas['TEMPLATE']) and
+ isset($section_datas['ITEMS']) and
+ isset($section_datas['TAG']))
+ {
+ return(true);
+ }
+ return(false);
+ }
+
+ protected function load_registered()
+ {
+ //load registered sections : database or file ??
+ $this->registered_sections=array();
+
+ $filename=MENU_REGISTERED_PATH.$this->registered_file;
+
+ if(file_exists($filename))
+ {
+ $fhandle=fopen($filename, "r");
+ if($fhandle)
+ {
+ $datas=fread($fhandle, filesize($filename));
+ fclose($fhandle);
+ $this->registered_sections=unserialize($datas);
+ return(true);
+ }
+ }
+ return(false);
+ }
+
+ protected function save_registered()
+ {
+ //save registered sections : database or file ??
+ $filename=MENU_REGISTERED_PATH.$this->registered_file;
+
+ $fhandle=fopen($filename, "w");
+ if($fhandle)
+ {
+ $written=fwrite($fhandle, serialize($this->registered_sections));
+ fclose($fhandle);
+ return($written);
+ }
+ return(false);
+ }
+
+
+ protected function sort()
+ {
+ $tmp=$this->sections;
+ uksort($tmp, array(&$this, 'sort_sections_cmpfct'));
+ $this->sections=$tmp;
+ }
+
+ protected function sort_registered()
+ {
+ $tmp=$this->registered_sections;
+ uksort($tmp, array(&$this, 'sort_registered_cmpfct'));
+ $this->registered_sections=$tmp;
+ }
+
+
+ private function sort_sections_cmpfct($a, $b)
+ {
+ if($this->sections[$a]['POSITION']==$this->sections[$b]['POSITION'])
+ {
+ return(($this->sections[$a]['ID']<$this->sections[$b]['ID'])?-1:1);
+ }
+ return(($this->sections[$a]['POSITION']<$this->sections[$b]['POSITION'])?-1:1);
+ }
+
+ private function sort_registered_cmpfct($a, $b)
+ {
+ return(($this->registered_sections[$a]['POSITION']<$this->registered_sections[$b]['POSITION'])?-1:1);
+ }
+
+ private function renum_position($datas)
+ {
+ $i=1;
+ foreach($datas as $key => $val)
+ {
+ $datas[$key]['POSITION']=$i;
+ $i+=1;
+ }
+ return($datas);
+ }
+
+
+
+
+} // class Menu
+
+
+
+
+
+class Section
+{
+ protected $name;
+ protected $template="generic.tpl";
+ protected $id;
+ protected $tag;
+ protected $items=array();
+
+ public function Section($id, $name, $template="", $tag="")
+ {
+ $this->id = $id;
+ $this->tag = $tag;
+ $this->set_name($name);
+ if(!$this->set_template($template))
+ {
+ $this->template=MENU_TEMPLATES_PATH."generic.tpl";
+ }
+
+ } // constructor
+
+ /*
+ public functions
+ */
+ public function get()
+ {
+ //this method returns a data structure ready to be used with the Menu class
+ return(
+ array(
+ 'ID' => $this->id,
+ 'NAME' => $this->name,
+ 'TEMPLATE' => $this->template,
+ 'ITEMS' => $this->items,
+ 'TAG' => $this->tag
+ )
+ );
+ }
+
+ public function get_id()
+ {
+ return($this->id);
+ }
+
+ public function get_name()
+ {
+ return($this->name);
+ }
+
+ public function get_template()
+ {
+ return($this->template);
+ }
+
+ public function get_tag()
+ {
+ return($this->tag);
+ }
+
+ public function get_items()
+ {
+ return($this->items);
+ }
+
+ public function set_name($value)
+ {
+ $this->name=$value;
+ }
+
+ public function set_template($value)
+ {
+ if($this->is_template($value))
+ {
+ $this->template=$value;
+ return(true);
+ }
+ return(false);
+ }
+
+ public function set_tag($value)
+ {
+ $this->tag=$value;
+ }
+
+ public function set_items($value)
+ {
+ $this->items=$value;
+ }
+
+ public function items_count()
+ {
+ if(is_array($this->items))
+ {
+ return(count($this->items));
+ }
+ else
+ {
+ return(-1);
+ }
+ }
+
+ /*
+ protected functions
+ */
+ protected function is_template($templatename)
+ {
+ if(file_exists($templatename) and (preg_match('/.+\.tpl$/i',$templatename)))
+ {
+ return(true);
+ }
+ return(false);
+ } // is_template
+
+} //class Section
+
+
+
+
+?> \ No newline at end of file