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);
+ }
+}