web-dev-qa-db-ja.com

プログラムで新しいノードのタイトルを作成する方法は?

Agendaコンテンツタイプの新しい各ノードのタイトルフィールドが、同じノードの日付フィールドから自動的に構築されるようにします。

hook_form_FORM_ID_alter()#default_value配列に#value$formをさまざまに設定しようとしましたが、効果はありませんでした。

どうすればこれを達成できますか?

4
iainH

エンティティビルダーコールバックでこれを行う方法を次に示します。

_<?php

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

//Implements hook_form_FORM_ID_alter()
function agenda_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {

    $form['title']['#access'] = FALSE;
    $form['#entity_builders'][] = 'agenda_node_builder';

}

function agenda_node_builder($entity_type, NodeInterface $node, $form, FormStateInterface $form_state)
{

    $date_of_meeting = $node->field_date_of_meeting->date->format('Y-m-d');
    $node->setTitle('Agenda for meeting on '.$date_of_meeting);

}    
_

メモ:

  1. コールバックは_hook_form_FORM_ID_alter_ではなくhook_form_BASE_FORM_ID_alter()で設定する必要があることがわかりました。この場合、コールバックは呼び出されませんでした。
    これの最後に到達しませんでしたが、変更フックが次の順序で呼び出されるという事実とおそらく関係があります:hook_form_alter()hook_form_BASE_FORM_ID_alter()hook_form_FORM_ID_alter()

  2. Nodes _#entity_builders_フォームが最終的に送信されるときに保存される前に、Nodeエンティティオブジェクトを変更用に提供します。

ポインタを提供してくれた@Berdirに感謝します。

8
iainH

または、おそらく hook_entity_presave() または hook_node_presave() を使用して、そこでフィールドの値を変更できます。

4
balagan

これを行う別の方法は、次のコードを使用することです。

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

/**
 * Implements hook_form_FORM_ID_alter().
 */
function MODULE_form_node_CONTENT_TYPE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  //Hide the title
  $form['title']['#access'] = FALSE;
}

/**
 * Implements hook_ENTITY_TYPE_create
 */
function MODULE_node_create(NodeInterface $node) {
  switch ($node->getType()) {
    case 'YOUR_CONTENT_TYPE':
      //Change the title
      $node->title = 'TEXT ' . $node->field_YOUR_FIELD->date->format('d-m-Y');
      break;
  }
}
3

Automatic Nodetitles および Token モジュールを使用してこれを実現できます。

Automatic Nodetitles モジュールにはDrupal 8バージョンがまだないことを知っていますが、 Port Automatic Nodetitles to Drupal 8 、あなたは実用的な解決策を見つけることができます。

3

自動エンティティラベル モジュールは適切なソリューションであり、D8ポートを備えています(現時点ではDEVバージョンのみ)。

1
Jonathan