Merge pull request #4097 from sbwalker/dev

fix SiteMap so that it supports page Urls
This commit is contained in:
Shaun Walker 2024-04-02 08:45:03 -04:00 committed by GitHub
commit ba38853406
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 58 deletions

View File

@ -47,14 +47,23 @@ namespace Oqtane.Pages
var sitemap = new List<Sitemap>(); var sitemap = new List<Sitemap>();
// build site map // build site map
var rooturl = _alias.Protocol + (string.IsNullOrEmpty(_alias.Path) ? _alias.Name : _alias.Name.Substring(0, _alias.Name.IndexOf("/")));
var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList();
var pageModules = _pageModules.GetPageModules(_alias.SiteId); var pageModules = _pageModules.GetPageModules(_alias.SiteId);
foreach (var page in _pages.GetPages(_alias.SiteId)) foreach (var page in _pages.GetPages(_alias.SiteId))
{ {
if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation)
{ {
var rooturl = _alias.Protocol + (string.IsNullOrEmpty(_alias.Path) ? _alias.Name : _alias.Name.Substring(0, _alias.Name.IndexOf("/"))); var pageurl = rooturl;
sitemap.Add(new Sitemap { Url = rooturl + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = DateTime.UtcNow }); if (string.IsNullOrEmpty(page.Url))
{
pageurl += Utilities.NavigateUrl(_alias.Path, page.Path, "");
}
else
{
pageurl += (page.Url.StartsWith("/") ? "" : "/") + page.Url;
}
sitemap.Add(new Sitemap { Url = rooturl + pageurl, ModifiedOn = DateTime.UtcNow });
foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId))
{ {

View File

@ -21,67 +21,37 @@ namespace Oqtane.Shared
return $"{type.Namespace}, {assemblyName}"; return $"{type.Namespace}, {assemblyName}";
} }
public static (string UrlParameters, string Querystring, string Fragment) ParseParameters(string url) public static (string UrlParameters, string Querystring, string Fragment) ParseParameters(string parameters)
{ {
// /path/urlparameters
// /urlparameters /urlparameters?Id=1 /urlparameters#5 /urlparameters?Id=1#5 /urlparameters?reload#5 // /urlparameters /urlparameters?Id=1 /urlparameters#5 /urlparameters?Id=1#5 /urlparameters?reload#5
// Id=1 Id=1#5 reload#5 reload // Id=1 Id=1#5 reload#5 reload
// #5 // #5
if (!url.Contains("://")) // create absolute url to convert to Uri
{ parameters = (!parameters.StartsWith("/") && !parameters.StartsWith("#") ? "?" : "") + parameters;
if (!url.StartsWith("/")) // urlparameters always start with "/" parameters = Constants.PackageRegistryUrl + parameters;
{ var uri = new Uri(parameters);
url = ((!url.StartsWith("#")) ? "?" : "/") + url;
}
url = Constants.PackageRegistryUrl + url; // create absolute url
}
var uri = new Uri(url);
var querystring = uri.Query.Replace("?", ""); var querystring = uri.Query.Replace("?", "");
var fragment = uri.Fragment.Replace("#", ""); var fragment = uri.Fragment.Replace("#", "");
var urlparameters = uri.LocalPath; var urlparameters = uri.LocalPath;
urlparameters = (urlparameters == "/") ? "" : urlparameters; urlparameters = (urlparameters == "/") ? "" : urlparameters;
if (urlparameters.Contains(Constants.UrlParametersDelimiter))
{
urlparameters = urlparameters.Substring(urlparameters.IndexOf(Constants.UrlParametersDelimiter) + 1);
}
return (urlparameters, querystring, fragment); return (urlparameters, querystring, fragment);
} }
public static (string Path, string Parameters) ParsePath(string url)
{
url = ((!url.StartsWith("/") && !url.Contains("://")) ? "/" : "") + url;
(string path, string querystring, string fragment) = ParseParameters(url);
var uriBuilder = new UriBuilder
{
Path = path,
Query = querystring,
Fragment = fragment
};
return (uriBuilder.Path, uriBuilder.Uri.Query + uriBuilder.Uri.Fragment);
}
public static string NavigateUrl(string alias, string path, string parameters) public static string NavigateUrl(string alias, string path, string parameters)
{ {
string querystring = "";
string fragment = "";
if (!string.IsNullOrEmpty(parameters)) if (!string.IsNullOrEmpty(parameters))
{ {
// parse path
(path, _) = ParsePath(path);
// parse parameters // parse parameters
(string urlparameters, string querystring, string fragment) = ParseParameters(parameters); (string urlparameters, querystring, fragment) = ParseParameters(parameters);
// add urlparameters to path
if (!string.IsNullOrEmpty(urlparameters)) if (!string.IsNullOrEmpty(urlparameters))
{ {
if (urlparameters.StartsWith("/")) urlparameters = urlparameters.Substring(1); path += (path.EndsWith("/") ? "" : "/") + $"{Constants.UrlParametersDelimiter}/{urlparameters.Substring(1)}";
path += (path.EndsWith("/") ? "" : "/") + $"{Constants.UrlParametersDelimiter}/{urlparameters}"; }
} }
// build url // build url
@ -93,14 +63,8 @@ namespace Oqtane.Shared
Query = querystring, Query = querystring,
Fragment = fragment Fragment = fragment
}; };
path = uriBuilder.Uri.PathAndQuery;
}
else
{
path = ((!string.IsNullOrEmpty(alias)) ? alias + (!path.StartsWith("/") ? "/" : "") : "") + path;
}
return path; return uriBuilder.Uri.PathAndQuery;
} }
public static string EditUrl(string alias, string path, int moduleid, string action, string parameters) public static string EditUrl(string alias, string path, int moduleid, string action, string parameters)