Как использовать предварительную ловушку, чтобы сохранить значение поля в качестве заголовка узла?

8

У меня есть пользовательское поле даты в типе узла «день». Когда узел сохранен (или отредактирован, а затем сохранен), я хотел бы получить значение field_date (а не дату публикации) и сохранить его в поле заголовка.

Я хотел бы знать, как, возможно, с помощью модуля для:

hook_presave

  • ПОЛУЧИТЕ ПОЛЕВОЕ ЗНАЧЕНИЕ

  • УСТАНОВИТЬ НАЗВАНИЕ КАК ЗНАЧЕНИЕ ПОЛЯ

  • СОХРАНИТЬ УЗЕЛ

Кевин Хаубрук
источник
Что нового в Drupal 8: API Entity Field перейдите к 4:20, если хотите.
Нет Sssweat

Ответы:

16

Вам нужно реализовать 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
Зачем вам загружать узел, когда он передается в хук как $entityобъект?
Джейми Холлерн
2
Кроме того, вызов $ entity-> save () в предварительно сохраненном хуке вызывает бесконечную рекурсию. Это не правильный ответ.
Джейми Холлерн
1
@JamieHollern Вы правы, у кода были проблемы, теперь я редактирую с правильным ответом. Спасибо за ваш комментарий.
Адриан Сид
3

Для сущности типа user

/**
 * Implements hook_entity_presave().
 */
function YOUR_MODULE_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  $entity->field_uhid->value = 'testing';     //set value for field
}
nehapandya
источник
3

Для сущности типа профиля я использовал код ниже

/**
 * 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
источник
0

Это сработало для меня, чтобы получить и установить значение поля даты, используя предварительную ловушку в зависимости от типа контента

/**
 * 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));
 }
}
Сантош
источник