Xmenu

Aus bafbal.de
Zur Navigation springen Zur Suche springen

xmenu - Das Menü[Bearbeiten]

Das Menu dient dazu, Kommandos mit einem Mausklick statt mit der Eingabe des Kommandonamens aufzurufen.

Kategorien[Bearbeiten]

Um die Menupunkte zu gliedern, gibt es die Kategorien. Kategorien sind im Menu (das ja eine Baumansicht ist) Baumknoten, die geöffnet und geschlossen werden können. Es werden die aktive Kategorien angezeigt. Die Kategorien werden entsprechend dem Wert der Spalte Sort sortiert.

Der Name einer Kategorie kann auch eine Funktion beinhalten. Üblicherweise ist das die Funktion $T(), um den Menutitel zu übersetzen.

Eine Kategorie

Um einen neuen Menupunkt anzulegen, wird auf den Button Eintrag hinzufügen geklickt.

Menupunkte[Bearbeiten]

Was Name, Status und Sort anbelangt, so gilt dasselbe wie bei Kategorien.

Ein Menupunkt

In der Zeile Command wird das Kommando genannt (gegebenenfalls inklusive Parameter), das beim Mausklick auf den Menupunkt ausgeführt werden soll. Das Feld Menu Category ID ist beschreibbar - damit können Menupunkte in eine andere Kategorie verschoben werden.

Jeder Menupunkt muss den Gruppen zugeordnet werden, denen er angezeigt werden soll. Er wird dann allen expliziten und impliziten Gruppenmitgliedern angezeigt.

Hinweis: Wird in der User-Liste links unten ein anderer User ausgewählt, so wird das Menu entsprechend dessen Usergruppen neu aufgebaut. Dies ist auch der Weg, mit der Administratoren nach einer Änderung ihres Menus dies aktualisieren: Mit einer Mausklick auf den Button U wird der Login-User eingestellt, dadurch wird das Menu neu aufgebaut.

Tabellen[Bearbeiten]

create table menu_category(
  menu_category_id varchar(40) not null primary key,
  name varchar(40) not null, 
  csort int,
  status int,
  datechg date,
  usrchg varchar(40),
  progchg varchar(40)
);
create table menu_item(
  menu_item_id varchar(40) not null primary key,
  menu_category_id varchar(40) not null,
  name varchar(40) not null, 
  command varchar(40) not null, 
  csort number(2),
  status int,
  datechg date,
  usrchg varchar(40),
  progchg varchar(40)
);
create table menu_item2group(
  menu_item2group_id varchar(40) not null primary key,
  menu_item_id varchar(40) not null,
  user_group_id varchar(40) not null, 
  status int,
  datechg date,
  usrchg varchar(40),
  progchg varchar(40)
);

Code[Bearbeiten]

xmenu[Bearbeiten]

#rights  n=frm   r_user=r  r_user.admin=w
#rights  n=admin   r_user.admin=w
#frm  y=treepage  c=xmenu   flt=xmenu_flt   w=400

#btn  y=save   s=#save  se=c
#btn  y=cancel   s=#cancel  se=cp
#btn  y=back   s=#treeback  se=b
#btn  y=backback   s=#treebackback  se=b
#btn  y=export   s=xmenu_eximport(ex)  se=b
#btn  y=import   s=xmenu_eximport(im)  se=b
#btn   c=$T(Refresh)   se=b   s=#filter   w=100

#filter

Das Kommando xmenu ist ohne Besonderheiten.

xmenu_add[Bearbeiten]

~ $ICP(0,cat)
#grd_add  i=grid     f_status=1

~ $ICP(0,item)
#tree_add  u=sel    t=menu_item   c=$T(new_menuitem)    c1=name   c2=command    s="#page_fill  d=xmenu_page_item"   si=Y

~ $ICP(0,group)
#grd_add  i=grid    

~~

Wird das Kommando xmenu_add mit dem Parameter cat aufgerufen, so wird eine neue Kategorie angelegt, mit dem Parameter group ist es eine neue Gruppenzuordnung eines Menupunktes. In beiden Fällen wird mit #grd_add dem Grid-Segment eine Zeile hinzugefügt. In beiden Fällen wird dabei auch gleich der Status auf den Wert 1 gesetzt - bei den Kategorien dadurch, dass in #grd_add der Parameter f_status=1 gesetzt wird, bei den Gruppen dadurch, dass in der Spaltendefinition #grd_col der Paramezer nv=1 ("NullValue") gesetzt wird. Beide Wege führen zum selben Ergebnis.

Neue Menüpunkte werden dagegen im Baum angelegt. Die Beschriftung des neuen Baumeintrags wird mit dem Parameter c gesetzt. Die Parameter c1 und c2 sind gesetzt, damit die Beschriftung des Baumeintrags sofort geändert wird, sobald diese Werte im Formular eingegeben werden. (Dazu ist auch noch erforderlich, dass der Parameter t gesetzt wird.)

xmenu_flt[Bearbeiten]

#tree_clear
#tree_add   u=root   c=$T(Categories)   s="#page_fill  d=xmenu_page_cats"

#sql select c.menu_category_id, c.name  as catname,    i.menu_item_id, i.name, i.command
#sql   from menu_category c
#sql     left outer join menu_item i on c.menu_category_id = i.menu_category_id
#sql   order by c.csort, c.menu_category_id, i.csort
#tree_node   u=root   t=menu_category    c1=catname   s="#page_fill   d=xmenu_page_cat"  nc=Y
#tree_node   u=last   t=menu_item    c1=name   c2=command     s="#page_fill  d=xmenu_page_item"   
#tree_fillsql  mex=3

Das Filter-Statement enthält nichts Ungewöhnliches. Die einzelnen Kategorien und deren Menupunkte werden in erwartbarer Hierarchie angezeigt, davor die Seite mit allen Kategorien. Mit mex=3 wird dafür gesorgt, dass die Baumeinträge gleich expandiert sind, wenn die Zahl der Kategorien drei nicht übersteigt.

xmenu_page_cat[Bearbeiten]

#page

#prim  as=Y  
#cat  as=Y     c=$T(Category)
#btns_seg  
#btns_btn  c=$T(Add_item)  w=150   cmd=xmenu_add(item)

#vl_seg  cc=2  clt=ss   w1=100  w2=300   wst2=300  n=vl   c=" "   b=H
#vl_line   c1="ID"   f2=menu_category_id   ro2=Y
#vl_line   c1="Name"   f2=name
#vl_line   c1="Sort"   f2=csort
#vl_line   c1="Status"   f2=status   y2=lookup   ld2=general_status
#sql select * from menu_category where menu_category_id = :kid
#vl_data   q=sql   t=menu_category   kid=$FND(s,menu_category_id)

Mit dem Kommando xmenu_page_cat werden in einem VL-Segment die Daten einer einzelnen Kategorie angezeigt. Im SQL-Statement wird auf deren ID gefiltert, der Wert für den Parameter wird mit $FND aus dem Baum geholt. Da auf dieser Seite keine neuen Kategorien angelegt werden, müssen dafür auch keine Vorkehrungen getroffen werden.

xmenu_page_cats[Bearbeiten]

#page

#prim  as=Y  
#cat  as=Y     c=$T(Categories)
#btns_seg  
#btns_btn  c=$T(Add_category)  w=150   cmd=xmenu_add(cat)

#grd_seg   frc=0   fcc=1   clt=ss   n=grid   c=" "   b=H
#grd_col   f=menu_category_id   c1="ID"   w=30   y=guid   ro=Y   nvi=$GUID()
#grd_col   f=name   c1="Name"   w=200   l=40
#grd_col   f=csort  c1=Sort   w=60   y=int   l=2   a=r   a1=l
#grd_col   f=status   c1="Status"   w=120   y=lookup   ld=general_status
#sql select * from menu_category   order by csort
#grd_data   q=sql   t=menu_category

Auf der Seite xmenu_page_cats werden die Kategorien gepflegt. Wird eine neue Kategorie angelegt, so wird ihr mit nvi=$GUID() eine ID verpasst, gleichzeitig wird der Datensatz als inserted gekennzeichnet.

xmenu_page_item[Bearbeiten]

#page

#prim  as=Y  
#cat  as=Y     c=$T(Menu_item)

#vl_seg  cc=2  clt=ss   w1=120  w2=300   wst2=300  n=vl   c=" "   b=H
#vl_line   c1="Menu Item ID"   f2=menu_item_id   ro2=Y   nvi2=$GUID()
#vl_line   c1="Menu Category ID"   f2=menu_category_id    nvi2=$FND(s,menu_category_id)
#vl_line   c1="Name"   f2=name   l2=40
#vl_line   c1="Command"   f2=command   l2=40
#vl_line   c1="Sort"   f2=csort   y2=int   l2=2
#vl_line   c1="Status"   f2=status   y2=lookup   ld2=general_status   nv2=1
#sql select * from menu_item where menu_item_id = :k_menu_item_id
#vl_data   q=sql   t=menu_item   k_menu_item_id=$FND(s,menu_item_id)

#prim  as=Y  
#cat  as=Y     c=$T(groups)
#btns_seg  
#btns_btn  c=$T(Add_group)  w=150   cmd=xmenu_add(group)

#grd_seg   frc=0   fcc=1   clt=ss   n=grid   c=" "   b=H
#grd_col   f=menu_item2group_id   c1="ID"   w=30   y=guid   ro=Y   nvi=$GUID()
#grd_col   f=menu_item_id   c1="Menu Item Id"   w=0    nvi=$PVAL(vl,1,0)
#grd_col   f=user_group_id   c1="User Group Id"   w=200   wst=200   y=lookup   ls=system_groups_all
#grd_col   f=status   c1="Status"   w=120     nv=1  y=lookup   ld=general_status 
#sql select * from menu_item2group  where menu_item_id = :kid
#grd_data   q=sql   t=menu_item2group   kid=$PVAL(vl,1,0)

Auf der Seite xmenu_page_item werden die Daten des Menüpunktes und die Gruppenzuordnungen gepflegt. Wenn ein neuer Menüpunkt angelegt wird, dann braucht er ID, Kategorie und Status, diese werden - wie üblich - mit nv-Paranetern ("Null Value") gesetzt. Für die ID wird dabei nvi verwendet (nvi2=$GUID()), damit der Datensatz als inserted gekennzeichnet wird. Bei den weiteren nv-Parametern ist das nicht nötig, aber auch nicht schädlich. Hier im Beipiel wurde bei der Kategorie auch nvi verwendet (nvi2=$FND(s,menu_category_id)), beim Status nicht (nv2=1), ohne dass dies an der Funktionalität etwas ändert.

Für die Gruppenzuordnungen gilt näherungsweise dasselbe, auch wenn wir hier ein Grid- statt einem VL-Segment haben und die Referenz nicht auf die Kategorie, sondern auf den Menueintrag geht. Erwähnenswert vielleicht noch, dass hier der ID des Menupunktes für den Parameter kid nicht aus dem Baum, sondern mit $PVAL() aus dem VL-Segment geholt wird. Auch an dieser Stelle gibt es zwei Möglichkeiten, da die neu erzeugte ID gleich in den Baum geschrieben wird und auch von dort bezogen werden könnte.