tmgmt_node.plugin.inc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * @file
  4. * Provides the node source plugin controller.
  5. */
  6. class TMGMTNodeSourcePluginController extends TMGMTDefaultSourcePluginController {
  7. /**
  8. * {@inheritdoc}
  9. *
  10. * Returns the data from the fields as a structure that can be processed by
  11. * the Translation Management system.
  12. */
  13. public function getData(TMGMTJobItem $job_item) {
  14. $node = node_load($job_item->item_id);
  15. $source_language = $job_item->getJob()->source_language;
  16. $languages = language_list();
  17. // If the node language is not the same as the job source language try to
  18. // load its translation for the job source language.
  19. if ($node->language != $source_language) {
  20. $translation_loaded = FALSE;
  21. foreach (translation_node_get_translations($node->nid) as $language => $translation) {
  22. if ($language == $source_language) {
  23. $node = node_load($translation->nid);
  24. $translation_loaded = TRUE;
  25. break;
  26. }
  27. }
  28. if (!$translation_loaded) {
  29. throw new TMGMTException(t('Unable to load %language translation for the node %title',
  30. array('%language' => $languages[$source_language]->name, '%title' => $node->title)));
  31. }
  32. }
  33. $type = node_type_get_type($node);
  34. // Get all the fields that can be translated and arrange their values into
  35. // a specific structure.
  36. $structure = tmgmt_field_get_source_data('node', $node, $job_item->getJob()->source_language);
  37. $structure['node_title']['#label'] = $type->title_label;
  38. $structure['node_title']['#text'] = $node->title;
  39. return $structure;
  40. }
  41. /**
  42. * {@inheritdoc}
  43. */
  44. public function saveTranslation(TMGMTJobItem $job_item) {
  45. if ($node = node_load($job_item->item_id)) {
  46. $job = $job_item->getJob();
  47. if (empty($node->tnid)) {
  48. // We have no translation source nid, this is a new set, so create it.
  49. $node->tnid = $node->nid;
  50. node_save($node);
  51. }
  52. $translations = translation_node_get_translations($node->tnid);
  53. if (isset($translations[$job->target_language])) {
  54. // We have already a translation for the source node for the target
  55. // language, so load it.
  56. $tnode = node_load($translations[$job->target_language]->nid);
  57. }
  58. else {
  59. // We don't have a translation for the source node yet, so create one.
  60. $tnode = clone $node;
  61. unset($tnode->nid, $tnode->vid, $tnode->uuid, $tnode->vuuid);
  62. $tnode->language = $job->target_language;
  63. $tnode->translation_source = $node;
  64. }
  65. // Allow modules and translator plugins to alter, for example in the
  66. // case of creating revisions for translated nodes, or altering
  67. // properties of the tnode before saving.
  68. drupal_alter('tmgmt_before_update_node_translation', $tnode, $node, $job_item);
  69. // Time to put the translated data into the node.
  70. $data = $job_item->getData();
  71. // Special case for the node title.
  72. if (isset($data['node_title']['#translation']['#text'])) {
  73. $tnode->title = $data['node_title']['#translation']['#text'];
  74. unset($data['node_title']);
  75. }
  76. tmgmt_field_populate_entity('node', $tnode, $job->target_language, $data, FALSE);
  77. // Reset translation field, which determines outdated status.
  78. $tnode->translation['status'] = 0;
  79. node_save($tnode);
  80. // We just saved the translation, set the sate of the job item to
  81. // 'finished'.
  82. $job_item->accepted();
  83. }
  84. }
  85. /**
  86. * {@inheritdoc}
  87. */
  88. public function getLabel(TMGMTJobItem $job_item) {
  89. if ($node = node_load($job_item->item_id)) {
  90. return entity_label('node', $node);
  91. }
  92. return parent::getLabel($job_item);
  93. }
  94. /**
  95. * {@inheritdoc}
  96. */
  97. public function getUri(TMGMTJobItem $job_item) {
  98. if ($node = node_load($job_item->item_id)) {
  99. return entity_uri('node', $node);
  100. }
  101. return parent::getUri($job_item);
  102. }
  103. /**
  104. * {@inheritdoc}
  105. */
  106. public function getType(TMGMTJobItem $job_item) {
  107. if ($node = node_load($job_item->item_id)) {
  108. return node_type_get_name($node);
  109. }
  110. return parent::getType($job_item);
  111. }
  112. /**
  113. * {@inheritdoc}
  114. */
  115. public function getSourceLangCode(TMGMTJobItem $job_item) {
  116. if ($node = node_load($job_item->item_id)) {
  117. return entity_language('node', $node);
  118. }
  119. return NULL;
  120. }
  121. /**
  122. * {@inheritdoc}
  123. */
  124. public function getExistingLangCodes(TMGMTJobItem $job_item) {
  125. $existing_lang_codes = array();
  126. if ($node = node_load($job_item->item_id)) {
  127. $existing_lang_codes = array(entity_language('node', $node));
  128. }
  129. if ($translations = translation_node_get_translations($job_item->item_id)) {
  130. $existing_lang_codes = array_unique(array_merge($existing_lang_codes, array_keys($translations)));
  131. }
  132. return $existing_lang_codes;
  133. }
  134. }