Phương pháp dễ nhất cho các trường có điều kiện trong một hình thức


20

Cách dễ nhất để có được một số phép thuật javascript để bật / tắt các trường biểu mẫu dựa trên giá trị của trường khác là gì? Điều này nghe có vẻ như cần một người trợ giúp ở đâu đó, nhưng tôi không thể tìm thấy nó. Tôi đang tìm kiếm một giải pháp không giới hạn ở các nút.


Không chắc đây thực sự là một câu hỏi của Drupal. Đây là một JavaScript và nên được hỏi trên Stack Overflow.
Camsoft

3
Tôi đang tìm kiếm một giải pháp Drupal. Tôi có khả năng viết Javascript cho nó, nhưng nó thực sự cảm thấy như nó nên được cắm vào API Form bằng cách nào đó.
Fuzzy76

Thật tuyệt. Tôi không nghĩ rằng điều đó đã rõ ràng trong câu hỏi ban đầu. Tôi không biết bất kỳ mô-đun nào có thể làm điều này.
Camsoft

Câu trả lời:


18

Phép thuật đang sử dụng thuộc tính #ahah / #ajax với các phần tử biểu mẫu, theo cách đó bạn có thể xác định điều gì sẽ kích hoạt sửa đổi và kết quả nên được sửa đổi, cộng với việc nó tích hợp hoàn toàn với jQuery.

Đây là phần quan trọng từ ví dụ dưới đây:

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

Dưới đây là một ví dụ hiển thị trang dựa trên biểu mẫu với hai lần thả xuống: danh sách các tùy chọn trong danh sách thả xuống thứ hai phụ thuộc vào lựa chọn trong danh sách thả xuống đầu tiên.

<?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();
    }
}

Đây là cách đúng để thay đổi biểu mẫu tùy thuộc vào giá trị của một trong các trường của nó. Nhưng để ẩn / hiển thị hoặc bật / tắt các trường, thuộc tính #states trên phần tử biểu mẫu dễ dàng hơn.
Pierre Buyle

6

Không phải mô-đun Trường có điều kiện làm điều đó?

Khi chỉnh sửa một nút, các trường được kiểm soát được hiển thị động và ẩn bằng JavaScript.


Đối với các hình thức nút và các trường CCK, có. Nhưng tôi muốn một cái gì đó có thể được sử dụng trong các trường hợp khác. Tôi sẽ làm rõ câu hỏi của tôi.
Fuzzy76

3

Có hai hệ thống khác nhau mà bạn có thể sử dụng:

  • # ahah / # ajax cho phép bạn gửi biểu mẫu với AJAX và xây dựng lại ở phía máy chủ. Hữu ích khi bạn thực sự muốn thêm các thành phần biểu mẫu mới , ví dụ điển hình trong D6 là upload.module. Đã giải thích ở trên.
  • Điểm mới trong Drupal 7 là hệ thống #states cho phép bạn thực hiện các công việc như hiển thị / ẩn / bật / tắt các thành phần biểu mẫu dựa trên các yếu tố khác. Xem http://www.randyfay.com/node/58 để biết thêm thông tin về điều đó.

1

Phương pháp đơn giản nhất là viết JavaScript của riêng bạn và sử dụng jQuery để đính kèm các trình xử lý sự kiện vào các sự kiện mờ và tập trung. Sau đó, khi cuộc gọi lại của bạn được kích hoạt, hãy tắt / bật các trường dựa trên logic của bạn.


Và nếu anh ta không có khả năng viết jQuery của riêng mình? Không phải là một mô-đun Drupal sẽ dễ dàng hơn mã hóa? - Do làm rõ câu hỏi, tôi rút lại nhận xét của mình.
Giải mã

Thứ nhất, bản thân tôi không biết về mô-đun Trường có điều kiện, thứ hai là một mô-đun như thế này sẽ bổ sung bao nhiêu vào dự án của anh ấy qua một số JS phía máy khách đơn giản?
Camsoft
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.