[ELMA3] Примеры кастомных html-портлетов
В системе ELMA существует возможность создавать свои портлеты, наполняя их содержимое при помощи языка Razor.
Язык Razor представляет собой смесь C# и HTML и позволяет работать с объектами системы, оформляя данные с помощью HTML.
Для создания такого портлета необходимо добавить на страницу новый портлет типа Код. В открывшемся окне находятся настройки портлета и ссылка Открыть редактор разметки, ведущая на окно редактирования.
Для оформления одной строчки кода C# используется символ @. Например:
<p> Текущее время :@DateTime.Now </p>
Для оформления блока кода С# используется конструкция @{…}. Например:
@{ if(condition) { code } }
Более подробную информацию по данной теме можно найти по адресу http://msdn.microsoft.com/en-us/VS2010TrainingCourse_ASPNETMVC3Razor.
Рассмотрим примеры портлетов типа Код.
Пример 1. Задачи согласования
В данном примере в портлете будут выводиться задачи согласования, в которых согласующим является текущий пользователь.
Пример сценария с использованием PublicAPI
@using EleWise.ELMA.API @using EleWise.ELMA.Tasks.Models @{ //создаем переменные, которые хранят статичные ссылки //Для согласования документов var DocRef = "/Docflow/Approvement/Execute/"; //для задач var TaskRef = "/Tasks/Task/Approve/"; //определяем текущего пользователя var CurUser = PublicAPI.Portal.Security.User.GetCurrentUser(); //получаем активные задачи согласования var ActiveApprove = PublicAPI.Portal.Objects.Tasks.ApprovalTask.Filter().Statuses(TaskBaseExtensions.ActiveTaskStatuses.ToList()).Query("Harmonizator=" + CurUser).Find(); //получаем активные задачи согласования по документам var ActiveDocumentApprove = PublicAPI.Docflow.Objects.Tasks.DocumentApprovementTask.Filter().Statuses(TaskBaseExtensions.ActiveTaskStatuses.ToList()).Query("Harmonizator=" + CurUser).Find(); } @{ foreach(var item in ActiveDocumentApprove) { //формируем ссылку из заранее созданных переменных и id найденных задач <p><a href=@DocRef@item.Id>Согласование документа - @item.Subject</a></p> } } @{ foreach(var item in ActiveApprove) { <p><a href=@TaskRef@item.Id>@item.Subject</a></p> } }
Пример сценария без использования PublicAPI
@using EleWise.ELMA.Security.Models @using EleWise.ELMA.Security.Services @using EleWise.ELMA.Tasks.Models @using EleWise.ELMA.Model.Services; @using EleWise.ELMA.Model.Managers @using EleWise.ELMA.Tasks.Managers; @using EleWise.ELMA.Documents.Models.Tasks @{ //создаем переменные, которые хранят статичные ссылки //Для согласования документов var DocRef = "/Docflow/Approvement/Execute/"; //для задач var TaskRef = "/Tasks/Task/Approve/"; //определяем текущего пользователя var CurUser = (User)AuthenticationService.GetCurrentUser<EleWise.ELMA.Security.Models.IUser>(); //создаем фильтр для задачи согласования var TaskFilter = InterfaceActivator.Create<ApprovalTaskFilter>(); //указываем статусы активных задач TaskFilter.Statuses=TaskBaseExtensions.ActiveTaskStatuses.ToList(); // foreach(var t in TaskBaseExtensions.ActiveTaskStatuses) // {TaskFilter.Statuses.Add(t);} //указываем текущего пользователя, как согласующего TaskFilter.Query = "Harmonizator="+CurUser; //выбираем данные по фильтру var ActiveApprove = ApprovalTaskManager.Instance.Find(TaskFilter, null); //создаем фильтр для задачи согласования по документу var DocumentTaskFilter = InterfaceActivator.Create<DocumentApprovementTaskFilter>(); DocumentTaskFilter.Statuses=TaskBaseExtensions.ActiveTaskStatuses.ToList(); //указываем статусы активных задач // foreach(var w in TaskBaseExtensions.ActiveTaskStatuses) // {DocumentTaskFilter.Statuses.Add(w);} //указываем текущего пользователя, как согласующего DocumentTaskFilter.Query = "Harmonizator="+CurUser; //выбираем данные по фильтру var ActiveDocumentApprove = EntityManager<DocumentApprovementTask>.Instance.Find(DocumentTaskFilter, null); } @{ foreach(var item in ActiveDocumentApprove) { //формируем ссылку из заранее созданных переменных и id найденных задач <p><a href=@DocRef@item.Id>Согласование документа - @item.Subject</a></p> } } @{ foreach(var item in ActiveApprove) { <p><a href=@TaskRef@item.Id>@item.Subject</a></p> } }
Пример 2. Мои контрагенты
В данном случае в портлете будут отображены контрагенты, в которых ответственным является текущий пользователь, и все созданные за текущий день контрагенты без привязки к ответственному.
Пример сценария с использованием PublicAPI
@using EleWise.ELMA.API; @using EleWise.ELMA.Model.Ranges; <h1>Мои контрагенты</h1> @{ //формируем ссылку, ищем нужные объекты var KontrRef = "/CRM/ContractorLegal/Details/"; var CurUser = PublicAPI.Portal.Security.User.GetCurrentUser(); //находим контрагентов по фильтру, указываем ответственным в фильтре текущего пользователя var MyKontr = PublicAPI.CRM.Contractor.Filter().Responsible(CurUser).Find(); foreach(var item in MyKontr) { <p><a href=@KontrRef@item.Id>@item.Name</a></p> } <h1>Новые контрагенты</h1> //только контрагенты, созданные сегодня (без привязки к ответственному) var createdate = new DateTimeRange(); createdate.From = DateTime.Now.Date; var NewKontr = PublicAPI.CRM.Contractor.Filter().CreationDate(createdate).Find(); foreach(var item in NewKontr) { <p><a href=@KontrRef@item.Id>@item.Name</a></p> } }
Пример сценария без использования PublicAPI
@using EleWise.ELMA.Security.Models; @using EleWise.ELMA.Security.Services; @using EleWise.ELMA.CRM.Managers; @using EleWise.ELMA.CRM.Models; @using EleWise.ELMA.Model.Services; @using EleWise.ELMA.Model.Managers; @using EleWise.ELMA.Model.Ranges; <h1>Мои контрагенты</h1> @{ //формируем ссылку, ищем нужные объекты var KontrRef = "/CRM/ContractorLegal/Details/"; var CurUser = (User)AuthenticationService.GetCurrentUser<EleWise.ELMA.Security.Models.IUser>(); //создаем фильтр для контрагента var contractorFilter = InterfaceActivator.Create<ContractorFilter>(); //указываем ответственным в фильтре текущего пользователя contractorFilter.Responsible = CurUser; //находим контрагентов по фильтру var MyKontr = ContractorManager.Instance.Find(contractorFilter, null); foreach(var item in MyKontr) { <p><a href=@KontrRef@item.Id>@item.Name</a></p> } <h1>Новые контрагенты</h1> //только контрагенты, созданные сегодня (без привязки к ответственному) var conCreateTodayFilter = InterfaceActivator.Create<ContractorFilter>(); var createdate = new DateTimeRange(); createdate.From = DateTime.Now.Date; conCreateTodayFilter.CreationDate = createdate; var NewKontr = ContractorManager.Instance.Find(conCreateTodayFilter, null); foreach(var item in NewKontr) { <p><a href=@KontrRef@item.Id>@item.Name</a></p> } }
Пример 3. Портлет для руководителей: Контроль исполнения задач
В данный портлет будут выводиться задачи, которые исполнитель не открывал более суток. Задачи разделены на процессные задачи и обычные задачи, результат оформлен в виде таблицы.
Пример сценария с использованием PublicAPI
@using EleWise.ELMA.API @{ var TaskRef = "/Tasks/Task/Execute/"; var FreshNewTasks = PublicAPI.Portal.TaskBase.Task.Filter().Status(PublicAPI.Enums.Tasks.TaskBaseStatus.NewOrder).Query("CreationDate in RelativeDateTime(’’,’0d’)").Find(); } <TABLE border="1" ALIGN=TOP WIDTH=100% > <UL> <TR> <TD width="250" VALIGN=TOP><H3>Задачи без реакции более одного дня</H3> </TD> <TD width="250" VALIGN=TOP> @{ foreach(var item in FreshNewTasks) { <li><a href=@TaskRef@item.Id>@item.Subject</a></li> } } @{ //если нет нужных задач, вставляем соответствующий комментарий if(FreshNewTasks.Count <= 0) { <p align="center">Нет задач со статусом "Новый"</p> }} </TD> <TD width="250" VALIGN=TOP> @{ foreach(var item in FreshNewTasks) { <li>@item.CreationDate.Value.ToString().Substring(0,16)</li> } } </TD> </UL> </TR> @{ var WTRef = "/Workflow/WorkflowTask/Execute/"; var FreshNewWT = PublicAPI.Processes.WorkflowTaskBase.WorkflowTask.Filter().Status(PublicAPI.Enums.Tasks.TaskBaseStatus.NewOrder).Query("CreationDate in RelativeDateTime(’’,’0d’)").Find(); } <UL> <TR> <TD width="250" VALIGN=TOP> <H3> Процессные задачи без реакции более одного дня</H3></TD> <TD width="250" VALIGN=TOP> @{ foreach(var item in FreshNewWT) { <li> <a href=@WTRef@item.Id>@item.Subject</a></li> } } @{ if(FreshNewWT.Count <= 0) { <p align="center">Нет задач со статусом "Новый"</p> } } </TD> <TD width="250" VALIGN=TOP> @{ foreach(var item in FreshNewWT) { <li>@item.CreationDate.Value.ToString().Substring(0, 16)</li> } } </TD> </UL> </TR> </TABLE>
Пример сценария без использования PublicAPI
@using EleWise.ELMA.Model.Managers; @using EleWise.ELMA.Tasks.Models; @using EleWise.ELMA.Model.Services; @using EleWise.ELMA.Workflow.Managers; @using EleWise.ELMA.Tasks.Managers; @using EleWise.ELMA.Workflow.Models;
@{ var TaskRef = "/Tasks/Task/Execute/"; var taskFilter = InterfaceActivator.Create<TaskFilter>(); taskFilter.Status = TaskBaseStatus.NewOrder; taskFilter.Query="CreationDate in RelativeDateTime(’’,’0d’) "; var FreshNewTasks = TaskManager.Instance.Find(taskFilter, null); } <TABLE border="1" ALIGN=TOP WIDTH=100% > <UL> <TR> <TD width="250" VALIGN=TOP><H3>Задачи без реакции более одного дня</H3> </TD> <TD width="250" VALIGN=TOP> @{ foreach(var item in FreshNewTasks) { <li><a href=@TaskRef@item.Id>@item.Subject</a></li> } } @{ //если нет нужных задач, вставляем соответствующий комментарий if(FreshNewTasks.Count <= 0) { <p align="center">Нет задач со статусом "Новый"</p> }} </TD> <TD width="250" VALIGN=TOP> @{ foreach(var item in FreshNewTasks) { <li>@item.CreationDate.Value.ToString().Substring(0,16)</li> } } </TD> </UL> </TR> @{ var WTRef = "/Workflow/WorkflowTask/Execute/"; var wftaskFilter = InterfaceActivator.Create<WorkflowTaskFilter>(); wftaskFilter.Status = TaskBaseStatus.NewOrder; wftaskFilter.Query="CreationDate in RelativeDateTime(’’,’0d’) "; var FreshNewWT = WorkflowTaskManager.Instance.Find(wftaskFilter, null); } <UL> <TR> <TD width="250" VALIGN=TOP> <H3> Процессные задачи без реакции более одного дня</H3></TD> <TD width="250" VALIGN=TOP> @{ foreach(var item in FreshNewWT) { <li> <a href=@WTRef@item.Id>@item.Subject</a></li> } } @{ if(FreshNewWT.Count <= 0) { <p align="center">Нет задач со статусом "Новый"</p> } } </TD> <TD width="250" VALIGN=TOP> @{ foreach(var item in FreshNewWT) { <li>@item.CreationDate.Value.ToString().Substring(0, 16)</li> } } </TD> </UL> </TR> </TABLE>