presaveフックを使用してフィールド値をノードタイトルとして保存する方法


8

ノードタイプ「日」にカスタム日付フィールドがあります。ノードを保存(または編集してから保存)するときに、field_date値(公開された日付ではない)を取得して、titleフィールドに保存します。

方法を知りたいのですが、おそらくモジュールを使用して:

hook_presave

  • フィールド値を取得

  • タイトルをフィールド値として設定

  • ノードを保存


Drupal 8の新機能:エンティティフィールドAPIは、必要に応じて4:20にスキップします。
Sssweatなし2016年

回答:


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オブジェクトとしてフックに渡されるときにノードをロードするのはなぜですか?
Jamie Hollern 2017年

2
また、事前保存フックで$ entity-> save()を呼び出すと、無限再帰が発生します。これは正解ではありません。
Jamie Hollern 2017年

1
@JamieHollernそうですね、コードに問題がありました。今は正しい答えで編集しています。ご意見ありがとうございます。
エイドリアンCid Almaguer

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
}

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

0

これは、コンテンツタイプに基づくpresaveフックを使用して日付フィールド値を取得および設定するのに役立ちました/ ** * 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)); }}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.