Come utilizzare l'hook di salvataggio per salvare un valore di campo come titolo del nodo?


8

Ho un campo data personalizzato in un tipo di nodo 'giorno'. Quando il nodo viene salvato (o modificato, quindi salvato), vorrei ottenere il valore field_date (non la data pubblicata) e salvarlo nel campo del titolo.

Vorrei sapere come, magari usando un modulo per:

hook_presave

  • OTTIENI IL VALORE DEL CAMPO

  • IMPOSTARE IL TITOLO COME VALORE DEL CAMPO

  • SALVA NODO


Novità di Drupal 8: API Campo entità passare a 4:20 se lo si desidera.
No Sssweat,

Risposte:


16

Devi implementare 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;
  }
}

1
Perché caricare il nodo quando viene passato nel gancio come $entityoggetto?
Jamie Hollern,

2
Inoltre, chiamare $ entity-> save () in un hook di presave provoca una ricorsione infinita. Questa non è una risposta corretta.
Jamie Hollern,

1
@JamieHollern Hai ragione, il codice ha avuto problemi, ora modifico con la risposta corretta. Grazie per il tuo commento.
Adrian Cid Almaguer,

3

Per entità di tipo utente

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

3

Per entità di tipo profilo ho usato sotto il codice

/**
 * 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;
 }
}

0

Questo ha funzionato per me per ottenere e impostare il valore del campo data utilizzando l'hook di Presave in base al tipo di contenuto

/**
 * Implements 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('Y-m-d\TH:i:s', $published));
 }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.