Tự động ẩn / hiển thị các trường API trường trong Drupal 7


15

Tôi đã tạo một thực thể với hình thức 'thêm mới'. Bản thân thực thể có một số lượng hạn chế của các biến thực tế. Tôi đã thêm hầu hết dữ liệu bổ sung mà tôi cần bằng cách sử dụng Trường tùy chỉnh (ví dụ: API trường).

Những gì tôi cần làm trong giai đoạn này là có thể ẩn động một trường dựa trên giá trị của trường khác. tức là nếu một trường thả xuống có giá trị được đặt thành Không, thì một trường khác sẽ bị ẩn, nếu không thì nó sẽ được hiển thị.

Từ những gì tôi có thể thấy, có thể dễ dàng thêm chức năng này vào các trường được tạo bằng API Mẫu (tức là thông qua thuộc tính AJAX), tuy nhiên có cách nào để đạt được nó bằng cách sử dụng các trường đính kèm không? Tôi không gặp vấn đề gì khi sử dụng Javascript tùy chỉnh nếu đó là điều bắt buộc để giải quyết vấn đề này.


Tôi không chắc liệu drupal.org/project/conditable_fields đã sẵn sàng cho d7 chưa, nhưng có thể đáng để xem xét
Jukebox

Câu trả lời:


6

jQuery hoạt động tốt cho việc này:

(function($) {
  $(document).ready(function() {
    $('#select1').change(function() {
      switch ($(this).val()) {
        case '1':
          $('#field2').hide();
          break;
        default:
          $('#field2').show();
          break;
      }
    });
  });
}) (jQuery);

Vâng, tôi đã kết thúc bằng cách sử dụng drupal_add_js trên trang biểu mẫu và cuối cùng đã làm điều đó trong jQuery. Tôi chỉ tự hỏi liệu có một cách 'Drupal' hơn để làm điều này.
NRaf

Tôi sẽ đề cập rằng tôi không phải là một fan hâm mộ lớn của phương pháp tiếp cận Drupal #states về khả năng hiển thị, đó là lý do tại sao tôi không đề xuất nó ở trên.
keithm

@keithm Bạn có thể giải thích rõ hơn về lý do tại sao bạn không phải là người hâm mộ của các tiểu bang (kể từ năm 2015, D7). Tôi đang làm việc trong một dự án nơi chúng tôi đang cố gắng đưa ra quyết định sử dụng #states vs drupal_add_js. Tại sao bạn nghĩ cái này là lựa chọn tốt hơn cái kia?
blue928

Theo ý kiến ​​của tôi, đó là vấn đề ưu tiên lập trình viên hợp pháp; lý do của tôi có thể khác với bạn. Điều đó nói rằng, trong thực tế, tôi không thích dùng đến một cú pháp khác sao chép chức năng được tìm thấy trong Javascript / jQuery. Khi tôi đã thử #states, tôi cũng thấy các trường hợp sử dụng mà nó được thiết kế quá hạn chế. Khi vấn đề của tôi mở rộng ra ngoài các trường hợp sử dụng này, tôi đã phải viết lại toàn bộ nội dung trong Javascript thẳng.
keithm

20

Trong Drupal 7, bạn có thể sử dụng $ form #statesthay vì tập lệnh jQuery tùy chỉnh. Thí dụ:

  $form['student_type'] = array(
    '#type' => 'radios',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'checkboxes',
    '#options' => drupal_map_assoc(array(t('SAT'), t('ACT'))),
    '#title' => t('What standardized tests did you take?'),
    // This #states rule says that this checkboxes array will be visible only
    // when $form['student_type'] is set to t('High School').
    // It uses the jQuery selector :input[name=student_type] to choose the
    // element which triggers the behavior, and then defines the "High School"
    // value as the one that triggers visibility.
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type"]' => array('value' => 'high_school'),
      ),
    ),
  );

Dưới đây là ví dụ nếu bạn muốn sử dụng #statescho nhiều điều kiện giá trị:

 $form['student_type'] = array(
    '#type' => 'checkboxes',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'textfield',
    '#title' => t('What standardized tests did you take?'),
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type[high_school]"]' => array('checked' => TRUE),
        ':input[name="student_type[undergraduate]"]' => array('checked' => TRUE),
        ':input[name="student_type[graduate]"]' => array('checked' => FALSE),
      ),
    ),
  );

Xem mô-đunform_example/form_example_states.inc từ ví dụ để biết thêm chi tiết và ví dụ.


Nhắc đến #states, tôi chưa bao giờ tìm được cách xác định các điều kiện hiển thị phức tạp hơn, chẳng hạn như: ẩn điều khiển A khi giá trị B điều khiển nằm trong mảng (x, y, z). Bạn có tình cờ biết một cú pháp cho điều đó?
Artur

1
Xem cập nhật của tôi ở trên
milkovsky

5

Bạn nên thử Trường có điều kiện , tôi nghĩ mô-đun này là phải có cho nhiệm vụ này. Bạn có thể đặt phụ thuộc giữa các trường trên giao diện quản trị thân thiện với người dùng. Ví dụ, bạn có thể thiết lập Ahiện trường để chỉ có thể nhìn thấy nếu Blĩnh vực có giá trị " 1234 ", hoặc bạn có thể đặt Ctextfield là có thể nhìn thấy chỉ khi Dlĩnh vực được đánh dấu, hoặc thiết lập Etrường để vô hình nếu Ftập trung , vv

Trên biểu mẫu tải lên, các phụ thuộc này sẽ được đặt phía máy khách, trên màn hình nút, các phụ thuộc này sẽ được đặt ở phía máy chủ.

Bạn có thể đặt các phụ thuộc này tại admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies.

Lĩnh vực có điều kiện (Nguồn hình ảnh: trang của dự án )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.