[ELMA3] Добавление ссылки на карточку справочника
В системе имеется возможность добавить ссылки для объекта, реализовать возможность перехода на карточку объекта.
В примере показана реализация точки расширения для объекта IMyObject, созданного в модуле, который содержит базовый набор свойств и одно свойство типа Выпадающий список. Для данного объекта реализованы переходы на карточку объекта из таблицы со списком записей справочника.
В системе существует две точки расширения для создания ссылок на объект: IEntityLink, IObjectLink. В данной статье будут рассмотрены обе точки расширения.
Пример отображения данных
Рис. 1. Ссылка на карточку объекта из таблицы с контрагентами
Рис. 2. Карточка объекта
Методы расширения (интерфейса) IEntityLink
Точка расширения (интерфейс) IEntityLink имеет следующие методы:
/// <summary> /// Тип сущности /// </summary> Type EntityType { get; } /// <summary> /// Идентификатор типа сущности /// </summary> Guid TypeUid { get; } /// <summary> /// Область /// </summary> string Area(IEntity entity); /// <summary> /// Действие /// </summary> string Action(IEntity entity); /// <summary> /// Котроллер /// </summary> string Controller(IEntity entity); /// <summary> /// Имя парметра id в методе /// </summary> string IdParam { get; } /// <summary> /// Дополнительный параметры /// </summary> /// <param name="entity"></param> /// <returns></returns> RouteValueDictionary GetParams(IEntity entity); /// <summary> /// Готовая ссылка /// </summary> /// <param name="entity"></param> /// <returns></returns> string Href(RequestContext html, IEntity entity); /// <summary> /// Загрузить сущность по TypeUid и Id если null /// </summary> bool LoadEntityIfNull { get; }
Пример класса точки расширения
[Component] public class EntityLinkExtension : IEntityLink { public Type EntityType { get { return typeof(IMyObject); } } public Guid TypeUid { get { return Guid.Empty; } } public string Area(IEntity entity) { return null; } public string Action(IEntity entity) { return null; } public string Controller(IEntity entity) { return null; } public string IdParam { get { return null; } } public RouteValueDictionary GetParams(IEntity entity) { return null; } public string Href(RequestContext html, IEntity entity) { var urlHelper = new UrlHelper(html); return urlHelper.Action("Entity", "Home", new { area = EntityLink.Web.RouteProvider.AreaName, id = entity.GetId().ToString() }); } public bool LoadEntityIfNull { get { return true; } } }
Данную точку расширения (IEntityLink) лучше использовать при работе с объектами системы ELMA, по сравнению с IObjectLink. IObjectLink лучше использовать для объектов извне.
Метод возвращает ссылку на объект формата
/Ваш_Модуль/Название_Контроллера/Действие_в_контроллере/Идентификатор_Объекта
В данном примере ссылка имеет вид: /EntityLink.Web/Home/Entity/1
Код контроллера HomeController.cs :
public ActionResult Entity(long id) { var model = EntityManager<IMyObject>.Instance.LoadOrNull(id); return View(model); }
Первое действие контроллера возвращает представление ViewItem.cshtml с моделью объекта IMyObject.
В данном примере использована таблица со списком объектов, наименования которых являются ссылками и ведут на карточку этого объекта, которая представлена при помощи представления ViewItem.cshtml.
Пример отображения карточки объекта в ViewItem.cshtml:
@model IMyObject @using EleWise.ELMA.Model.Services @using EleWise.ELMA.Web.Mvc.ExtensionPoints @using EleWise.ELMA; @using EntityLink.Models @{ Html.Header(SR.T("Мой объект")); } @(Html.Toolbar("toolbar").Group("toolbar-group-1") .ToolbarLink(SR.Back, "#x32/Prev.png", "javascript:history.back(-1);", "toolbar-action-Back") ) @using (Html.ElmaForm()) { @Html.TableFormStart() @Html.DisplayFor(m => m, "Object") @Html.TableFormEnd() }
Главное отличие IEntityLink от IObjectLink в том, что IEntityLink можно использовать только для объектов системы (сущностей), тогда как IObjectLink можно использовать практически для всех объектов системы (сущности, перечисления…). Стоит отметить, что IEntityLink имеет более гибкие настройки, в отличие от IObjectLink. В примере при реализации IObjectLink будет создана ссылка для пользовательского события в календаре IDelivery, тогда как реализовать данную ссылку при помощи IEntityLink невозможно. Подробнее о создании собственных событий в календаре можно прочитать в следующей статье.
Пример отображения данных
Рис. 3. Сгенерированная ссылка на событие в календаре
Методы расширения (интерфейса) IObjectLink
Точка расширения (интерфейс) IObjectLink имеет следующие методы:
- public bool CheckType(Type type) – определяет тип объекта, для которого предназначено данное расширение, в качестве параметра передается объект.
- public string Url(RequestContext context, object obj) – возвращает строку, содержащую адрес до объекта.
Пример класса точки расширения
[Component] public class ObjectLinkExtension : IObjectLink { public bool CheckType(Type type) { return type.IsInheritOrSame<DeliveryCalendarItem>(); } public string Url(RequestContext context, object obj) { var urlHelper = new UrlHelper(context); return urlHelper.Action("ViewItem", "Catalogs", new { area = EleWise.ELMA.BPM.Web.Common.RouteProvider.AreaName, id = ((DeliveryCalendarItem)obj).Id, uid = InterfaceActivator.UID<IDelivery>() }); } }
Метод возвращает ссылку на запись в справочнике. При желании можно реализовать собственное отображение атрибутов объекта IDelivery.