コンテナフォーム要素をどのように処理する必要がありますか?

drupal.stackexchange https://drupal.stackexchange.com/questions/533

  •  16-10-2019
  •  | 
  •  

質問

レジスタユーザーフォームにいくつかのカスタムフィールドを追加しましたが、「コンテナ」タイプのフォーム要素にパッケージ化されていることが発見されました。私のコードは、あらゆる種類の異なるカスタムレジスタフィールドを処理する必要があります。

これらのオブジェクトを解析し、それらからフィールドを抽出するにはどうすればよいですか?配列を調べる必要があり、そこに何を見つけることができると思いますか?

これらのオブジェクトに良いドキュメントを見つけることができないようです。

編集:

ユーザー登録を通じて受け取った通常のフィールドは、次のようになるかもしれません。

name
... (Array, 10 elements)
#type (String, 9 characters ) textfield
#title (String, 10 characters ) Username
#maxlength (Integer) 60
#required (Boolean) TRUE
#attributes (Array, 1 element)
class (Array, 1 element)
0 (String, 8 characters ) username
#default_value (String, 0 characters )
#access (Boolean) TRUE
#weight (Integer) -10
#fb_registration_field (String, 4 characters ) name

フォームコンテナは次のようになります:

field_birtyday
... (Array, 6 elements)
#type (String, 9 characters ) container
#attributes (Array, 1 element)
#weight (String, 1 characters ) 7
#tree (Boolean) TRUE
#language (String, 3 characters ) und
und (Array, 13 elements)
0 (Array, 12 elements)
#entity_type (String, 4 characters ) user
#bundle (String, 4 characters ) user
#field_name (String, 14 characters ) field_birtyday
#language (String, 3 characters ) und
#field_parents (Array, 0 elements)
#columns (Array, 2 elements)
0 (String, 5 characters ) value
1 (String, 6 characters ) format
#title (String, 8 characters ) Birthday
#description (String, 0 characters )
#required (Boolean) FALSE
#delta (Integer) 0
#weight (Integer) 0
value (Array, 16 elements)
#entity_type (String, 4 characters ) user
#bundle (String, 4 characters ) user
#field_name (String, 14 characters ) field_birtyday
#language (String, 3 characters ) und
#field_parents (Array, 0 elements)
#columns (Array, 2 elements)
0 (String, 5 characters ) value
1 (String, 6 characters ) format
#title (String, 8 characters ) Birthday
#description (String, 0 characters )
#required (Boolean) FALSE
#delta (Integer) 0
#weight (Integer) 0
#type (String, 9 characters ) textfield
#default_value (NULL)
#size (String, 2 characters ) 60
#maxlength (String, 3 characters ) 255
#attributes (Array, 1 element)
#theme (String, 25 characters ) field_multiple_value_form | (Callback) field_multiple_value_form();
#field_name (String, 14 characters ) field_birtyday
#cardinality (String, 1 characters ) 1
#title (String, 8 characters ) Birthday
#required (Integer) 0
#description (String, 0 characters )
#prefix (String, 42 characters ) <div id="field-birtyday-add-more-wrapper">
#suffix (String, 6 characters ) </div>
#max_delta (Integer) 0
#after_build (Array, 1 element)
0 (String, 30 characters ) field_form_element_after_build | (Callback) field_form_element_after_build();
#language (String, 3 characters ) und
#field_parents (Array, 0 elements)
役に立ちましたか?

解決

使用する必要があります $form_state['values'] 送信されたユーザーデータを処理するためではありません $form.

他のヒント

動的であるため、そのフォームには良いドキュメントはありません。モジュールはhook_form_alter()を実装し、完全に逆さまにすることができます。例では、名前はuser.moduleによって直接追加されますが、field_birthdayはフィールドであり、フィールドは必要に応じて複数回表示できる方法で構築されます。それが彼らが容器であり、それらの内側のみが実際のフォーム要素である理由です。

応答ではなく実際のフォームを解析したいと仮定すると、再帰的にフォームを通過する必要があります。関数 element_children() それであなたを助けることができます。それは、あなたがその関数に渡したものの下のすべてのフォーム要素のキーを返します。

ライセンス: CC-BY-SA帰属
所属していません drupal.stackexchange
scroll top