translation_views.views.inc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. /**
  3. * @file
  4. * Provide views extra filters/fields for translator needs.
  5. *
  6. * @ingroup views_module_handlers
  7. */
  8. use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException as PluginNotFound;
  9. use Drupal\translation_views\TranslationViewsFieldDefinitions as FieldDefinitions;
  10. /**
  11. * Implements hook_views_data_alter().
  12. *
  13. * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
  14. */
  15. function translation_views_views_data_alter(array &$data) {
  16. $content_translation_manager = \Drupal::service('content_translation.manager');
  17. foreach (\Drupal::entityTypeManager()->getDefinitions() as $entity_type_id => $entity_type) {
  18. if ($entity_type->hasHandlerClass('views_data')
  19. && $entity_type->isTranslatable()
  20. && $content_translation_manager->isEnabled($entity_type_id)
  21. ) {
  22. try {
  23. /** @var \Drupal\views\EntityViewsDataInterface $views_data */
  24. $views_data = \Drupal::entityTypeManager()->getHandler(
  25. $entity_type_id,
  26. 'views_data'
  27. );
  28. }
  29. catch (PluginNotFound $e) {
  30. throw new PluginNotFound($entity_type_id, sprintf(
  31. 'The "%s" entity type did not specify views_data handler class.',
  32. $entity_type->getLabel()
  33. ));
  34. }
  35. $field_data_table = $views_data->getViewsTableForEntityType($entity_type);
  36. if (!empty($field_data_table)) {
  37. $key = $entity_type_id . '_translation';
  38. $target_key = $key . '_target';
  39. $group = t('@entity_label translation', [
  40. '@entity_label' => $entity_type->getLabel(),
  41. ]);
  42. $translations_table =& $data[$key];
  43. $translations_table_target =& $data[$target_key];
  44. $pk = $entity_type->getKey('id');
  45. $translations_table['table'] = [
  46. 'group' => $group,
  47. 'entity type' => $entity_type_id,
  48. 'join' => [
  49. $field_data_table => [
  50. 'join_id' => 'translation_views_language_join',
  51. 'type' => 'LEFT',
  52. 'left_field' => $pk,
  53. 'field' => $pk,
  54. 'table' => $field_data_table,
  55. ],
  56. ],
  57. ];
  58. $translations_table += FieldDefinitions::buildStatusField();
  59. $translations_table += FieldDefinitions::buildTargetLanguageField();
  60. $translations_table += FieldDefinitions::buildOpLinksField();
  61. $translations_table += FieldDefinitions::buildCountField();
  62. $translations_table_target['table'] = [
  63. 'group' => $group,
  64. 'join' => [
  65. $field_data_table => [
  66. 'type' => 'LEFT',
  67. 'left_field' => $pk,
  68. 'field' => $pk,
  69. 'table' => $field_data_table,
  70. 'extra' => [
  71. [
  72. 'field' => 'langcode',
  73. 'value' => '***TRANSLATION_VIEWS_TARGET_LANG***',
  74. ],
  75. ],
  76. ],
  77. ],
  78. ];
  79. $translations_table_target += FieldDefinitions::buildOutdatedField(
  80. $translations_table['content_translation_outdated']
  81. );
  82. $translations_table_target += FieldDefinitions::buildSourceField(
  83. $translations_table['content_translation_source']
  84. );
  85. $translations_table_target += FieldDefinitions::buildDefaultLangcodeField(
  86. $translations_table['default_langcode']
  87. );
  88. $translations_table_target += FieldDefinitions::buildChangedField(
  89. $translations_table['changed']
  90. );
  91. }
  92. }
  93. }
  94. }