Composant de carte SXA Partie 3 Afficher la distance dans le marqueur de POI

Salut les gens! Content de te revoir. Dans le post précédent, nous avions configuré la carte avec tous les marqueurs fournis dans la source de données, et pour ne pas être affecté par les résultats de la recherche sur la page, nous avons fourni la signature des résultats de la recherche aux propriétés de contrôle de la carte. Et ont placé le Location Finder. Dans ce cas, la distance n’est pas indiquée. Les entrées de point central sur la source de données Carte sont utilisées pour ajuster la vue Carte et ne contribuent pas à évaluer la distance si le paramètre de chaîne de requête g n’est pas présent. g contiennent les coordonnées de géolocalisation et sont utilisés pour évaluer la distance par l’API de recherche.

La carte affiche tous les marqueurs et n’est pas affectée par la taille de la page de résultats de recherche

Aucune distance n’est indiquée
Pour montrer la distance, il peut y avoir plusieurs solutions. Une approche consiste à enregistrer l’emplacement recherché dans le cookie et à lire ce cookie dans une fonction intégrée personnalisée pour le modèle Scriban qui aide à évaluer la distance.
Voici le code implémentant l’idée ci-dessus.
Créez un fichier JS localement et copiez le code ci-dessous ou téléchargez GeolocationCookieManager.js. Téléchargez le fichier dans le dossier des scripts du thème du site. par exemple /sitecore/media library/Themes/tenant/site/themename/Scripts.
XA.component.geolocationcookiemanger = (function ($, document) {
"use strict";
var api = {},
scriptsLoaded = false;
api.init = function() {
if ($("body").hasClass("on-page-editor")) {
return;
}
if(!scriptsLoaded)
{
scriptsLoaded = true;
XA.component.search.vent.on("hashChanged", function(hash) {
var reloadPage = false;
var components = $('*[data-properties]');
_.each(components, function(elem) {
var $el = $(elem),
properties = $el.data("properties");
var signature = properties.searchResultsSignature;
if (typeof signature !== "undefined")
{
var gsign = signature.length > 0 && signature !== "" ? signature + "_g" : "g";
var gsignVal = hash[gsign];
if (typeof gsignVal !== "undefined" && gsignVal !== null && gsignVal !== "") {
if(XA.cookies.readCookie(gsign) !== gsignVal)
{
XA.cookies.createCookie(gsign, gsignVal);
reloadPage = true;
}
}
}
});
if(reloadPage)
{
window.location.reload(); //needed to send the newly updated cookie to server so the map loads with the distance value
}
});
}
};
return api;
}(jQuery, document));
XA.register("geolocationcookiemanger", XA.component.geolocationcookiemanger);
Ajoutez un fichier de classe à votre projet VS existant adapté à une fonction intégrée personnalisée pour le modèle Scriban. Copiez le code ci-dessous ou téléchargez le code source à partir de Référentiel MapExtension.
using System;
using Scriban.Runtime;
using Sitecore.Data.Items;
using Sitecore.XA.Foundation.Scriban.Pipelines.GenerateScribanContext;
using Sitecore.ContentSearch.Data;
using Sitecore.XA.Foundation.Search.Models;
using Sitecore.XA.Foundation.SitecoreExtensions.Extensions;
using Sitecore.Mvc.Presentation;
using Sitecore.Data.Fields;
using System.Linq;
using System.Web;
namespace CustomSXA.Foundation.MapExtension
{
public class GetGeospatial : IGenerateScribanContextProcessor
{
private delegate Geospatial GetGeospatialModel(Item item, string distanceUnit);
public void Process(GenerateScribanContextPipelineArgs args)
{
var getGetGeospatialModelImplementation = new GetGeospatialModel(GetGeospatialModelImplementation);
args.GlobalScriptObject.Import("sc_geospatial", getGetGeospatialModelImplementation);
}
public Geospatial GetGeospatialModelImplementation(Item item, string distanceUnit = "Miles")
{
if (item != null && item.InheritsFrom(Sitecore.XA.Foundation.Geospatial.Templates.IPoi.ID))
{
var centre = this.SetLocationCentre();
if (centre != null)
{
return new Geospatial(item, centre, (Unit)Enum.Parse(typeof(Unit), distanceUnit));
}
}
return null;
}
public Coordinate SetLocationCentre()
{
string sign = RenderingContext.CurrentOrNull.Rendering.Parameters["Signature"];
string coordinates = string.Empty;
double lat, lon;
if (System.Web.HttpContext.Current.Request.Cookies[$"{sign}_g"] != null)
{ //Map component signature g value
coordinates = System.Web.HttpContext.Current.Request.Cookies[$"{sign}_g"].Value;
}
else if (System.Web.HttpContext.Current.Request.Cookies["g"] != null)
{ //regular default g value
coordinates = System.Web.HttpContext.Current.Request.Cookies["g"].Value;
}
else if (!string.IsNullOrWhiteSpace(RenderingContext.CurrentOrNull?.Rendering.DataSource))
{ //coordinates from map data source
Item dataSource = Sitecore.Context.Database.GetItem(RenderingContext.CurrentOrNull.Rendering.DataSource);
ReferenceField field = dataSource.Fields["Central point mode"];
if (field != null && field.TargetItem["Value"] == "Auto")
{
string vLat = dataSource["Central point latitude"];
string vLon = dataSource["Central point longitude"];
if (!string.IsNullOrWhiteSpace(vLat) && !string.IsNullOrWhiteSpace(vLon))
{
lat = Convert.ToDouble(vLat);
lon = Convert.ToDouble(vLon);
return new Coordinate(lat, lon);
}
}
}
if (string.IsNullOrWhiteSpace(coordinates))
{ //signature g value from the first component found
string gcookieKey = HttpContext.Current.Request.Cookies.AllKeys.ToList().FirstOrDefault(k => k.EndsWith("_g"));
if (HttpContext.Current.Request.Cookies[gcookieKey] != null)
{
coordinates = HttpContext.Current.Request.Cookies[gcookieKey].Value;
}
}
if (!string.IsNullOrWhiteSpace(coordinates))
{
string[] coordinatesValues = coordinates.Split('|');
if (coordinatesValues.Length == 2)
{
lat = Convert.ToDouble(coordinatesValues[0]);
lon = Convert.ToDouble(coordinatesValues[1]);
return new Coordinate(lat, lon);
}
}
return null;
}
}
}
Créez un fichier de configuration de correctif nommé CustomSXA.Foundation.MapExtension.config dans le dossier App_Config\Include\Foundation de votre projet et mettez-le à jour avec la configuration ci-dessous.
<?xml version="1.0"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<generateScribanContext>
<processor type="CustomSXA.Foundation.MapExtension.GetGeospatial, CustomSXA.Foundation.MapExtension" resolve="true" />
</generateScribanContext>
</pipelines>
</sitecore>
</configuration>
Installez le Sitecore et Scriban requis Paquets NuGet. Générez le projet, copiez CustomSXA.Foundation.MapExtension.dll dans webroot\bin et Foundation\CustomSXA.Foundation.MapExtension.config dans votre dossier webroot\App_Config\Include\Foundation.
Créons une nouvelle variante personnalisée pour POI et utilisons la fonction scirban intégrée personnalisée. Accédez à /sitecore/content/tenant/site/Presentation/Rendering Variants/POI/Default.
Dupliquez cet élément et nommez-le Marqueur.
Dans la nouvelle variante, mettez à jour le champ Modèle de l’élément /sitecore/content/tenant/site/Presentation/Rendering Variants/POI/Marker/Distance, avec le code ci-dessous.
{{ if o_geospatial }}
Distance: {{ o_geospatial.distance | math.round 1 }} {{ o_geospatial.unit }}
{{else}}
{{o_geospatial = sc_geospatial i_item 'Kilometers'}}
{{ if o_geospatial }}
Distance: {{ o_geospatial.distance | math.round 1 }} {{ o_geospatial.unit }}
{{end}}
{{end}}
Accédez à /sitecore/content/tenant/site/Presentation/POI Types/Simple POI
Remplacez la variante par défaut par Marqueur. Sauvegarde le.
Prévisualisez l’élément où tous les composants sont configurés. Ci-dessous se trouve la sortie où elle montre la distance en marqueurs.

Les distances sont indiquées dans les marqueurs
Même distance Scriban peut être utilisé pour le composant Résultats de la recherche.
Passez à la variante Résultats de la recherche. par exemple /sitecore/content/demotenant/sitecorethinker/Presentation/Rendering Variants/Search Results/vertical
Dupliquez cet élément et nommez-le Emplacements.
Copiez l’élément scriban Distance /sitecore/content/tenant/site/Presentation/Rendering Variants/POI/Marker/Distance sous cette nouvelle variante Emplacements afin qu’il ressemble à ci-dessous.

Variante de distance dans les résultats de recherche
Dans le cas du composant Search Results, o_geospatial est disponible et peut donc fournir la distance. Une autre partie peut être retirée. Sauvegarde le. Remplacez la variante par Emplacements dans le composant Résultats de la recherche.

Définir la variante d’emplacement dans les résultats de recherche
Prévisualisez la page, maintenant les résultats de recherche affichent également la distance.

Distance dans les marqueurs et les résultats de recherche
J’espère que cela t’aides. Bon apprentissage SXA 🙂
Source link