logo

[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

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.
@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

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно
@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

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.
@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>
Результат: