123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- <?php
- /**
- * @file
- * Provides methods for other modules to use with translated content.
- */
- /**
- * Implement hook_node_delete().
- *
- * Manages translation information for nodes.
- */
- function translation_helpers_node_delete($node) {
- // Only act if we are dealing with a content type supporting translations.
- if (translation_supported_type($node->type)) {
- translation_helpers_invoke_translation_change($node);
- }
- }
- /**
- * Invoke hook_node_translation_change() to allow modules to respond to a change in
- * source translation.
- *
- * Follows logic in translation_remove_from_set().
- *
- * Sample implementation:
- * <code>
- * function example_node_translation_change($node) {
- * if (isset($node->translation_change)) {
- * // If there is only one node remaining, track by nid rather than tnid. Otherwise, use
- * // the new tnid.
- * $new = $node->translation_change['new_tnid'] == 0 ? $node->translation_change['remaining_nid'] : $node->translation_change['new_tnid'];
- * db_update('example')
- * ->fields(array('id' => $new))
- * ->condition('id', $node->translation_change['old_tnid'])
- * ->execute();
- * }
- * }
- * </code>
- */
- function translation_helpers_invoke_translation_change($node) {
- if (isset($node->tnid)) {
- if (db_query('SELECT COUNT(*) FROM {node} WHERE tnid = :tnid', array(':tnid' => $node->tnid))->fetchField() == 1) {
- // There is only one node left in the set.
- $node->translation_change = array(
- 'old_tnid' => $node->tnid,
- 'new_tnid' => 0,
- // Determine the remaining former member of the translation set.
- // May be needed e.g. to reassign existing data from the tnid to this nid.
- 'remaining_nid' => db_query('SELECT nid FROM {node} WHERE tnid = :tnid', array(':tnid' => $node->tnid))->fetchField(),
- );
- // Allow other modules to respond to the removal of this translation set.
- module_invoke_all('node_translation_change', $node);
- }
- else {
- // If the node being removed was the source of the translation set,
- // we pick a new source - preferably one that is up to date.
- if ($node->tnid == $node->nid) {
- $node->translation_change = array(
- 'old_tnid' => $node->tnid,
- 'new_tnid' => db_query('SELECT nid FROM {node} WHERE tnid = :tnid ORDER BY translate ASC, nid ASC', array(':tnid' => $node->tnid))->fetchField(),
- );
- // Allow other modules to respond to the changed source for this translation set.
- module_invoke_all('node_translation_change', $node);
- }
- }
- }
- }
- /**
- * Implement hook_module_implements_alter().
- *
- * Set translation_helpers to act before translation module.
- */
- function translation_helpers_module_implements_alter(&$implementations, $hook) {
- if ($hook == 'node_delete') {
- // Move translation_helpers_node_delete() to the beginning of the list.
- $group = $implementations['translation_helpers'];
- unset($implementations['translation_helpers']);
- $implementations = array_merge(array('translation_helpers' => $group), $implementations);
- }
- }
- /**
- * Return the source translation of a node.
- */
- function translation_helpers_get_source($node) {
- if (isset($node->tnid) && translation_supported_type($node->type)) {
- // A node can be its own source.
- if ($node->nid == $node->tnid) {
- return $node;
- }
- return node_load($node->tnid);
- }
- return FALSE;
- }
- /**
- * Return the translation of a node in a given language.
- */
- function translation_helpers_get_translation($node, $language) {
- if (isset($node->tnid) && translation_supported_type($node->type)) {
- $translations = translation_node_get_translations($node->tnid);
- if (isset($translations[$language])) {
- return node_load($translations[$language]->nid);
- }
- }
- return FALSE;
- }
|