양식에서 조건부 필드를위한 가장 쉬운 방법


20

다른 필드 값을 기반으로 양식 필드를 활성화 / 비활성화하기위한 자바 스크립트 마법을 얻는 가장 쉬운 방법은 무엇입니까? 어딘가에 도우미가 있어야하는 것처럼 들리지만 찾을 수 없습니다. 노드로 제한되지 않는 솔루션을 찾고 있습니다.


이것이 실제로 Drupal 질문인지 확실하지 않습니다. JavaScript이며 Stack Overflow에 요청해야합니다.
Camsoft

3
Drupal 솔루션을 찾고있었습니다. Javascript를 작성할 수는 있지만 어떻게 든 Form API에 연결해야한다고 생각합니다.
Fuzzy76

멋지다. 나는 그것이 원래 질문에서 분명하지 않다고 생각합니다. 나는 이것을 할 수있는 모듈을 모른다.
Camsoft

답변:


18

마술은 양식 요소와 함께 #ahah / #ajax 속성을 사용하여 수정을 트리거 할 대상과 결과로 수정해야 할 대상을 정의 할 수 있으며 jQuery와 완벽하게 통합됩니다.

이것은 아래 예제에서 중요한 부분입니다.

'#ajax' => array(
    'event' => 'change',
    'callback' => 'myajax_ajax_callback',
    'wrapper' => 'dropdown_second_replace',
),

다음은 두 개의 드롭 다운이있는 양식 기반 페이지를 표시하는 예입니다. 두 번째 드롭 다운의 옵션 목록은 첫 번째 드롭 다운의 선택 사항에 따라 다릅니다.

<?php

/**
 * Implementation of hook_menu().
 * Registers a form-based page that you can access at "http://localhost/myajax"
 */
function myajax_menu(){
    return array(
        'myajax' => array(
            'title' => 'A page to test ajax',
            'page callback' => 'drupal_get_form',
            'page arguments' => array('myajax_page'),
            'access arguments' => array('access content'), 
        )
    );
}



/**
 * A form with a dropdown whose options are dependent on a
 * choice made in a previous dropdown.
 *
 * On changing the first dropdown, the options in the second are updated.
 */
function myajax_page($form, &$form_state) {
    // Get the list of options to populate the first dropdown.
    $options_first = myajax_first_dropdown_options();

    // If we have a value for the first dropdown from $form_state['values'] we use
    // this both as the default value for the first dropdown and also as a
    // parameter to pass to the function that retrieves the options for the
    // second dropdown.
    $value_dropdown_first = isset($form_state['values']['dropdown_first']) ? $form_state['values']['dropdown_first'] : key($options_first);

    $form['dropdown_first'] = array(
        '#type' => 'select',
        '#title' => 'First Dropdown',
        '#options' => $options_first,
        '#default_value' => $value_dropdown_first,

        // Bind an ajax callback to the change event (which is the default for the
        // select form type) of the first dropdown. It will replace the second
        // dropdown when rebuilt
        '#ajax' => array(
            // When 'event' occurs, Drupal will perform an ajax request in the
            // background. Usually the default value is sufficient (eg. change for
            // select elements), but valid values include any jQuery event,
            // most notably 'mousedown', 'blur', and 'submit'.
            'event' => 'change',
            'callback' => 'myajax_ajax_callback',
            'wrapper' => 'dropdown_second_replace',
        ),
    );
    $form['dropdown_second'] = array(
        '#type' => 'select',
        '#title' => 'Second Dropdown',
        // The entire enclosing div created here gets replaced when dropdown_first
        // is changed.
        '#prefix' => '<div id="dropdown_second_replace">',
        '#suffix' => '</div>',
        // when the form is rebuilt during ajax processing, the $value_dropdown_first variable
        // will now have the new value and so the options will change
        '#options' => myajax_second_dropdown_options($value_dropdown_first),
        '#default_value' => isset($form_state['values']['dropdown_second']) ? $form_state['values']['dropdown_second'] : '',
    );
    return $form;
}

/**
 * Selects just the second dropdown to be returned for re-rendering
 *
 * Since the controlling logic for populating the form is in the form builder
 * function, all we do here is select the element and return it to be updated.
 *
 * @return renderable array (the second dropdown)
 */
function myajax_ajax_callback($form, $form_state) {
    return $form['dropdown_second'];
}


/**
 * Helper function to populate the first dropdown. This would normally be
 * pulling data from the database.
 *
 * @return array of options
 */
function myajax_first_dropdown_options() {
    return array(
        'colors' => 'Names of colors',
        'cities' => 'Names of cities',
        'animals' => 'Names of animals',
    );
}


/**
 * Helper function to populate the second dropdown. This would normally be
 * pulling data from the database.
 *
 * @param key. This will determine which set of options is returned.
 *
 * @return array of options
 */
function myajax_second_dropdown_options($key = '') {
    $options = array(
        'colors' => array(
            'red' => 'Red',
            'green' => 'Green',
            'blue' => 'Blue'
        ),
        'cities' => array(
            'paris' => 'Paris, France',
            'tokyo' => 'Tokyo, Japan',
            'newyork' => 'New York, US'
        ),
        'animals' => array(
            'dog' => 'Dog',
            'cat' => 'Cat',
            'bird' => 'Bird'
        ),  
    );
    if (isset($options[$key])) {
        return $options[$key];
    }
    else {
        return array();
    }
}

필드 중 하나의 값에 따라 양식을 변경하는 올바른 방법입니다. 그러나 필드를 숨기거나 표시하거나 활성화 / 비활성화하기 위해 양식 요소의 #states 속성이 더 쉽습니다.
Pierre Buyle

6

하지 않습니다 조건부 필드 그냥 할 모듈?

노드를 편집 할 때 제어 된 필드가 JavaScript로 동적으로 표시되고 숨겨집니다.


노드 양식 및 CCK 필드의 경우 예. 그러나 나는 다른 상황에서 사용될 수있는 것을 원했습니다. 나는 나의 질문을 명확히 할 것이다.
Fuzzy76

3

사용할 수있는 두 가지 시스템이 있습니다.

  • # ahah / # ajax를 사용하면 AJAX와 함께 양식을 제출하고 서버 측에서 다시 작성할 수 있습니다. 실제로 양식 요소 를 추가하려는 경우에 유용합니다 . D6의 일반적인 예는 upload.module입니다. 위에서 이미 설명했습니다.
  • Drupal 7의 새로운 기능은 #states 시스템으로 다른 요소를 기반으로 양식 요소 표시 / 숨기기 / 활성화 / 비활성화와 같은 작업을 수행 할 수 있습니다. 이에 대한 자세한 내용은 http://www.randyfay.com/node/58 을 참조 하십시오 .

1

가장 쉬운 방법은 고유 한 JavaScript를 작성하고 jQuery를 사용하여 이벤트 핸들러를 흐림 및 초점 이벤트에 첨부하는 것입니다. 그런 다음 콜백이 시작되면 논리에 따라 필드를 비활성화 / 활성화하십시오.


그리고 자신의 jQuery를 작성할 수 없다면? Drupal 모듈이 코딩보다 쉽지 않습니까? -질문이 명확 해져서 의견을 철회합니다.
Decipher

첫째, Conditional Fields 모듈을 스스로 알지 못했습니다. 둘째, 이와 같은 모듈이 간단한 클라이언트 측 JS를 통해 프로젝트에 얼마나 많은 오버 헤드를 추가합니까?
Camsoft
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.