Građa na strani poslužitelja
Plug-in prima HTTP zahtjeve za specifične izbornike od klijenta i odgovara s feedom izbornika u JSON formatu. Odgovor je označen kao tip sadržaja application/JSON.
?uri=menu:<specific menu name>&navID=<navigation node OID or custom unique name>
[&windowID=<portlet window control ID on the page> ]
gdje:- navID
- Ovaj parametar je ili ObjectID u serijaliziranom formatu niza ili prilagođeno jednoznačno ime navigacijskog čvora portala (stranice portala), a prikazuje se kad se zahtijeva izbornik. Ovaj parametar navodi kontekst za dobavljača punjenja izbornika radi upotrebe prilikom izgradnje izbornika, tako da znamo koju temu treba koristiti, jer je tema vezana za stranicu izričito ili nasljedstvom.
- windowID
- Ovaj parametar je optimizirani i serijalizirani ObjectID u formatu niza za kontrolu prozora portleta na stranici koja je specificirana s navID. Taj parametar je potreban samo za izbornike koji sadrže akcije na razini portleta, drugim riječima, skin menus. Ovaj parametar mora biti serijalizirani ObjectID. Prilagođeni jedinstveni naziv ne radi za ID prozora portleta.
- pageAction
- skinAction
- moreActions
Ove datoteke postoje u WebDAV, pod menuDefinitions direktorijem unutar korijena teme. Korijen je postavljen u meta podacima teme pod nazivom ulaza meta podataka com.ibm.portal.theme.template.ref. Ostale datoteke u tom direktoriju su JSON sintaksa, ali ih ne koristi građa JSON izbornika

Sintaksa datoteke definicija JSON izbornika
Za više informacija o samom JSON, pogledajte JSON početnu stranicu.
[
// optional one-line comment
{
JSON object 1 (first menu item)
},
/*
optional multi-line comment
*/
{
JSON object 2 (second menu item)
},
...
]
U ovu datoteku možete dodati komentare koristeći proširenje JSON sintakse specifično za portal.
Konačni objekt u matrici nema zarez između svojih vitičastih zagrada i zatvorene zagrade matrice.
Poredak objekata u matrici unutar datoteke definicija izbornika određuje poredak stavaka na izborniku na klijentu.
Svaki objekt unutar matrice je pojedinačna definicija stavke izbornika ili je referenca na optimizacijski modul teme koji sadrži dodatni markup datoteke definicija JSON izbornika. Ovaj priloženi JSON je uključen unutar iako je u samoj datoteci izbornika.
Svaki objekt se sastoji od višestrukih zarezom odijeljenih JSON članova, gdje svaki od njih ima ime i vrijednost, odvojene dvotočkom. Ime člana je uvijek niz u navodnicima. Vrijednosti mogu biti nizovi znakova, booleovi, ugniježđeni objekti ili matrice, ovisno o imenu člana. Neka imena članova mogu imati samo određene vrijednosti, kako je definirano u sljedećoj listi.
Sljedeći nazivi i vrijednosti stavki izbornika su prihvatljivi za unos tipa.
- "type" : "Header"
- Definira oznaku za naredne unose u izborniku. Tipično se prikazuje na UI klijenta kao istaknuto i spojeno, iako to je kontrolirano stilom primijenjenim na stavke izbornika. Na zaglavlje
u izborniku se obično ne može kliknuti.
Može se dodati više unosa naslova, unutar vrijednosti titles, za druge jezike.
Član itemClass se može dodati za kontrolu izgleda zaglavlja.
{ "type" : "Header", "titles" : [{"lang":"en","value":"<English text>"}, {"lang":"de", "value" : "German text"},...] } - "type" : "Separator"
Definira odjelitelj između stavki izbornika. Separator se može pokazati kao prazno mjesto, red ili drukčije, zavisno o stilu koji je primijenjen na izbornik.
Separator obično ne treba nikakve druge članove, iako se može dodati itemClass radi kontrole izgleda.
{ "type" : "Separator", }- "type" : "DynamicMenuitem"
Na ovo se možda može kliknuti i možda postoji akcija, a stavka DynamicMenuitem ima id član čija vrijednost je ime plug-ina. Dobavljač punjenja izbornika koristi taj ID za dohvat instance imenovane operacije, u koju se zatim radi upit za informacije potrebne za izgradnju sadržaja punjenja izbornika za tu menuitem. Postoji nekoliko gotovih plug-inova u WebSphere Portal i mogu se koristiti u default definicijama izbornika, a one se mogu koristiti u prilagođenim izbornicima i temama.
Ovaj plug-in sadrži vlastiti indikator toga da li je aktivan, uključujući dozvole za kontrolu pristupa za trenutnog korisnika, i sadrži vlastiti lokalizirani naslov i opis te actionHttpMethod vrijednost za dobavljača punjenja izbornika za upotrebu kod izgradnje izbornika za tu stavku. OperationURI za ovaj plug-in operacije postaje actionUrl u odgovarajućem ulazu izbornika. Drugi članovi objekta također su dozvoljeni, uključujući actionFn, actionHttpMethod, visibilityFn, itemClass i meta podatke. Član markupID se može dodati za kreiranje ID-a na html oznaci za rezultirajuću stavku izbornika.
Ako isActive() metoda vrati false kad ju pozove kod dobavljača punjenja izbornika, stavka izbornika je prisutna u punjenju izbornika, ali ima dodan booleov član "visibility" : false u feed. Ovaj booleov član označava kodu sa strane klijenta da se ova operacija ne bi trebala prikazati korisniku te da kod sa strane klijenta ne uključuje tu stavku u konačno prikazani izbornik.
Opcijski se može navesti i moduleArgs član. Taj član je niz imena i vrijednosti u formatu parametra odijeljenih ampersandima (&). Ako postoje, ovi argumenti se predaju plug-inu tamo gdje dobavljač punjenja pristupa plug-inu radi izgradnje trenutnog unosa stavke izbornika.
{ "type" : "DynamicMenuitem", "id" : "operations.framework.plugin.name" }- "type" : "StaticMenuitem"
Na ovo se možda može kliknuti i možda će imati akciju. Ova stavka se obično koristi za umetanje stavke izbornika koja ima implementaciju za strane klijenta, umjesto sa strane poslužitelja.
Dozvoljava autoru datoteke definicija punjenja izbornika da potpuno specificira proizvoljni unos stavke izbornika. Sve potrebne informacije se moraju navesti u datoteci definicije izbornika, zato što nema odgovarajuće operacije za StaticMenuitem. Parametar id je opcijski i davatelj feeda izbornika ga zanemaruje zbog StaticMenuitem, iako nije označen ako greška sintakse ako takva postoji.
Ostali opcijski članovi mogu se dodati prema potrebi.
{ "type" : "StaticMenuitem", "titles" : [{"lang" : "en", "value" : "My English menu item text"}, {"lang" : "de", "value" : "Mein menu item text auf Deutsch"}, ... ], "descriptions" : [{"lang" : "en", "value" : "My English menu item longer description flowing beautiful prose"}, {"lang" : "de", "value" : "Mein menu item longer description flowing beautiful prose auf Deutsch"}, ... ], "actionUrl" : "http://www.yourco.com/wps/myportal/some_useful_url", "actionHttpMethod" : "POST", "actionFn" : "client_method_to_override_actionUrl", "metadata" : { "navID" : "${navID}", "some_name" : "some_value", "some_other_name" : "${SubVar_From_Request_Query_Parms}" } "markupId" : "my.item.markupId" }- "type" : "ModuleRef"
Datoteka definicije izbornika ima id član čija vrijednost je ime plug-ina. Taj plug-in mora imati doprinos tipa izbornika i poddoprinos tipa JSON. Dobavljač punjenja izbornika koristi vrijednost id člana u tom JSON objektu za dohvat reference na JSON poddoprinos unutar doprinosa izbornika za taj modul. Ovaj JSON poddoprinos mora biti važeći, samostalni markup definicije JSON izbornika, uključujući otvorene i zatvorene zagrade koje zatvaraju matricu. Dobavljač punjenja izbornika će maknuti otvorenu i zatvorenu zagradu i umetnuti markup doprinosa u odgovor punjenja izbornika kao da je bio uključen u glavnu datoteku definicija.
Pokazuje s imenom na plug-in koji sadrži dodatni markup sintakse datoteke definicija JSON formata i izbornika, koji dobavljač punjenja stavlja u punjenje izbornika, a to zamjenjuje ModuleRef unos.
Opcijski, može se dodati član moduleArgs. Ako je prisutan, vrijednost moduleArgs člana se predaje kao argumenti za dohvat markupa datoteke definicija JSON izbornika iz plug-ina.
{ "type" : "ModuleRef", "id" : "Theme Optimization Framework module name" }- "type" : "Submenu"
Definira znak rezerviranog mjesta u trenutnom izborniku gdje se pripaja nova podrazina izbornika. Ta stavka omogućuje izbornike s više slojeva. Ne postoji forsirana granica na razinu ugnježđivanja. Podizbornik dohvaća nezavisni, dodatni zahtjev izbornika dobavljaču punjenja JSON izbornika, kad se prelazi preko unos podizbornika u prikazanom izborniku.
Izbornik se pridodaje na jednu stranu, već prema tome kako diktira položaj ekrana. Podizbornik se dohvaća u odvojenom sljedećem zahtjevu od strane klijenta.
Podizbornik imenuje izbor sadržaja izbornika s članom id ili moduleId, a mora imati član titles za navođenje teksta za stavku znaka rezerviranog mjesta, a neobvezno može imati i član descriptions.
Jedina razlika između ova dva člana je kako se obrađuje sljedeći zahtjev, kada se podizbornik proširi i kod klijenta dohvati feed proširenog izbornika u novom HTTP zahtjevu:- Za id, sljedeći zahtjev se tretira kao imenovanje datoteke definicija izbornika, gdje je id ime datoteke, a ekstenzija je .json.
- Za moduleId, sljedeći zahtjev se tretira
kao imenovanje plug-ina koji sadrži potreban JSON markup. Ovom
zahtjevu se pristupa kao da ga je navela datoteka definicije izbornika.
{ "type" : "ModuleRef", "id" : "moduleId_value" }
Član moduleArgs se također može dodati. Ako je prisutan moduleRef član unutar SubMenu unosa, vrijednost moduleArgs člana se pridodaje URL-u koji se izgrađuje kao ID stavke izbornika. Ova vrijednost se koristi kao referenca izbornika od klijenta za dohvat markupa izbornika za kaskadni podizbornik.
{ "type" : "SubMenu", "id" : "name_of_submenu_definition_JSON_file", "titles" : [{"lang" : "en", "value" : "My English sub-menu item text"}, {"lang" : "de", "value" : "Mein sub-menu item text auf Deutsch"}, ... ], "descriptions" : [{"lang" : "en", "value" : "My English sub-menu item longer description flowing beautiful prose"}, {"lang" : "de", "value" : "Mein sub-menu item longer description flowing beautiful prose auf Deutsch"}, ... ] } or { "type" : "SubMenu", "moduleId" : "name_of_theme_opt_framework_module_which_contributes_submenu_definition_JSON_", ... }
Važeći članovi datoteke definicija JSON izbornika
| Ime člana | Vrijednost i primjer za syntax | Komentari |
|---|---|---|
| tip | "Header", "Separator", "DynamicMenuitem", "StaticMenuitem", "ModuleRef", Submenu" | Određuje tip stavke izbornika koju kreira ovaj objekt datoteke definicija izbornika |
| id | Niz znakova | Za DynamicMenuitem ili ModuleRef, id član je obvezan. Za Submenu, obvezno je id ili moduleId.
|
| titles | Matrica objekata, od kojih svaki ima ove članove: "lang" definira jezik za unos naslova, a "value" sadrži niz za taj jezik i za naslov. "titles" : [ {"lang":"en", "value":"Title in English"}, {"lang":"de", "value":"Title auf Deutsch"}, ... ] |
Obvezno za zaglavlje, StaticMenuitem i unose podizbornika. Navedena lista jezika pokriva samo potrebne jezike koje mogu trebati korisnici portala. Može se također koristiti za DynamicMenuitem. DynamicMenuitem dohvaća naslov za odgovarajući plug-in. Plug-in je potreban za implementiranje lokaliziranog sučelja i za navođenje lokaliziranih nizova za odgovarajuće jezike. Možete pregaziti naslove i opisa pomoću odgovarajućih elemenata u JSON. Međutim, nadjačavanje se odnosi na sve jezike. Ne možete izabrati određeni jezik za nadjačavanje. Odjelitelj nema pridružen tekst. ModuleRef se zamjenjuje s drugim markupom. |
| descriptions | Isto kao naslovi. "descriptions" : [ {"lang":"en", "value":"Title in English"}, {"lang":"de", "value":"Title auf Deutsch"}, ... ] | Opcijski za sve tipove. Ako je prisutan, ovaj član interpretira default klijentski kod kao tekst pomoći kad se prelazi preko stavke izbornika. |
| itemClass | Niz znakova | Opcijski za sve tipove. Ovaj član je ime klase stila koja je primijenjena na stavku izbornika. Ako postoji, to je ime klase koja je prisutna u listi stila pridruženoj temi za izbornik. |
| enabled | Booleovo true ili false | Opcijski za sve tipove. Default je true. Ovaj član označava da li će se na strani klijenta moći kliknuti na stavku izbornika. True je jednako aktivno, false je jednako nije aktivno. |
| enableFn | Niz znakova | Opcijski za sve tipove. Ako postoji, ovaj član je ime
JavaScript™ funkcije
koju treba izvesti na klijentu radi određivanja da li je ta stavka izbornika aktivna.
Dovršeni JSON objekt izbornika feeda za ovu stavku izbornika se predaje kao argument za funkciju. Rezultat poziva ove funkcije nadjačava postavku "enabled". |
| actionUrl | Niz znakova | Za StaticMenuitem, mora postojati actionUrl ili actionFn. Ako je actionUrl prisutan, to može biti
apsolutni ili relativni URL ili niz znakova upita koji se pridodaje URL-u ili
vrijednosti oznake trenutnog zahtjeva. Nije potrebno za
DynamicMenuitem. Nije korisno za bilo koji drugi tip. Pozivanje actionFn ima prednost pred actionUrl ako je oboje prisutno. |
| actionHttpMethod | Niz znakova, s normalnim HTTP vrijednostima, "GET", "POST", "PUT", "DELETE" i drugim vrijednostima. | Default je "GET". Opcijski za sve tipove objekta. Ako postoji na DynamicMenuitem, to nadjačava svaku akciju koju daje plug-in građe operacija. |
| actionFn | Niz znakova | Za StaticMenuitem, mora postojati actionUrl ili actionFn. Ako actionFn postoji, taj član je ime JavaScript funkcije koju treba izvesti na klijentu kad se klikne na stavku izbornika. Dovršeni JSON objekt izbornika feeda za ovu stavku izbornika se predaje kao argument za funkciju. Pozivanje actionFn ima prednost pred actionUrl ako je oboje prisutno. |
| visibilityFn | Niz znakova | Opcijski za sve tipove, ali nije korisno za Separator ili ModuleRef. Za DynamicMenuitem ili StaticMenuitem, ako visibilityFn postoji, taj član je ime JavaScript funkcije za izvođenje na klijentu radi određivanja da li je stavka izbornika aktivna. Dovršeni JSON objekt izbornika feeda za ovu stavku izbornika se predaje kao argument za funkciju. |
| metadata | Za verziju 8.0.0.1: Umetnuti objekt, gdje članovi mogu
biti vrijednosti niza, Booleove vrijednosti, numeričke vrijednosti ili drugi
ugniježđeni objekti. Nema forsiranog ograničenja razine ugnježđivanja.
Postoje samo 2 ograničenja na meta podacima:
Prije verzije 8.0.0.1, meta podaci su bili ograničeni samo na String tipove bez umetnutog ugnježđivanja. |
Opcijski za sve tipove. Ako postoji, članovi moraju voditi računa o ograničenjima navedenim za odgovarajuću verziju. Ako postoje zamjenske varijable u bilo kojoj vrijednosti niza znakova unutar objekta meta podataka, na bilo kojoj razini ugnježđivanja, u obliku ${variableName}, onda se te vrijednosti zamjenjuju u parametrima upita u primljenom zahtjevu izbornika (...&variableName=value...). U nizu znakova meta podataka može postojati više zamjenskih varijabli, ali se kroz niz predaje samo jednom. Sve pronađene zamjenske varijable za koje ne postoje zamjene u parametrima upita iz zahtjeva, ostaju nepromijenjene u meta podacima koji se predaju klijentima kao dio odgovora JSON feeda. Na primjer:
|
| moduleId | Niz znakova | Opcijski za Submenu, ali je primjenjivo samo za Submenu. Ako postoji umjesto ID-a u Submenu unosu, ovaj član je ime modula kao id od ModuleRef kojem klijent pristupa u posebnom, izravnom zahtjevu ako korisnik proširi stavku podizbornika. Format stavke izbornika koju ovo izgrađuje je {"type":"Submenu", "id" : "moduleRef:", ... }. Klijentski kod radi zahtjev za poslužitelj koristeći taj ID, a taj zahtjev je varijacija normalnog zahtjeva izbornika: ?uri=menu:moduleRef:". Kod dobavljača punjenja rukuje ovim zahtjevom pozivajući imenovani modul kao da je postojala datoteka definicija punjenja izbornika koja sadrži ModuleRef s tim ID-om. |
| moduleArgs | Niz znakova,
u formatu skupa parametara upita HTTP zahtjeva, ali bez vodećeg ampersanda (dobavljač punjenja izbornika će dodati ispred ampersand). Ako postoje višestruki parametri upita, trebalo bi umetnuti ampersand između svakog parametra nakon prvog. Primjer:
|
Opcijski za Submenu, ali je primjenjivo samo za Submenu. Ako je prisutan zajedno s moduleId, tada URI kojeg će izgraditi dobavljač punjenja izbornika za unos podizbornika izgleda kao {"type" : "Submenu", "id" : "moduleRef:moduleId_value&moduleArgs_value", ... }. Ako postoji s ID-om u podizborniku, URI izgleda kao i u prethodnom primjeru, ali bez prefiksa moduleRef: za ID i za argumente. |
| markupId | Proizvoljni niz, koristi se za kreiranje ID-a u html oznaci koja definira stavku izbornika. | Opcijski. Korisno je samo za DynamicMenuItem i StaticMenuItem unose izbornika. Zamjena varijabli je podržana za ovu stavku, tako da se ${windowID} može koristiti za pravljenje jednoznačnih instanci ID-a za svaki portlet kod prikaza. |
Pisanje datoteke definicija izbornika za modularizirane teme
Možete napisati novu datoteku definicija izbornika za novu temu koristeći dobavljača punjenja na strani poslužitelja i JavaScript na strani klijenta. Ako se gotovi primjer teme kopira i promijeni u novu, prilagođenu temu, mogu se koristiti iste JSON datoteke izbornika ili se mogu promijeniti ako je potrebno. Ako se neke nove funkcije sa strane klijenta referenciraju iz stavaka izbornika, tada se te nove JavaScript funkcije moraju kreirati i referencirati.
Dobavljač punjenja JSON izbornika traži datoteke definicija JSON izbornika u menuDefinitions direktoriju u korijenu teme u WebDAV.
Koristite postojeće datoteke definicija izbornika kao uzorke i koristite alate kao što su jsonlint za prethodnu provjeru JSON sintakse.
JSON sintaksa je ograničavajuća za datoteke definicija izbornika, osim što su dozvoljeni komentari.
Kad radite debug, koristite niz praćenja com.ibm.wps.jsonmenu.*=all na poslužitelju.
Dinamički prošireni i dinamički sagrađeni izbornici
Počevši od WebSphere Portal 8.0.0.1, stavke izbornika se mogu dodavati dinamički u datoteku definicija izbornika. Ta funkcija se može koristiti za proširenje postojeće datoteke "static" definicija izbornika, kao što su datoteke koje postoje u primjeru teme unutar menuDefinitions foldera u WebDAV. Također se može koristiti za dinamičku izgradnju izbornika bez da datoteka statičkog izbornika uopće postoji.
Ponovno to pozovite u URI-ju zahtjeva za izbornik, s parametrom upita koji počinje s "?uri=menu:menu name". To ime izbornika građa izbornika tretira kao ime datoteke, a datoteka se traži u "base location" radi resursa za tu temu, kako je navedeno u svojstvu meta podataka teme com.ibm.portal.theme.template.ref. Unutar definicije izbornika, unos "type":"ModuleRef" može referencirati modul optimizacije teme koji sadrži menu doprinos i unutar toga JSON poddoprinos. Taj JSON poddoprinos ima URL koji pokazuje na stvarni JSON kod. JSON dohvaćen iz URL-a tog poddoprinosa se zamjenjuje u punjenju izbornika na mjestu "type":"ModuleRef" unosa iz datoteke.
Počevši od WebSphere Portal 8.0.0.1, ovaj JSON poddoprinos se također može označiti s ref-id kvalifikatorom. Vrijednost tog kvalifikatora je String. Na kraju obrade datoteke definicija izbornika, građa izbornika dodaje još jedan korak. On pretražuje sve JSON poddoprinose koji se nalaze u modulima teme iz profila za trenutnu stranicu, a stranica se navodi s navID parametrom na zahtjevu za izbornik. Ako bilo koja od ref-id oznaka iz tih poddoprinosa odgovara zahtijevanom imenu izbornika koji se obrađuje, tada se JSON kod za te poddoprinose dinamički dodaje na kraj punjenja izbornika, isto tako kao da je postojao "type":"ModuleRef" unos koji je specifično pokazivao na taj modul.
Ova građa izbornika omogućuje dinamičko proširivanje sadržaja izbornika s novim stavkama, kreiranjem novih modula teme ili bar novih poddoprinosa te ažuriranjem profila umjesto ažuriranja datoteka definicija izbornika.
Za više informacija o izgradnji modula optimizacije teme koji uključuju JSON poddoprinose, pogledajte Dodavanje stavke izbornika s modulom.
Kontrola životnog vijeka predmemorije za JSON feed izbornika
Na WebSphere Portal verziji 8.0.0.1 i kasnijim, građa JSON izbornika prihvaća jedno ili više WP ConfigService svojstava u obliku "jsonmenu.cache.time.<menu name>" gdje je vrijednost vrijeme predmemorije u sekundama. Ova vrijednost mora biti veća od ili jednaka 0. Vrijednost 0 označava da se izbornik neće predmemorirati.
Vrijednosti <menu name> iz ovih WP ConfigService postavki se uspoređuju s vrijednosti iz "?uri=menu:<menu name>" parametra upita na dolaznom zahtjevu za izbornik. Usporedba imena izbornika iz WP ConfigService s primljenim zahtjevom za izbornik je osjetljiva na veličinu slova.