Widget is a type of plugin that allows you to render some HTML code by the specific place where you want to include the widget, this place is called a widget zone.
Firstly you must create a class that implements the IWidgetProvider interface :
public partial interface IWidgetProvider : IProvider
{
Task> GetWidgetZones();
Task GetPublicViewComponentName(string widgetZone);
}
It includes two methods:
GetWidgetZone: should return a list of widget zones (the place where you want to put your
widget)
GetPublicViewComponentName : should return name of view component. It receives a widget zone, so you can return different component names depends on the widget zone
Example implementation :
public class MyPluginWidgetProvider : IWidgetProvider
{
public string ConfigurationUrl => "/Admin/MyPlugin/Configure";
public string SystemName => "Widget.MyPlugin";
public string FriendlyName => "Misc MyPlugin";
public int Priority => 0;
public IList LimitedToStores => new List();
public IList LimitedToGroups => new List();
public Task GetPublicViewComponentName(string widgetZone)
{
return Task.FromResult("MyViewComponent");
}
public Task> GetWidgetZones()
{
return Task.FromResult>(new List { "checkout_completed_top" });
}
}
Next, we must create a view component. Create a class with attribute ViewComponent, inherit
from ViewComponent, and create method InvokeAsync
[ViewComponent(Name = "WidgetsFacebookPixel")]
public class MyWidgetViewComponent : ViewComponent
{
public Task InvokeAsync(string widgetZone, object additionalData = null)
{
var model = new SampleModel() { Value = "sample value" };
return Task.FromResult(View("~/Plugins/Widget.MyPlugin/Views/Index.cshmtl", model));
}
}
GrandNode
invokes the InvokeAsync method when you are on a page that includes a specific widget zone.
You should notice that you can return View with a model in the same way as in controller in ASP.NET.
Lastly
you must register widget provider in IOC container :
services.AddScoped<IWidgetProvider, MyPluginWidgetProvider>();
Finally, we can build our plugin. Remember that after installation you must enable the widget in Admin panel -> Plugins -> Widgets.