Herschrijven van inhoud: een overzicht

Inleiding

Hoe kan je, aan de hand van inhoud van velden, automatisch een nieuwe veldwaarde aanmaken? Ik heb een overzicht gemaakt van een aantal mogelijkheden. Het herschrijven van inhoud wordt veel gebruikt. Zo kan je aan de hand van een quotering (vb 6/10) een passende afbeelding laten verschijnen. Een alternatief voor star rating module zeg maar.. En iedereen heeft bij views reeds het herschrijven gebruikt om een meer beknopte weergave te verkrijgen, desnoods met opmaak.

Case

We werken in deze studie een case uit waarbij we coördinaten (breedte- en lengtegraad) herschrijven om een link te leggen naar een OpenStreetMap (kortweg OSM). De link ziet er zo uit: https://www.openstreetmap.org/#map=12/51.20880/3.22552 De 12 is de zoomfactor, gevolgd door de breedte- en lengtegraad. Voor alle duidelijkheid.. het gaat hier over een link. We gaan geen iframes gebruiken met een kaartvoorstelling. Gebruik de Leaflet module als je een kaart wilt... Als je ook een marker erbij wilt, dan word de link: https://www.openstreetmap.org/?mlat=51.20880&mlon=3.22552#map=12/51.2088/3.2255 De coördinaten worden hier nog eens herhaald voor de marker. (Zo kan je desnoods een marker doen afwijken van het midden van de kaart...). Men kan trouwens ook met adressen werken in plaats van coördinaten. Dan wordt de schrijfwijze: https://www.openstreetmap.org/search?query=Brugge markt. 

Een print van de kaart... We kiezen de markt van Brugge...

Mogelijkheden

We bespreken achtereenvolgens...

  1. Token filter
  2. Token filter in paragrafen
  3. Token filter met PHP
  4. Computed field
  5. Viewfield
  6. EVA
  7. PHP field
  8. Node referentie
  9. Feeds
  10. Twigs

1) Token Filter

We hebben de volgende velden aangemaakt... Het derde veld is een gewoon tekstveld met opmaak.

Na het activeren van de module moet je bij de tekstformaten (vb Volledige HTML)  aangeven dat je Tokens wil gebruiken..


Zet ook deze instelling van de tokens als eerste bewerking.


Tenslotte.. Als er geen coördinaten werden ingevuld dan willen we geen gebruik maken van de tokens. Dit zou fouten veroorzaken. De tokens worden dan niet omgezet, maar als tekst aanzien.


 

Nu maken we een tekstveld aan waar we deze tokens gaan gebruiken. Gebruik in dit tekstveld het correct ingestelde formaat (vb Volledige HTML)

Deze html, typisch voor een link, heb ik in de broncode aangebracht. Merk de tokens op. Welke tokens je moet gebruiken, vindt je bij de helpfunctie van je Drupal. Je kunt ook een knop invoegen in je editor, die bij de token filter module hoort. 

Vergeet niet om dit ook in de standaardwaarde van je tekstveld te plaatsen, voor nieuwe inhoud. Zo. Klaar. De coördinaten gaan na een link genereren, die ons de OSM kaart oplevert.

Er is echter één probleem... wat als er geen coördinaten werden ingevuld. We hebben de tokens dan wel afgezet, maar de link wordt toch nog aangemaakt en we belanden ergens in het midden van de Atlantische Oceaan...

Hoe lossen we dit op zonder programmeren? Wel er bestaat een module die de velden toont afhankelijk van de waarden van andere velden (Field Formatter Condition). https://www.drupal.org/project/fico  Voor Drupal 9 is het behelpen met een patch. Drupal 8 vormt geen probleem. Ik stel echter volgende oplossing voor..

2) Token filter in een paragraaf

Als er geen coördinaten zijn, is er ook geen paragraaf... en dus nooit onnodige output. Logisch hé. Maak een paragraaftype aan met de nodige velden en koppel die met je inhoudstype.

De werkwijze is dus volledig analoog aan bovenstaande, maar de tokens zijn anders, aangezien ze nu vanuit een paragraaf komen.

3) Token filter met PHP

Als je geen paragrafen of Field Formatter Condition, wilt gebruiken en je wilt toch controleren of er inhoud aanwezig is om te herschrijven naar de link, dan rest je nog enkel PHP. Je hebt daarvoor de PHP filter module nodig. Ik raad je aan om zelf een tekstformaat aan te maken vb PHP Script. (Dit heeft te maken met een bugje in de module.) 

Schakel de twee nodige instellingen in. Zo kunnen we nu ook tokens gebruiken in PHP.


Zet zeker deze volgorde in. Eerst moet het token vervangen worden vooraleer de php kan uitgevoerd worden, natuurlijk. Ook de Replace empty values is van belang. Als er geen token is, zal dit vervangen worden door een lege waarde. 


De php bevat een begin en eind <?php  en ?>. Daarna controleren we of er gegevens zijn ingevuld. != staat voor niet gelijk aan in PHP. Het herschrijven gebeurt dus enkel als er in houd werd ingevuld.

4) Computed Field

De tool om in een node inhoud te herschrijven is natuurlijk computed fields. Het is er speciaal voor gemaakt. Maak een veld aan in je inhoudstype. Ik kies voor tekst lang.

De code gelijkt als twee druppels water aan de vorige code. Logisch. Computed fields hebben ingebouwde php. Merk op dat er nu geen tokens worden gebruikt. Via entity worden de veldwaarden opgehaald. !empty staat trouwens voor 'niet leeg'... Een uitroepingsteken in php staat voor 'not'. Er staat ook t("kaart") in plaat van gewoon "kaart". Drupal heeft een ingebouwde vertalingsmogelijkheid als tekst met die t wordt voorafgegaan. De t staat voor translatable... = vertaalbaar. Je kunt dus bij je vertalingsinterface 'kaart' vanaf dan vertalen... Anders heb je deze mogelijkheid niet.


Computed fields komen niet voor in het inhoudstype bij het inputformulier. Je moet dus werken met de standaardwaarde van het veld. Standaardwaarden hebben de onhebbelijkheid om pas actief te worden na opslaan van de node. Als je dus je code uittest, moet je telkens de node opnieuw opslaan...

5) Viewfield

Herschrijven kan je natuurlijk ook met views. 

Er is een bij de velden een tab waarmee je de inhoud kunt herschrijven. Je kunt hierbij gebruik maken van de tokens. Makkelijk om onze link mee te schrijven.

Ik maak steeds gebruik van een nieuw veld om te herschrijven. Aangepaste tekst. Dit maakt het overzichtelijker. De velden die worden gebruikt zet je dan verborgen.

Het herschrijven is makkelijk.

Om geen link te bekomen als er geen coördinaten zijn, gebruiken we een views filter.

Er is nog wel één probleem... We zien alle links van elke node in het inhoudstype. Daarom zetten we een contextuele filter.

Nu moeten we natuurlijk nog deze view koppelen aan een inhoudstype. Dit kunnen we met 2 modules: Viewfield en EVA. Hier behandelen we de eerste optie.

Zet, als je nog geen inhoud hebt, de standaardwaarde in. Als je reeds nodes hebt en pas achteraf ga je een view gebruiken om te herschrijven, neem je beter EVA (zie vervolg)



De view filtert op de ID van de node. Omdat dit de standaard waarde is, hoef je niets verder in te vullen. Viewfield kan meerdere argumenten aan. Daarom is deze module soms beter geschikt dan EVA. Daar is deze instelling moeilijker.


Je kunt je ook afvragen of deze procedure de snelheid van je site vertraagt. Eerst een view oproepen, die daarna filteren... Het antwoord is ongetwijfeld 'JA', zeker ten opzichte van Computed fields. Aangezien we echter een contextuele filter hebben die slechts één node oproept is deze vertraging minimaal. Ik heb sites draaien met meer dan 30 000 nodes en meerdere van deze views. Daar is de vertraging ongeveer één seconde.

6) EVA (Entity Views Attachement)

Bovenstaande view kan ook gekoppeld worden met EVA. De view blijft dezelfde, enkel de koppeling met het inhoudstype is anders.

De koppeling:


Je krijgt bij de weergave van je inhoudstype, het veld te zien.
 

EVA heeft het voordeel dat het onmiddellijk zichtbaar is. Bestaande inhoud kan dus makkelijk aangepast worden. Bij een viewfield is dit moelijker.

7) PHP veld

Deze methode maakt gebruik van de PHP module.

We zien hoe de node wordt geladen en hoe de waarden worden ingelezen en herschreven. Een alternatief voor computed field.

 

8) Node referentie

Deze methode is perfect als de keuzemogelijkheid beperkt is. Stel dat je een bedrijf hebt met verschillende leveringsplaatsen en je wilt aanduiden voor welke plaats een pakket bestemd is?

Dan maak je eerst een inhoudstype aan met bvb een linkveld.

Je maakt de verschillende nodes aan.


En zet ze klaar als referentie in je inhoudstype. Een beetje werk op voorhand, maar je maakt dan ook geen fouten meer bij de input van de coördinaten.


Deze methode gebruik ik veel om getallen om te zetten naar afbeeldingen. vb voor een ranking van 6/10 kan je hiermee een overeenkomstige afbeelding vertonen. Bij deze methode moet je eigenlijk zelf de inhoud herschrijven op voorhand. Het spreekt voor zich dat enkel kan voor een beperkt aantal mogelijkheden. 

 

Bij de weergave van je inhoudstype kies je voor het referentieveld een weergavemodus vb teaser. Je zet enkel het linkveld actief. Referentievelden geven standaard ook altijd de titel van de referentienode. Dit kan je oplossen door een module zoals Exclude Node Title te gebruiken.

9) Feeds

Misschien verrassend, maar je kunt het herschrijven ook aan Excel of Calc overlaten. Je weet dat je makkelijk de kolommen kunt herschrijven in deze rekenbladen. Maak er dan een csv van om te importeren of zet het bestand op de server. Je zou er van verbaasd staan hoeveel grote websites er bestandsgewijs worden beheerd. Stocklijsten bijvoorbeeld zorgen voor de nodes in een grote webshop. Denk niet dat er daar iemand de nodes zit aan te passen. Met deze werkwijze kan je ook tegelijkertijd de coördinaten ingeven, zonder fouten te typen. Feeds kan zo ingesteld worden dat nodes worden verwijderd als ze niet meer in de lijst voorkomen. Anderen worden geupdate of nieuw aangemaakt. Je kunt ook instellen hoeveel keer Feeds zich per dag moet vernieuwen. 

Zet bij het Feedstype, de verwijzingen naar je bestand.

Importeer.


Herhaal dit zoveel keer je wilt... Zo beheer je dus een grote site... Door een bestand op de server te zetten... Herschrijven van inhoud is hier een kwestie van een kolommetje instellen... Dit is ook de snelste manier. Op het ogenblik dat de inhoud wordt opgeroepen staat alles reeds klaar.

r

10) Twigs

Twigs vormen een brug tussen PHP en HTML. Deze tool is ingebouwd in Drupal en laat toe om inhoud te herschrijven, desnoods met berekeningen en voorwaarden. Het is zo interessant dat ik er een aparte bespreking voor gemaakt heb: https://drupal.vlaanderen/algemene-bespreking/twigs-gebruiken-een-view

Slotbedenking

Welke methode je best gebruikt hangt dus af van het doel dat je voor ogen hebt en hoe goed je thuis bent in de materie...Ik hoop dat er toch een methode tussen zit die bruikbaar is...