Plugin Code
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Razor;
using Nop.Core;
using Nop.Core.Infrastructure;
using Nop.Services.Configuration;
using Nop.Web.Framework.Themes;
using Nop.Web.Framework;
namespace Nop.Plugin.Apollo.Appointments.ViewEngine
{
public class CustomViewEngine : IViewLocationExpander
{
public string StoreTheme = "DefaultClean";
public void PopulateValues(ViewLocationExpanderContext context)
{
//no need to add the themeable view locations at all as the administration should not be themeable anyway
if (context.AreaName?.Equals(AreaNames.Admin) ?? false)
return;
var settingService = EngineContext.Current.Resolve<ISettingService>();
var storeContext = EngineContext.Current.Resolve<IStoreContext>();
StoreTheme = settingService.GetSettingByKeyAsync("storeinformationsettings.defaultstoretheme", "DefaultClean", storeContext.GetCurrentStore().Id, true).Result;
context.Values[StoreTheme] = EngineContext.Current.Resolve<IThemeContext>().GetWorkingThemeNameAsync().Result;
}
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
{
if (context.AreaName == null)
{
if (!context.Values.TryGetValue(StoreTheme, out string? theme))
return viewLocations;
if (context.ViewName == "_AddToCart" &&
(context.ControllerName == "Product" || context.ControllerName == "YourController"))
{
viewLocations = new[] { $"~/Plugins/SSI.Plugin.Name/Views/FrontView/Shared/Themes/_AddToCart.cshtml" }.Concat(viewLocations);
}
}
return viewLocations;
}
}
}
Add to the Plugin Startup File
public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
services.Configure<RazorViewEngineOptions>(o =>
{
o.ViewLocationExpanders.Add(new CustomViewEngine());
});
}