web-dev-qa-db-ja.com

フィールドが使用されている場所に応じて、ネストされた段落のフィールドを「形成」する方法

次のエンティティタイプがあります。

  • ノードタイプ: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_apg_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を注入できると思います。

3
simesy

このシナリオでは、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に感謝します。

3
simesy

$ context変数をさらに詳しく調べることができると思いましたが、これまでのところ、これは私にほのめかしています。これまでのところ、最良の候補はフォームの#parentsですが、あいまいなfield_childへの参照しか見つからない場合。

エンティティオブジェクトは$ contextで使用できますか?そうでない場合は、$ form_stateのどこかにある可能性があります。

段落エンティティを取得したら、Paragraph::getParentEntity()を使用して親を取得し、そこから親のタイプを取得できます。

0
adrum99