6. Web Designer
27 марта 2020 г.
17:22
https://www.oneidentity.com/community/identity-manager/f/forum/27167/grid-band-search-function
Чтобы создать новую страницу - надо сначала создать новый проект и для портала выбрать этот проект.
If properties that are defined in the web project (languages, display settings, menu structure) are going to be changed, you must make a copy of the default web project.
Затем создать новый модуль - это и будет страницв с ссылкой в меню.
Добавление ячеек в таблицу
Для того, чтобы отобразить данные из таблицы на странице
Выбрать элемент на веб странице - он отобразиться на вкладке Properties
Правой кнопкой по нему - Show definition object
Выбрать Main - правой кнопкой - Structure nodes – Container
Затем по созданному контейнеру правой кнопкой - выбрать элемент
Добавить строку в таблицу
https://www.oneidentity.com/community/identity-manager/f/forum/22545/webdesigner-question-again
Для того, чтобы иметь возможность добавить TextBox - надо сначала создать Container (Iteration) и в него уже поместить TextBox.
Did you load the table ADSAccount? It seems like you are having trouble there as well....
In the initilizer choose the data action "load collection" and use a wise whereclause. Something like UID_Person=getuser(). You can have this whereclause on the collection itself as well...
Or are you ok with that?The filter on ADSAccount would be something like:
UID_Person = (from Person select current UID_Person)
Выделить надпись жирным
Цвет верха страницы (синий) задан в переменной VI_Common_Color_MastHead
Правка configuration keys.
To configure a web project
-
Click Edit in the menu bar.
-
Select Web project in the Configure project sub-menu
Отображение приветствия
format("Hello, {0}!", from user select firstname)
Надо изменить заголовок
Удаление строки
Создаем контейнер итерации и накидываем на него кнопку
Действие сервера - Delete
Выбираем коллекцию. В Правило фильтрации "Collection with filter rule" пишем
FirstName = (select current FirstName from PersonColl_Test)
А лучше выбирать UID!!!
Кнопка
Русификация портала
Заходим в дизайнер - Base Data – Databases - справа внизу Edit translation in database -
o import the files using the Designer
-
In the lower pane of the navigation view, select Base Data.
-
In the Language Editor Task pane (far right pane), select the Edit translation in database.
The Language Editor appears.
-
Click the
-

Import toolbar button.
- Navigate to the required .csv language file, and click Open.
The file import may take several minutes to complete. Click the
Commit to database toolbar button to save the files to the One Identity Manager database.
|
| Note: There are separate language packs for each module and each language, allowing you to install the required translations for the modules you have installed. Repeat this import process for each language pack to want to install. |
|----|----|
Once the language files are imported into One Identity Manager, there are no additional steps required to configure the web portal to display in a different language. The web portal will display in the current browser language. For information on installing the web portal, see the One Identity Manager Installation Guide.
Заходим в IE и настраиваем на русский - чтобы первым был.
Чтобы делать записи на 2х языках с переводом
В значении указывать
translate('#LDS#Test1')
Затем идем в Edit – Captions и там добавляем ключ Test1 с текстом на русском.
Условие для отображения меню
В проекте для пункта меню указать условие, например:
Exists("personinaerole",sqland(sqlcompareuid("uid_person",getuser()),"xorigin > 0 and uid_aerole in (select UID_Aerole from AErole where Ident_Aerole in ('CCC_gph_manager', 'CCC_trigram_manager', 'CCC_allusers_view'))"))
или для конкретного пункта меню
Exists("personinaerole",sqland(sqlcompareuid("uid_person",getuser()),"xorigin > 0 and uid_aerole in (select UID_Aerole from AErole where Ident_Aerole in ('CCC_allusers_view'))"))
Не работает поиск по индексу на портале
Не указывать балансировщик для поиска, а указывать конкретный App Server!!!
Переконфигурация портала и настройка поиска (app server)
In Web Portal bin folder, launch WebDesigner.ConfigFileEditor tool to check if App server connection defined in Search service section works. Most likely app server or its configuration has an issue. HTH.
Передача action из меню
То есть, если у нас из меню приходит действие edit - он просто загружает текущего сотрудника из коллекции
Проверка значения
from Person select not match(CCC_Trigramm, '^[A-z0-9_]*\$')
На карточке пользователя на портале не отображаются все свойства
Сначала думал, что проблема с правами на просмотр атрибутов.
Атрибуты просто не были перечислены в конфиге, откуда функция (PropertyList()) берет их.
Надо зайти в Edit – Configure Project – WebProject.
Параметр называется VI_ObjectView_Person_Fields
При выборе департамента в всплывающем окне отображается полный путь до департамента
Надо в компоненте VI_ObjectCollection_Hierarchical изменить текст
На select current display() from hierarchytable (через Extension)
Передача определенного параметра в форму
В модуле формы создания нового сотрудника (например) создаем ComponentInterface
Назначаем его на Update коллекции
В модуле, откуда вызываем
Изменения отображения поля
{{ _currentColumn3.DatabaseSourceColumn.Columnname }} in ("UID_DialogCulture")
Чтобы 2 поля не отображалось одновременно, надо в defaultColums прописать условие, например
{{ _currentColumn2.DatabaseSourceColumn.Columnname }} in ("ExitDate","DateLastWorked","CCC_Direction", "Title", "CCC_Contract")
А вообще, я остановился на Задании правила для ячейки
Ошибка "There is no cursor defined on the collection"
Надо указывать контейнере итерации и в нем компонент Column Editor
"You are getting this error because the text box does not know which row of the ShoppingCartOrder collection it should bind to.
You can try putting your textbox inside a container iteration."
Корзина
При помещении продукта в корзину - создается запись в таблице ShopingCartOrder
А сами продукты в корзине хранятся в таблице ShopingCartItem
Возможность назначения продуктов всем сотрудникам
Конфиг параметр VI_ITShop_Filter_PersonOrderFor (Employee for whom a request can be placed)
"uid_person in ( select uid_person from QER_VEditEmployee)"
Возможность назначения роли другим сотрудникам
Модуль VI_ITShop_ProductSelection
Функция CanOrderForSomebodyElse()
exists("personinaerole",sqland(sqlcompareuid("uid_person", getuser()),"xorigin > 0 and uid_aerole in (select UID_Aerole from AErole where Ident_Aerole in ('Security Administrator'))"))
-------------------------------
Чтобы руководитель мог назначать только своим подчиненным продукты, а Security Administrator - всем сотрудникам
1) Делаем копию модуля ITShop_ProductSelection с заменой
2) Добавляем параметр VI_ITShop_Filter_PersonOrderFor1 (тип SQL Filter Condition)
3) Прописываем значение только что созданного параметра
"uid_person in ( select uid_person from QER_VEditEmployee)"
4) В коллекции Container - uidPersonCandidate делаем модификацию Filter on candidate objects
format("UID_Person in(
select UID_Person from Person where {0}
UNION
select UID_Person from Person where {1}
)",if( exists("personinaerole",sqland(sqlcompareuid("uid_person", getuser()),"xorigin > 0 and uid_aerole in (select UID_Aerole from AErole where Ident_Aerole in ('Security Administrator'))")) ) then
getconfig("VI_ITShop_Filter_PersonOrderFor1") else getconfig("VI_ITShop_Filter_PersonOrderFor"),
if(PersonHasSubIdentity())then
format("UID_Person in (select uid_person from {0})", SqlFunctionCallTable("QER", "GGetInfo", "FTPersonsAreMe", sqlformatvalue(getuser(), "string", "NonUnicodeLiterals")))
else
SqlCompareUid("UID_Person",GetUser())
)
Таким образом, если сотрудник имеет подчиненных, он сможет назначать продукты своим подчиненным.
Если сотрудник Security Administrator - сможет назначать продукты всем сотрудникам.
Ориг uidPersonCandidate
format("UID_Person in(
select UID_Person from Person where {0}
UNION
select UID_Person from Person where {1}
)",
getconfig("VI_ITShop_Filter_PersonOrderFor"),
if(PersonHasSubIdentity())then
format("UID_Person in (select uid_person from {0})", SqlFunctionCallTable("QER", "GGetInfo", "FTPersonsAreMe", sqlformatvalue(getuser(), "string", "NonUnicodeLiterals")))
else
SqlCompareUid("UID_Person",GetUser())
)
Отображение в таблице имени по UID из другой таблицы
from Point_of_View select CCC_PoV_Name where UID_CCCPoint_of_View = (from CCCPointOfViewInAccProd_Temp select current CCC_UID_Point_of_View)
Отображение подкатегорий на портале
Надо создать service category верхнего уровня и для категорий нижнего уровня указывать ее как Parent service category
На портале висит надпись вверху "Development system - Updates pending"
Надо обновить портала зайдя по адресу
https://nl-sd-idmweb01.ao.nlmk/IdentityManager/monitor
В корзине нужно отображать обязательное поле UID_Department
Надо в процессе Workflow у ITShop добавить Approval level – DP - Manager of department.
Тогда при заказе продукта поле Департамент будет обязательным!
Убрать надпись Developement system из правого угла портала
В Designer поставить Production system
Создание выпадающего окна с требованием указать доп параметр
Фишка в том, чтобы указать обязательный параметр для продукта. И уже выпадающей формой задавать этот параметр.
-
Создать в ITShop Request Property - с указанием Mandatory Field
-
У ServiceItem указать в поле Request Properties (это ShoppingCartItem) это новое поле
-
Для того, чтобы у определенного продукта отображался определенный компонент - надо настроить Object-depended references, чтобы переопределить стандартные модули!
А именно:
-
Insert Shopping Cart Item
-
Parameters Shopping Cart Items
-
Edit Shopping Cart Item
-
Расширить схему параметрами для отображения
-
Для того, чтобы выводить всплывающее окно после выбора продукта, Object-depended references надо создать Insert_ShoppingCartItem компонент указываем VI_Insert_ShoppingCartItem_Default (его копию) (Этот компонент вызывается из VI_Insert_ShoppingCartItem_Default)?.
Копия VI_Insert_ShoppingCartItem_Default вызывает компонент VI_ITShop_ShoppingCartItem_Editor, который мы и можем кастомизировать!
-
Пилим VI_ITShop_ShoppingCartItem_Editor (копию)
-
Загрузка для коллекции ShoppingCartItem создаем виртуальные поля (Webinar…)
- Загружаем коллекцию Person
Указываем Create interactive entitles
- При инициализации загружаем значения полей у пользователя уже прописанные
Value берем из поля CCC_ExtendedInternetAccess (у поля значение 01010)
if(Substring((select CCC_ExtendedInternetAccess from Person where UID_Person = getuser()),0,1) = '1' ) then 'true' else 'false'
- Запись в поле
format("{0}{1}{2}{3}{4}",if(select current Webinar from ShoppingCartItem) = 'True' then '1' else '0',if(select current Social from ShoppingCartItem) = 'True' then '1' else '0',if(select current External_mail from ShoppingCartItem) = 'True' then '1' else '0',if(select current File_exchanger from ShoppingCartItem) = 'True' then '1' else '0',if(select current ForMobile from ShoppingCartItem) = 'True' then '1' else '0')
- Для того, чтобы настроить отображение полей в корзине - идем в Object Depended References
Связь VI_Interfaces_ObjectSwitch_Parameters_ShoppingCartItem
- Затем, в ComponentInterface1 создаем CollectionExtension для коллекции ShoppingCartItem
Добавляем Properties
В Initialization обновляем эти поля
if(Substring((select current CustomProperty08 from ShoppingCartItem),0,1) = '1' ) then 'true' else 'false'
На форме отображаем эти поля
Отключить возможность изменения поля
надо в Extensions HTML attr указать 'disabled' в обоих полях
В дополнение
Колонки при указании параметров:
являются колонками таблицы ShoppingCartItem
При добавлении новых колонок, расширении ShoppingCartItem надо так же расширить таблицу PersonWantsOrg этой же колонкой! Так как данные уходят в PWO после Submit заказа.
Только нужно не забыть про права на колонку новую! А то может не хватить прав у пользователя писать в нее!
В выпадающим окне сделать поле, которое будет отображаться в зависимости от условия
-
Сделать копию VI_Insert_ShoppingCartItem_Default (CCC_Insert_ShoppingCartItem_TechOwner)
-
В Object-Dependent установить для Insert SHoppingCartItem созданный компонент CCC_Insert_ShoppingCartItem_TechOwner
-
Сделать копию VI_ITShop_ShoppingCartItem_Editor (CCC_ITShop_ShoppingCartItem_Editor_TechOwner)
-
CCC_Insert_ShoppingCartItem_TechOwner будет открывать CCC_ITShop_ShoppingCartItem_Editor_TechOwner если есть Request Properties обязательные у ServiceItem
-

-
У CCC_ITShop_ShoppingCartItem_Editor_TechOwner убрать стандартный элемент PropertyEditor и дополнить самостоятельно нужными колонками, в колонке, для которой нужно будет условие отображения - указать поле Viewing condition (у ее контейнера)
-
Для отображения колонки в поле деталей ShoppingCartItem (справа) после помещения в корзину, нужно создать пустой компонент и дополнить его полями для отображения из ShoppingCartItem (не из Request Properties)
-
В Object Dependent сделать для компонента Parameters ShoppingCartItem - этот компонент будет отображаться ниже Request Properties
-
![Stat page VI_StandardVVeb ccc CCC CustomTechOwner Configuration Custom Techowner Load collection: CMD8 Servers Shoppingcaftltem- CCC_LII Container LayoutPaneII Elfi Container3 8,1aAeneu Elfi Containers ShowChangehÆIue0 - true DisplayNoPopup0 - false EnableNauigation0 - true AdditionalVVhereCIause0 - [E]ÉÉlä EditTabIe- ShoppingCaftItem EditCoIumn- CCC DID Person Object-dependentreferences Shouu eRension values Node editor Container I (Container) General settings Vie•.ming condition Identifier (optional) Grouping ShoppingCarCICem ERended properties s lect u rent CCC UID Person](../media/6. Web Designer/media/image32.png)
Условие Condition отображения контейнера
from PersonWantsOrg select current (DisplayOrg in ('Доступ в интернет'))
(IsNull(ShowCancelOrder(), true) = true)
and
(from PersonWantsOrg select top 1
(Orderstate in ('OrderProduct','OrderProlongate','OrderUnsubscribe', 'Granted')
and (uid_personinserted = (select uid_person from user) or uid_personordered = (select uid_person from user))
and convert( isnull(getconfig("VI_ITShop_OrderHistory_CancelOrder"), 'false'), 'System.Boolean')) where UID_PersonWantsorg = '\<UID_PersonWantsOrg you are currently looking at>')
exists("personinaerole",sqland(
sqlcompareuid("uid_person", getuser()),"xorigin > 0 and uid_aerole in (select UID_Aerole from AErole where Ident_Aerole in ('IDM Operator' ))"))
Добавить поле на страницу нового сотрудника иностранного или по договору
Сначала расширить схему у Person.
В WebDesigner помимо того, что добавить поле
Надо в ColumsEditor проверить, что поле указано в условии отображения
Upload file
Имя файла
format("C:\temp\0}",select filename from localvars)
format("C:\temp\0}",select current UID_AccProduct from ShoppingCartItem)
If you do, then the "File name" could be filled out with : format("C:\Upload\0}-{1}", from FileUploadLocalCollection select filename, FormatDate(getdate(), "yyyyMMdd-hhmmss"))
Создание модуля для редактирования объектов
-
Надо создать модуль и повесить его на пункт меню
-
В этом модуле указать коллекцию - объект БД
-
Создать грид на форме для отображения данных из коллекции
-
Создать коллекцию типа Single Row для хранения временных данных (TempVars)
-
Создать коллекцию для хранения выбранной записи из таблицы (CurrentAccountProduct) - Object Type как у основной коллекции
-
У грида основной таблицы указать Selection Action - сохранение в временую коллекцию UID (from AccountProductGroup select current uid_accproductgroup)
-
Создать ещё одну форму
-
Указать редирект на новую форму из действия Selection Action
-
У новой формы сделать инициализацию коллекции Current с условием WHERE (sqlcompareuid("uid_accproductgroup", from TempVars select UID))
-
Сделать итерацию по этой коллекции
Сохранение существующего имени файла, через Upload
If you do, then the "File name" could be filled out with : format("C:\Upload\0}-{1}", from FileUploadLocalCollection select filename, FormatDate(getdate(), "yyyyMMdd-hhmmss"))
In my example, I defined a local single row collection called "FileUploadLocalCollection" with string Property "filename".
With that, you must assign "Collection for file name" to "FileUploadLocalCollection", and "Property for file name" to "filename".
Изменение имени файла, через Upload
Надо создать 3 функции в модуле или компоненте
**1) FullFileName() **
select filename from FileUploadLocalCollection
2) GetFileName()
Substring(FullFileName(), 0, Indexof(FullFileName(), ".", 0))
3) GetExtension()
Substring(FullFileName(), Indexof(FullFileName(), ".", 0), )
Потом можно их использовать для составления имени файла
format("C:\inetpub\wwwroot\IdentityManager\Doc\0}-{1}{2}",GetFileName(),FormatDate(getdate(), "dd-MM-yyyy-hhmmss"),GetExtension())
Написать код в функцию
{{ string.Concat(System.Linq.Enumerable.Repeat("--", length)) }}
Указать тег html
В Extended Properties создать Variable
Идентификатор TagName
значение - имя тега
Отображение полей редактируемой таблицы на форме
-
Создаем Container Iteration по Current объекту таблицы
-
В нем property iteration и в нем Property list - перечисляем свойства таблицы для редактирования
-
Потом в property iteration создаем контейнер с расширенными свойствами HTML Attribute - "class" -
"LayoutpPropRow"
- В этом контейнере создаем ещё контейнер со свойством class
"imx-layoutpanel-cell imx-layoutpanel-mobileblock LayoutpPropCol LayoutpPropCol0 imx-flex-row"
Там будет VI_Edit_PropertyCaption
- И создаем параллельно ещё контейнер с class
"imx-layoutpanel-cell imx-layoutpanel-mobileblock LayoutpPropCol LayoutpPropCol1"
в нем ещё один контейнер с Column-Depended Reference
Добавление нового элемента в таблицу
-
Создаем новую коллекцию с типом объекта - наша таблица, куда будем писать данные
-
Создаем новую форму
-
Делаем кнопку на основной форме и делаем Insert в новую коллекцию и действие после Insert -> переадресуем на новую созданную форму
-
Новая форма - копия формы для редактирования таблицы, только объект - новая коллекция
Добавить колонку в индекс для поиска
Browse the column in Designer, and assign an index weight (for example 1). This will cause the description field to be included in the index for service items.
* *
Потом можно перезапустить индекс - надо зайти на AppServer
Identity Manager 8.0 - Web Portal User Guide (oneidentity.com)
Добавить таблицу для поиска на портале
Например, по дефолту на портале не ищутся сервисные категории.
Чтобы добавить поиск по сервисным категориям, надо в WebDesigner зайти в модуль VI_Common_Search и добавить, как Extension новую таблицу
Перевод колонки
Language dependent column name for displaying in the administration tool’s user interface. Translate the given text using the
button.
Если на портале
datacaption(personwantsorg,displayorg)
Отключить возможность саморегистрации на главной (Click here if you do not have an account.)
Перевести Строк верхнего уровня в Корзине
В переводах ключ WD_GridPagingTotalCountTopLevel
Заказ продуктов Все для всех
Значение параметра VI_ITShop_Filter_PersonOrderFor
заменить на
"uid_person in ( select uid_person from QER_VEditEmployee)"
У VI_ITShop_ProductSelection
Collections - Container - uidPersonCandidate фильтр указать
format("UID_Person in(select UID_Person from Person where {0})",getconfig("VI_ITShop_Filter_PersonOrderFor"))
Чтобы даты отображались в архиве в нормальном формате, а не daysago
There is an editor available for these column-dependent references.
On the start-page click on Column-dependent references.
Then go to the tab Display values by column and identify the columns that use the component VI_Edit_View_DateTimeago. Click on these columns and customize them to use the Component VI_Edit_View_Date.
That should do the trick.
>Но это не изменило отображение!
Поэтому, я зашел в стандартный проект (Vi_StandartWeb) и удалили формат ячеек, через Extension
The WebDesigner component reponsible for the "user-friendly" display is called VI_Edit_View_DateTimeago. If you search for that name in WebDesigner, you will find component references that look like in the following screenshot. These rules say that the user-friendly display will be used to display values from the specified column.
You can delete these rules and the display will revert to the "technical" display.
Убрать поля в колонке справа
WEBSQL кусочек из строки взять
VI_Common_DecisionHistory
Substring(from DecisionHistory select current displayvalue(UID_PWODecisionRule),5)
Проверка значений на корректность Regex
Пишем скрипт
#If Not SCRIPTDEBUGGER Then
Imports System.Text.RegularExpressions
#End If
Public Function CCC_isWhiteSpace(ByVal str As String) As Boolean
Dim pattern As String
pattern = "^[\s|\|\]"
If Not Regex.IsMatch(str, pattern, RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant) Then
Return False
Else
Return True
End If
End Function
Public Function CCC_isPhoneNumber(ByVal str As String) As Boolean
Dim pattern As String
pattern = "^((8|\7)[\ ]?)?(\?\d{3}\?[\ ]?)?[\d\ ]{7,10}\$"
If Not Regex.IsMatch(str, pattern, RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant) Then
Return False
Else
Return True
End If
End Function
CCC_ITShop_Approvals
В Веб дизайнере добавляем валидатор
translate('#LDS#IncorrectValue')
CCC_isWhiteSpace(from Vars select current ReasonDeny)
И перевод не забыть добавить!
Или можно ещё через FormatScript у поля сделать
Web designer validation not triggered - Forum - Identity Manager Community - One Identity Community
Imports System.Text.RegularExpressions
Public Function CCC_ServiceAccount_CheckName(ByVal text As String) As Boolean
Dim pattern As String = "[^A-Za-z0-9\]"
Dim c As MatchCollection = Regex.Matches(text, pattern)
Dim m As Match
Return (c.count=0)
End Function
--
Убрать сообщения об ошибках при логине на портале
Перевести портал в прод режим
Just configure your web portal to run in production mode and not in debugging mode as it currently does.
Отображение категорий списком верхнеуровневым
\<\<HowTo ITShop Service catalog accordeon.docx>>
Настройка опционального шага обоснования принятых решений по запросам на доступ в IT Shop
\<\<HowTo ITShop Simplified approval.docx>>
Балансировщик
Hello Community,
we have 1IM V8.1 running in the environment with 2 Application Servers connected via load balancer and 2 Web Servers connected via load balancer.
Is it enough to configure the load balancer for the Application Servers as follows:
-
sticky sessions support from the load balancer
-
ss-id cookies for Application Server
-
the signing (session token) certificate of both application servers is the same, which allows reusing a session from one application server in case of a server switch.
Should the load balancer for Web Servers have a similar configuration?
Поиск
Identity Manager 8.0.5 - Web Designer Reference Guide (oneidentity.com)
Чтобы работал поиск у Grid, надо указать дополнительные Extended Properties
Добавить дополнительную информацию в PWO для отображения на портале
Поле PWO DisplayObjectKeyAssignment
LOAD Collection условие WHERE
sqlcompareuid("uid_person", from Container select UID_PersonSelected)
sqland("CCC_EmployeeType='Contractor'","IsInActive='1'")
format("UID_AccProduct in (select StructureDisplay1 from AttestationCase where StructureDisplay1 \<> '')")
Sqlcompareuid - возвращает только одно значение.
Добавить кнопку для отображения уволенных при заказе продукта при выборе получателя
CCC_ITShop_ProductSelection из него идет VI_Edit_MultiFK
Делаем копию VI_Edit_MultiFK
Копируем кнопку Change
Создаем Content1
CandidateDbWhereClause заменяем на ""
У кнопки делаем ссылку на Content1
Multi-request resources
Для Object Dependent References привязать интерфейс к компоненту
Валидатор выкидывает ошибку (validate)
Функция exists ведет себя странно, вместо нее использовать можно count
Where Clause
"(UID_WorkDeskType='e6e5472b-3fe0-4eb8-b5d9-84b3fa16c2a4')"
Или
sqlcompare ("LastName", "Schm*", "string", "LIKE")
Не хватает прав на отображение поля на портале "Viewing permission denied for value"
Добавил сотрудника, под которым вхожу на портал в APP роль "Identity & Access Governance\§Auditors"
За связь ITShop и UNSGroupB (с имеющимся ServiceItem и галкой ITShop) отвечает таблица ITShopOrgHasUNSGroupB
Быстрый вывод записей из таблицы (вывод сотрудников)
VI_ITShop_QueryToPerson
Выбор из множества записей
VI_Edit_FK / VI_Edit_FK_AutoComplete
Использовать поле FK! Которое ссылается на другую таблицу!
Можно использовать виртуальную коллекцию.
Смысл: Создаем виртуальную Single-row коллекцию, в ней определяем Column, как на скриншоте
А в VI_Edit_FK_AutoComplete указываем эту колонку из Single-row коллекцию
Автопубликация AD групп в ITShop
Процесс
ADS_ADSGroup_Publish_to_ITShop
Параметр для включения фичи
QER\ITShop\GroupAutoPublish
Наследование полномочий - заказ продукта как у другого пользователя (select reference user)
Отвечают компоненты
VI_ITShop_ProductSelectionByReferenceUser
VI_ITShop_ProductSelection_ReferenceUser
Условие отображения меню для определенной категории, чтобы можно было указать связанного пользователя (заказать продукты как у другого пользователя)
Для остальных категорий ссылка в меню будет скрыта
Модуль VI_ITShop_ProductSelection
from Container select current WhereClauseGroup = "uid_accproductgroup = 'd492fba0-3be1-49df-a355-d84b3ad1eb20'"
Для более корректной работы я создал отдельный пункт меню:
-
Делаем копию VI_ITShop_ProductSelection_ReferenceUser
-
В компоненте VI_ITShop_ProductSelection добавляем расширением для коллекции Container - параметр uidPersonReferenceSED такой же, как uidPersonReferenceSED
-
Добавляем пункт меню, как Select a reference user
- Условие отображения пункта меню делаем:
from Container select current WhereClauseGroup = "uid_accproductgroup = 'd492fba0-3be1-49df-a355-d84b3ad1eb20'"
- Set Foreign Key ставим uidPersonReferenceSED
- В Events добавляем событие на Update Container
- Load Collection - PersonReference условие Where
format("uid_person = {0}", sqlformatvalue(from container select uidpersonreferencesed, "string", "NonUnicodeLiterals"))
-
Делаем редирект на копию VI_ITShop_ProductSelection_ReferenceUser
-
Property watch = uidPersonReferenceSED
В копии VI_ITShop_ProductSelection_ReferenceUser через расширение удаляем
- Через расширение для Fill Collection ObjectAssignment делаем условие Where
FullPath LIKE "SED*"
Использование Database queries
Создать запросы в WebDesigner -> Edit -> Edit database queries
Используем так:
Грабли:
- Если создавали запрос не через wizard то потребуется добавить права для групп. Ниже запрос который это делает. Нужно только поменять название группы и название запроса.
insert into QBMGroupHasLimitedSQL(UID_QBMLimitedSQL,UID_DialogGroup,XObjectKey) select UID_QBMLimitedSQL,UID_DialogGroup,concat('\<Key>\<T>QBMGroupHasLimitedSQL\</T>\<P>',UID_QBMLimitedSQL,'\</P>\<P>',UID_DialogGroup,'\</P>\</Key>') as XObjectKey from (select (select UID_DialogGroup from DialogGroup where GroupName = N'CCCViewPermissions') as UID_DialogGroup,(select UID_QBMLimitedSQL from QBMLimitedSQL where Ident_QBMLimitedSQL = N'CCC_CMDBGetParamFilter') as UID_QBMLimitedSQL) as x
- Нужно обязательно определить поля в коллекции, которые возвращает запрос иначе будете получать исключение что запрос не возвращает некие стандартные поля.
Изменить отображение записей в модальном всплывающем окне выбора FK
Для самой колонки можно изменить Display в Designer
Кастомизация заказ продукта как у другого пользователя (только для определенной категории)
-
Создан кастомный модуль на основе VI_ITShop_ProductSelection_ReferenceUser (CCC_ITShop_ProductSelection_ReferenceUser_SED)
-
В модуле VI_ITShop_ProductSelection (у заказчика CCC_VI_ITShop_ProductSelection)
добавить в Collections - Container - Property (uidPersonReferenceSED) - как копия uidPersonReference
-
В ToolbarButton4 добавить как копию "Select a reference user" - Select a reference user for SED - с переводом
-
В ObjectSwitchContainer2 в Action - Set foreign key задать Property - uidPersonReferenceSED
- Добавить сработку на событие Update - Container по полю uidPersonReferenceSED и редирект на компонент CCC_ITShop_ProductSelection_ReferenceUser_SED
- В компоненте CCC_ITShop_ProductSelection_ReferenceUser_SED для Fill collection: ObjectsAssignment указываем правило фильтрации - только продукты СЭД
- Для того, чтобы пункт меню отображался только для категорий СЭД - надо установить условие отображения этого пункта в модуле VI_ITShop_ProductSelection
- Для того, чтобы отображать только группы AD Sed - В компоненте CCC_ITShop_ProductSelection_ReferenceUser_SED добавим таблицу AccProductGroupCollection
- Загрузим коллекцию
- Загрузим только группы из этой коллекции
- Задать конфигурационный параметр - UID категории СЭД!
Вариант, через кнопку в компоненте CCC_ITShop_AccProductGroupSelector
- Из компонента VI_ITShop_ProductSelection скопировать VI_Popup из Select reference user
В Action кнопки компонента CCC_ITShop_AccProductGroupSelector
В ComponentInterface1 в virtual collection Container добавить VirtualProperty uidpersonreference
Добавить виртуальную коллекцию PersonReference
Из компонента VI_ITShop_ProductSelection скопировать Event Update uidpersonreference
В CCC_ITShop_AccProductGroupSelector
Аттестация. Отображение случаев аттестации сгруппированным и с бегунком по высоте страницы.
В компоненте CCC_Attestation_AttestationCase_ViewMultiplePolicy установить ApplyFilledHeight = false
Изменение модального окна выбора дополнительных параметров продукта
Для отображения модального окна при помещении продукта в корзину используется компонент VI_ITShop_ShoppingCartItem_Editor
Для получения списка параметров используется функция GetAccProductParams
Скрыть продукты из отображения для выбора (Candidates)
В компоненте VI_ITShop_ProductSelection GridBand: AccProductCandidate меняем условие Where на
from container select sqland(GetEffectiveGroupWhereClause(), whereclauseperson, "uid_AccProduct in (select UID_AccProduct from AccProduct where IsSpecialProduct = '0')")
Вариант 2
В компоненте VI_ITShop_ProductSelection (ССС_VI_ITShop_ProductSelection)
- Добавляем функцию ExcludeHiddenAccProducts() со значением
"uid_AccProduct in (select UID_AccProduct from AccProduct where XTouched = 'H')"
- GridBand: AccProductCandidate меняем условие Where на
from container select sqland(GetEffectiveGroupWhereClause(), whereclauseperson, ExcludeHiddenAccProducts())
Для продуктов с доп. параметрами (которые хотим скрыть) устанавливаем атрибут XTouched = 'H'
Удаление родительского продукта из корзины
В кастомном модуле CCC_ITShop_ShoppingCartItem_Editor_SED добавляем шаг удаление ShoppingCartItem из БД! С условием отбора - что это Parent продукт
uid_shoppingcartitem = (from ShoppingCartItem select uid_shoppingcartitem where IsOptionalChild = False)
Сделать checkbox неактивным (серым) и с поставленной галочкой
Для checkbox сделать Extended properties с Identifier:
if (from AccProductOptional select current Orderable = false) then "checked disabled" else ""
Отображение окна для Multirequetable ресурса если нет доступных (не заказанных) доп. Продуктов
Надо сделать ещё один Action с условием:
(select count() from AccProductOptional where Orderable = true) = 0 and (from shoppingcartitem select current IsOptionalChild = false)
И просто отображать PopUp с текстом
Убрать плашку аттестация сотрудников с главного экрана
Надо в модуле VI_Start отключить, через расширение, Container3






![Database Translations View a Commit to database Navigation Base Data [E} • General Databaklö TimeTracedatabases Configuration parameters Schedules Change labels Icons Large images @ Web services Getting Started One Identity Manager Schema Permissions Process Orchestration Script Library user Interface Mail Templates Documentation Base Data Favorites Help X Base Data State Search Job Server Editor Table Select Languages • Language Editor Column Usage ADSAccount ADSAccount ADSAccount ADSDomain ADSDomain ADSDomain ADSGroup ADSGroup ADSGroup ADSMachine ADSMachine ADSMachine AERole Search translation Search edsvaDeprovisionStatus edsvaDeprovisionStatus edsvaDeprovisionStatus NamespaceManaged8y NamespaceManaged8y NamespaceManaged8y edsvaDeprovisionStatus edsvaDeprovisionStatus edsvaDeprovisionStatus MachineRoIe MachineRoIe MachineRoIe Descri tion Source List of perm List of perm List of perm List of perm List of perm List of perm List of perm List of perm List of perm List of perm List of perm List of perm Data x Deprovisioni Deprovisioni No deprovisi %Globals.Ql FIM No synchron Deprovisioni Deprovisioni No deprovisi Domain con Server Workstation All resources to all emplo a lication r Tasks O Base data informabon Configura ton Editconfigurationparan*as Job Server Editor Edit]observer Language Editor Edittramslationindatabase](../media/6. Web Designer/media/image8.png)




![Configuration Definition Initializer Container Container3 Container2 8—• Extended properties [3—+ Switchl [3-0 Casel - Tree Treel E]" Tree band: HierarchyTabIe Database access options ControlListI A current GetParentKeyOfromhierarChytablein(fromhierarchytabIeseIectprimaryk Extended properties Multilingual Captions Captions.. i sel- Node Quick edit if (select f nm hierarchytable in hierarchytable select ) ) ) Gene else a pæt key that of this display, shN it DisplayLong f nm splay ( ) f nm](../media/6. Web Designer/media/image14.png)


![Main [3—+ Switchl Casel [3—+ Case2 Container (iteration): CurrenExernaIEmpIoyee Person - CurrenExernaIEmpIoyee DepartpmentWhereCIauseO - format( •UID_Departmen EmployeeType0 - •ForeignEmpIoyee• Language'] - 'QSM-CLlLT-en-LlY Title](../media/6. Web Designer/media/image17.png)










![Container Container2 - Additional Parameters Header Container3 É]5N LayoutPaneII Container 12 - Webinar A Webinar Containers Webinar Container4 - Social A Social Container6 Check80xI Container7 - Ex_mail A External_mail Container8 Checkaox2 de editor Webinar (Checkbox) Sorting -z; Grouping pety ShoppingCartItem Webinar I (No ass igned)](../media/6. Web Designer/media/image28.png)






























































