logo

[ELMA3] Примеры кастомных html-портлетов

В системе ELMA существует возможность создавать свои портлеты, наполняя их содержимое при помощи языка Razor.

Язык Razor представляет собой смесь C# и HTML и позволяет работать с объектами системы, оформляя данные с помощью HTML.

Для создания такого портлета необходимо добавить на страницу новый портлет типа Код. В открывшемся окне находятся настройки портлета и ссылка Открыть редактор разметки, ведущая на окно редактирования.

Для оформления одной строчки кода C# используется символ @. Например:

1
2
3
<p>
Текущее время :@DateTime.Now
</p>

Для оформления блока кода С# используется конструкция @{…}. Например:

1
2
3
4
5
6
@{
if(condition)
   {
   code
   }
}

Более подробную информацию по данной теме можно найти по адресу http://msdn.microsoft.com/en-us/VS2010TrainingCourse_ASPNETMVC3Razor.

Рассмотрим примеры портлетов типа Код.

Пример 1. Задачи согласования

В данном примере в портлете будут выводиться задачи согласования, в которых согласующим является текущий пользователь.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@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 включительно
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@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 включительно.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
@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>
Результат: