diff --git a/js/simple_sitemap.form.js b/js/simple_sitemap.form.js index 04cb661..40944e4 100644 --- a/js/simple_sitemap.form.js +++ b/js/simple_sitemap.form.js @@ -34,6 +34,9 @@ $('.form-item-simple-sitemap-priority').hide(); } }); + + + // Show 'Regenerate sitemap' field if setting has changed. $("#edit-simple-sitemap-priority").change(function() { $('.form-item-simple-sitemap-regenerate-now').show(); diff --git a/js/simple_sitemap.sitemapEntities.js b/js/simple_sitemap.sitemapEntities.js index 0c08ef1..c4d4458 100644 --- a/js/simple_sitemap.sitemapEntities.js +++ b/js/simple_sitemap.sitemapEntities.js @@ -29,12 +29,16 @@ $.each(atomicEntities, function(index, value) { var enabledId = '#edit-' + value + '-enabled'; var priorityId = '.form-item-' + value + '-simple-sitemap-priority'; + var skipUntranslated = '.form-item-' + value + '-simple-sitemap-skip-untranslated'; + if ($(context).find(enabledId).is(':checked')) { // Show 'Priority' field if 'Index sitemap' is ticked. $(priorityId).show(); + $(skipUntranslated).show(); } else { // Hide 'Priority' field if 'Index sitemap' is empty. $(priorityId).hide(); + $(skipUntranslated).hide(); } }); @@ -61,14 +65,18 @@ $.each(atomicEntities, function(index, value) { var enabledId = '#edit-' + value + '-enabled'; var priorityId = '.form-item-' + value + '-simple-sitemap-priority'; + var skipUntranslated = '.form-item-' + value + '-simple-sitemap-skip-untranslated'; + $(enabledId).change(function() { if ($(context).find(enabledId).is(':checked')) { // Show 'Priority' field if 'Index sitemap' is ticked. $(priorityId).show(); + $(skipUntranslated).show(); } else { // Hide 'Priority' field if 'Index sitemap' is empty. $(priorityId).hide(); + $(skipUntranslated).hide(); } }); // Show 'Regenerate sitemap' field if setting has changed. diff --git a/simple_sitemap.module b/simple_sitemap.module index bfabf6d..bdc2488 100644 --- a/simple_sitemap.module +++ b/simple_sitemap.module @@ -72,12 +72,20 @@ function simple_sitemap_entity_form_submit($form, &$form_state) { case 'bundle': $f->bundleName = !empty($f->bundleName) ? $f->bundleName : $f->getFormEntityId(); - $generator->setBundleSettings($f->entityTypeId, $f->bundleName, ['index' => $values['simple_sitemap_index_content'], 'priority' => $values['simple_sitemap_priority']]); + $generator->setBundleSettings($f->entityTypeId, $f->bundleName, [ + 'index' => $values['simple_sitemap_index_content'], + 'priority' => $values['simple_sitemap_priority'], + 'skip_untranslated' => $values['simple_sitemap_skip_untranslated'], + ]); break; case 'instance': $f->instanceId = !empty($f->instanceId) ? $f->instanceId : $f->getFormEntityId(); - $generator->setEntityInstanceSettings($f->entityTypeId, $f->instanceId, ['index' => $values['simple_sitemap_index_content'], 'priority' => $values['simple_sitemap_priority']]); + $generator->setEntityInstanceSettings($f->entityTypeId, $f->instanceId, [ + 'index' => $values['simple_sitemap_index_content'], + 'priority' => $values['simple_sitemap_priority'], + 'skip_untranslated' => $values['simple_sitemap_skip_untranslated'], + ]); break; } diff --git a/src/Batch.php b/src/Batch.php index b55f696..5144311 100644 --- a/src/Batch.php +++ b/src/Batch.php @@ -197,7 +197,31 @@ class Batch { $alternate_urls = []; foreach ($languages as $language) { $langcode = $language->getId(); - if (!$batch_info['skip_untranslated'] || $language->isDefault() || $entity->hasTranslation($langcode)) { + + $skip_untranslated = FALSE; + // Check entity_id settings. + if (isset($batch_info['entity_types'][$entity_info['entity_type_name']][$entity_info['bundle_name']]['entities'][$entity_id]['skip_untranslated'])) { + $skip_untranslated = $batch_info['entity_types'][$entity_info['entity_type_name']][$entity_info['bundle_name']]['entities'][$entity_id]['skip_untranslated']; + } + // Check bundled entities. + elseif (isset($entity_info['bundle_settings']['skip_untranslated'])) { + if ($entity_info['bundle_settings']['skip_untranslated'] == TRUE) { + $skip_untranslated = TRUE; + } + } + else { + if ($batch_info['skip_untranslated'] == TRUE) { + $skip_untranslated = TRUE; + } + } + + if ($skip_untranslated) { + if ($entity->hasTranslation($langcode)) { + $url_object->setOption('language', $language); + $alternate_urls[$langcode] = $url_object->toString(); + } + } + else { $url_object->setOption('language', $language); $alternate_urls[$langcode] = $url_object->toString(); } @@ -267,6 +291,7 @@ class Batch { $alternate_urls = []; foreach ($languages as $language) { $langcode = $language->getId(); + if (!$batch_info['skip_untranslated'] || is_null($entity) || $entity->hasTranslation($langcode) || $language->isDefault()) { $url_object->setOption('language', $language); $alternate_urls[$langcode] = $url_object->toString(); diff --git a/src/Form.php b/src/Form.php index 2a2fc1b..9e7e497 100644 --- a/src/Form.php +++ b/src/Form.php @@ -33,6 +33,7 @@ class Form { private static $valuesToCheck = [ 'simple_sitemap_index_content', 'simple_sitemap_priority', + 'simple_sitemap_skip_untranslated', 'simple_sitemap_regenerate_now' ]; @@ -104,7 +105,7 @@ class Form { $form_fragment['simple_sitemap_regenerate_now']['#description'] .= '
' . $this->t('Otherwise the sitemap will be regenerated on the next cron run.'); } } - + public function displayEntitySettings(&$form_fragment, $multiple = FALSE) { $prefix = $multiple ? $this->entityTypeId . '_' : ''; @@ -119,6 +120,8 @@ class Form { $priority = isset($settings['priority']) ? $settings['priority'] : self::PRIORITY_DEFAULT; $bundle_name = !empty($this->bundleName) ? $this->bundleName : $this->t('undefined'); + $skip_untranslated = isset($settings['skip_untranslated']) ? $settings['skip_untranslated'] : FALSE; + if (!$multiple) { $form_fragment[$prefix . 'simple_sitemap_index_content'] = [ '#type' => 'radios', @@ -128,6 +131,7 @@ class Form { 1 => $this->entityCategory == 'instance' ? $this->t('Index this @bundle entity', ['@bundle' => $bundle_name]) : $this->t('Index entities of this type'), ] ]; + if ($this->entityCategory == 'instance' && isset($bundle_settings['index'])) { $form_fragment[$prefix . 'simple_sitemap_index_content']['#options'][$bundle_settings['index']] .= ' (' . $this->t('Default') . ')'; } @@ -144,6 +148,14 @@ class Form { '#default_value' => $priority, '#options' => self::getPrioritySelectValues(), ]; + + $form_fragment[$prefix . 'simple_sitemap_skip_untranslated'] = [ + '#type' => 'checkbox', + '#title' => t('Skip non-existent translations'), + '#description' => t('If checked, only links to the translated content will be included, otherwise the sitemap will include links to all content translation variants, even when the content has not been translated yet. It will overwrite global Skip non-existent translation configuration. '), + '#default_value' => $skip_untranslated, + ]; + if ($this->entityCategory == 'instance' && isset($bundle_settings['priority'])) { $form_fragment[$prefix . 'simple_sitemap_priority']['#options'][(string)$bundle_settings['priority']] .= ' (' . $this->t('Default') . ')'; } diff --git a/src/Form/SimplesitemapEntitiesForm.php b/src/Form/SimplesitemapEntitiesForm.php index d8d1459..89a3dd2 100644 --- a/src/Form/SimplesitemapEntitiesForm.php +++ b/src/Form/SimplesitemapEntitiesForm.php @@ -44,16 +44,17 @@ class SimplesitemapEntitiesForm extends SimplesitemapFormBase { foreach ($entity_type_labels as $entity_type_id => $entity_type_label) { $form['simple_sitemap_entities']['entities'][$entity_type_id] = [ - '#type' => 'details', - '#title' => $entity_type_label, - '#open' => $generator->entityTypeIsEnabled($entity_type_id), - ]; + '#type' => 'details', + '#title' => $entity_type_label, + '#open' => $generator->entityTypeIsEnabled($entity_type_id), + ]; $form['simple_sitemap_entities']['entities'][$entity_type_id][$entity_type_id . '_enabled'] = [ '#type' => 'checkbox', '#title' => $this->t('Enable @entity_type_label (@entity_type_id) support', ['@entity_type_label' => strtolower($entity_type_label), '@entity_type_id' => $entity_type_id]), '#description' => $this->t('Sitemap settings for this entity type can be set on its bundle pages and overridden on its entity pages.'), '#default_value' => $generator->entityTypeIsEnabled($entity_type_id), ]; + $form['#attached']['drupalSettings']['simple_sitemap']['all_entities'][] = str_replace('_', '-', $entity_type_id); if ($generator->entityTypeIsAtomic($entity_type_id)) { $form['simple_sitemap_entities']['entities'][$entity_type_id][$entity_type_id . '_enabled']['#description'] = $this->t('Sitemap settings for this entity type can be set below and overridden on its entity pages.'); @@ -82,13 +83,15 @@ class SimplesitemapEntitiesForm extends SimplesitemapFormBase { if ($generator->entityTypeIsAtomic($entity_type_id)) { $generator->setBundleSettings($entity_type_id, $entity_type_id, [ 'index' => TRUE, - 'priority' => $values[$entity_type_id . '_simple_sitemap_priority'] - ]); + 'priority' => $values[$entity_type_id . '_simple_sitemap_priority'], + 'skip_untranslated' => $values[$entity_type_id . '_simple_sitemap_skip_untranslated'], + ]); } } else $generator->disableEntityType($entity_type_id); } + } parent::submitForm($form, $form_state); diff --git a/src/Simplesitemap.php b/src/Simplesitemap.php index 377c72a..ffbb479 100644 --- a/src/Simplesitemap.php +++ b/src/Simplesitemap.php @@ -16,7 +16,7 @@ class Simplesitemap { private $db; private $entityTypeManager; private static $allowed_link_settings = [ - 'entity' => ['index', 'priority'], + 'entity' => ['index', 'priority', 'skip_untranslated'], 'custom' => ['priority']]; /**