次のエンティティタイプがあります。
nodepage
pg_a
pg_b
pg_child
私はコンテンツモデルを持っています:
nodepage
->field_a
Referenced bundles: pg_a
->field_child
Referenced bundles: pg_child
->field_b
Referenced bundles: pg_b
->field_child
Referenced bundles: pg_child
pg_a
とpg_b
の両方にfield_child
というフィールドがあり、pg_child
を参照できることがわかります。これは、サイトのアーキテクチャにとって大きな意味を持っています。
今私がやりたいことは、alter pg_childからですが、pg_a
からではなくpg_b
から参照される場合はonlyです。 。
hook_field_widget_form_alter
では、私thinkで変更を行う必要があります。以下を実行できます。
$field_definition = $context['items']->getFieldDefinition();
// Get the current field widget being built, eg `field_child_thing`.
$name = $field_definition->getName();
// Get the bundle, ie. `pg_child`
$targetBundle = $field_definition->getTargetBundle();
// Get the bundle that $targetBundle is attached to in this instance...
$instance = ???
$ context変数をさらに詳しく調べることができると思いましたが、これまでのところ、これは私にほのめかしています。これまでの最良の候補は、フォームの#parents
ですが、あいまいなfield_child
への参照しか見つからない場合。
私は今どこかから、おそらく親ビルド内にさらに$ contextを注入できると思います。
このシナリオでは、cta
段落内のさまざまな場所でfield_caption
が使用されています。企業はfield_caption
を25文字に制限するように要求しましたが、field_foo_cta
というエンティティ参照フィールドのノードで使用されている場合のみです。
まず、hook_field_widget_form_alter
を実装することにより、ルールに基づいてウィジェットに#processコールバックを追加します。
function mymodule_field_widget_form_alter(&$element, FormStateInterface $form_state, &$context) {
$field_definition = $context['items']->getFieldDefinition();
if ($field_definition instanceof FieldConfig) {
$config = $field_definition->id();
list ($entity_type, $bundle, $field_name) = explode('.', $config);
if ($entity_type == 'paragraph' && $field_name == 'field_caption') {
$element['#process'][] = ['\Drupal\mymodule\BusinessRules', 'alterFieldCaption'];
}
}
}
次に、モジュールのsrc
ディレクトリに新しいクラスを作成します。
namespace Drupal\mymodule;
class BusinessRules {
public static function alterFieldCaption(array &$element, FormStateInterface &$form_state, array &$complete_form) {
// Use whatever logic to target instances of `field_caption`.
if (reset($element['#parents']) == 'field_foo_cta') {
$element['value']['#maxlength'] = 25;
}
return $element;
}
}
これについて助けてくれた@larowlanに感謝します。
$ context変数をさらに詳しく調べることができると思いましたが、これまでのところ、これは私にほのめかしています。これまでのところ、最良の候補はフォームの#parentsですが、あいまいなfield_childへの参照しか見つからない場合。
エンティティオブジェクトは$ contextで使用できますか?そうでない場合は、$ form_stateのどこかにある可能性があります。
段落エンティティを取得したら、Paragraph::getParentEntity()
を使用して親を取得し、そこから親のタイプを取得できます。