2012-06-14 2 views
8

Справочная информация: В Drupal 7 я создал форму с CCK (также как пользовательский интерфейс поля). Я использовал модуль Field group, чтобы создать полевую группу, но мне нужно, чтобы она была условной, то есть она будет отображаться только в зависимости от предыдущего ответа.Условные полевые группы/поля в Drupal 7

Предыдущие исследования: Для создания условного поля, вы можете использовать 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'), 
    ), 
    ); 
    } 
} 

Однако, кажется, нет никакого способа, чтобы использовать States API для fieldgroups. Следует отметить, что, хотя поля хранятся в $form, полевые группы хранятся в $form['#groups'], а также в $form['#fieldgroups']. Я не знаю, как отличить их, и с учетом этого я попытался применить атрибут #states к групповой группе таким же образом, как описано выше. Однако он вызывает только ошибки сервера.

Вопрос: Есть ли способ сделать отображение групповой группы условно, используя API-интерфейс States или какой-либо альтернативный подход?

ответ

2

Вот самое простое решение, с которым я столкнулся. Для этого есть две части: (1.) программно изменить отображение формы и (2.) использовать графический интерфейс для изменения отображения содержимого.

(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.) Затем я использовал Field group модуль для изменения отображения содержимого. Я сделал это, перейдя на мой тип контента и используя вкладку «Управление отображением», чтобы создать группу полей и добавить к ней свои поля. Таким образом, поля будут отображаться отдельно от одной и той же группы как в форме, так и в сохраненном контенте.

0

Возможно, вы сможете попробовать код this module, чтобы помочь вам найти решение проблемы.

+0

Спасибо за отзыв. Я на самом деле не смотрел на нее, потому что мне удалось что-то наконец сработать. Если вы заинтересованы, ознакомьтесь с опубликованным решением. – 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['groupA']['groupB']['#states'] etc.... 

Вам может понадобиться добавить атрибут ID, если он не существует:

$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

Смежные вопросы