Drupal 8の Paragraphs モジュールを使用して、段落フィールドに含まれるフォームフィールドの動作を変更しようとしています。これにより、=のような動作を追加できますAJAXコールバック、状態などを使用して他のフィールドを非表示にする.
この関数を使用して、段落の親フィールドにアクセスできます。
function hook_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
}
しかし、段落内のフィールドにどのようにアクセスしますか?
私が試してみました hook_field_widget_form_alter
ですが、役に立ちません。
どうすればよいですか?
注:私はまだDrupal開発にかなり慣れていません。
パラグラフ^ 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';
}
}
hook_form_alter
を使用すると、ウィジェットからのものなど、フォーム内のあらゆるものを変更できます。それは簡単に少し乱雑になる可能性があり、ウィジェットをいじくると簡単に壊れる傾向があります。
ウィジェットを変更したい場合は、独自のウィジェットを作成してください。ウィジェットはプラグイン(PHPクラス)なので、自分のサブクラスを自分のものにして、関数を完全に上書きするか、関数を拡張することで変更できます。
ウィジェットは注釈システムを使用するため、クラスの上にコメントとして名前、IDなどを定義する必要があります。最も簡単な方法は、元のウィジェットをコピーして、新しい名前とIDを変更するだけです。残りは必要なようにする必要があります。
Drupal新しいプラグインを見つけるために、キャッシュをクリアすることを忘れないでください。
段落ブラウザーをフィールドウィジェットとして使用している場合、もう1つひねりがあります。適合するフックはhook_field_widget_paragraphs_browser_form_alter()
という名前です。理解するのにかなりの時間を費やしました...