ノードのタイトルにノードのNIDを埋め込むにはどうすればよいですか?


8

Automatic Nodetitlesモジュールが存在することは知っていますが、これはDrupal 7専用です。

[送信]をクリックしたときにタイトルにNIDを自動的に割り当てる方法はありますか?NIDは、送信ボタンが押されるまで存在しないことを知っています。タイトルにNIDを埋め込むにはどうすればよいですか?

どのフックを使用しますか?


D8のAuto EntityLabelを試しましたか?開発ブランチが存在します。ルールも試しましたか?
ケビン

@Kevin残念ながら、ルール8はMIAです。
Sssweatなし16

回答:


5

次の2つの手順を実行する必要があります。

ステップ1:タイトルと非表示フォームを自動生成します。コードでhook_field_widget_form_alter()を使用する

function MY_MODULE_field_widget_form_alter(&$element, \Drupal\Core\Form\FormStateInterface $form_state, $context) {
  $field_definition = $context['items']->getFieldDefinition();
  $bundle = $form_state->getFormObject()->getEntity()->bundle();
  // You can check with other bundle
  if ($field_definition->getName() == 'title' && $bundle == 'page' && $element['value']['#default_value'] == '') {
    $element['#required'] = FALSE;
    //hidden title  
    $element['#type'] = 'hidden';
    $element['value']['#required'] = FALSE;
    // Set default value
    $element['value']['#default_value'] = 'Default Title';
  }
}

ステップ1では、フォームを相互送信できます。

ステップ2:新しいタイトルをデフォルト値で上書きします。hook_node_insert()を使用します

function MY_MODULE_node_insert(Drupal\node\NodeInterface $node) {
  if ($node->bundle() == 'page') {
    $new_title = 'New title ' . $node->id();
    $node->setTitle($new_title);
    $node->setNewRevision(FALSE);
    $node->save();  
  }
}

2
保存後にのみ使用できる唯一の情報であるnidがある場合、これは正しい方法です。日付などの何かはpresaveフックから可能であり、2回再保存する必要がないので高速です。これが本当に必要な場合は、タイトルがデフォルトでないことを確認するチェックも追加する必要があります。
Berdir

1

フックポストアクションモジュールを使用できます。

したがって、このモジュールでは、この制限を克服するためにいくつかの新しいDrupalフックを導入します

  • hook_entity_postsave
  • hook_entity_postinsert
  • hook_entity_postupdate
  • hook_entity_postdelete
  • hook_node_postsave
  • hook_node_postinsert
  • hook_node_postupdate
  • hook_node_postdelete

あなたがそれをインストールしているものはhook_node_postsave()フックを使うことができます

自動Nodetitlesのモジュールのページは言います:

よりよく維持された代替が利用可能であることに注意してくださいhttps : //www.drupal.org/project/auto_entitylabel


0

これは古い問題かもしれませんが、これが私の見解です。ノード追加記事にこれが必要だとしましょう。

<?php

use Drupal\Core\Form\FormStateInterface;
use Drupal\node\NodeInterface;

function MYMODULE_form_node_article_form_alter(&$form, FormStateInterface $form_state, $form_id) {

    // Hide title field to avoid confusion
    $form['title']['#access'] = FALSE;
    // Set a temporary title because it's always required on node save.
    $form['title']['widget'][0]['value']['#default_value'] = 'Dummy title';

}

function MYMODULE_node_insert(NodeInterface $node) {
  if ($node->bundle() == 'article') {
    $new_title = 'Title ' . $node->id();
    $node->setTitle($new_title);
    $node->setNewRevision(FALSE);
    $node->save();
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.