Drupal 7에서 필드 API 필드를 동적으로 숨기거나 표시


14

'새로 추가'양식을 사용하여 엔터티를 만들었습니다. 실체 자체에는 제한된 수의 실제 변수가 있습니다. 사용자 정의 필드 (예 : 필드 API)를 사용하는 데 필요한 대부분의 추가 데이터를 추가했습니다.

이 단계에서해야 할 일은 다른 필드의 값을 기준으로 한 필드를 동적으로 숨길 수 있다는 것입니다. 즉, 드롭 다운 필드의 값이 아니오로 설정된 경우 다른 필드를 숨겨야합니다. 그렇지 않으면 표시해야합니다.

내가 볼 수 있듯이 Form API를 사용하여 만든 필드 (예 : AJAX 속성)를 통해이 기능을 추가하는 것이 다소 쉽지만 연결된 필드를 사용하여 얻을 수있는 방법이 있습니까? 이 문제를 해결하는 데 필요한 경우 사용자 정의 Javascript를 사용하는 데 아무런 문제가 없습니다.


drupal.org/project/conditional_fields 가 아직 d7에 갈 준비가 되었는지 확실하지 않지만, 살펴볼 가치가 있습니다.
Jukebox

답변:


5

jQuery는 다음과 같이 잘 작동합니다.

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

예, 양식 페이지에서 drupal_add_js를 사용하여 jQuery에서 작업을 마쳤습니다. 나는 이것을 할 수있는 더 'Drupal'방법이 있는지 궁금했습니다.
NRaf

나는 Drupal #states가 가시성에 접근하는 것을 좋아하지 않는다고 언급했기 때문에 위에서 제안하지 않았습니다.
keithm

@keithm 왜 당신이 국가의 팬이 아닌지에 대해 자세히 설명해 주시겠습니까 (2015 년, D7). #states vs drupal_add_js를 사용하기로 결정한 프로젝트를 진행 중입니다. 왜 하나가 다른 하나보다 더 나은 선택이라고 생각합니까?
blue928

제 생각에는 합법적 인 프로그래머의 선호입니다. 나의 근거는 당신과 다를 수 있습니다. 즉, 실제로 Javascript / jQuery에있는 기능을 복제하는 다른 구문에 의존하는 것을 싫어합니다. #states를 시도했을 때, 너무 제한적으로 설계된 사용 사례도 발견했습니다. 내 유스 케이스 밖에서 문제가 확장되면 어쨌든 전체 자바 스크립트로 모든 것을 다시 작성해야했습니다.
keithm

19

Drupal 7에서는 #states커스텀 jQuery 스크립트 대신 $ form을 사용할 수 있습니다 . 예:

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

#states여러 값 조건 에 사용하려는 경우의 예는 다음과 같습니다 .

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

자세한 내용과 예 는 form_example/form_example_states.incfrom examples 모듈 을 참조하십시오.


에 대해 말하자면 #states, 제어 B 값이 배열 (x, y, z)에있을 때 제어 A 숨기기. 당신은 그것에 대한 구문을 알고 있습니까?
Artur

1
위의 내 업데이트 참조
milkovsky

4

조건부 필드를 시도 해야합니다.이 모듈은이 작업에 반드시 필요한 요소라고 생각합니다. 사용자 친화적 인 관리 인터페이스에서 필드 간 종속성을 설정할 수 있습니다. 예를 들어, 당신은 설정할 수 있습니다 A단지로 필드를 경우 B필드 값 "이 1234 ", 또는 당신이 설정할 수 있습니다 C로 텍스트 필드를 경우에만 D필드가 확인 또는 설정됩니다 E에 필드 보이지 않는 경우 FIS가 집중

업로드 양식에서 이러한 종속성은 클라이언트 측으로 설정되고 노드 표시에서는 서버 측에서 설정됩니다.

에서이 종속성을 설정할 수 있습니다 admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies.

조건부 필드 (이미지 출처 : 프로젝트 페이지 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.