View source
<?php
module_load_include('inc', 'term_reference_tree', 'term_reference_tree.field');
module_load_include('inc', 'term_reference_tree', 'term_reference_tree.widget');
function term_reference_tree_element_info() {
$types = array(
'checkbox_tree' => array(
'#input' => true,
'#process' => array(
'term_reference_tree_process_checkbox_tree',
),
'#theme' => array(
'checkbox_tree',
),
'#pre_render' => array(
'form_pre_render_conditional_form_element',
),
),
'checkbox_tree_level' => array(
'#input' => false,
'#theme' => array(
'checkbox_tree_level',
),
'#pre_render' => array(
'form_pre_render_conditional_form_element',
),
),
'checkbox_tree_item' => array(
'#input' => false,
'#theme' => array(
'checkbox_tree_item',
),
'#pre_render' => array(
'form_pre_render_conditional_form_element',
),
),
'checkbox_tree_label' => array(
'#input' => false,
'#theme' => array(
'checkbox_tree_label',
),
'#pre_render' => array(
'form_pre_render_conditional_form_element',
),
),
'checkbox_tree_track_list' => array(
'#input' => false,
'#theme' => array(
'checkbox_tree_track_list',
),
'#pre_render' => array(
'form_pre_render_conditional_form_element',
),
),
);
return $types;
}
function term_reference_tree_theme() {
return array(
'checkbox_tree' => array(
'render element' => 'element',
),
'checkbox_tree_level' => array(
'render element' => 'element',
),
'checkbox_tree_item' => array(
'render element' => 'element',
),
'checkbox_tree_label' => array(
'render element' => 'element',
),
'checkbox_tree_track_list' => array(
'render element' => 'element',
),
'term_tree_list' => array(
'render element' => 'element',
),
);
}
function _term_reference_tree_get_term_hierarchy($tid, $vid, &$allowed, $filter, $label, $default = array()) {
$terms = _term_reference_tree_get_children($tid, $vid, $default);
$result = array();
if ($filter != '') {
foreach ($allowed as $k => $v) {
if (array_key_exists($k, $terms)) {
$term =& $terms[$k];
$children = _term_reference_tree_get_term_hierarchy($term->tid, $vid, $allowed, $filter, $label, $default);
if (is_array($children)) {
$term->children = $children;
$term->children_selected = _term_reference_tree_children_selected($term, $default);
}
else {
$term->children_selected = FALSE;
}
$term->TEST = $label;
array_push($result, $term);
}
}
}
else {
foreach ($terms as &$term) {
if ($filter == '' || array_key_exists($term->tid, $allowed)) {
$children = _term_reference_tree_get_term_hierarchy($term->tid, $vid, $allowed, $filter, $label, $default);
if (is_array($children)) {
$term->children = $children;
$term->children_selected = _term_reference_tree_children_selected($term, $default);
}
else {
$term->children_selected = FALSE;
}
$term->TEST = $label;
array_push($result, $term);
}
}
}
return $result;
}
function _term_reference_tree_get_children($tid, $vid) {
$select = db_select('taxonomy_term_data', 'd');
$select
->join('taxonomy_term_hierarchy', 'h', 'd.tid = h.tid');
$result = $select
->fields('d', array(
'tid',
'name',
))
->condition('d.vid', $vid, '=')
->condition('h.parent', $tid, '=')
->orderBy('weight')
->orderBy('name')
->orderBy('tid')
->execute();
$terms = array();
while ($term = $result
->fetchAssoc()) {
$terms[$term['tid']] = (object) $term;
}
return $terms;
}
function _term_reference_tree_children_selected($terms, $default) {
foreach ($terms->children as $term) {
if (isset($default[$term->tid]) || $term->children_selected) {
return true;
}
}
return false;
}
function _term_reference_tree_get_parent($tid) {
$q = db_query_range("select h.parent from {taxonomy_term_hierarchy} h where h.tid = :tid", 0, 1, array(
':tid' => $tid,
));
$t = 0;
foreach ($q as $term) {
$t = $term->parent;
}
return $t;
}
function _term_reference_tree_flatten($element, &$form_state) {
$output = array();
$children = element_children($element);
foreach ($children as $c) {
$child = $element[$c];
if (array_key_exists('#type', $child) && ($child['#type'] == 'radio' || $child['#type'] == 'checkbox')) {
$output[] = $child;
}
else {
$output = array_merge($output, _term_reference_tree_flatten($child, $form_state));
}
}
return $output;
}
function _term_reference_tree_get_options(&$terms, &$allowed, $filter) {
$options = array();
if (is_array($terms) && count($terms) > 0) {
foreach ($terms as $term) {
if (!$filter || is_array($allowed) && $allowed[$term->tid]) {
$options[$term->tid] = entity_label('taxonomy_term', $term);
$options += _term_reference_tree_get_options($term->children, $allowed, $filter);
}
}
}
return $options;
}