Commit a4e5fedf authored by Dave Reid's avatar Dave Reid

by Dave Reid: Fixed most of xmlsitemap_taxonomy and entity code. Rebuilding is still broken.

parent 122f48be
......@@ -24,7 +24,7 @@ function xmlsitemap_settings_form() {
$form['xmlsitemap']['xmlsitemap_minimum_lifetime'] = array(
'#type' => 'select',
'#title' => t('Minimum sitemap lifetime'),
'#options' => array(0 => t('No minimum')) + drupal_map_assoc(array(300, 900, 1800, 3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800), 'format_interval'),
'#options' => array(0 => t('No minimum')) + drupal_map_assoc(array(300, 900, 1800, 3600, 10800, 21600, 43200, 86400, 172800, 259200, 604800), 'format_interval'),
'#default_value' => xmlsitemap_var('minimum_lifetime')
);
$form['xmlsitemap']['xmlsitemap_xsl'] = array(
......@@ -191,8 +191,8 @@ function xmlsitemap_settings_form_submit($form, $form_state) {
* @see xmlsitemap_rebuild_form_submit()
*/
function xmlsitemap_rebuild_form() {
if (!$_POST && !xmlsitemap_var('rebuild_needed')) {
if (!xmlsitemap_var('regenerate_needed')) {
if (!$_POST && !variable_get('xmlsitemap_rebuild_needed', FALSE)) {
if (!variable_get('xmlsitemap_regenerate_needed', FALSE)) {
drupal_set_message(t('Your sitemap is up to date and does not need to be rebuilt.'), 'error');
}
else {
......@@ -201,16 +201,20 @@ function xmlsitemap_rebuild_form() {
}
}
// Show only the modules that implement the 6.x-2.x hooks.
$modules = module_implements('xmlsitemap_link_info', TRUE);
$form['modules'] = array(
$entities = xmlsitemap_get_link_info();
foreach ($entities as $entity => $info) {
if (empty($info['base table'])) {
// Only show entities which can be rebuilt.
unset($entities[$entity]);
}
}
$form['entities'] = array(
'#type' => 'select',
'#title' => t("Select which modules' links you would like to rebuild"),
'#description' => t('If no modules are selected, the sitemap files will just be regenerated.'),
'#title' => t("Select which link types you would like to rebuild"),
'#description' => t('If no link types are selected, the sitemap files will just be regenerated.'),
'#multiple' => TRUE,
'#options' => drupal_map_assoc($modules),
'#default_value' => xmlsitemap_var('rebuild_needed') || !xmlsitemap_var('developer_mode') ? $modules : array(),
'#options' => drupal_map_assoc(array_keys($entities)),
'#default_value' => xmlsitemap_var('rebuild_needed') || !xmlsitemap_var('developer_mode') ? array_keys($entities) : array(),
'#access' => xmlsitemap_var('developer_mode'),
);
$form['save_custom'] = array(
......@@ -240,7 +244,7 @@ function xmlsitemap_rebuild_form_submit($form, &$form_state) {
variable_set('xmlsitemap_rebuild_needed', TRUE);
module_load_include('inc', 'xmlsitemap');
$batch = xmlsitemap_rebuild_batch($form_state['values']['modules'], $form_state['values']['save_custom']);
$batch = xmlsitemap_rebuild_batch($form_state['values']['entities'], $form_state['values']['save_custom']);
batch_set($batch);
$form_state['redirect'] = 'admin/config/search/xmlsitemap';
}
......@@ -249,14 +253,6 @@ function xmlsitemap_rebuild_form_submit($form, &$form_state) {
* Add a table summary for an entity and its bundles.
*/
function xmlsitemap_add_form_entity_summary(&$form, $entity, array $entity_info) {
$header = array(
t('Type'),
t('Inclusion'),
t('Priority'),
t('Total'),
t('Indexed'),
t('Visible'),
);
$priorities = xmlsitemap_get_priority_options(NULL, FALSE);
$statuses = xmlsitemap_get_status_options(NULL);
......@@ -296,6 +292,14 @@ function xmlsitemap_add_form_entity_summary(&$form, $entity, array $entity_info)
}
if ($rows) {
$header = array(
$entity_info['bundle label'],
t('Inclusion'),
t('Priority'),
t('Available'),
t('Indexed'),
t('Visible'),
);
$rows[] = array(
array(
'data' => t('Totals'),
......
......@@ -344,7 +344,7 @@ function xmlsitemap_generate_index($handle, &$status, $language) {
/**
* Batch information callback.
*/
function xmlsitemap_rebuild_batch($modules = array(), $save_custom = FALSE) {
function xmlsitemap_rebuild_batch($entities = array(), $save_custom = FALSE) {
$batch = array(
'operations' => array(),
'finished' => 'xmlsitemap_rebuild_batch_finished',
......@@ -353,13 +353,11 @@ function xmlsitemap_rebuild_batch($modules = array(), $save_custom = FALSE) {
);
// Purge any links first.
$batch['operations'][] = array('xmlsitemap_rebuild_batch_clear', array($modules, $save_custom));
$batch['operations'][] = array('xmlsitemap_rebuild_batch_clear', array($entities, $save_custom));
// Fetch all the sitemap links and save them to the {xmlsitemap} table.
foreach ($modules as $module) {
if (module_hook($module, 'xmlsitemap_links')) {
$batch['operations'][] = array('xmlsitemap_rebuild_batch_fetch', array($module));
}
foreach ($entities as $entity) {
$batch['operations'][] = array('xmlsitemap_rebuild_batch_fetch', array($entity));
}
// Generate all the sitemap pages.
......@@ -373,22 +371,12 @@ function xmlsitemap_rebuild_batch($modules = array(), $save_custom = FALSE) {
}
/**
* Batch callback; clear sitemap links for modules.
* Batch callback; clear sitemap links for entites.
*/
function xmlsitemap_rebuild_batch_clear($modules, $save_custom, &$context) {
$purge = array();
foreach ($modules as $module) {
$types = module_invoke($module, 'xmlsitemap_link_info');
foreach ($types as $type => $info) {
if ($info['purge']) {
$purge[] = $type;
}
}
}
if ($purge) {
function xmlsitemap_rebuild_batch_clear(array $entities, $save_custom, &$context) {
if (!empty($entities)) {
$query = db_delete('xmlsitemap');
$query->condition('type', $purge);
$query->condition('type', $entities);
// If we want to save the custom data, make sure to exclude any links
// that are not using default inclusion or priority.
if ($save_custom) {
......
......@@ -777,6 +777,7 @@ function xmlsitemap_get_link_info($type = NULL, $reset = FALSE) {
if ($reset) {
$link_info = NULL;
entity_info_cache_clear();
}
elseif ($cached = cache_get('xmlsitemap:link_info:' . $language->language)) {
$link_info = $cached->data;
......@@ -802,8 +803,6 @@ function xmlsitemap_get_link_info($type = NULL, $reset = FALSE) {
'type' => $key,
'base table' => FALSE,
'bundles' => array(),
'object keys' => array(),
'admin' => array(),
);
}
drupal_alter('xmlsitemap_link_info', $link_info);
......
......@@ -5,15 +5,34 @@
* Implements hook_xmlsitemap_link_info().
*/
function xmlsitemap_menu_xmlsitemap_link_info() {
return array(
'menu' => array(
'purge' => TRUE,
'table' => 'menu_links',
$types['menu'] = array(
'label' => t('Menu'),
'bundle label' => t('Menu title'),
'base table' => 'menu_links',
'object keys' => array(
'id' => 'mlid',
'subtype' => 'menu_name',
'subtypes' => xmlsitemap_menu_get_menus(),
'bundle' => 'menu_name',
),
'path callback' => 'xmlsitemap_menu_path',
);
foreach (menu_get_menus() as $menu => $name) {
$types['menu']['bundles'][$menu] = array(
'label' => $name,
'admin' => array(
'real path' => 'admin/structure/menu/manage/' . $menu . '/edit',
'access arguments' => array('administer menu'),
),
'xmlsitemap' => array(
'priority' => variable_get('xmlsitemap_menu_priority_' . $menu, 0.5),
'status' => variable_get('xmlsitemap_menu_status_' . $menu, 0),
),
);
}
return $types;
}
function xmlsitemap_menu_path($menu_item) {
return $menu_item['link_path'];
}
/**
......
......@@ -5,6 +5,8 @@
* Implements hook_entity_info_alter().
*/
function xmlsitemap_node_entity_info_alter(&$entity_info) {
$entity_info['node']['label'] = t('Content');
$entity_info['node']['bundle label'] = t('Content type');
$entity_info['node']['xmlsitemap'] = array();
foreach (node_type_get_names() as $type => $name) {
$entity_info['node']['bundles'][$type]['xmlsitemap'] = array(
......
......@@ -5,6 +5,7 @@
* Implements hook_entity_info_alter().
*/
function xmlsitemap_taxonomy_entity_info_alter(&$entity_info) {
$entity_info['taxonomy_term']['bundle label'] = t('Vocabulary name');
$entity_info['taxonomy_term']['xmlsitemap'] = array();
foreach (taxonomy_vocabulary_get_names() as $machine_name => $vocabulary) {
$entity_info['taxonomy_term']['bundles'][$machine_name]['xmlsitemap'] = array(
......@@ -14,6 +15,21 @@ function xmlsitemap_taxonomy_entity_info_alter(&$entity_info) {
}
}
/**
* Implements hook_xmlsitemap_link_info_alter().
*/
function xmlsitemap_taxonomy_xmlsitemap_link_info_alter(&$link_info) {
// Change taxonomy term bundle type from machine name to vid.
$link_info['taxonomy_term']['object keys']['bundle'] = 'vid';
foreach (taxonomy_vocabulary_get_names() as $machine_name => $vocabulary) {
// Adjust the edit path to the *real* edit path.
$link_info['taxonomy_term']['bundles'][$machine_name]['admin']['path'] .= '/edit';
$link_info['taxonomy_term']['bundles'][$machine_name]['admin']['real path'] .= '/edit';
$link_info['taxonomy_term']['bundles'][$vocabulary->vid] = $link_info['taxonomy_term']['bundles'][$machine_name];
unset($link_info['taxonomy_term']['bundles'][$machine_name]);
}
}
/**
* Implements hook_cron().
*
......@@ -28,7 +44,7 @@ function xmlsitemap_taxonomy_cron() {
*/
function xmlsitemap_taxonomy_xmlsitemap_index_links($limit) {
if ($vids = xmlsitemap_taxonomy_get_vids()) {
$tids = db_query_range("SELECT t.tid FROM {term_data} t LEFT JOIN {xmlsitemap} x ON x.type = 'taxonomy_term' AND t.tid = x.id WHERE x.id IS NULL AND t.vid IN (:vids) ORDER BY t.tid DESC", 0, $limit, array(':vids' => $vids))->fetchCol();
$tids = db_query_range("SELECT t.tid FROM {taxonomy_term_data} t LEFT JOIN {xmlsitemap} x ON x.type = 'taxonomy_term' AND t.tid = x.id WHERE x.id IS NULL AND t.vid IN (:vids) ORDER BY t.tid DESC", 0, $limit, array(':vids' => $vids))->fetchCol();
$terms = taxonomy_term_load_multiple($tids);
foreach ($terms as $term) {
$link = xmlsitemap_taxonomy_create_link($term);
......@@ -44,7 +60,7 @@ function xmlsitemap_taxonomy_xmlsitemap_links($offset = 0, $limit = 0) {
$links = array();
if ($vids = xmlsitemap_taxonomy_get_vids()) {
$sql = "SELECT t.tid FROM {term_data} t WHERE t.tid > :tid AND t.vid IN (:vids) ORDER BY t.tid";
$sql = "SELECT t.tid FROM {taxonomy_term_data} t WHERE t.tid > :tid AND t.vid IN (:vids) ORDER BY t.tid";
$args = array(':tid' => $offset, ':vids' => $vids);
$tids = ($limit ? db_query_range($sql, 0, $limit, $args)->fetchCol() : db_query($sql, $args)->fetchCol());
$terms = taxonomy_term_load_multiple($tids);
......@@ -63,7 +79,7 @@ function xmlsitemap_taxonomy_xmlsitemap_links($offset = 0, $limit = 0) {
function xmlsitemap_taxonomy_xmlsitemap_links_batch_info() {
$vids = xmlsitemap_taxonomy_get_vids();
return array(
'max' => $vids ? db_query("SELECT COUNT(t.tid) FROM {term_data} t WHERE t.vid IN (:vids)", array(':vids' => $vids))->fetchField() : 0,
'max' => $vids ? db_query("SELECT COUNT(t.tid) FROM {taxonomy_term_data} t WHERE t.vid IN (:vids)", array(':vids' => $vids))->fetchField() : 0,
);
}
......@@ -83,18 +99,6 @@ function xmlsitemap_taxonomy_form_taxonomy_form_vocabulary_alter(&$form, $form_s
);
xmlsitemap_add_form_type_options($form, 'taxonomy', $options);
// @todo Enable these features:
//$form['xmlsitemap']['xmlsitemap_taxonomy_calculate_priority'] = array(
// '#type' => 'checkbox',
// '#title' => t('Calculate priority based on term depth and weight.'),
// '#default_value' => xmlsitemap_taxonomy_var('calculate_priority_' . $vid),
//);
//$form['xmlsitemap']['xmlsitemap_taxonomy_include_empty_terms'] = array(
// '#type' => 'checkbox',
// '#title' => t('Include terms that do not have any associated content.'),
// '#default_value' => xmlsitemap_taxonomy_var('include_empty_terms_' . $vid),
//);
// The submit and delete buttons need to be weighted down.
$form['submit'] += array('#weight' => 50);
if (isset($form['delete'])) {
......@@ -158,28 +162,35 @@ function xmlsitemap_taxonomy_form_taxonomy_form_term_alter(&$form, $form_state)
}
/**
* Implements hook_taxonomy().
* Implements hook_taxonomy_vocabulary_delete().
*/
function xmlsitemap_taxonomy_taxonomy($op, $type, $array = NULL) {
if ($type == 'vocabulary') {
$vid = $array['vid'];
// Insert and update actions handled by xmlsitemap_taxonomy_taxonomy_form_vocabulary_submit().
if ($op == 'delete') {
xmlsitemap_link_delete_multiple(array('type' => 'taxonomy_term', 'subtype' => $vid));
variable_del('xmlsitemap_taxonomy_status_' . $vid);
variable_del('xmlsitemap_taxonomy_priority_' . $vid);
}
}
if ($type == 'term') {
$tid = $array['tid'];
if ($op == 'insert' || $op == 'update') {
$link = xmlsitemap_taxonomy_create_link((object) $array);
xmlsitemap_save_link($link);
}
elseif ($op == 'delete') {
xmlsitemap_link_delete('taxonomy_term', $tid);
}
}
function xmlsitemap_taxonomy_vocabulary_delete(stdClass $vocabulary) {
xmlsitemap_link_delete_multiple(array('type' => 'taxonomy_term', 'subtype' => $vocabulary->vid));
variable_del('xmlsitemap_taxonomy_status_' . $vocabulary->vid);
variable_del('xmlsitemap_taxonomy_priority_' . $vocabulary->vid);
}
/**
* Implements hook_taxonomy_term_insert() {
*/
function xmlsitemap_taxonomy_term_insert(stdClass $term) {
$link = xmlsitemap_taxonomy_create_link($term);
xmlsitemap_save_link($link);
}
/**
* Implements hook_taxonomy_term_update() {
*/
function xmlsitemap_taxonomy_term_update(stdClass $term) {
$link = xmlsitemap_taxonomy_create_link($term);
xmlsitemap_save_link($link);
}
/**
* Implements hook_taxonomy_term_delete() {
*/
function xmlsitemap_taxonomy_term_delete(stdClass $term) {
xmlsitemap_link_delete('taxonomy_term', $term->tid);
}
/**
......@@ -222,43 +233,42 @@ function xmlsitemap_taxonomy_create_link(stdClass $term) {
/**
* Calculate the priority of a taxonomy term based on depth and weight.
*/
function xmlsitemap_taxonomy_calculate_term_priority($term) {
/*function xmlsitemap_taxonomy_calculate_term_priority(stdClass $term) {
// Calculate priority.
// Min weight = -128
// Max weight = 127
// Max depth = ?
return NULL;
}
}*/
/**
* Find the tree depth of a taxonomy term.
*
* @param $tid
* A term ID.
* @param $term
* A taxonomy term object.
* @return
* The tree depth of the term.
*/
function xmlsitemap_taxonomy_get_term_depth($tid) {
function xmlsitemap_taxonomy_get_term_depth(stdClass $term) {
static $depths = array();
if (!isset($depths[$tid])) {
if ($parent = db_query("SELECT parent FROM {term_hierarchy} WHERE tid = %d", $tid)->fetchField()) {
if (!isset($depths[$term->tid])) {
if ($parent = db_query("SELECT parent FROM {term_hierarchy} WHERE tid = %d", $term->tid)->fetchField()) {
// If the term has a parent, the term's depth is the parent's depth + 1.
if (!isset($depths[$parent])) {
$depths[$parent] = xmlsitemap_taxonomy_get_term_depth($parent);
}
$depths[$tid] = $depths[$parent] + 1;
$depths[$term->tid] = $depths[$parent] + 1;
}
else {
// Term has no parents, so depth is 0.
$depths[$tid] = 0;
$depths[$term->tid] = 0;
}
}
return $depths[$tid];
return $depths[$term->tid];
}
function xmlsitemap_taxonomy_get_node_count($term) {
function xmlsitemap_taxonomy_get_node_count(stdClass $term) {
// @todo Use db_rewrite_sql() w/ switch user.
return db_query_range("SELECT COUNT(tn.nid) FROM {term_node} tn LEFT JOIN {node n} USING (nid) WHERE tn.tid = :tid AND n.status = 1", 0, 1, array(':tid' => $term->tid))->fetchField();
}
......@@ -304,22 +314,3 @@ function xmlsitemap_taxonomy_variables() {
// $defaults['xmlsitemap_taxonomy_include_empty_terms_' . $vid] = TRUE;
// return $defaults;
//}
/**
* Internal implementation of variable_get().
*/
function xmlsitemap_taxonomy_var($name, $default = NULL) {
static $defaults = NULL;
if (!isset($defaults)) {
$defaults = xmlsitemap_taxonomy_variables();
}
$name = 'xmlsitemap_taxonomy_' . $name;
// @todo Remove when stable.
if (!isset($defaults[$name])) {
trigger_error(t('Default variable for %variable not found.', array('%variable' => $name)));
}
return variable_get($name, isset($default) || !isset($defaults[$name]) ? $default : $defaults[$name]);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment