Comment utiliser le crochet préenregistré pour enregistrer une valeur de champ comme titre de nœud?

8

J'ai un champ de date personnalisé dans un type de noeud «jour». Lorsque le nœud est enregistré (ou édité puis enregistré), je voudrais obtenir la valeur field_date (pas la date de publication) et l'enregistrer dans le champ titre.

Je voudrais savoir comment, peut-être en utilisant un module pour:

hook_presave

  • OBTENEZ UNE VALEUR SUR LE TERRAIN

  • DÉFINIR LE TITRE COMME VALEUR DE TERRAIN

  • ENREGISTRER LE NOEUD

Kevin howbrook
la source
Quoi de neuf dans Drupal 8: l'API Entity Field passe à 4:20 si vous le souhaitez.
Pas de Sssweat

Réponses:

16

Vous devez implémenter le hook_entity_presave ()

/**
 * Implements hook_entity_presave().
 */
function YOUR_MODULE_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  switch ($entity->bundle()) {
    // Here you modify only your day content type
    case 'day':
      // Setting the title with the value of field_date.
      $entity->setTitle($entity->get('field_date')->value);
     break;
  }
}
Adrian Cid Almaguer
la source
1
Pourquoi voudriez-vous charger le nœud lorsqu'il est passé dans le crochet en tant $entityqu'objet?
Jamie Hollern
2
De plus, l'appel de $ entity-> save () dans un hook de pré-enregistrement provoque une récursion infinie. Ce n'est pas une bonne réponse.
Jamie Hollern
1
@JamieHollern Vous avez raison, le code a eu des problèmes, maintenant je modifie avec la bonne réponse. Merci pour votre commentaire.
Adrian Cid Almaguer
3

Pour l'entité de type utilisateur

/**
 * Implements hook_entity_presave().
 */
function YOUR_MODULE_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  $entity->field_uhid->value = 'testing';     //set value for field
}
nehapandya
la source
3

Pour l'entité de type profil que j'ai utilisée sous le code

/**
 * Implements hook_entity_presave().
 */
function YOUR_MODULE_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityType()->id() == 'profile') {
    $zipcode = $entity->field_zip_code->value;
    $url = "http://maps.googleapis.com/maps/api/geocode/json?address=".$zipcode."&sensor=false";
    $details=file_get_contents($url);
    $result = json_decode($details,true);
    $lat=$result['results'][0]['geometry']['location']['lat'];
    $lng=$result['results'][0]['geometry']['location']['lng'];
    $entity->field_geolocation->lat = $lat;
    $entity->field_geolocation->lng = $lng;
 }
}
nehapandya
la source
0

Cela a fonctionné pour moi pour obtenir et définir la valeur du champ de date à l'aide du crochet de préenregistrement basé sur le type de contenu / ** * Implémente hook_entity_presave (). * /

function YOUR_MODULE_global_entity_presave (Drupal \ Core \ Entity \ EntityInterface $ entity) {if ($ entity-> bundle () == 'blog') {$ published = $ entity-> get ('created') -> value; $ entity-> set ('field_published_date', date ('Ymd \ TH: i: s', $ published)); }}

santhosh
la source