diff options
author | Dries Buytaert <dries@buytaert.net> | 2004-10-13 18:38:33 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2004-10-13 18:38:33 +0000 |
commit | 551782a5b23d8d39034d7b7c25e45e2f63767251 (patch) | |
tree | 0d4409f360ffd7f16d0f7ad05cee563e391fe0ba | |
parent | b3451d0274dcae62f72e594747278ab19697afe5 (diff) | |
download | brdo-551782a5b23d8d39034d7b7c25e45e2f63767251.tar.gz brdo-551782a5b23d8d39034d7b7c25e45e2f63767251.tar.bz2 |
- Modified patch #10424 by Jeremy: deleting terms can orphan child terms in the database.
I rewrote this patch for simplicity.
-rw-r--r-- | modules/taxonomy.module | 42 | ||||
-rw-r--r-- | modules/taxonomy/taxonomy.module | 42 |
2 files changed, 62 insertions, 22 deletions
diff --git a/modules/taxonomy.module b/modules/taxonomy.module index e8f26f7c5..dc593879f 100644 --- a/modules/taxonomy.module +++ b/modules/taxonomy.module @@ -294,19 +294,37 @@ function taxonomy_save_term($edit) { } function taxonomy_del_term($tid) { - $term = taxonomy_get_term($tid); - - db_query('DELETE FROM {term_data} WHERE tid = %d', $tid); - db_query('DELETE FROM {term_hierarchy} WHERE tid = %d', $tid); - db_query('DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d', $tid, $tid); - db_query('DELETE FROM {term_synonym} WHERE tid = %d', $tid); - db_query('DELETE FROM {term_node} WHERE tid = %d', $tid); + $tids = array($tid); + while ($tids) { + $children_tids = $orphans = array(); + foreach ($tids as $tid) { + // See if any of the term's children are about to be become orphans: + if ($children = taxonomy_get_children($tid)) { + foreach ($children as $child) { + // If the term has multiple parents, we don't delete it. + $parents = taxonomy_get_parents($child->tid); + if (count($parents) == 1) { + $orphans[] = $child->tid; + } + } + } - module_invoke_all('taxonomy', 'delete', 'term', $term); + $term = taxonomy_get_term($tid); + + db_query('DELETE FROM {term_data} WHERE tid = %d', $tid); + db_query('DELETE FROM {term_hierarchy} WHERE tid = %d', $tid); + db_query('DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d', $tid, $tid); + db_query('DELETE FROM {term_synonym} WHERE tid = %d', $tid); + db_query('DELETE FROM {term_node} WHERE tid = %d', $tid); + + module_invoke_all('taxonomy', 'delete', 'term', $term); + drupal_set_message(t('deleted term "%name".', array('%name' => $term->name))); + } + + $tids = $orphans; + } cache_clear_all(); - - return t('deleted term "%name".', array('%name' => $term->name)); } function _taxonomy_confirm_del_term($tid) { @@ -318,7 +336,9 @@ function _taxonomy_confirm_del_term($tid) { $form .= form_submit(t('Delete')); $form .= form_submit(t('Cancel')); - return form(form_item(t('Delete term "%name"', array('%name' => $term->name)), $form, t('Are you sure you want to delete the term?'))); + $output = form(form_item(t('Delete term "%name" and all its children', array('%name' => $term->name)), $form, t('Are you sure you want to delete the term and all its children (if any)?'))); + + return $output; } /** diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module index e8f26f7c5..dc593879f 100644 --- a/modules/taxonomy/taxonomy.module +++ b/modules/taxonomy/taxonomy.module @@ -294,19 +294,37 @@ function taxonomy_save_term($edit) { } function taxonomy_del_term($tid) { - $term = taxonomy_get_term($tid); - - db_query('DELETE FROM {term_data} WHERE tid = %d', $tid); - db_query('DELETE FROM {term_hierarchy} WHERE tid = %d', $tid); - db_query('DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d', $tid, $tid); - db_query('DELETE FROM {term_synonym} WHERE tid = %d', $tid); - db_query('DELETE FROM {term_node} WHERE tid = %d', $tid); + $tids = array($tid); + while ($tids) { + $children_tids = $orphans = array(); + foreach ($tids as $tid) { + // See if any of the term's children are about to be become orphans: + if ($children = taxonomy_get_children($tid)) { + foreach ($children as $child) { + // If the term has multiple parents, we don't delete it. + $parents = taxonomy_get_parents($child->tid); + if (count($parents) == 1) { + $orphans[] = $child->tid; + } + } + } - module_invoke_all('taxonomy', 'delete', 'term', $term); + $term = taxonomy_get_term($tid); + + db_query('DELETE FROM {term_data} WHERE tid = %d', $tid); + db_query('DELETE FROM {term_hierarchy} WHERE tid = %d', $tid); + db_query('DELETE FROM {term_relation} WHERE tid1 = %d OR tid2 = %d', $tid, $tid); + db_query('DELETE FROM {term_synonym} WHERE tid = %d', $tid); + db_query('DELETE FROM {term_node} WHERE tid = %d', $tid); + + module_invoke_all('taxonomy', 'delete', 'term', $term); + drupal_set_message(t('deleted term "%name".', array('%name' => $term->name))); + } + + $tids = $orphans; + } cache_clear_all(); - - return t('deleted term "%name".', array('%name' => $term->name)); } function _taxonomy_confirm_del_term($tid) { @@ -318,7 +336,9 @@ function _taxonomy_confirm_del_term($tid) { $form .= form_submit(t('Delete')); $form .= form_submit(t('Cancel')); - return form(form_item(t('Delete term "%name"', array('%name' => $term->name)), $form, t('Are you sure you want to delete the term?'))); + $output = form(form_item(t('Delete term "%name" and all its children', array('%name' => $term->name)), $form, t('Are you sure you want to delete the term and all its children (if any)?'))); + + return $output; } /** |