De DDM-modules in Liferay uitbreiden met aangepaste veldtypes is niet zo eenvoudig. Deze blogpost is het resultaat van onze pogingen om het te doen. Het eerste deel geeft een overzicht van wat DDM eigenlijk betekent en waar je het gebruikt. Daarna laten we een voorbeeld zien van een flexibel custom DDM veldtype dat we hebben gemaakt. Tot slot geeft het laatste deel van deze blog je wat aanwijzingen over hoe je zelf aangepaste DDM veldtypes kunt maken.
DDM staat voor Dynamic Data Mapping, een set modules die verschillende typen velden definieert die worden gebruikt om samen te stellen:
Liferay wordt gebundeld met een steeds groter wordende set out-of-the-box DDM veldtypes. Op dit moment (Liferay 7.1 is net uitgebracht) zijn de volgende veldtypen beschikbaar:
|
Veldtype |
Veld uiterlijk |
Beschikbaar voor gebruik in |
||
|
WCM structuren |
Gegevens definities |
Metagegevenssets |
||
|
Booleaans |
Selectievakje-veld |
X |
X |
X |
| Kleur | Kleurkiezer | X | X | X |
| Datum | Datumkiezer | X | X | X |
| Decimaal | Invoerveld dat valideert dat de invoer een decimaal is | X | X | X |
| Documenten en media | Documenten en media selector | X | X | X |
| Geolocatie | Markering op een kaart | X | X | X |
| HTML | Rijk tekstveld (AlloyEditor) | X | X | X |
| Afbeelding | Knop om lokale afbeelding te uploaden of afbeelding te selecteren uit Documenten en Media | X | ||
| Geheel getal | Invoerveld dat valideert dat de invoer een geheel getal is | X | X | X |
| Link naar pagina | Selector voor een openbare of privépagina binnen de huidige site | X | X | X |
| Getal | Invoerveld dat valideert of de invoer een decimaal getal of een geheel getal is | X | X | X |
| Radio | Lijst met keuzerondjes met vooraf geconfigureerde opties | X | X | X |
| Selecteer | Drop-downveld (enkele selectie) of lijstboxveld (meervoudige selectie) met vooraf geconfigureerde opties | X | X | X |
| Scheidingsteken | Horizontale lijn | X | ||
| Tekst | Tekstveld met één regel | X | X | X |
| Tekstvak | Multiregel tekstveld | X | X | X |
| Webinhoud | Web content artikelselector | X | X | X |
Voor basisbehoeften op het gebied van contentbeheer is de standaardset DDM-veldtypen meestal voldoende. Er zijn echter zeker use cases waarbij je aangepaste veldtypes moet maken:
In dit artikel zullen we onderzoeken hoe u dergelijke aangepaste velden kunt maken. Als voorbeeld nemen we de eerste use case en proberen we een veldtype te maken dat de respons van een REST endpoint als mogelijke waarden van een vervolgkeuzelijst neemt.
Met het standaard Select-veld in Liferay kunnen auteurs van inhoud een waarde kiezen uit een vooraf gedefinieerde lijst met mogelijke waarden voor een artikel. Dit is prima voor eenvoudige doeleinden, maar wat als je deze vervolgkeuzelijst dynamisch wilt vullen met waarden van een extern platform? Of als de waarden in de lijst afhankelijk zijn van de gebruiker die erom vraagt?
Maak kennis met het gloednieuwe REST Select-veld. Met dit dropdown-veld kun je een REST-eindpunt configurerenen de JSON-velden in het antwoordtoewijzen aan de labels en waarden van de mogelijke opties.
Voer de volgende handelingen uit om de module te installeren in je Liferay installatie:
Naast de standaardattributen zoals "Field Label" en "Required", zijn er 3 extra attributen die je moet configureren. Het eerste attribuut moet je vullen met de URL van een REST endpoint. Dit moet een eindpunt zijn dat een lijst met JSON-objecten retourneert. Bijvoorbeeld het eindpunt http://localhost:8080/api/jsonws/country/get-countries (een ingebouwd eindpunt in Liferay) retourneert de volgende output:
Met de twee resterende attributen configureer je wat er respectievelijk in het label en de waarde van de HTML <option>-elementen moet komen. Als je in dit geval bijvoorbeeld het JSON-attribuut "nameCurrentValue" kiest voor het label van de optie en het JSON-attribuut "a3" voor de waarde van de optie, dan levert dat de volgende HTML op:
Als je een nieuw webcontentartikel maakt op basis van de structuur die je zojuist hebt gemaakt, kun je een land selecteren uit de dynamisch geladen vervolgkeuzelijst!
In dit deel van de blog onderzoeken we hoe Liferay is uitgebreid om het nieuwe REST Select veld te ondersteunen. Hopelijk geeft dit je genoeg inzicht om aan de slag te gaan met je eigen custom DDM veldtype!
Het bleek een hele reis te zijn om nieuwe DDM velden te maken in Liferay, zelfs in 7.x. Je zou verwachten dat elk veldtype is gedefinieerd in zijn eigen OSGi module, maar de jammerlijke waarheid is dat de definitie en rendering van deze velden verspreid is over verschillende Liferay modules in zowel client-side als server-side code. Dus het resultaat is op zijn zachtst gezegd nogal lastig.
Overweeg deze oplossing alleen als het echt niet anders kan!!!
Met dat gezegd hebbende, ga door met het lezen van dit artikel.
Het startpunt is https://github.com/limburgie/com.liferay.dynamic.data.mapping.field.extender. Deze repository biedt een skeletproject dat kan worden uitgebreid om nieuwe DDM veldtypen te ondersteunen. Elk deel dat moet worden uitgebreid of geïmplementeerd is gemarkeerd met een //TODO commentaar. Je kunt een diff doen van deze hoofdtak met de 7.x/field/ddm-rest-select tak om de verschillende wijzigingen te zien om je eigen implementatie te maken.
-Dexternal-properties=portal-developer.properties met setenv.sh (Unix) of setenv.bat (Windows).Hoewel het een echte uitdaging was om een aangepast DDM veld te maken, IS het mogelijk. Als je genoeg flexibiliteit in je veld injecteert, kan het zelfs meerdere doelen dienen. Stuur me je feedback over hoe jij het anders zou doen of welke veldtypes je op dit moment mist in Liferay 7.x.
Bedankt voor het lezen!