[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>
}
}
.png)
Пример 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>
}
}
.png)
Пример 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>
.png)