Computed fields in combinatie met paragraphs

Moeilijkheid

Met computed fields kan je berekeningen maken met velden...

Zo kan een inhoudstype 'verkoopsproduct', velden bevatten met het aantal aangekochte en het aantal verkochte items. Het is een makkie om daar dan de huidige stock voor te berekenen door deze 2 velden van elkaar af te trekken.

In deze gevorderde bijdrage gaan we echter een stap verder... Wat als de aantallen in een paragraafveld zitten?

In de paragraaf houden we bij op welke datum er een hoeveelheid producten werden toegevoegd. 

In het inhoudstype van het product refereren we naar deze paragraaf en maken we een computed field aan van het type integer, dat het totaal aantal aangekochte producten ooit moet bijhouden.


Zo zie je dat er hier 2 X werd aangekocht. Eerst 500  en dan nog eens 150 stuks van een bepaald product.

Als we nu het product bekijken dan zien we ook het totaal van alle aankopen.

Dit doen we aan de hand van een computed field met de volgende code. Ik heb commentaar gezet bij elke stap in de code. Omdat paragrafen, referentievelden zijn, moet je eerst hun paragraaf id gaan zoeken, pas daarna kan deze velden gebruiken om te rekenen.

//veld in het inhoudstype dat verwijst naar de paragraaf (machinenaam)
   $veld_van_paragraaf="field_stockinput";
// veld in de paragraaf dat het getal bevat dat moet worden opgeteld (machinenaam)
   $getalveld="field_aantal";

$totaal=0;

// Verzamel de gegevens in het paragraafveld. We de id's nodig van deze paragrafen om in de paragraaf naar het veld met de aantallen te kunnen gaan.
if ($paragraph_field_items = $entity->$veld_van_paragraaf->getValue()) {
    $paragraph_storage = \Drupal::entityTypeManager()->getStorage('paragraph');
// Verzamel de id's van paragrafen van deze node en laad ze in
  $ids = array_column($paragraph_field_items, 'target_id');
  $paragraphs_objects = $paragraph_storage->loadMultiple($ids);
// Doorloop nu de lus van deze paragrafen 
  foreach ($paragraphs_objects as $paragraph) {
    $aantal= $paragraph->$getalveld->value;
    $totaal=$totaal+$aantal;
  }
}
// tenslotte.. een computed field moet via de $value worden toegekend.

$value =$totaal;

De output van je computed field ziet er zo uit. Je moet de cache uit zetten, anders berekent hij nieuwe waarden niet onmiddellijk.

Het spreekt voor zich dat je nu op analoge manier ook de verkoopscijfers in rekening kunt brengen om tot een effectieve stock te komen.

Als je een computed field toevoegt nadat er reeds nodes werden aangemaakt, dan moet elke node opnieuw worden opgeslagen. De module 'Resave Nodes' lijkt op het eerste gezicht de oplossing, maar dit triggert het computed field blijkbaar niet. Ook Views bulk Operations met resave werkt niet. Je kunt het oplossen door Views Entity Form Field te gebruiken en het computed field als formfield in te stellen.