Puncte:1

Add a hero image and text when a node goes from unpublished to published

drapel es

I'm trying to add a hero image and text when a node goes from unpublished to published. The things include:

  1. Add an image from my media library to a media field on the node
  2. Add a page title to the node, drawing upon a field already saved on the node

I'm attempting to build a hook on hook_node_update() but it's not working. I'm not sure why.

The code I am using, part of the running_event_adding_header.module file, is the following.

namespace Drupal\Core\Field\EntityReferenceFieldItemList;
namespace Drupal\node\Entity;


/**
 * Implements hook_node_update()
 */
 
function running_event_adding_header_node_update(Drupal\Core\Entity\EntityInterface $entity) {
  // End function if the entity is not an event
  if ($entity->bundle() !== 'event') {
    return;
  }
  
  // End function if the event is not a running type of event (running events are '30' in my system)
  if ($entity->bundle() === 'event' && $entity->get('field_event_type')->getString() != '30') {
      return;
  }

  // Check if the new state is "published" and the old state was something other than "published".

  if ($entity->get('moderation_state')->getString() === 'published') {

    /**
    * Add hero image and text to running event page, if not already present
    * The hero image field is 'field_hero_image'
    * The hero text field is 'field_tagline'
    */

    if ($entity->get('field_hero_image')->isEmpty()) {
      $media = Media::load(53); // 53 is the media ID for the image I'm wanting to load on all running pages: .../media/53/edit
      $entity->set('field_hero_image', $media);
    }

    //'field_tagline' is the hero title field
    if ($entity->get('field_tagline')->isEmpty()) {
      $entity->set('field_tagline', $entity->label());
    }
    $entity->save();  
  }
}//close function

Updated code (29 July).

Per @sonfd's recommendation, this uses hook_node_presave(), but is still not changing the node pages:

<?php

namespace Drupal\Core\Field\EntityReferenceFieldItemList;
namespace Drupal\node\Entity;

//In the function below, I'm attempting to update
//'event' type nodes, specifically those with an event_type of '30'

//In those nodes, I'm attempting to use a Media library image 
//and use the page's title in the hero section


function running_event_add_default_node_presave(Drupal\node\NodeInterface $entity) {
  if ($entity->bundle() === 'event' && $entity->get('field_event_type')->toString()=== '30') {
    if ($entity->get('field_hero_tagline')->isEmpty()) {
      $entity->set('field_hero_tagline', $entity->label());
    }
    if ($entity->get('field_hero_image')->isEmpty()) {
      $media = Media::load(53); 
      $entity->set('field_hero_image', $media);
    }
  }



}

sonfd avatar
drapel in
1. Ștergeți acele spații de nume - nu ar trebui să fie acolo. 2. Care este numele mașinii modulului dvs. și unde se află cârligul de presalvare în modulul dvs. 3. Ce ar trebui să facă `$entity->get('field_event_type')->toString() === '30'`? Nu cred că face ceea ce vrei tu. Field_event_type este o referință la entitate și 30 este id-ul entității cu care verificați?
scaffolding avatar
drapel es
1. Au plecat! 2. Numele mașinii modulului și directorul acestuia sunt `running_event_add_default_content`. Cârligul de presare se află în fișierul modulului, care este salvat în directorul modulului. Codul din fișierul modulului este lipit mai sus. 3. Ai dreptate, acea linie este menită să se uite la câmpul „field_event_type” al tipului de eveniment, apoi să transforme acea valoare într-un șir. Tipul de eveniment este o modalitate prin care putem reutiliza șablonul de eveniment pentru diferite tipuri de evenimente. Evenimentele de rulare sunt egale cu o valoare „30”.
sonfd avatar
drapel in
Cârligul tău este numit incorect.Ar trebui să fie `running_event_add_default_content_node_presave`, adică `NAME_OF_MODULE_node_presave`
scaffolding avatar
drapel es
Scuze, am scris greșit; sunt denumite corect în codul meu. Am eliminat ` if ($entity->bundle() === 'event' && $entity->get('field_event_type')->toString()=== '30') {` și, din păcate, este același rezultat - noua imagine și textul eroului nu sunt adăugate.
sonfd avatar
drapel in
Codul pe care îl afișați ar trebui să funcționeze. Sunteți sigur că câmpurile sunt goale și modulul dvs. este activat?
scaffolding avatar
drapel es
Mulțumesc - cred că are legătură cu modul în care mă refer la câmpuri? În prezent, primesc această eroare când încerc să salvez un nod de eveniment: `Drupal\Core\Entity\EntityStorageException: Câmpul field_hero_tagline este necunoscut. în Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (linia 846 din core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php). `
scaffolding avatar
drapel es
Să [continuăm această discuție în chat](https://chat.stackexchange.com/rooms/128041/discussion-between-scaffolding-and-sonfd).
Puncte:2
drapel in

Nu poți folosi hook_ENTITY_TYPE_update() pentru a actualiza datele entității. Acest lucru este notat în documentele hook:

Acest cârlig rulează odată ce stocarea entității a fost actualizată. Rețineți că implementările de cârlig nu pot modifica datele entității stocate. Obțineți obiectul entitate originală de la $entity->original.

Dacă trebuie să actualizați datele entității, utilizați hook_ENTITY_TYPE_presave() in schimb. Rețineți că cu hook_ENTITY_TYPE_presave() nu trebuie sa suni $entity->salvare(), trebuie doar să setați valorile entității și să lăsați entitatea să salveze singură.

scaffolding avatar
drapel es
Mulțumesc @sonfd! Am încercat acest lucru, dar încă nu văd actualizarea nodului de eveniment după publicare. Codul pe care l-am folosit este: getType() == 'event') { //update the fundraising target field, 'field_target' $entity->set("field_target", "109"); } } ```
scaffolding avatar
drapel es
În mod ideal, ceea ce ar trebui să se întâmple este: nodul este creat și salvat într-o stare nepublicată. Un editor revizuiește, apoi publică. Când publică, funcția ar trebui să adauge valori suplimentare. Nu pot face ca acea parte să funcționeze - chiar și exemplul mai simplu din comentariul meu de mai sus nu creează o valoare nouă la publicare.
sonfd avatar
drapel in
Puteți posta codul dvs. actualizat în întrebarea dvs.? De asemenea, se pare că aveți mai multe spații de nume definite, dar acestea ar trebui să fie instrucțiuni de utilizare? Ești sigur că codul tău se declanșează?
scaffolding avatar
drapel es
Mulțumesc @sonfd - codul actualizat este acum inclus în întrebarea mea.Codul pare să se declanșeze; dacă includ o greșeală de scriere în el, Drupal răspunde cu o eroare showstopping.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.