Các hộp kiểm được chọn (phân loại) điền vào danh sách chọn mới với các giá trị của các hộp được chọn


7

* câu hỏi đã được trả lời: Cần trợ giúp với hook_node_submit trong mô-đun tùy chỉnh để lưu dữ liệu *


Trong Drupal 7, tôi có một loại nội dung tùy chỉnh. Trong đó, có một tham chiếu nhiều thuật ngữ để chọn các danh mục cho nội dung đó.

Bây giờ tôi cần có thể chọn một từ danh mục đã chọn trước đó và đánh dấu nó bằng cách nào đó là danh mục 'chính'.

Hãy nói rằng tôi có nhiều trường tham chiếu thuật ngữ chọn với các tùy chọn sau:

Apples
Bananas
Pears
Oranges
Grapes
Pineapples

Người dùng chọn Táo, Lê và Nho. Bây giờ tôi cần phải:

  1. Lập trình tạo một trường khác cho mỗi trong số những người được chọn này có thể với một cuộc gọi lại ajax và có các nút radio để tôi chỉ có thể chọn một trong những thuật ngữ được chọn là một trong những thuật ngữ chính của tôi.
  2. Tạo một trường vô tuyến bên cạnh các mục được đánh dấu.

Có ai có bất kỳ ý tưởng liên quan đến điều này?

Để rõ ràng hơn, tôi có rất nhiều danh sách này trên một loại nội dung. Lặp lại mỗi danh sách dưới dạng một danh sách giá trị không phải là một tùy chọn.

Tôi đoán rằng cách tốt nhất của tôi là sử dụng hook_form_alter()với một số loại gọi lại AJAX để tạo một nút radio duy nhất bên cạnh hộp đánh dấu mà người dùng vừa đánh dấu hoặc lập trình một danh sách trường radio mới cho mỗi mục được chọn trong danh sách đã chỉ định.

Cập nhật: Ok, tôi đã quyết định rằng cách tốt nhất để làm là tạo một mô-đun tùy chỉnh sử dụng ajax để tạo nút radio cho mỗi hộp kiểm tra, cho phép chọn thành phần nên được sử dụng làm thành phần chính.

Vì vậy, tôi đã sử dụng hook_form_alter()để thêm một #after_buildhàm vì chúng ta cần đợi biểu mẫu được hiển thị trước khi chúng ta có thể truy cập các giá trị thuật ngữ thuế.

Đây là mô-đun của tôi cho đến nay. Tôi sử dụng rất nhiều ý kiến ​​vì vậy cần phải rõ ràng những gì tôi đang cố gắng làm:

MYMODULE.module

/**
 * Implementation of HOOK_form_alter()
 * Do the ajax form alteration
 */
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {

  // 1.CONTENT FORM
  // I created a custom content type 'content' and added a term
  // reference to it 
  if($form_id == 'content_node_form') {

    // tax term ref is the main part, so let us
    // remove title and body fields
    unset($form['body']);
    unset($form['title']);

    // do our stuff after the form has been rendered ...
    $form['#after_build'][] = 'MYMODULE_after_build';

  }
}

/**
 * after_build function for content_node_form
 */
function MYMODULE_after_build(&$form, &$form_state) {

    dsm($form);  

    // In the after_build call we can now actually use the 
    // element_children function to grab the values of the fields that
    // don't start with a hash tag #
    // in this test case 1,2,3,4 and 5

    // wrap each of the elements rendered ...
    foreach(element_children($form['field_taxonomy']['und']) as $key) {

      $form['field_taxonomy']['und'][$key] += array(

        // this is added before the element and then replaced by our callback ..
        // we use the $key value in the id so that we know which div to replace 
        // depending on which checkbox is checked ...
        '#prefix' => '<div class="taxonomy_term_wrapper">
                        <div id="callback_replace_'.$key.'">Replace Me ' . $key . '</div>',

        // this is added after the element so we basically wrap around it ..
        '#suffix' => '</div>',

        // add some ajax stuff here ...
        '#ajax' => array(
          // name of the callback function to call upon change
          'callback' => 'MYMODULE_callback',
          // the id of the element that will be replaced
          'wrapper' => 'callback_replace_'.$key,
          // replace the wrapper
          'method' => 'replace',
          // what kind of effect do we want ...
          'effect' => 'fade',
          // show progress on callback
          'progress' => array('type' => 'throbber'),
        ),
      ); 



      if (!empty($form_state['values']['field_taxonomy']['und'][$key])) {
        // the form to show upon change ...
        $form['field_taxonomy']['und']['main_cat'] = array(
          // we want a radio button
          '#type' => 'radio',
          '#title' => t('Test Title'),
          '#description' => t('Test Description ...'),
          '#default_value' => empty($form_state['values']['field_taxonomy']['und'][$key]) ?
                              $form_state['values']['field_taxonomy']['und'][$key] :
                              $form_state['values']['field_taxonomy']['und'][$key],
        );
      }

    }

  return $form;
} 

function MYMODULE_callback($form, $form_state) {
 return $form['field_taxonomy']['und']['main_cat'];
}

Đây là những gì nó trông giống như trước khi kiểm tra một hộp:

Đây là những gì nó trông giống như trước khi kiểm tra một hộp

HTML của biểu mẫu được hiển thị là dạng sau:

ảnh chụp màn hình


Đây thực sự không phải là một câu trả lời như vậy, nhưng hãy thử xem mô-đun Ví dụ. Nó có một số ví dụ mẫu ajax gọn gàng có thể giúp bạn trên con đường của mình :) drupal.org/project/examples
Chapabu

Xin chào Chapabu, cảm ơn câu trả lời của bạn. Tôi đã sử dụng các ví dụ ajax, nhưng vấn đề của tôi nằm ở thực tế là tôi cần sử dụng after_build để thêm mã của mình và bây giờ tôi không biết nó có làm gì không ... Tôi đã thêm rất nhiều mã ở trên - bao gồm cả tiến trình của tôi cho đến nay với các mô-đun. Có lẽ bạn có thể thấy các lỗi
tecjam

hmm..điều duy nhất tôi có thể (nhanh chóng) thấy khác biệt trong after_build của bạn là định dạng. Trong các tài liệu Drupal, nó nói nó sẽ trông như thế này - $ form ['# after_build'] => mảng ('MYMODULE_after_build');
Chapabu

Tôi tin rằng $ form ['# after_build'] => mảng ('MYMODULE_after_build'); giống như $ form ['# after_build'] [] = 'MYMODULE_after_build'; - Lưu ý []
tecjam

Ngoài ra, hàm after_build dường như hoạt động tốt vì nó bao bọc các thuật ngữ phân loại của tôi trong div tùy chỉnh của tôi và thêm div thay thế của tôi. Chỉ có cuộc gọi lại không hoạt động ..
tecjam

Câu trả lời:


1

tạo các mục như hộp kiểm. sau khi chúng được chọn, hiển thị danh sách thả xuống với các mục này hoặc nút radio khác để chọn danh mục chính. bạn có thể ẩn trình đơn thả xuống thứ hai bằng cách sử dụng mã sau cho đến khi hộp kiểm đầu tiên được chọn.

'#states' => array(
'visible' => array(
':input[name="your checkbox"]' => array('checked' => TRUE),
 ),
)

thêm phần này vào phần tử bạn muốn ẩn. phần này sẽ chỉ hiển thị khi hộp kiểm được chọn.


0

Làm thế nào về hai danh sách, một danh sách chính có một lựa chọn, nhiều lựa chọn khác. Bạn vẫn sẽ cần giải quyết danh sách hoặc lựa chọn thứ hai để loại bỏ trùng lặp.


Xin chào và cảm ơn câu trả lời của bạn. Vâng, tất nhiên điều đó sẽ làm việc. Tuy nhiên, tôi có rất nhiều danh sách trên trang tạo nội dung và có tất cả hai lần không phải là một lựa chọn. Tôi chỉ đơn giản là trả lời câu hỏi trên vì lợi ích của một ví dụ.
tecjam
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.