プログラムでフィールドのデフォルト値を設定する


10

Drupal 6では、PHPを使用してデフォルト値を設定できましたが、Drupal 7では同じコードを使用できません。

私はこれをを通じて試みていますhook_form_alter()が、コードが機能しません。

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"]['#default_value'] = $default;
      // …
      break;
  }
}

回答:


17

form alter関数が実際に実行されていると仮定すると(これはへの呼び出しで確認できますdsm())、field要素に到達するために下がる必要がある配列のレベルが実際にはさらに2つあります。

$form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;

Drupal 7では、フィールドが翻訳された各言語の値の配列があり(カーディナリティが複数/無制限のフィールドに対応できるようにするため)、それぞれの下にさまざまな異なるフィールド列の配列があります。ほとんどの場合、これは「値」になりますが、常にそうとは限りません(たとえば、画像フィールドにファイルID列、代替列などがあります)。

それが役に立てば幸い


それはもう1つの深さです:)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79

2
この回答はすべてのウィジェットで機能するわけではありません。値の指定方法によって異なります。たとえば、entityreferenceフィールドでは、次を使用します:$ form ['field_name'] ['und'] [0] ['target_id'] ['#default_value'] = $ default
Renee

@Renee非常に正しい。詳細については、こちらをご覧ください
Clive

1
フィールドの値は常に@Mouneerの言語です。多言語サイトがない場合は、デフォルトLANGUAGE_NONEを使用する必要があります
Clive

1
確かに、@ Mouneerの方が少し優れていると説明できたかもしれません。現在の言語はどこかの形で見つかります(たぶん$form['#entity']->language、定数の代わりに使用できるようにチェックする必要があると思います。検索コード。)$languageグローバルによって決定された現在の言語も使用しますが、とにかくそれを支援するAPIメソッドがあります(field_get_itemsまたはEntityMetadataWrapper、エンティティモジュールによって提供されるより優れています)
Clive

0

これは正しい:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;
      // …
      break;
  }
}

0

これはうまくいきます:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);
  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"][0]['value']['#default_value']=$default;
      break;
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.