ノード編集フォームのタイトルフィールドを非表示または無効にするにはどうすればよいですか?
コンテンツタイプの[フォームの管理]表示タブ(admin/structure/types/manage/CONTENT_TYPE_MACHINE_NAME/form-display
)の場合、ログに整合性制約エラーが表示されます。
したがって、Node編集フォームにデフォルトのタイトルフィールドを表示したくありません。他のフィールドと同様にタイトルフィールドを通常非表示にすると、ノードの作成後に白い画面が表示されます。ログにタイトルフィールドが表示されると表示されます。 tはnull ...と続きます...
hook_form_alter() 関数を使用して、フォーム(ノード編集フォームを含む)を変更し、Titleフィールドを無効にすることができます。以下のサンプルコードを確認してください:
use Drupal\field_collection\Entity\FieldCollectionItem;
function [MODULE_NAME]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
switch ($form_id) {
case 'node_[CONTENT_TYPE]_edit_form':
$form['title']['#disabled'] = 'disabled';
break;
}
}
1つのフォームのみを変更する場合は、 hook_form_FORM_ID_alter() 関数を確認し、FORM_IDをnode_ [CONTENT_TYPE] _edit_formここで、CONTENT_TYPEはノードタイプフォームです。
ユーザーにタイトルフィールドを表示せずにノードのタイトルを自動的に設定するには、 自動エンティティラベル モジュールを使用できます。モジュールはD8の開発バージョンですが、適切に機能していれば試してみることができます。
自動エンティティラベル モジュールを使用したくない場合は、カスタムコードで同じことを試すことができます。サンプルコードを確認してください こちら
tl; dr:デフォルトのタイトルを指定し、ユーザーがそれを変更することを許可しません。
D7→D8 レコードの変更 状態:
node_type-> has_titleを削除して、エンティティフォームの表示を優先します
エンティティフォーム表示を使用してノードタイトルウィジェットの動作を構成できるようになったため、ノードのタイトルフォーム要素を非表示にする特別なフラグは不要になりました。
特定のノードタイプのタイトルを非表示にするには、「フォーム表示の管理」UIを使用するか、次のようなスニペットで非表示にします。
$form_display = entity_get_form_display('node', 'article', 'default'); $form_display->removeComponent('title'); $form_display->save();
それを読んだ後、私はいくつかの方法を試しました。最後の1つだけが機能するので、この回答は何を試すべきかしないの警告として機能するはずです。
独自のモジュールの場合は、core.entity_form_display.node.my_content_type.default.yml
を編集し、title
キーをcontent
から削除します。これはフィールドで機能しますが、タイトルや、プロモート、作成などの他のデフォルトの項目を削除しても、/node/add/my_content_type
のフォームに表示されます。
このコードをmy_module_install
に追加します。
$form_display = entity_get_form_display('node', 'my_content_type', 'default');
$form_display->removeComponent('title');
$form_display->save();
これは視覚的には機能しますが、このソリューションには3つの問題があります。-それでも、参照する整合性制約エラーが発生します。 -これは、データベースの設定がインストール時にファイルの設定を上書きする原因になります。これは、私見では悪い考えです。 -entity_get_form_display
は廃止されました
非表示にしますが、削除しないでください。 core.entity_form_display.node.my_content_type.default.yml
:
hidden:
title: false
試行錯誤の結果、ここでは論理が逆になることがわかりました。これも、参照する整合性制約エラーの原因になります。
私はこれを試してみましたが、タイトルには空の文字列も許可されていないようです。したがって、コアノードモジュールのコードのほとんどを再実装する独自のエンティティタイプを作成するか、...
デフォルトのタイトルを指定し、ユーザーが変更できないようにします。
function my_module_form_node_my_content_type_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
$form['title']['#disabled'] = 'disabled';
$form['title']['widget'][0]['value']['#default_value'] = 'none';
}
none
をmy_module
、タイムスタンプ、または好きなブランドのピーナッツバターに変更できます。
これが、プロジェクトでこの問題を解決する方法です。現時点では 自動エンティティラベル Drupal 8バージョン、つまり コードを参照 していない場合、情報のみが表示されます。 ymlファイル。
常にタイトルを設定する必要があるため、エンティティの作成時にタイトルを設定します。
use Drupal\node\NodeInterface;
/**
* Implements hook_ENTITY_TYPE_create
*/
function YOUR_MODULE_node_create(NodeInterface $node) {
switch ($node->getType()) {
case 'CONTENT_TYPE_MACHINE_NAME':
$node->title = 'Date: ' . date('Y-m-d G:i:s');
break;
}
}
そしてもう1つの部分は、ノードフォームのタイトルを非表示にすることです。これを行うには、次のコマンドを使用できます。
/**
* Implements hook_form_alter().
*/
function YOUR_MODULE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
//With this you will know your form_id (see in the next function YOUR_FORM_ID)
dpm($form_id);
}
そしてこのフックであなたはタイトルを隠します、これであなたはトリックをします
/**
* Implements hook_form_FORM_ID_alter().
*/
function YOUR_MODULE_form_YOUR_FORM_ID_alter(array &$form, FormStateInterface $form_state, $form_id) {
$form['title']['#access'] = FALSE;
}
自動ノードタイトルモジュールを使用することもできます。これにより、ノードタイプをコンテンツタイプの設定で必要なものに設定できますが、追加または編集時にフィールドは表示されません。
タイトルはレイアウトビルダーでさまざまな点で役立つことがわかりました:-コンテンツのプレビューを表示-ブロックIDとして使用
私のソリューションでは、ブロックタイプのタイトルを使用し、同じタイプのブロックの数をカウントすることで、自動タイトルを生成しています。
function [module]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
if ($form_id === 'layout_builder_add_block') {
// Get the blocks plugins id counter.
$bundle = $form['settings']['block_form']['#block']->bundle();
$plugin_id = 'inline_block:' . $bundle;
// Get the blocks plugins id count array.
if ($node = $form_state->getTemporary()['gathered_contexts']['layout_builder.entity']->getContextData()->getEntity()) {
$block_count = 0;
foreach ($node->layout_builder__layout as $section) {
$components = $section->section->getComponents();
foreach ($components as $block) {
if ($plugin_id === $block->getPluginId()) {
$block_count += 1;
}
}
}
}
// If not exist start from 0.
// Insert default title.
$form['settings']['label']['#default_value'] = t('%title-%title_id', [
'%title' => $form['settings']['admin_label']['#plain_text'],
'%title_id' => $block_count,
]);
// Change title description.
$form['settings']['label']['#title'] = t('Block id');
$form['settings']['label']['#description'] = t('Automatic id generator. Can be modified by user but must be unique.');
// Update and hide display title checkbox.
// $form['settings']['label_display']['#default_value'] = FALSE;
// $form['settings']['label_display']['#access'] = FALSE;
}
if ($form_id === 'layout_builder_update_block') {
// Change title description.
$form['settings']['label']['#title'] = t('Block id');
$form['settings']['label']['#description'] = t('Automatic id generator. Can be modified by user but must be unique.');
// Update and hide display title checkbox.
// $form['settings']['label_display']['#default_value'] = FALSE;
// $form['settings']['label_display']['#access'] = FALSE;
}
}
/**
* HOOK_preprocess_block.
*/
function [module]_preprocess_block(&$variables) {
// Add id into block.
$label = qfcc_structure_normaliseLabelToId($variables['label']);
if (!$label) {
$label = Rand(100, 999);
}
$variables['attributes']['id'] = 'block-' . $label;
}
function [module]_normaliseLabelToId($text) {
if (!$text) {
return NULL;
}
$text = trim(strtolower($text));
$text = str_replace(' ', '-', $text);
$text = str_replace('_', '-', $text);
$text = preg_replace('/[^a-z0-9\-]/', '', $text);
return $text ?? NULL;
}