Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 12 Current »

In this page you’ll find:

Goal

The purpose of this article is to show you how to extend the existing search results widget.

Overview

All components in the Vue.js framework are quite extendable and can be modified to handle custom layout, styles and behaviour. This is possible due to the built-in capability of the platform to attach templates as script tag and therefore supplying a dynamic structure of the presentation.

Prerequisite

Configured Hawksearch widgets - Kentico: Working with widgets

Extending the templates

  • In order to override the default view file the Hawksearch search results widget uses you need to create a razor view file in your frontend project at Views/Shared/Components/SearchResults/Default.cshtml.

  • In order to add additional templates, create corresponding view files under Views/Shared/Components/SearchResults/ . When displayed in the widget settings, they will be split by capital letters and words after the first will be lowercased. So a view file called “SearchResultsTemplateOne“ will be displayed like “Search results template one” in the widget settings.

    The way the connector is designed it will automatically find the razor view files in that folder and use them. Below is the Default.cshtml code used.

@model Hawksearch.Kentico.Xperience.UI.Widgets.SearchResultsViewModel

@{
    var trackedEvents = new List<string>()
{
        Model.ComponentViewModel.Properties.TrackBannerClickEvent ? "BannerClick" : "",
        Model.ComponentViewModel.Properties.TrackBannerImpressionEvent ? "BannerImpression" : "",
        Model.ComponentViewModel.Properties.TrackClickEvent ? "Click" : "",
        Model.ComponentViewModel.Properties.TrackPageLoadEvent ? "PageLoad" : "",
        Model.ComponentViewModel.Properties.TrackRecommendationClickEvent ? "RecommendationClick" : ""
    };

    var eventsJson = Newtonsoft.Json.JsonConvert.SerializeObject(trackedEvents.Where(a => !string.IsNullOrEmpty(a)));
    var settingsJson = Newtonsoft.Json.JsonConvert.SerializeObject(Model.ConnectorSettings);

    var language = Model.ConnectorSettings.MultilingualIndexingEnabled ?
                                CMS.Localization.LocalizationContext.CurrentCulture.CultureCode : "";
}

@if (Model.ConnectorSettings.FrontendFramework == Hawksearch.Kentico.Xperience.CMS.Configuration.FrontendFrameworkType.Vue)
{
    <div class="vue-app-wrapper-ae hawk"
         data-indexname="@Model.ComponentViewModel.Properties.IndexName"
         data-language="@language"
         data-additionalparameters="@Model.ComponentViewModel.Properties.Data"
         data-trackedevents="@eventsJson"
         data-hawksearchsettings="@settingsJson"
         data-initialsearch="true">
        <div class="hawk__body">

            <facet-list></facet-list>

            <results></results>

        </div>
    </div>

    <script id="custom-result-item" type="x-template">
        <div class="result-item">
            <p class="result-item-title">{{ getField('title') }}</p>
            <p class="result-item-description">{{ getField('description') }}</p>
        </div>
    </script>
}
else
{
    <div id="hawksearch-react-search-results"
         data-indexname="@Model.ComponentViewModel.Properties.IndexName"
         data-language="@language"
         data-additionalparameters="@Model.ComponentViewModel.Properties.Data"
         data-trackedevents="@eventsJson"
         data-hawksearchsettings="@settingsJson">
    </div>
}

If you want to modify the actual result item template (the one used to render each result item), you need to modify the html code inside the <script id=”custom-result-item”> element. It is important to note that the overall widget needs to be wrapped in a div element with the class “vue-app-wrapper-ae“ and to have the data attributes present as in the snippet above, otherwise functionality might not work as expected. Currently, the connector locates those divs in a page when initializing the Vue.js components.

You can use the “getField” call as on row 40 of the snippet above to get fields values that were returned for each document from Hawksearch.

Additional resources

If you’d like to use some additional components, please refer to the following pages:

  • No labels