EntityTranslationActionsAdd.class.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. /**
  3. * @file
  4. * Et_action plugin class.
  5. */
  6. class EntityTranslationActionsAdd extends EntityTranslationActionsBasic {
  7. /**
  8. * Function checks if plugin available for selected entity type.
  9. */
  10. public function available() {
  11. return entity_translation_enabled($this->entityType);
  12. }
  13. /**
  14. * Function function executes plugin actions.
  15. */
  16. public function action($entity, $context, $handler = NULL) {
  17. $handler = $handler ? $handler : entity_translation_get_handler($this->entityType, $entity);
  18. $lang_source = ($this->options['source'] == '-entity-') ? $this->entityLanguage($entity, $handler, FALSE) : $this->options['source'];
  19. $language_target = ($this->options['language'] == '-entity-') ? $this->entityLanguage($entity, $handler, FALSE) : $this->options['language'];
  20. if ($lang_source == $language_target) {
  21. return;
  22. }
  23. $translations = $handler->getTranslations();
  24. // No source translation;
  25. if ((!$lang_source || !$translations || !isset($translations->data[$lang_source])) && $lang_source != LANGUAGE_NONE) {
  26. return ENTITY_TRANSLATION_ACTIONS_RESULT_NO_SOURCE;
  27. }
  28. // Target translation exists;
  29. if (isset($translations->data[$language_target]) && $this->options['translation_exists'] == ENTITY_TRANSLATION_ACTIONS_TRANSLATION_SKIP) {
  30. return ENTITY_TRANSLATION_ACTIONS_RESULT_EXISTS;
  31. }
  32. list(,, $bundle_name) = entity_extract_ids($this->entityType, $entity);
  33. // Clone field translations.
  34. foreach (field_info_instances($this->entityType, $bundle_name) as $instance) {
  35. $field_name = $instance['field_name'];
  36. $field = field_info_field($field_name);
  37. if ($field['translatable']) {
  38. $original_item = isset($entity->{$field_name}[$lang_source]) ? $entity->{$field_name}[$lang_source] : NULL;
  39. // MERGE. Add item if not empty and no value for language.
  40. if ($original_item && !isset($entity->{$field_name}[$language_target])) {
  41. $entity->{$field_name}[$language_target] = $original_item;
  42. }
  43. // REPLACE. Replace existing value for language.
  44. // Or remode it if source values is empty.
  45. elseif ($this->options['translation_exists'] == ENTITY_TRANSLATION_ACTIONS_TRANSLATION_REPLACE) {
  46. if ($original_item) {
  47. $entity->{$field_name}[$language_target] = $original_item;
  48. }
  49. else {
  50. unset($entity->{$field_name}[$language_target]);
  51. }
  52. }
  53. }
  54. }
  55. // Create new translation.
  56. if ($language_target != LANGUAGE_NONE) {
  57. $lang_entity = $handler->getLanguage();
  58. $new_translation = isset($translations->data[$lang_source]) ? $translations->data[$lang_source] : array();
  59. $new_translation['status'] = TRUE;
  60. $new_translation['language'] = $language_target;
  61. $new_translation['source'] = ($lang_entity == $language_target) ? FALSE : $lang_entity;
  62. $handler->setTranslation($new_translation);
  63. }
  64. return ENTITY_TRANSLATION_ACTIONS_RESULT_CREATED;
  65. }
  66. /**
  67. * Function builds form elements for action.
  68. */
  69. public function formBuild(&$form, &$form_state) {
  70. $options = $this->languagesOptions();
  71. $options_keys = array_keys($options);
  72. $form['source'] = array(
  73. '#type' => 'radios',
  74. '#options' => $options,
  75. '#title' => t('Original language:'),
  76. '#required' => TRUE,
  77. '#default_value' => current($options_keys),
  78. );
  79. $form['language'] = array(
  80. '#type' => 'radios',
  81. '#options' => $options,
  82. '#title' => t('New language:'),
  83. '#required' => TRUE,
  84. );
  85. $form['translation_exists'] = array(
  86. '#type' => 'select',
  87. '#options' => $this->translationExistsOptions(),
  88. '#title' => t('Actions for existing translation:'),
  89. );
  90. }
  91. /**
  92. * Function returns options ways for resolving conflicts in translations.
  93. */
  94. protected function translationExistsOptions() {
  95. return array(
  96. ENTITY_TRANSLATION_ACTIONS_TRANSLATION_SKIP => t('SKIP ANY actions if translation exists'),
  97. ENTITY_TRANSLATION_ACTIONS_TRANSLATION_REPLACE => t('REPLACE ALL existing values with new'),
  98. ENTITY_TRANSLATION_ACTIONS_TRANSLATION_MERGE => t('ADD NEW values if existing translation is empty'),
  99. );
  100. }
  101. }