logo

[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 имеет следующие методы:

  1. public bool CheckType(Type type) – определяет тип объекта, для которого предназначено данное расширение, в качестве параметра передается объект.
  2. 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.

Ссылки на элементы API

Прикрепленные файлы