iikoFront API SDK

Шаблонизация через RazorEngine для печатных форм

Опубликован новый пример SampleRazorRunner, который показывает возможности использования Razor разметки в комбинации с данными, полученными из Resto.Front.Api.

Данный пример имеет статический класс RazorRunner, который содержит 2 метода UpdateRazorAssemblyReference и RunCompile.

  1. UpdateRazorAssemblyReference(string restoApiAssemblyToUse, params string[] otherAssembliesToUse) - данный метод позволяет обновить список сборок, содержимое которых будет использоваться для компиляции шаблона Razor.
    1. Первый аргумент restoApiAssemblyToUse - обязательный. Компилятору необходимо знать какая именно версия API будет использоваться.
    2. Второй аргумент - необязательный. Дополнительные сборки следует указывать, если они содержат какие-либо необходимые данные, методы, модели для шаблона, на использование которых у компилятора изначально нет инструкций. Несколько библиотек будут использоваться всегда, так как они необходимы для нормального функционирования компилятора:

      • mscorlib.dll
      • netstandard.dll
      • System.dll
      • System.Core.dll
      • RazorEngine.NetStandard.dll
      • Microsoft.CSharp.dll

    Метод использует класс ExternalAssemblyReferenceResolver, который и описывает процесс обновления ссылок на ассамблеи для Razor.

  2. RunCompile(string template, object model) - данный метод отвечает непосредственно за компиляцию шаблона Razor.
    1. template - шаблон в виде строки. Строку можно писать динамически или подгружать из файлов. Обычно расширение для Razor шаблона - .cshtml
    2. model - объект модели с заданным набором данных.

Стоит отметить, что модели для шаблонов могут быть двух типов:

Также пример имеет простое окно:

ext_number

Оно позволяет динамически задавать шаблон и видеть полученный результат или сведения об ошибках. Изначально в SampleRazorRunner приложен пример разметки Razor - RazorTemplateSample.cshtml. Данный пример выводит некоторые данные об открытом заказе.

Если вы хотите использовать данный механизм в своём плагине, можете скопировать файл RazorRunner.cs и указать секцию о System.Runtime.CompilerServices.Unsafe в app.config.

При создании и использовании шаблонов Razor для печати в Resto.Front.Api стоит знать язык описания разметки iiko.

Далее будет представлен простой пример использования данного функционала:

using RestoRazorRunner;
using System;
using System.Linq;
using System.Xml.Linq;
using Resto.Front.Api.Data.Print;

namespace Resto.Front.Api.SamplePlugin
{
	public static class RazorRunnerSample
	{
		public static void RunCompileSample()
		{
			var os = PluginContext.Operations;

		    //Задаем простой Razor шаблон
		    var razorTemplate = "@{" +
		    "\r\nvar os = Resto.Front.Api.PluginContext.Operations;" +
		    "\r\nvar order = os.GetOrderById((Guid)@Model.OrderId);" +
		    "\r\n}" +
		    "\r\n<doc>" +
		    "\r\n@string.Format(\"Заказ \u2116: {0}\", order.Number)" +
		    "\r\n</doc>";
		    
		    var model = new SampleOrderModel { OrderId = os.GetOrders().Last().Id };
		    
		    //Указываем, какие библиотеки необходимо использовать.
		    RazorRunner.UpdateRazorAssemblyReference(
		    typeof(PluginContext).Assembly.ManifestModule.Name //Получает текущую используемую в плагине версию API
		    );
		    
		    //Получаем скомпилированный шаблон
		    var result = RazorRunner.RunCompile(razorTemplate, model);
		    
		    //Печатаем его через Resto.Front.Api
		    var printingDevice = os.GetPrintingDeviceInfos().Last();
		    os.Print(printingDevice, new Document { Markup = XElement.Parse(result) });			    
		}

		public sealed class SampleOrderModel
		{
			public Guid OrderId { set; get; }
		}
	}
}

Альтернативно, можно вместо печати получить полностью отформатированный текст с помощью операции FormatDocumentOnPrintingDevice.