From 4b1685af048e412a58c9a417cab3308e5eed8cfa Mon Sep 17 00:00:00 2001 From: bachy Date: Sat, 27 Oct 2012 16:13:15 +0200 Subject: [PATCH] EntityMalformedException PATCH http://drupal.org/node/1595358 Signed-off-by: bachy --- ...-missing-vocabulary-machine-name.patch.txt | 34 +++ term_reference_tree.module | 12 + term_reference_tree.module.orig | 226 ++++++++++++++++++ 3 files changed, 272 insertions(+) create mode 100644 term_reference_tree-missing-vocabulary-machine-name.patch.txt create mode 100644 term_reference_tree.module.orig diff --git a/term_reference_tree-missing-vocabulary-machine-name.patch.txt b/term_reference_tree-missing-vocabulary-machine-name.patch.txt new file mode 100644 index 00000000..9a88add8 --- /dev/null +++ b/term_reference_tree-missing-vocabulary-machine-name.patch.txt @@ -0,0 +1,34 @@ +diff --git a/htdocs/sites/default/modules/contrib/term_reference_tree/term_reference_tree.module b/htdocs/sites/default/modules/contrib/term_reference_tree/term_reference_tree.module +index f479a0e..70343fc 100644 +--- a/htdocs/sites/default/modules/contrib/term_reference_tree/term_reference_tree.module ++++ b/htdocs/sites/default/modules/contrib/term_reference_tree/term_reference_tree.module +@@ -82,10 +82,17 @@ function _term_reference_tree_get_term_hierarchy($tid, $vid, &$allowed, $filter, + + $result = array(); + ++ $vocab = taxonomy_vocabulary_load( $vid ); ++ + if ($filter != '') { + foreach($allowed as $k => $v) { + if (array_key_exists($k, $terms)) { + $term =& $terms[$k]; ++ ++ if ( !isset($term->vocabulary_machine_name) && !empty($vocab) ) { ++ $term->vocabulary_machine_name = $vocab->machine_name; ++ } ++ + $children = _term_reference_tree_get_term_hierarchy($term->tid, $vid, $allowed, $filter, $label, $default); + if (is_array($children)) { + $term->children = $children; +@@ -102,6 +109,11 @@ function _term_reference_tree_get_term_hierarchy($tid, $vid, &$allowed, $filter, + else { + foreach($terms as &$term) { + if ($filter == '' || array_key_exists($term->tid, $allowed)) { ++ ++ if ( !isset($term->vocabulary_machine_name) && !empty($vocab) ) { ++ $term->vocabulary_machine_name = $vocab->machine_name; ++ } ++ + $children = _term_reference_tree_get_term_hierarchy($term->tid, $vid, $allowed, $filter, $label, $default); + if (is_array($children)) { + $term->children = $children; diff --git a/term_reference_tree.module b/term_reference_tree.module index 4346ed47..caaee155 100644 --- a/term_reference_tree.module +++ b/term_reference_tree.module @@ -82,10 +82,17 @@ function _term_reference_tree_get_term_hierarchy($tid, $vid, &$allowed, $filter, $result = array(); + $vocab = taxonomy_vocabulary_load( $vid ); + if ($filter != '') { foreach($allowed as $k => $v) { if (array_key_exists($k, $terms)) { $term =& $terms[$k]; + + if ( !isset($term->vocabulary_machine_name) && !empty($vocab) ) { + $term->vocabulary_machine_name = $vocab->machine_name; + } + $children = _term_reference_tree_get_term_hierarchy($term->tid, $vid, $allowed, $filter, $label, $default); if (is_array($children)) { $term->children = $children; @@ -102,6 +109,11 @@ function _term_reference_tree_get_term_hierarchy($tid, $vid, &$allowed, $filter, else { foreach($terms as &$term) { if ($filter == '' || array_key_exists($term->tid, $allowed)) { + + if ( !isset($term->vocabulary_machine_name) && !empty($vocab) ) { + $term->vocabulary_machine_name = $vocab->machine_name; + } + $children = _term_reference_tree_get_term_hierarchy($term->tid, $vid, $allowed, $filter, $label, $default); if (is_array($children)) { $term->children = $children; diff --git a/term_reference_tree.module.orig b/term_reference_tree.module.orig new file mode 100644 index 00000000..4346ed47 --- /dev/null +++ b/term_reference_tree.module.orig @@ -0,0 +1,226 @@ + 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; +} + +/** + * Implements hook_theme(). + */ +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', + ), + ); +} + + +/** + * This function returns a taxonomy term hierarchy in a nested array. + * + * @param $tid + * The ID of the root term. + * @param $vid + * The vocabulary ID to restrict the child search. + * + * @return + * A nested array of the term's child objects. + */ +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; +} + +/** + * This function is like taxonomy_get_children, except it doesn't load the entire term. + * + * @param $tid + * The ID of the term whose children you want to get. + * @param $vid + * The vocabulary ID. + * + * @return + * An array of taxonomy terms, each in the form array('tid' => $tid, 'name' => $name) + */ +function _term_reference_tree_get_children($tid, $vid) { + // DO NOT LOAD TAXONOMY TERMS HERE + // Taxonomy terms take a lot of time and memory to load, and this can be + // very bad on large vocabularies. Instead, we load the term as necessary + // in cases where it's needed (such as using tokens or when the locale + // module is enabled). + $select = db_select('taxonomy_term_data', 'd'); + $select->join('taxonomy_term_hierarchy', 'h', 'd.tid = h.tid'); + $result = $select->fields('d', array('tid', 'vid', '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; +} + +/** + * Recursively go through the option tree and return a flat array of + * options + */ +function _term_reference_tree_flatten($element, &$form_state) { + $output = array(); + $children = element_children($element); + foreach($children as $c) { + $child = $element[$c]; + // dsm($child, '$child'); + 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; +} + +/** + * Return an array of options. + * + * This function converts a list of taxonomy terms to a key/value list of options. + * + * @param $terms + * An array of taxonomy term IDs. + * @param $allowed + * An array containing the terms allowed by the filter view + * @param $filter + * A string defining the view to filter by (only used to detect whether view + * filtering is enabled + * + * @return + * A key/value array of taxonomy terms (name => id) + */ +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; +} +