diff --git a/xmlsitemap.info b/xmlsitemap.info
index 0c319d8..1206723 100644
--- a/xmlsitemap.info
+++ b/xmlsitemap.info
@@ -4,6 +4,7 @@ package = XML sitemap
core = 7.x
files[] = xmlsitemap.xmlsitemap.inc
files[] = xmlsitemap.test
+files[] = xmlsitemap_views_fields.test
recommends[] = robotstxt
configure = admin/config/search/xmlsitemap
test_dependencies[] = robotstxt:robotstxt
diff --git a/xmlsitemap.module b/xmlsitemap.module
index a05c7c8..dfd09f4 100644
--- a/xmlsitemap.module
+++ b/xmlsitemap.module
@@ -290,6 +290,16 @@ function xmlsitemap_robotstxt() {
}
}
+
+/**
+ * Implements hook_views_api().
+ */
+function xmlsitemap_views_api() {
+ return array(
+ 'api' => 3,
+ );
+}
+
/**
* Internal default variables for xmlsitemap_var().
*/
diff --git a/xmlsitemap.views.inc b/xmlsitemap.views.inc
new file mode 100644
index 0000000..d2c0e12
--- /dev/null
+++ b/xmlsitemap.views.inc
@@ -0,0 +1,128 @@
+ $field) {
+ $data[$table_alias][$field_name] = $field;
+ }
+ }
+ }
+ return $data;
+}
+
+/**
+ * Table information.
+ *
+ * @param array $info
+ * Information about how the entity type is represented by xmlsitemap.
+ *
+ * @return array
+ * An array of table data based on the information about the entity type.
+ * Most importantly it returns join data for the table alias,
+ * which is different each time.
+ */
+function _xmlsitemap_table_data(array $info) {
+ $table_data = array();
+ $table_data['group'] = t('XML sitemap');
+ // Gets the base table (node, user, etc.) from $info.
+ $table_data['join'][$info['base table']] = array(
+ 'table' => 'xmlsitemap',
+ 'field' => 'id',
+ // Gets the field name (nid, uid, etc.) from $info.
+ 'left_field' => $info['entity keys']['id'],
+ 'extra' => array(
+ array(
+ 'field' => 'type',
+ // Also filters on the entity type (node, user, etc.),
+ // not to be confused with the base table name above.
+ 'value' => $info['type'],
+ 'operator' => '=',
+ ),
+ ),
+ );
+ return $table_data;
+}
+
+/**
+ * Field information.
+ *
+ * @return array
+ * Returns the field information for four fields
+ * (status, status override, priority, priority override)
+ * that can be shown in views. These are always the same
+ * no matter what entity type the view is showing.
+ */
+function _xmlsitemap_field_data() {
+ $field_data = array();
+ $field_data['status'] = array(
+ 'title' => t('Inclusion'),
+ 'help' => t('Is this included in the XML sitemap?'),
+ 'field' => array(
+ 'handler' => 'views_handler_field_boolean',
+ ),
+ 'sort' => array(
+ 'handler' => 'views_handler_sort',
+ ),
+ 'filter' => array(
+ 'handler' => 'views_handler_filter_boolean_operator',
+ ),
+ );
+ $field_data['status_override'] = array(
+ 'title' => t('Inclusion override'),
+ 'help' => t('Was the XML sitemap inclusion overridden, or left as the default?'),
+ 'field' => array(
+ 'handler' => 'views_handler_field_boolean',
+ ),
+ 'sort' => array(
+ 'handler' => 'views_handler_sort',
+ ),
+ 'filter' => array(
+ 'handler' => 'views_handler_filter_boolean_operator',
+ ),
+ );
+ $field_data['priority'] = array(
+ 'title' => t('Priority'),
+ 'help' => t('The XML sitemap priority.'),
+ 'field' => array(
+ 'handler' => 'views_handler_field_numeric',
+ 'click sortable' => TRUE,
+ ),
+ 'sort' => array(
+ 'handler' => 'views_handler_sort',
+ ),
+ );
+ $field_data['priority_override'] = array(
+ 'title' => t('Priority override'),
+ 'help' => t('Was the XML sitemap priority overridden, or left as the default?'),
+ 'field' => array(
+ 'handler' => 'views_handler_field_boolean',
+ ),
+ 'sort' => array(
+ 'handler' => 'views_handler_sort',
+ ),
+ 'filter' => array(
+ 'handler' => 'views_handler_filter_boolean_operator',
+ ),
+ );
+ return $field_data;
+}
diff --git a/xmlsitemap_views_fields.test b/xmlsitemap_views_fields.test
new file mode 100644
index 0000000..84c12b9
--- /dev/null
+++ b/xmlsitemap_views_fields.test
@@ -0,0 +1,145 @@
+ 'XML sitemap views fields',
+ 'description' => 'Functional tests for providing xmlsitemap fields to views.',
+ 'group' => 'XML sitemap',
+ );
+ }
+
+ /**
+ * Setup before any tests are run.
+ *
+ * @see DrupalWebTestCase::setUp()
+ */
+ protected function setUp($modules = array()) {
+ $modules[] = 'views';
+ $modules[] = 'xmlsitemap_node';
+ parent::setUp($modules);
+ }
+
+ /**
+ * Test that views can show XML sitemap settings on nodes.
+ */
+ public function testNodeSettings() {
+ // Create a node.
+ $node = $this->drupalCreateNode();
+ // Create view with xmlsitemap fields.
+ $view = $this->nodeView();
+ $view->save();
+ // Load view, check that xmlsitemap fields are not overridden.
+ $this->drupalGet('xmlsitemap-node-fields');
+ $this->assertRaw('0.5');
+ $this->assertRaw('No');
+ $this->assertRaw('No');
+ $this->assertRaw('No');
+ // Override xmlsitemap fields for node.
+ $node->xmlsitemap['priority'] = 0.6;
+ $node->xmlsitemap['priority_override'] = 1;
+ $node->xmlsitemap['status'] = 1;
+ $node->xmlsitemap['status_override'] = 1;
+ node_save($node);
+ // Re-load view, check that xmlsitemap fields are overridden.
+ $this->drupalGet('xmlsitemap-node-fields');
+ $this->assertRaw('0.6');
+ $this->assertRaw('Yes');
+ $this->assertRaw('Yes');
+ $this->assertRaw('Yes');
+ }
+
+ /**
+ * An exported view.
+ *
+ * @return view
+ * A view of nodes that displays the XML sitemap fields.
+ */
+ private function nodeView() {
+ $view = new view();
+ $view->name = 'xmlsitemap_views_fields_nodes';
+ $view->description = '';
+ $view->tag = 'default';
+ $view->base_table = 'node';
+ $view->human_name = 'XML sitemap node fields';
+ $view->core = 7;
+ $view->api_version = '3.0';
+ $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+ /* Display: Master */
+ $handler = $view->new_display('default', 'Master', 'default');
+ $handler->display->display_options['title'] = 'XML sitemap node fields';
+ $handler->display->display_options['use_more_always'] = FALSE;
+ $handler->display->display_options['access']['type'] = 'perm';
+ $handler->display->display_options['cache']['type'] = 'none';
+ $handler->display->display_options['query']['type'] = 'views_query';
+ $handler->display->display_options['exposed_form']['type'] = 'basic';
+ $handler->display->display_options['pager']['type'] = 'none';
+ $handler->display->display_options['pager']['options']['offset'] = '0';
+ $handler->display->display_options['style_plugin'] = 'default';
+ $handler->display->display_options['style_options']['default_row_class'] = FALSE;
+ $handler->display->display_options['style_options']['row_class_special'] = FALSE;
+ $handler->display->display_options['row_plugin'] = 'fields';
+ /* Field: Content: Title */
+ $handler->display->display_options['fields']['title']['id'] = 'title';
+ $handler->display->display_options['fields']['title']['table'] = 'node';
+ $handler->display->display_options['fields']['title']['field'] = 'title';
+ $handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
+ $handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
+ $handler->display->display_options['fields']['title']['element_default_classes'] = FALSE;
+ $handler->display->display_options['fields']['title']['link_to_node'] = FALSE;
+ /* Field: XML sitemap: Inclusion */
+ $handler->display->display_options['fields']['status']['id'] = 'status';
+ $handler->display->display_options['fields']['status']['table'] = 'xmlsitemap_node';
+ $handler->display->display_options['fields']['status']['field'] = 'status';
+ $handler->display->display_options['fields']['status']['element_type'] = 'span';
+ $handler->display->display_options['fields']['status']['element_class'] = 'xmlsitemap-inclusion';
+ $handler->display->display_options['fields']['status']['element_default_classes'] = FALSE;
+ $handler->display->display_options['fields']['status']['not'] = 0;
+ /* Field: XML sitemap: Inclusion override */
+ $handler->display->display_options['fields']['status_override']['id'] = 'status_override';
+ $handler->display->display_options['fields']['status_override']['table'] = 'xmlsitemap_node';
+ $handler->display->display_options['fields']['status_override']['field'] = 'status_override';
+ $handler->display->display_options['fields']['status_override']['element_type'] = 'span';
+ $handler->display->display_options['fields']['status_override']['element_class'] = 'xmlsitemap-inclusion-override';
+ $handler->display->display_options['fields']['status_override']['element_default_classes'] = FALSE;
+ $handler->display->display_options['fields']['status_override']['not'] = 0;
+ /* Field: XML sitemap: Priority */
+ $handler->display->display_options['fields']['priority']['id'] = 'priority';
+ $handler->display->display_options['fields']['priority']['table'] = 'xmlsitemap_node';
+ $handler->display->display_options['fields']['priority']['field'] = 'priority';
+ $handler->display->display_options['fields']['priority']['element_type'] = 'span';
+ $handler->display->display_options['fields']['priority']['element_class'] = 'xmlsitemap-priority';
+ $handler->display->display_options['fields']['priority']['element_default_classes'] = FALSE;
+ $handler->display->display_options['fields']['priority']['separator'] = '';
+ /* Field: XML sitemap: Priority override */
+ $handler->display->display_options['fields']['priority_override']['id'] = 'priority_override';
+ $handler->display->display_options['fields']['priority_override']['table'] = 'xmlsitemap_node';
+ $handler->display->display_options['fields']['priority_override']['field'] = 'priority_override';
+ $handler->display->display_options['fields']['priority_override']['element_type'] = 'span';
+ $handler->display->display_options['fields']['priority_override']['element_class'] = 'xmlsitemap-priority-override';
+ $handler->display->display_options['fields']['priority_override']['element_default_classes'] = FALSE;
+ $handler->display->display_options['fields']['priority_override']['not'] = 0;
+
+ /* Display: Page */
+ $handler = $view->new_display('page', 'Page', 'page');
+ $handler->display->display_options['path'] = 'xmlsitemap-node-fields';
+
+ return $view;
+ }
+
+ // LATER: Test taxonomy_term.
+ // LATER: Test user.
+}