Xmenu: Unterschied zwischen den Versionen
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 22: | Zeile 22: | ||
Jeder Menupunkt muss den Gruppen zugeordnet werden, denen er angezeigt werden soll. Er wird dann allen expliziten und impliziten Gruppenmitgliedern angezeigt. | 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== | ||
+ | |||
+ | ===xmenu=== | ||
+ | |||
+ | #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=== | ||
+ | |||
+ | ~ $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=== | ||
+ | |||
+ | #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=== | ||
+ | |||
+ | #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=== | ||
+ | |||
+ | #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=== | ||
+ | |||
+ | #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. |
Aktuelle Version vom 21. Mai 2021, 10:07 Uhr
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.
#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.