* 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:
- 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.
- 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_build
hà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:
HTML của biểu mẫu được hiển thị là dạng sau: