@@ -19,6 +19,7 @@ function term_reference_tree_field_widget_info() {
|
||||
'select_parents' => 0,
|
||||
'cascading_selection' => 0,
|
||||
'track_list' => 0,
|
||||
'track_list_order' => 0,
|
||||
'token_display' => '',
|
||||
'parent_term_id' => '',
|
||||
'max_depth' => '',
|
||||
@@ -171,7 +172,18 @@ function term_reference_tree_field_widget_settings_form($field, $instance) {
|
||||
'#default_value' => $settings['track_list'],
|
||||
'#return_value' => 1,
|
||||
);
|
||||
|
||||
$form['track_list_order'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Track list drag and drop order'),
|
||||
'#description' => t(
|
||||
'Allow drag and drop selected terms ordering on tracklist.'),
|
||||
'#default_value' => $settings['track_list_order'],
|
||||
'#return_value' => 1,
|
||||
'#element_validate' => array('_term_reference_tree_track_list_order_validate'),
|
||||
);
|
||||
|
||||
|
||||
$form['max_depth'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Maximum Depth'),
|
||||
@@ -251,6 +263,18 @@ function _term_reference_tree_cascading_selection_validate($element, &$form_stat
|
||||
}
|
||||
}
|
||||
|
||||
function _term_reference_tree_track_list_order_validate($element, &$form_state){
|
||||
if ($form_state['values']['instance']['widget']['settings']['track_list'] == 0 && $form_state['values']['instance']['widget']['settings']['track_list_order'] == 1) {
|
||||
// This is pretty wonky syntax for the field name in form_set_error, but it's
|
||||
// correct.
|
||||
form_set_error('field][track_list_order', t('You must enable Track List if Track List Order is enabled.'));
|
||||
}
|
||||
/*
|
||||
TODO check if number of values is diffrent from 1
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process the checkbox_tree widget.
|
||||
*
|
||||
@@ -310,6 +334,7 @@ function term_reference_tree_process_checkbox_tree($element, $form_state) {
|
||||
$element[] = array(
|
||||
'#type' => 'checkbox_tree_track_list',
|
||||
'#max_choices' => $max_choices,
|
||||
'#track_list_order' => $element['#track_list_order'],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -443,7 +468,8 @@ function theme_checkbox_tree_label($variables) {
|
||||
function theme_checkbox_tree_track_list($variables) {
|
||||
//Should the label be singular or plural? Depends on cardinality of term field.
|
||||
static $nothingselected;
|
||||
|
||||
// dsm($variables, 'theme_checkbox_tree_track_list : $variables');
|
||||
|
||||
if(!$nothingselected) {
|
||||
$nothingselected = t('[Nothing selected]');
|
||||
//Add the "Nothing selected" text. To style it, replace it with whatever you want.
|
||||
@@ -459,17 +485,17 @@ function theme_checkbox_tree_track_list($variables) {
|
||||
'Selected item (click the item to uncheck it)',
|
||||
'Selected items (click an item to uncheck it)'
|
||||
);
|
||||
$order = $variables['element']['#track_list_order'] ? 'order-list' : '';
|
||||
$output =
|
||||
'<div class="term-reference-track-list-container">
|
||||
<div class="term-reference-track-list-label">' . $label . '</div>
|
||||
<ul class="term-reference-tree-track-list"><li class="term_ref_tree_nothing_message">'.$nothingselected.'</li></ul>
|
||||
<ul class="term-reference-tree-track-list '.$order.'"><li class="term_ref_tree_nothing_message">'.$nothingselected.'</li></ul>
|
||||
</div>';
|
||||
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Implements hook_widget_field_form().
|
||||
*/
|
||||
@@ -512,6 +538,7 @@ function term_reference_tree_field_widget_form(&$form, &$form_state, $field, $in
|
||||
$element['#select_parents'] = $settings['select_parents'];
|
||||
$element['#cascading_selection'] = $settings['cascading_selection'];
|
||||
$element['#track_list'] = $settings['track_list'];
|
||||
$element['#track_list_order'] = $settings['track_list_order'];
|
||||
$element['#parent_tid'] = $settings['parent_term_id'] || $field['settings']['allowed_values'][0]['parent'];
|
||||
$element['#vocabulary'] = $voc->vid;
|
||||
$element['#token_display'] = module_exists('token') ? $settings['token_display'] : '';
|
||||
@@ -523,7 +550,11 @@ function term_reference_tree_field_widget_form(&$form, &$form_state, $field, $in
|
||||
'#element_validate' => array('_term_reference_tree_widget_validate'),
|
||||
'#properties' => $properties,
|
||||
);
|
||||
|
||||
|
||||
if ($settings['track_list_order']) {
|
||||
drupal_add_library('system', 'ui.sortable');
|
||||
}
|
||||
|
||||
return $element;
|
||||
}
|
||||
|
||||
@@ -544,25 +575,58 @@ function term_reference_tree_field_widget_form(&$form, &$form_state, $field, $in
|
||||
* The validated element.
|
||||
*/
|
||||
function _term_reference_tree_widget_validate(&$element, &$form_state) {
|
||||
dsm($element, '_term_reference_tree_widget_validate | $element');
|
||||
$items = _term_reference_tree_flatten($element, $form_state);
|
||||
dsm($items, '$items');
|
||||
$value = array();
|
||||
|
||||
if ($element['#max_choices'] != 1) {
|
||||
foreach($items as $child) {
|
||||
if (array_key_exists('#value', $child) && $child['#value'] !== 0) {
|
||||
array_push($value, array($element['#value_key'] => $child['#value']));
|
||||
if(!$element['#track_list_order']){
|
||||
foreach($items as $child) {
|
||||
if (array_key_exists('#value', $child) && $child['#value'] !== 0) {
|
||||
array_push($value, array( $element['#value_key'] => $child['#value']));
|
||||
|
||||
// If the element is leaves only and select parents is on, then automatically
|
||||
// add all the parents of each selected value.
|
||||
if ($element['#select_parents'] && $element['#leaves_only']) {
|
||||
foreach($child['#parent_values'] as $parent_tid) {
|
||||
if (!in_array(array($element['#value_key'] => $parent_tid), $value)) {
|
||||
array_push($value, array($element['#value_key'] => $parent_tid));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// If the element is leaves only and select parents is on, then automatically
|
||||
// add all the parents of each selected value.
|
||||
if ($element['#select_parents'] && $element['#leaves_only']) {
|
||||
foreach($child['#parent_values'] as $parent_tid) {
|
||||
if (!in_array(array($element['#value_key'] => $parent_tid), $value)) {
|
||||
array_push($value, array($element['#value_key'] => $parent_tid));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
$selected_terms = array();
|
||||
foreach($items as $child) {
|
||||
if (array_key_exists('#value', $child) && $child['#value'] !== 0) {
|
||||
$delta = $form_state['input'][$child['#value'].'-weight'];
|
||||
$selected_terms[$delta] = array($element['#value_key'] => $child['#value']);
|
||||
|
||||
// If the element is leaves only and select parents is on, then automatically
|
||||
// add all the parents of each selected value.
|
||||
if ($element['#select_parents'] && $element['#leaves_only']) {
|
||||
foreach($child['#parent_values'] as $parent_tid) {
|
||||
if (!in_array(array($element['#value_key'] => $parent_tid), $selected_terms)) {
|
||||
$delta = $form_state['input'][$parent_tid.'-weight'];
|
||||
$selected_terms[$delta] = array($element['#value_key'] => $parent_tid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
// reorder items
|
||||
ksort($selected_terms);
|
||||
// record in value
|
||||
foreach ($selected_terms as $delta => $term) {
|
||||
$value[] = $term;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
// If it's a tree of radio buttons, they all have the same value, so we can just
|
||||
@@ -575,6 +639,8 @@ function _term_reference_tree_widget_validate(&$element, &$form_state) {
|
||||
}
|
||||
}
|
||||
|
||||
dsm($value, '$value');
|
||||
|
||||
if ($element['#required'] && empty($value)) {
|
||||
// The title is already check_plained so it's appropriate to use !.
|
||||
form_error($element, t('!name field is required.', array('!name' => $element['#title'])));
|
||||
@@ -701,7 +767,23 @@ function _term_reference_tree_build_item(&$element, &$term, &$form_state, &$valu
|
||||
$parents_for_id = array_merge($element['#parents'], array($term->tid));
|
||||
$e['#id'] = drupal_html_id('edit-' . implode('-', $parents_for_id));
|
||||
$e['#parents'] = $element['#parents'];
|
||||
}
|
||||
}else if($element['#track_list_order']){
|
||||
$delta = 0;
|
||||
$i = -1;
|
||||
if(isset($value[$term->tid])){
|
||||
foreach ($value as $tid) {
|
||||
$i++;
|
||||
if($term->tid == $tid)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$e_weight = array(
|
||||
'#type' => 'hidden',
|
||||
'#value' => $i,
|
||||
'#name' => $term->tid.'-weight',
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$e = array(
|
||||
@@ -710,9 +792,12 @@ function _term_reference_tree_build_item(&$element, &$term, &$form_state, &$valu
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
$container[$term->tid] = $e;
|
||||
|
||||
if(isset($e_weight)){
|
||||
$container[$term->tid.'-weight'] = $e_weight;
|
||||
}
|
||||
|
||||
if (($depth + 1 <= $element['#max_depth'] || !$element['#max_depth']) && property_exists($term, 'children') && count($term->children) > 0) {
|
||||
$parents = $parent_tids;
|
||||
$parents[] = $term->tid;
|
||||
|
||||
Reference in New Issue
Block a user