[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
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> } } |
.png)
Пример 2. Мои контрагенты
В данном случае в портлете будут отображены контрагенты, в которых ответственным является текущий пользователь, и все созданные за текущий день контрагенты без привязки к ответственному.
Пример сценария с использованием 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 | @ 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> } } |
.png)
Пример 3. Портлет для руководителей: Контроль исполнения задач
В данный портлет будут выводиться задачи, которые исполнитель не открывал более суток. Задачи разделены на процессные задачи и обычные задачи, результат оформлен в виде таблицы.
Пример сценария с использованием 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 | @ 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> |
.png)