Agendaコンテンツタイプの新しい各ノードのタイトルフィールドが、同じノードの日付フィールドから自動的に構築されるようにします。
hook_form_FORM_ID_alter()
の#default_value
配列に#value
と$form
をさまざまに設定しようとしましたが、効果はありませんでした。
どうすればこれを達成できますか?
エンティティビルダーコールバックでこれを行う方法を次に示します。
_<?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);
}
_
メモ:
コールバックは_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()
。
Node
s _#entity_builders
_フォームが最終的に送信されるときに保存される前に、Node
エンティティオブジェクトを変更用に提供します。
ポインタを提供してくれた@Berdirに感謝します。
または、おそらく hook_entity_presave() または hook_node_presave() を使用して、そこでフィールドの値を変更できます。
これを行う別の方法は、次のコードを使用することです。
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;
}
}
Automatic Nodetitles および Token モジュールを使用してこれを実現できます。
Automatic Nodetitles モジュールにはDrupal 8バージョンがまだないことを知っていますが、 Port Automatic Nodetitles to Drupal 8 、あなたは実用的な解決策を見つけることができます。
自動エンティティラベル モジュールは適切なソリューションであり、D8ポートを備えています(現時点ではDEVバージョンのみ)。