2011-02-01 1 views
3

Drupal 7でノードフォームを使用しているため、ユーザー用に単純化するためにセクションに分割したい垂直タブ機能を使用します。Drupalフォームのフィールドセットにフィールドを移動できない - 現在の値を取得できない

hook_form_FORMID_alter()を使用すると、難しいことなくフィールドを移動できます。ノードが保存されると、値が正しく書き込まれ、ノードビューに表示されます。

ノードを再編集すると、移動したフィールドの値が設定されないため、データが失われる可能性があります。 form_state ['fields'] [field] [langcode]でarray_parentsの値を変更するなど、さまざまなオプションを試しました。

(私は代わりにpre_render中にフィールドを移動する方が良いだろうかと思った。)

に任意のアイデア?

答えて

3

フィールドAPIフィールドは、デフォルトでコンテナフィールドタイプに配置されます。

$form['field_tags']['#type'] = 'fieldset'; 
$form['field_tags']['#title'] = 'Tags'; 
$form['field_tags']['#group'] = 'additional_settings'; 

よりよい解決策は、あなたがむしろよりも、UIを介してこれらの変更を加えることができる新しいField Group moduleを使用することです:あなたは垂直タブでフィールドセットに変換したい場合は、次の操作を行うことができますコード。

+0

私はそのモジュールが存在するかどうかわかりませんでした。素晴らしい。私は車輪を再発明したいという願望はない:-)インストールされていて、遊んでいる。 – Adaddinsane

+1

実際には、フォーム上でより細かいテーマ管理やカスタムフォームの作成が必要な多くの状況において、フィールドグループよりも私にとって有用だったので、コード内の解決策についてはアップボーニングしています。 – geerlingguy

+0

もうひとつ注意:コード内にカスタム垂直タブグループを作成するには、$ form ['group_name_here'] ['#type'] = 'vertical_tabs'; - 上記のコードで 'additional_settings'の代わりに 'group_name_here'を置き換えてください。 – geerlingguy

2

場合によっては、フォーム作成プロセスの#after_buildステップで項目項目を移動する方が効果的です。 hook_form_alterで

、あなたはそうのようなあなたの後のビルド機能を設定します。

function mymodule_form_alter(&$form, &$form_state, $form_id) 
{ 
    $form['#after_build'][] = 'mymodule_myform_after_build'; 
} 

次に、あなたのafter_build機能はそれほどのように定義する:

function mymodule_myform_after_build($form) 
{ 
    //do stuff to the form array 
    return $form; 
} 

を私はあなたにも個々の要素にafter_buildを定義することができると思います。

とにかく、すべてのモジュールがその作業を終えると、フォームを変更するのは良い方法です。

関連する問題