views_handler_sort_node_language.inc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. /**
  3. * Sort handler that allows sorting on a specific language.
  4. *
  5. * @ingroup views_sort_handlers
  6. */
  7. class views_handler_sort_node_language extends views_handler_sort {
  8. /**
  9. * {@inheritdoc}
  10. */
  11. function can_expose() {
  12. return FALSE;
  13. }
  14. /**
  15. * {@inheritdoc}
  16. */
  17. function query() {
  18. if (isset($this->options['language'])) {
  19. $langcode = $this->get_system_langcode($this->options['language']);
  20. // Validate the langcode.
  21. if (preg_match('/^[a-z0-9\-]+$/i', $langcode)) {
  22. $this->ensure_my_table();
  23. // See https://stackoverflow.com/questions/14104055/ordering-by-specific-field-value-first
  24. $formula = "{$this->table_alias}_language = '{$langcode}'";
  25. $this->query->add_orderby($this->table_alias, NULL, $this->options['order'], $formula);
  26. }
  27. }
  28. }
  29. /**
  30. * Converts a views language code into a Drupal language code.
  31. */
  32. function get_system_langcode($langcode) {
  33. global $language_content;
  34. $default_language = language_default('language');
  35. $system_langcode = str_replace(array(
  36. '***CURRENT_LANGUAGE***',
  37. '***DEFAULT_LANGUAGE***',
  38. ),
  39. array(
  40. $language_content->language,
  41. $default_language,
  42. ),
  43. $langcode);
  44. return $system_langcode;
  45. }
  46. /**
  47. * {@inheritdoc}
  48. */
  49. function option_definition() {
  50. $options = parent::option_definition();
  51. $options['language'] = array('default' => '***CURRENT_LANGUAGE***');
  52. return $options;
  53. }
  54. /**
  55. * {@inheritdoc}
  56. */
  57. function admin_summary() {
  58. $summary = parent::admin_summary();
  59. if ($this->options['language']) {
  60. $language_options = $this->get_language_options();
  61. $summary = t('@order, @language', array(
  62. '@order' => $summary,
  63. '@language' => $language_options[$this->options['language']],
  64. ));
  65. }
  66. return $summary;
  67. }
  68. /**
  69. * Returns languages to sort by.
  70. *
  71. * @return array
  72. * All the languages.
  73. */
  74. function get_language_options() {
  75. $languages = array(
  76. '***CURRENT_LANGUAGE***' => t("Current user's language"),
  77. '***DEFAULT_LANGUAGE***' => t("Default site language"),
  78. LANGUAGE_NONE => t('No language')
  79. );
  80. $languages = array_merge($languages, views_language_list());
  81. return $languages;
  82. }
  83. /**
  84. * {@inheritdoc}
  85. */
  86. function show_sort_form(&$form, &$form_state) {
  87. parent::show_sort_form($form, $form_state);
  88. $form['language'] = array(
  89. '#type' => 'radios',
  90. '#title' => t("Specific language"),
  91. '#description' => t("Choose which specific language to sort by. Not to be confused with the 'Language' sort handler, which sorts by language."),
  92. '#options' => $this->get_language_options(),
  93. '#default_value' => $this->options['language'],
  94. );
  95. }
  96. }