diff --git a/metatag_views/metatag_views.info b/metatag_views/metatag_views.info new file mode 100644 index 0000000..f2e72cc --- /dev/null +++ b/metatag_views/metatag_views.info @@ -0,0 +1,9 @@ +name = Meta tags: Views +description = Provides Meta tags integration with Views and the Views UI. +package = Meta tags +core = 7.x + +dependencies[] = metatag +dependencies[] = views + +files[] = metatag_views_plugin_display_extender_metatags.inc diff --git a/metatag_views/metatag_views.install b/metatag_views/metatag_views.install new file mode 100644 index 0000000..deafaeb --- /dev/null +++ b/metatag_views/metatag_views.install @@ -0,0 +1,24 @@ + t('Views')); + return $info; +} + +/** + * Implements hook_metatag_config_default(). + */ +function metatag_views_metatag_config_default() { + $configs = array(); + + $config = new stdClass(); + $config->instance = 'view'; + $config->api_version = 1; + $config->disabled = FALSE; + $config->config = array( + 'title' => array('value' => '[view:title] | [site:name]'), + 'description' => array('value' => '[view:description]'), + 'canonical' => array('value' => '[view:url]'), + ); + $configs[$config->instance] = $config; + + return $configs; +} diff --git a/metatag_views/metatag_views.module b/metatag_views/metatag_views.module new file mode 100644 index 0000000..e94bbb1 --- /dev/null +++ b/metatag_views/metatag_views.module @@ -0,0 +1,89 @@ + 3); +} + +/** + * Implements hook_ctools_plugin_api(). + */ +function metatag_views_ctools_plugin_api($owner, $api) { + if ($owner == 'metatag' && $api == 'metatag') { + return array('version' => 1); + } +} + +function metatag_views_views_display_has_metatags(views_plugin_display $display) { + if (method_exists($display, 'has_metatags')) { + return $display->has_metatags(); + } + else { + return $display->has_path() && $display->uses_breadcrumb(); + } +} + +/** + * Implements hook_view_preview_info_alter(). + */ +function metatag_views_views_preview_info_alter(&$rows, $view) { + if (metatag_views_views_display_has_metatags($view->display_handler)) { + $instance = 'view:' . $view->name; + $metatags = $view->display_handler->get_option('metatags'); + $metatags = !empty($metatags) ? $metatags : array(); + + // Set the page title to be the previewed views title before fetching + // meta tag values. + $title = drupal_set_title(); + if ($view_title = $view->get_title()) { + drupal_set_title($view_title); + } + + $options['token data']['view'] = $view; + $values = metatag_metatags_values($instance, $metatags, $options); + foreach ($values as $metatag => $value) { + $metatag_info = metatag_get_info('tags', $metatag); + $values[$metatag] = check_plain($metatag_info['label']) . ': ' . check_plain($value); + } + $rows['query'][] = array( + '' . t('Meta tags') . '', + implode('
', $values), + ); + + // Restore the page title. + drupal_set_title($title); + } +} + +/** + * Implements hook_page_alter(). + */ +function metatag_views_page_alter(&$page) { + if ($view = views_get_page_view()) { + // The following is taken from views_get_page_view() + // If a module is still putting in the display like we used to, catch that. + if (is_subclass_of($view, 'views_plugin_display')) { + $view = $view->view; + } + + if (metatag_views_views_display_has_metatags($view->display_handler)) { + $metatags = $view->display_handler->get_option('metatags'); + $metatags = !empty($metatags) ? $metatags : array(); + + // Build options for meta tag rendering. + $instance = 'view:' . $view->name; + $options = array(); + $options['token data']['view'] = $view; + + // Add the metatags. + $page['content']['metatags'][$instance] = metatag_metatags_view($instance, $metatags, $options); + } + } +} diff --git a/metatag_views/metatag_views.tokens.inc b/metatag_views/metatag_views.tokens.inc new file mode 100644 index 0000000..0ebc7d1 --- /dev/null +++ b/metatag_views/metatag_views.tokens.inc @@ -0,0 +1,102 @@ + t('View'), + 'description' => t('Tokens related to views.'), + 'needs-data' => 'view', + ); + $info['tokens']['view']['name'] = array( + 'name' => t('Name'), + 'description' => t('The human-readable name of the view.'), + ); + $info['tokens']['view']['description'] = array( + 'name' => t('Description'), + 'description' => t('The description of the view.'), + ); + $info['tokens']['view']['machine-name'] = array( + 'name' => t('Machine name'), + 'description' => t('The machine-readable name of the view.'), + ); + $info['tokens']['view']['title'] = array( + 'name' => t('Title'), + 'description' => t('The title of current display of the view.'), + ); + $info['tokens']['view']['url'] = array( + 'name' => t('URL'), + 'description' => t('The URL of the view.'), + 'type' => 'url', + ); + + return $info; +} + +/** + * Implements hook_tokens(). + */ +function metatag_views_tokens($type, $tokens, array $data = array(), array $options = array()) { + if (module_hook('views', 'tokens')) { + return array(); + } + + $url_options = array('absolute' => TRUE); + if (isset($options['language'])) { + $url_options['language'] = $options['language']; + } + $sanitize = !empty($options['sanitize']); + $langcode = isset($options['language']) ? $options['language']->language : NULL; + + $replacements = array(); + + if ($type == 'view' && !empty($data['view'])) { + $view = $data['view']; + + foreach ($tokens as $name => $original) { + switch ($name) { + case 'name': + $replacements[$original] = $sanitize ? check_plain($view->human_name) : $view->human_name; + break; + + case 'description': + $replacements[$original] = $sanitize ? check_plain($view->description) : $view->description; + break; + + case 'machine-name': + $replacements[$original] = $view->name; + break; + + case 'title': + $title = $view->get_title(); + $replacements[$original] = $sanitize ? check_plain($title) : $title; + break; + + case 'url': + if ($path = $view->get_url()) { + $replacements[$original] = url($path, $url_options); + } + break; + } + } + + // [view:url:*] nested tokens. This only works if Token module is installed. + if ($url_tokens = token_find_with_prefix($tokens, 'url')) { + if ($path = $view->get_url()) { + $replacements += token_generate('url', $url_tokens, array('path' => $path), $options); + } + } + } + + return $replacements; +} diff --git a/metatag_views/metatag_views.views.inc b/metatag_views/metatag_views.views.inc new file mode 100644 index 0000000..5933983 --- /dev/null +++ b/metatag_views/metatag_views.views.inc @@ -0,0 +1,21 @@ + t('Meta tags'), + 'help' => t('Provides meta tags for views.'), + 'handler' => 'metatag_views_plugin_display_extender_metatags', + 'enabled' => TRUE, + ); + + return $plugins; +} diff --git a/metatag_views/metatag_views_plugin_display_extender_metatags.inc b/metatag_views/metatag_views_plugin_display_extender_metatags.inc new file mode 100644 index 0000000..f560212 --- /dev/null +++ b/metatag_views/metatag_views_plugin_display_extender_metatags.inc @@ -0,0 +1,58 @@ +display); + } + + function options_definition_alter(&$options) { + $options['metatags'] = array('default' => array()); + } + + function options_summary(&$categories, &$options) { + if ($this->has_metatags()) { + $categories['metatags'] = array( + 'title' => t('Meta tags'), + 'column' => 'second', + ); + $metatags = $this->display->get_option('metatags'); + $options['metatags'] = array( + 'category' => 'metatags', + 'title' => t('Meta tags'), + 'value' => !empty($metatags) ? t('Overridden') : t('Using defaults'), + ); + } + } + + function options_form(&$form, &$form_state) { + if ($form_state['section'] == 'metatags') { + $form['#title'] .= t('The meta tags for this display'); + $instance = 'view:' . $form_state['view']->name; + $metatags = $this->display->get_option('metatags'); + $metatags = !empty($metatags) ? $metatags : array(); + $options['token types'] = array('view'); + $options['context'] = 'view'; + metatag_metatags_form($form, $instance, $metatags, $options); + $form['metatags']['#type'] = 'container'; + } + } + + function options_submit(&$form, &$form_state) { + if ($form_state['section'] == 'metatags') { + $metatags = $form_state['values']['metatags']; + metatag_filter_values_from_defaults($metatags); + $this->display->set_option('metatags', $metatags); + } + } + + function pre_execute() { + //dpm($this->display); + //$metatags = $this->display->get_option('metatags'); + //dpm($metatags); + } +}