10

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

以前の調査:条件付きフィールドを作成するには、hook_form_alter()を使用して次のように#states属性を編集できます。

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'),
      ),
    );
  }
}

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

質問:States APIまたは代替アプローチを使用して、フィールドグループを条件付きで表示する方法はありますか?

4

3 に答える 3

7

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),
    ),
  );
}

これは完璧に機能します。グループ A が別のグループにある場合は、これを行います。

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

id 属性が存在しない場合は、追加する必要がある場合があります。

$element['your_field_group']['#attributes']['id'] = 'some-id';
$element['yout_field_group']['#id'] = 'some-id';
于 2012-11-03T16:12:46.753 に答える
2

これが私が思いついた最も簡単な解決策です。これには基本的に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.)次に、フィールドグループモジュールを使用して、コンテンツの表示を変更しました。これを行うには、コンテンツタイプに移動し、[表示の管理]タブを使用してフィールドグループを作成し、それにフィールドを追加します。このように、フィールドはフォームと保存されたコンテンツの両方で同じグループの一部であるように見えます。

于 2012-06-28T22:31:30.633 に答える
0

このモジュールのコードを見て、アイデアを見つけるのに役立つかもしれません。

于 2012-06-28T12:15:30.363 に答える