2012-06-14 64 views
8

Nền: Trong Drupal 7, tôi đã tạo biểu mẫu có CCK (còn gọi là Giao diện trường). Tôi đã sử dụng mô-đun Field group để tạo nhóm field, nhưng tôi cần nó có điều kiện, nghĩa là nó sẽ chỉ hiển thị tùy thuộc vào câu trả lời trước.Trường nhóm/lĩnh vực có điều kiện trong Drupal 7

Nghiên cứu trước đây: Để tạo ra một lĩnh vực có điều kiện, bạn có thể sử dụng hook_form_alter() để chỉnh sửa các thuộc tính #states như vậy:

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

Tuy nhiên, có vẻ là không có cách nào để sử dụng API Kỳ fieldgroups. Một điều cần lưu ý là, trong khi các trường được lưu trữ trong $form, các nhóm lĩnh vực được lưu trữ trong $form['#groups'] cũng như trong $form['#fieldgroups']. Tôi không biết làm thế nào để phân biệt giữa chúng, và với điều này trong tâm trí, tôi đã cố gắng áp dụng một thuộc tính #states cho một fieldgroup theo cách tương tự như trên. Tuy nhiên, nó chỉ tạo ra lỗi máy chủ.

Câu hỏi: Có cách nào để làm cho một fieldgroup hiển thị có điều kiện sử dụng API của tiểu bang hoặc một số phương pháp thay thế khác không?

Trả lời

2

Đây là giải pháp đơn giản nhất mà tôi đã đưa ra. Về cơ bản có 2 phần: (1.) thay đổi hiển thị biểu mẫu, và (2.) sử dụng GUI để thay đổi hiển thị nội dung.

(1.) Trước tiên, tôi đã sử dụng hook_form_alter() để lập trình tạo fieldset có điều kiện và thêm các trường hiện có vào trường này. Các mã được hiển thị dưới đây.

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.) Sau đó, tôi đã sử dụng mô-đun Field group để thay đổi hiển thị nội dung. Tôi đã làm điều này bằng cách vào loại nội dung của tôi và sử dụng tab 'Quản lý hiển thị' để tạo một nhóm trường và thêm các trường của tôi vào đó. Bằng cách này, các trường sẽ xuất hiện ngoài cùng một nhóm trên cả biểu mẫu và nội dung đã lưu.

0

Có thể bạn có thể thử xem mã số this module để giúp bạn tìm ý tưởng.

+0

Thanks for the tip. Tôi đã không thực sự kết thúc nhìn vào nó bởi vì tôi có một cái gì đó để cuối cùng làm việc. Kiểm tra các giải pháp được đăng nếu bạn quan tâm. – seane

3

bạn phải sử dụng các hook_field_group_build_pre_render_alter()

Đơn giản chỉ cần:

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

này hoạt động perfecly. Nếu nhóm A là trong một nhóm khác, làm điều này

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

Bạn có thể cần thêm một thuộc tính id nếu không tồn tại:

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

Chà, điều này còn thanh lịch hơn cả giải pháp của tôi! Cảm ơn bạn! – seane

+0

Loại hình này làm việc cho tôi nhưng tôi gặp phải một vấn đề lớn. Khi tạo một nút của một loại nội dung khác, mã này sẽ vẫn thực thi. Và khi tôi cố gắng đặt điều kiện trong mã để kiểm tra loại nút cụ thể, có vẻ như phần tử $ đã chuyển qua các giá trị từ biểu mẫu khác đến biểu mẫu này. Vấn đề chính: loại nút không chính xác. Bất cứ ai khác trải nghiệm điều này? Tôi đang ở trên D7. – MTsrb

+0

@MTsrb Thử một điều kiện trên '$ element ['# form_id']' – HerrSerker

Các vấn đề liên quan