2012-06-14 11 views
8

背景: Drupal 7では、私はCCK(別名フィールドUI)でフォームを作成しました。私はField groupモジュールを使用してフィールドグループを作成しましたが、条件付きにする必要があります。つまり、以前の回答に応じて表示されるだけです。Drupalの条件付きフィールドグループ/フィールドセット7

前の研究:条件付きフィールドを作成するには、そのよう#states属性を編集するhook_form_alter()を使用することができます。

function MYMODULE_form_alter(&$form, &$form_state, $form_id) { 
    if ($form_id == 'person_info_node_form') { 
    // Display 'field_maiden_name' only if married 
    $form['field_maiden_name']['#states'] = array(
     'visible' => array(
     ':input[name="field_married[und]"]' => array('value' => 'Yes'), 
    ), 
    ); 
    } 
} 

しかし、fieldgroupsのためのアメリカのAPIを使用する方法はないように思えます。注目すべき点の1つは、フィールドが$formに格納されている一方、フィールドグループは$form['#groups']と同様に$form['#fieldgroups']に格納されています。これらを区別する方法はわかりませんが、これを念頭に置いて、上記と同じ方法で#states属性をフィールドグループに適用しようとしました。ただし、サーバーエラーのみが発生します。

質問:状態APIを使用して条件付きでフィールドグループを表示する方法や、別の方法がありますか?

答えて

2

ここで私が思いついたもっとも簡単な解決法があります。 (1)フォームの表示をプログラムで変更し、(2)GUIを使用してコンテンツの表示を変更します。

(1.)まず、hook_form_alter()を使用して、プログラムで条件付きフィールドセットを作成し、既存のフィールドを追加しました。コードを以下に示します。

function MYMODULE_form_alter(&$form, &$form_state, $form_id) { 
    if ($form_id == 'FORM_ID_node_form') { 
    // programmatically create a conditional fieldset 
    $form['MYFIELDSET'] = array(// do NOT name the same as a 'Field group' fieldset or problems will occur 
     '#type' => 'fieldset', 
     '#title' => t('Conditional fieldset'), 
     '#weight' => intval($form['field_PARENT']['#weight'])+1, // put this fieldset right after it's "parent" field 
     '#states' => array(
     'visible' => array(
      ':input[name="field_PARENT[und]"]' => array('value' => 'Yes'), // only show if field_PARENT == 'Yes' 
     ), 
    ), 
    ); 

    // add existing fields (created with the Field UI) to the 
    // conditional fieldset 
    $fields = array('field_MYFIELD1', 'field_MYFIELD2', 'field_MYFIELD3'); 
    $form = MYMODULE_addToFieldset($form, 'MYFIELDSET', $fields); 
    } 
} 

/** 
* Adds existing fields to the specified fieldset. 
* 
* @param array $form Nested array of form elements that comprise the form. 
* @param string $fieldset The machine name of the fieldset. 
* @param array $fields An array of the machine names of all fields to 
*     be included in the fieldset. 
* @return array $form The updated form. 
*/ 
function MYMODULE_addToFieldSet($form, $fieldset, $fields) { 
    foreach($fields as $field) { 
    $form[$fieldset][$field] = $form[$field]; // copy existing field into fieldset 
    unset($form[$field]); // destroy the original field or duplication will occur 
    } 

    return $form; 
} 

は(2)次に、Iは、コンテンツの表示を変更するためにField groupモジュールを使用します。私は自分のコンテンツタイプに行き、「表示の管理」タブを使ってフィールドグループを作成し、それにフィールドを追加することでこれを行いました。この方法では、フィールドはフォームと保存されたコンテンツの両方で同じグループから離れているように見えます。

0

多分、this moduleのコードを見て、アイデアを見つけることができます。

+0

感謝を:グループAは、別のグループに属している場合は、この

$element['groupA']['groupB']['#states'] etc.... 

を行うあなたは何も存在しない場合は、id属性を追加する必要があるかもしれません。私は最終的に働く何かを持っているので、私は実際にそれを見終わらなかった。興味がある場合は、投稿されたソリューションをチェックしてください。 – seane

3

あなたは、単にhook_field_group_build_pre_render_alter()

を使用する必要があります。

function your_module_field_group_build_pre_render_alter(&$element) { 
    $element['your_field_group']['#states'] = array(
    'visible' => array(
     ':input[name="field_checkbox"]' => array('checked' => TRUE), 
    ), 
); 
} 

これはperfecly動作します。先端のための

$element['your_field_group']['#attributes']['id'] = 'some-id'; 
$element['yout_field_group']['#id'] = 'some-id'; 
+0

うわー、これは私の解決策よりはるかにエレガントです!ありがとうございました! – seane

+0

私のために働いたこの種のものですが、大きな問題に遭遇しました。異なるコンテンツタイプのノードを作成する場合、このコードはまだ実行されます。特定のノードタイプをチェックするコードに条件を入れようとすると、$要素が他のフォームの値をこのノードに持ち越したように見えます。主な問題:ノードタイプが正しくありませんでした。誰もがこれを経験する?私はD7にいる。 – MTsrb

+0

@MTsrb '$ element ['#form_id']'で条件を試してください – HerrSerker

関連する問題