ノード編集フォームのタイトルフィールドを無効にする方法は?


8

ノード編集フォームのタイトルフィールドを非表示または無効にするにはどうすればよいですか?

コンテンツタイプの[フォーム表示の管理]タブ(admin/structure/types/manage/CONTENT_TYPE_MACHINE_NAME/form-display)から実行すると、ログに整合性制約エラーが発生します。

そのため、ノード編集フォームにデフォルトのタイトルフィールドを表示したくありません。タイトルフィールドを他のフィールドと同じように非表示にした場合。ノード作成後に白い画面が表示される。そして、ログはタイトルフィールドをnullにすることはできないと言っています... ...など...


お探しNode::setTitleですか?
Jimmy Ko

@JimmyKomコメントありがとうございます。言い換えれば、ノード編集フォームにデフォルトのタイトルフィールドを表示したくない。タイトルフィールドを他のフィールドと同じように非表示にした場合。ノード作成後に白い画面が表示される。そして、ログはタイトルフィールドがnullであってはならないと言います... ...など...
Mudassar Ali

あなたはあなたの問題を解決しますか?
エイドリアンCid Almaguer

回答:


6

あなたは使用することができますhook_form_alter()と無効(ノード編集フォームを含む)任意の形式に変更する機能をタイトルフィールドを。以下のサンプルコードを確認してください:

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_IDnode_ [CONTENT_TYPE] _edit_formで変更できます。ここで、CONTENT_TYPEはノードタイプフォームです。

編集:

ユーザーにタイトルフィールドの表示を許可せずにノードタイトルを自動的に設定するには、自動エンティティラベルモジュールを使用できます。モジュールはD8の開発バージョンですが、適切に機能していれば試してみることができます。

自動エンティティラベルモジュールを使用したくない場合は、カスタムコードを使用して同じことを試すことができます。ここでサンプルコードを確認してください


ありがとうございますが、フィールドを無効にすることは問題ではありません。drupalコアはタイトルなしでノードを作成することを許可していないようです。DBからこのエラーに対処する方法Drupal\Core\Entity\EntityStorageException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' cannot be null: INSERT INTO {node_field_data}
Mudassar Ali

わかりました。基本的に、ノードのコンテンツの追加または編集時にタイトルフィールドを表示したくないので、ユーザーがコンテンツを作成できるようにしますよね?はいの場合、これが役立つ場合は、このモジュールの自動エンティティラベルを確認してください。モジュールは現在開発バージョンです。
Yogesh

それはD8の開発中です。安全に使用できるかわからない...
Mudassar Ali

1
自動エンティティラベルモジュールが機能しない場合は、このリンクにあるサンプルコードを試してください。Drupal8のタイトルを自動入力しますか?
Yogesh

1
タイトルがない場合、管理インターフェースでノードをどのように識別しますか?メタデータなどをどのように考慮していますか?これは、正統な言葉ではありません。何らかの方法で何らかの値を入力するのが最善です。
ケビン

4

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つだけが機能するので、この回答は何を試してはならないかについての警告として役立つはずです。

entity_form_display設定を編集します

独自のモジュールの場合はcore.entity_form_display.node.my_content_type.default.ymltitleキーを編集してから削除しますcontent。これはフィールドで機能しますが、タイトルや、昇格、作成などの他のデフォルトの項目を削除した場合でも、フォームのに表示され/node/add/my_content_typeます。

コードでentity_form_displayを変更する

次のコードを追加します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廃止されました

entity_form_display構成で非表示にします

非表示にしますが、削除しないでください。でcore.entity_form_display.node.my_content_type.default.yml

hidden:
  title: false

試行錯誤の結果、ここでは論理が逆になることがわかりました。これも、参照する整合性制約エラーの原因になります。

CSSを使用して非表示にする

私はこれを試しました、そしてタイトルに空の文字列も許可されていないようです。したがって、コアノードモジュールのほとんどのコードを再実装する独自のエンティティタイプを作成するか、...

私が見つけた唯一の実用的な解決策

デフォルトのタイトルを指定し、ユーザーが変更できないようにします。

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

あなたは、変更される可能性nonemy_moduleタイムスタンプ、またはピーナッツバターのあなたのお気に入りのブランド、。


2

これが、プロジェクトでこの問題を解決する方法です。現時点では、自動エンティティラベルにはDrupal 8バージョンがありません。コード見ると、info.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;
}

1

自動ノードタイトルモジュールを使用することもできます。これにより、ノードタイプをコンテンツタイプの設定で必要なものに設定できますが、追加または編集時にフィールドは表示されません。


0

タイトルがレイアウトビルダーでさまざまな点で役立つことがわかりました。-コンテンツのプレビューを表示-ブロック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;
}

ここに画像の説明を入力してください ここに画像の説明を入力してください

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