Вот обещанные детали реализации. Задача упрощённо - знать, кто последний открывал форму на портале.
1. Тип Entity Form выбрали Edit, иначе копки Approve/Reject не доступны в режиме RеadOnly.
2. При подключении к порталу на стороне портала есть нужная информация про подключившегося - {user.id}, значение webRole etc. Поэтому создано отношение N:1 "Portal User" (client) > Quote, которое хранит ID пользователя портала (контакт в СРМ). Задача - обновить значение этого лукапа (поле new_portalcontactid) в CRM.
3. Рассматривался вариант создания и вызова веб-сервиса, но хотелось чего-то "меньше по весу".
4. Кнопка Submit присутствует на Entity Form по умолчанию, но она была скрыта - потому что пользователь не может менять детали на портале:
X++:
$(".button[id='UpdateButton']").hide();
5. Поле new_portalcontactid добавлено на форму портала, причём скрыть его - нужнa не одна, а три команды -
X++:
$("#new_portalcontactid_name").hide();
$("#new_portalcontactid_label").hide();
if (IsNull != $("button.btn.btn-default.clearlookupfield")) {
$("button.btn.btn-default.clearlookupfield").slideUp();
}
3-я команда для clearlookupfield скрывает большой крестик выбора на поле лукапа, почему-то hide для него не работает, поэтому он исчезает подобно улыбке Чеширского кота (в реальности очень быстро, для пользователя незаметно).
6. Кнопка Submit (#UpdateButton), хотя и скрыта, но вызвать событие её нажатия можно -
X++:
function gridCallBack() {
if($('table.table-striped.table-fluid').is(':visible')) {
$("#UpdateButton").trigger("click");
} else {
setTimeout(gridCallBack, 200);
}
}
CallBack нужен, чтобы удостовериться, что таблица с дочерними записями подгрузилась на форме, иначе это вызывало ошибку изображения линий.
7. На Entity Form в разделе "On Success Settings" указали, что нужно сделать Redirect на Web Page, и выбран прототип этой же страницы.
8. при загрузке страницы поле new_portalcontactid подгружается из СRМа на форму вместе со всеми остальными,считывается, проверяется на совпадение с текущим {user.id} и если они разные, новые значения лукапа сохраняются и вызывается gridCallBack().
X++:
if (userID != $("#new_portalcontactid")[0].value) {
//set field value to current portal user ID
$("#new_portalcontactid").val(userID);
$("#new_portalcontactid_entityname").val(userType);
gridCallBack();
}
9. Для пользователя страница перезагружается, это довольно быстрый процесс но почему я и назвал решение не очень элегантным. Если нужны ещё детали - спрашивайте