Name
global.KBPortalSitemapGeneratorUtil
Description
Util script for generating sitemaps for kb and csp portals
Script
var KBPortalSitemapGeneratorUtil = Class.create();
KBPortalSitemapGeneratorUtil.prototype = {
initialize: function () {
this.spUtil = new GlideSPUtil();
this.kbViewModel = new KBViewModel();
},
getTranslatedArticlesList: function (kbGr) {
if (GlidePluginManager().isActive('com.glideapp.knowledge.i18n2'))
return this.kbViewModel.getLanguagesToDisplay(kbGr);
},
isSPPagePubliclyAccessible: function (spPageGr) {
if (spPageGr) {
return spPageGr.getValue('public') == '1' ? true : false;
}
return false;
},
isHumanReadableUrlEnabled: function (spPageGr) {
var humanReadableURLStructure = '';
if (spPageGr)
humanReadableURLStructure = spPageGr.getValue('human_readable_url_structure') || '';
if (humanReadableURLStructure.trim())
return true;
return false;
},
getPubliclyAccessibleArticles: function (servicePortalUrlSuffix, servicePortalSysId, kbPageId, baseportalURL) {
var currUserId = gs.getUserID();
gs.getSession().impersonate('guest');
var spPageGr = new GlideRecord('sp_page');
spPageGr.addQuery('id', kbPageId);
spPageGr.query();
if (spPageGr.next() && !this.isSPPagePubliclyAccessible(spPageGr)){
gs.getSession().impersonate(currUserId);
return '';
}
// get knowledge bases associated with the service portal
var knowledgeBaseIds = [];
var gr = new GlideRecord('m2m_sp_portal_knowledge_base');
gr.addQuery('sp_portal', servicePortalSysId);
gr.query();
while (gr.next()) {
var knowBaseId = gr.getValue('kb_knowledge_base');
knowledgeBaseIds.push(knowBaseId);
}
// get knowledge articles in the knowledge bases that can be accessed publicly
var encodedQuery = 'kb_knowledge_baseIN' + knowledgeBaseIds.join();
encodedQuery += '^sys_class_name!=kb_knowledge_block';
var kbGr = new GlideRecord('kb_knowledge');
kbGr.addEncodedQuery(encodedQuery);
kbGr.addQuery('active', true);
kbGr.addQuery('workflow_state', 'published');
kbGr.query();
var urlEntities = '';
var spSEOHeaderTagsSNC = new global.SPSEOHeaderTagsSNC();
while (kbGr.next()) {
if (kbGr.canRead()){
var translatedArticles = this.getTranslatedArticlesList(kbGr);
var kbLang = kbGr.getValue('language') || 'en';
var kbNumber = kbGr.getValue('number');
var lastMod = kbGr.getValue('sys_updated_on').split(' ')[0];
var queryParams = 'id=' + kbPageId + '&sysparm_article=' + kbNumber;
var humanReadablePart = '';
if (this.isHumanReadableUrlEnabled(spPageGr))
humanReadablePart = this.getHumanReadableUrls(spPageGr, queryParams);
var kbUrl = baseportalURL + '/' + servicePortalUrlSuffix + '/' + kbLang + humanReadablePart + '?' + queryParams;
urlEntities += '<url>\n' +
'<loc>' + kbUrl + '</loc>\n' +
'<lastmod>' + lastMod + '</lastmod>\n';
if (translatedArticles && translatedArticles.length > 1) {
// add href lang if more than 1 language is found in translatedArticles
for (var i in translatedArticles) {
var locale = translatedArticles[i].language;
var translatedArticleQParams = 'id=' + kbPageId + '&sysparm_article=' + translatedArticles[i].number;
var tempKbUrl = baseportalURL + '/' +servicePortalUrlSuffix + '/' + locale + this.getHumanReadableUrls(spPageGr, translatedArticleQParams) + '?' + translatedArticleQParams;
urlEntities += '<xhtml:link rel="alternate" hreflang="' + locale + '" href="' + tempKbUrl + '"/>\n';
}
}
urlEntities += '</url>\n';
}
}
if (urlEntities)
urlEntities = '<url>\n' + baseportalURL + '/' + servicePortalUrlSuffix + '?id=kb_home\n' + '</url>\n'
+ '<url>\n' + baseportalURL + '/' + servicePortalUrlSuffix + '?id=kb_search\n' + '</url>\n'
+ urlEntities;
urlEntities = urlEntities.replaceAll('&', '&');
gs.getSession().impersonate(currUserId);
return urlEntities;
},
getPubliclyAccessibleCatalogItems: function (servicePortalUrlSuffix, servicePortalSysId, catalogPageId, baseportalURL) {
var currUserId = gs.getUserID();
gs.getSession().impersonate('guest');
var spPageGr = new GlideRecord('sp_page');
spPageGr.addQuery('id', catalogPageId);
spPageGr.query();
if (spPageGr.next() && !this.isSPPagePubliclyAccessible(spPageGr)){
gs.getSession().impersonate(currUserId);
return '';
}
// get catalogs associated with the service portal
var catalogIds = [];
var gr = new GlideRecord('m2m_sp_portal_catalog');
gr.addQuery('sp_portal', servicePortalSysId);
gr.query();
while (gr.next()) {
var catId = gr.getValue('sc_catalog');
catalogIds.push(catId);
}
// get catalog items in catalogs that can be accessed publicly
var encodedQuery = 'sc_catalogsIN' + catalogIds.join();
var scCatGr = new GlideRecord('sc_cat_item');
scCatGr.addEncodedQuery(encodedQuery);
scCatGr.addQuery('active', true);
scCatGr.query();
var urlEntities = '';
while (scCatGr.next()) {
if (scCatGr.canRead()){
var scCatSysId = scCatGr.getValue('sys_id');
var lastMod = scCatGr.getValue('sys_updated_on').split(' ')[0];
var queryParams = 'id=' + catalogPageId + '&sys_id=' + scCatSysId;
var humanReadablePart = '';
if (this.isHumanReadableUrlEnabled(spPageGr))
humanReadablePart = this.getHumanReadableUrls(spPageGr, queryParams);
var scCatUrl = baseportalURL + '/' + servicePortalUrlSuffix + humanReadablePart + '?' + queryParams;
urlEntities = urlEntities + '<url>\n' +
'<loc>' + scCatUrl + '</loc>\n' +
'<lastmod>' + lastMod + '</lastmod>\n';
urlEntities += '</url>\n';
}
}
urlEntities = urlEntities.replaceAll('&', '&');
gs.getSession().impersonate(currUserId);
return urlEntities;
},
getHumanReadableUrls: function (spPageGr, queryParams) {
var humanReadablePart = '';
if (spPageGr)
humanReadablePart = this.spUtil.getHumanReadableUrl(spPageGr, queryParams);
if (humanReadablePart)
humanReadablePart = '/' + humanReadablePart;
return humanReadablePart;
},
type: 'KBPortalSitemapGeneratorUtil'
};
Sys ID
0bea6d45382a9110f8778af503189ee4