metatag_views.module 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. /**
  3. * @file
  4. * Provides native meta tag integration with Views.
  5. */
  6. // This is used to join the view name and the display name when building the
  7. // context string.
  8. define('METATAG_VIEWS_CONTEXT_SEPARATOR', '__');
  9. /**
  10. * Implements hook_views_api().
  11. */
  12. function metatag_views_views_api() {
  13. return array('api' => 3.0);
  14. }
  15. /**
  16. * Implements hook_ctools_plugin_api().
  17. */
  18. function metatag_views_ctools_plugin_api($owner, $api) {
  19. if ($owner == 'metatag' && $api == 'metatag') {
  20. return array('version' => 1);
  21. }
  22. }
  23. /**
  24. * Implements hook_view_preview_info_alter().
  25. */
  26. function metatag_views_views_preview_info_alter(&$rows, $view) {
  27. $metatags = $view->display_handler->get_option('metatags');
  28. if (!is_array($metatags) || empty($metatags)) {
  29. return;
  30. }
  31. // If meta tags were found but they're not nested for the language, fix it.
  32. // This leaves some possibility for future versions to support translation.
  33. if (!empty($metatags) && !isset($metatags[LANGUAGE_NONE])) {
  34. $metatags = array(LANGUAGE_NONE => $metatags);
  35. }
  36. // Set the page title to be the previewed views title before fetching meta
  37. // tag values.
  38. $title = drupal_set_title();
  39. if ($view_title = $view->get_title()) {
  40. drupal_set_title($view_title);
  41. }
  42. $instance = 'view:' . $view->name;
  43. $options['token data']['view'] = $view;
  44. $values = metatag_metatags_values($instance, $metatags, $options);
  45. $use_views_tokens = $view->display_handler->get_option('metatags_tokenize');
  46. foreach ($values as $metatag => $value) {
  47. $metatag_info = metatag_get_info('tags', $metatag);
  48. // If enabled, use replacement tokens from the first Views result row.
  49. if ($value && $use_views_tokens) {
  50. $value = $view->style_plugin->tokenize_value($value, 0);
  51. }
  52. $values[$metatag] = check_plain($metatag_info['label']) . ': ' . check_plain($value);
  53. }
  54. if (!empty($values)) {
  55. $rows['query'][] = array(
  56. '<strong>' . t('Meta tags') . '</strong>',
  57. implode('<br />', $values),
  58. );
  59. }
  60. // Restore the page title.
  61. drupal_set_title($title);
  62. }
  63. /**
  64. * Implements hook_page_alter().
  65. */
  66. function metatag_views_page_alter(&$page) {
  67. // By default do not add meta tags to admin pages. To enable meta tags on
  68. // admin pages set the 'metatag_tag_admin_pages' variable to TRUE.
  69. if (path_is_admin(current_path()) && !variable_get('metatag_tag_admin_pages', FALSE)) {
  70. return;
  71. }
  72. $view = views_get_page_view();
  73. // Check if Views metatags are enabled.
  74. if (!empty($view) && metatag_config_is_enabled('view')) {
  75. global $language;
  76. // The following is taken from views_get_page_view().
  77. // If a module is still putting in the display like we used to, catch that.
  78. if (is_subclass_of($view, 'views_plugin_display')) {
  79. $view = $view->view;
  80. }
  81. // Prevent Views settings from overwriting global:frontpage.
  82. if (drupal_is_front_page() && metatag_config_is_enabled('global:frontpage')) {
  83. return;
  84. }
  85. // Include only view name by default.
  86. $instance = 'view:' . $view->name;
  87. // Include display name if option is overridden.
  88. if (!$view->display_handler->is_defaulted('metatags')) {
  89. $instance = 'view:' . $view->name . ':' . $view->current_display;
  90. }
  91. // Load the meta tags for this view.
  92. $metatags = $view->display_handler->get_option('metatags');
  93. // Only proceed if there's something to work with.
  94. if (!empty($metatags) && is_array($metatags)) {
  95. // If meta tags were found but they're not nested for the language, fix
  96. // it. This leaves some possibility for future versions to support
  97. // translation.
  98. if (!isset($metatags[LANGUAGE_NONE])) {
  99. $metatags = array(LANGUAGE_NONE => $metatags);
  100. }
  101. // Translate all of the meta tags using i18n, but don't update the
  102. // strings.
  103. metatag_translate_metatags($metatags[LANGUAGE_NONE], 'metatag_views:' . $view->name . METATAG_VIEWS_CONTEXT_SEPARATOR . $view->current_display, NULL, FALSE);
  104. // If enabled, use replacement tokens from the first Views result row.
  105. if ($view->display_handler->get_option('metatags_tokenize')) {
  106. // If the Views output was loaded from the Views output cache, the
  107. // fields won't have been rendered and thus the first row tokens would
  108. // be empty. Therefore, in this case, we manually trigger rendering of
  109. // the first row.
  110. _metatag_views_render_first_row($view);
  111. foreach ($metatags as $langcode => $values) {
  112. foreach ($values as $metatag => $config) {
  113. if (!empty($config['value']) && is_scalar($config['value'])) {
  114. $metatags[$langcode][$metatag]['value'] = $view->style_plugin->tokenize_value($config['value'], 0);
  115. }
  116. }
  117. }
  118. }
  119. // Build options for meta tag rendering.
  120. $options = array();
  121. $options['token data']['view'] = $view;
  122. $options['language'] = $language->language;
  123. // The page region can be changed.
  124. $region = variable_get('metatag_page_region', 'content');
  125. // Add the metatags.
  126. $page[$region]['metatags'][$instance] = metatag_metatags_view($instance, $metatags, $options);
  127. }
  128. }
  129. }
  130. /**
  131. * Triggers rendering of the first row of the Views result set.
  132. *
  133. * This is used as a helper function in metatag_views_page_alter() to have the
  134. * necessary field tokens available.
  135. *
  136. * @param view $view
  137. * The view for which result fields should be rendered.
  138. */
  139. function _metatag_views_render_first_row(view $view) {
  140. $result = $view->result;
  141. if (!$result) {
  142. return;
  143. }
  144. // We only need the first row of the results.
  145. $result = array_intersect_key($result, array(0 => TRUE));
  146. $view->style_plugin->render_fields($result);
  147. }