段落フィールド内に含まれるフォームフィールドの動作を変更するにはどうすればよいですか?


18

Drupal 8のParagraphsモジュールを使用して、段落フィールド内に含まれるフォームフィールドの動作を変更しようとしています。これは、AJAXコールバックなどの動作を追加したり、状態などを使用して他のフィールドを非表示にしたりできるようにするためです。

この関数を使用して、段落の親フィールドにアクセスできます。

function hook_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { 
}

しかし、段落内のフィールドにアクセスするにはどうすればよいですか?

試しましhook_field_widget_form_alterたが、役に立ちませんでした。

どうすればいいですか?

注:私はまだDrupalの開発を始めたばかりです。


あなたの祭壇でこれを試してみてください、kint($form);そしてkint($form_id);、それはあなたのALTERフックIDのIDを与える必要がありますし、それはまた、あなたが変更したい何のためのアレイ・パスを与える必要があります。
ダニーイングランド

回答:


14

パラグラフ^ 1.3以降、hook_field_widget_WIDGET_TYPE_form_alter()を使用できますフックの使用についての良いコメントがあるため、8.2バージョンをリンクしました)。

次の例を見ることができます modules/contrib/paragraphs/tests/modules/paragraphs_test/paragraphs_test.module

/**  
 * Implements hook_field_widget_WIDGET_TYPE_form_alter().  
 */  
function paragraphs_test_field_widget_entity_reference_paragraphs_form_alter(&$element, &$form_state, $context) {
  if ($element['#paragraph_type'] == 'altered_paragraph') {
    $element['subform']['field_text']['widget'][0]['#title'] = 'Altered title';
  }
}

6
「Paragraphs Classic」ではなく「Paragraphs EXPERIMENTAL」ウィジェットを使用している場合、ウィジェットタイプはのparagraphs代わりになりentity_reference_paragraphsます。
ダリン

1
いくつかの有用なもの(これらのフックをデバッグすることができないため): /* @var $paragraph \Drupal\paragraphs\Entity\Paragraph */ $paragraph = $form_state->get('paragraph'); $delta = $context['delta'];
ダリン

1

使用hook_form_alterすると、フォーム内のあらゆるもの、ウィジェットからのものも変更できます。それは簡単に少し乱雑になり、ウィジェットをいじると簡単に壊れてしまいます。

ウィジェットを変更したい場合、できることは自分のウィジェットを作成します。ウィジェットはプラグイン(PHPクラス)であるため、関数を完全に上書きするか関数を拡張することにより、独自のサブクラスを所有するサブクラスに変更できます。

ウィジェットは注釈システムを使用するため、クラスの上にコメントとして名前、IDなどを定義する必要があります。最も簡単な方法は、元のウィジェットをコピーして新しい名前とIDを変更するだけです。残りは必要なものでなければなりません。

キャッシュをクリアして、Drupalが新しいプラグインを見つけられるようにしてください。


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