Como usar o gancho de pré-gravação para salvar um valor de campo como título do nó?

8

Eu tenho um campo de data personalizado em um tipo de nó 'dia'. Quando o nó é salvo (ou editado e salvo), gostaria de obter o valor field_date (não a data de publicação) e salvá-lo no campo title.

Gostaria de saber como, talvez usando um módulo para:

hook_presave

  • GET VALOR DO CAMPO

  • DEFINIR TÍTULO COMO VALOR DO CAMPO

  • SALVAR NODE

Kevin howbrook
fonte
O que há de novo no Drupal 8: API do campo de entidade, pule para 4:20, se desejar.
Não Sssweat

Respostas:

16

Você precisa implementar o 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
fonte
11
Por que você carregaria o nó quando ele está sendo passado para o gancho como $entityobjeto?
precisa
2
Além disso, chamar $ entity-> save () em um gancho de pré-salvamento causa recursão infinita. Esta não é uma resposta correta.
precisa
11
@JamieHollern Você está certo, o código teve problemas, agora eu edito com a resposta correta. Obrigado por seu comentário.
Adrian Cid Almaguer
3

Para entidade do tipo usuário

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

Para entidade do tipo perfil, usei o código abaixo

/**
 * 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
fonte
0

Isso funcionou para eu obter e definir o valor do campo de data usando gancho de pré-gravação com base no tipo de conteúdo / ** * Implementa hook_entity_presave (). * /

função YOUR_MODULE_global_entity_presave (Drupal \ Core \ Entity \ EntityInterface $ entity) {if ($ entity-> bundle () == 'blog') {$ publish = $ entity-> get ('created') -> value; $ entity-> set ('data_published_do_campo', data ('Ymd \ TH: i: s', $ publicado)); }}

santhosh
fonte