Xmenu
Inhaltsverzeichnis
Das Menu dient dazu, Kommandos mit einem Mausklick statt mit der Eingabe des Kommandonamens aufzurufen.
Kategorien
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.
Um einen neuen Menupunkt anzulegen, wird auf den Button Eintrag hinzufügen geklickt.
Menupunkte
Was Name, Status und Sort anbelangt, so gilt dasselbe wie bei Kategorien.
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
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
#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.
~ $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.)
#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.
#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.
#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.