Я пытаюсь создать компонент, который динамически отображает поля из sObject FieldSet. Функция, которую я хотел бы добавить, — это возможность перехода от пользовательского интерфейса компонента к макету страницы FieldSet, чтобы добавлять/удалять поля по мере необходимости. Возможно ли это сделать, используя стандартный набор полей sObject в активном режиме Lightning? есть ли лучший подход для этой функциональности в молнии? похоже, что FieldSet не полностью поддерживается в Lightning... по крайней мере, пока?

0
sfdx bomb 10 Авг 2018 в 15:26
1
FieldSet является конфигурацией установки, хотите ли вы, чтобы конечные пользователи могли изменять FieldSet из LC? Или пользователи, имеющие доступ к этому LC, будут только системными администраторами? Каков ваш вариант использования здесь?
 – 
Jayant Das
10 Авг 2018 в 16:00
Они не поддерживаются в Lightning, но поддерживаются в Classic. В любом случае вам понадобится контроллер на стороне сервера для выполнения вашего запроса и передачи информации туда и обратно вашему компоненту.
 – 
crmprogdev
10 Авг 2018 в 16:22
Функция «Да» будет доступна только для системных администраторов, у которых есть доступ к настройке того, какие поля будут доступны на экране. Вариант использования в основном просто для облегчения доступа - в настоящее время, чтобы добраться туда, вы должны переключиться на классический> перейти к настройке> объект поиска и найти набор полей, чтобы отредактировать, какие поля будут отображаться.
 – 
sfdx bomb
10 Авг 2018 в 16:49

3 ответа

После еще немного поиска кажется, что единственный способ в настоящее время перейти на страницу редактирования/просмотра FieldSet — это принудительно перейти к классическому интерфейсу с помощью взлома URL.

Страница редактирования/просмотра по идентификатору набора полей:

"https://<your instance url>.my.salesforce.com/<FieldsetId>"

Все наборы полей по идентификатору sObject:

"https://<your instance url>.my.salesforce.com/_ui/common/config/entity/FieldSetListUI/d?retURL=%2F0IX%2Fe%3Fsetupid%3DCustomObjects&setupid=CustomObjects&tableEnumOrId=<EntityDefinitionId>"

Чтобы динамически получить базовый URL-адрес в APEX:

private static String baseUrl = URL.getSalesforceBaseUrl().toExternalForm();

Чтобы получить идентификатор FieldSet — самый быстрый способ — попросить администраторов сначала скопировать и вставить его один раз и сохранить в месте, которое можно запросить (например, пользовательский тип метаданных, sObject..) — тогда FieldSetId или EntityDefinitionId можно объединить. в эту строку FieldSetURL. который из JS я только что разрешил навигацию по клику:

window.location.href = FieldSetURL; 

В случае, если кто-то захочет пройти лишнюю милю и получить либо FieldSetId, либо EntityDefinitionId - по-видимому, единственный способ получить их динамически будет через REST Tooling API - ниже показан пример: https://success.salesforce.com/answers?id=90630000000Cjf2AAC

string fieldSetName = 'xxx'; // replace to the Name of your fieldSet
string query = 'Select Id,ManageableState,MasterLabel,DeveloperName,NamespacePrefix,Description,EntityDefinitionId from FieldSet Where DeveloperName=\''.replace(' ','+') +fieldSetName +'\'';

String baseUrl = URL.getSalesforceBaseUrl().toExternalForm();
String toolingAPIString = '/services/data/v43.0/tooling/query/?q='+query;
String reqMethodType ='GET';

    Httprequest request =new HttpRequest();
    request.setEndpoint(baseUrl + toolingAPIString);
    request.setMethod(reqMethodType);
    request.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionID());
    request.setHeader('Content-Type', 'application/json');

    Http httpReq = new Http();
    HttpResponse res = httpReq.send(request);
    System.debug(res.getBody());

Но если цель состоит в том, чтобы иметь возможность перемещать этот код между организациями, использование Tooling API по-прежнему потребует дополнительных усилий администратора, поскольку в каждой организации потребуется настройка параметров удаленных сайтов (на настройку уходит примерно столько же времени, сколько на жестко закодированное решение для копирования и вставки идентификатора и гораздо меньше кода - но это вариант).

1
sfdx bomb 12 Авг 2018 в 03:05

Другой подход, который я использую, — использование действия update record.

Короче говоря, вы добавляете действие обновления записи к своему объекту и выбираете нужные поля.

Затем вы добавляете это действие как компонент Related Record в домашнюю запись конструктора приложений для этого объекта.

Я написал подробный ответ о том, как это сделать здесь:

Lightning, отображать поля объектов на другой вкладке

0
Itai Shmida 12 Авг 2018 в 12:09

ОБНОВЛЕНИЕ

В Winter '19 наборы полей теперь доступно в Lightning Experience.


На данный момент доступ к набору полей в LEX невозможен, и для этого вам нужно переключиться на классическую версию. Существует идея для включения этой функции в ЛЕКС.

Кроме того, на основе вашего комментария, в котором подробно изложено ваше требование, где вы хотите облегчить это из пользовательского компонента:

Функция «Да» будет доступна только для системных администраторов, у которых есть доступ к настройке того, какие поля будут доступны на экране. Вариант использования в основном просто для облегчения доступа - в настоящее время, чтобы добраться туда, вы должны переключиться на классический> перейти к настройке> объект поиска и найти набор полей, чтобы отредактировать, какие поля будут отображаться

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

Но по идее для компонента вам нужно будет знать URL-адрес набора полей объекта, к которому вы пытаетесь обратиться в Classic, а затем просто предоставить ссылку на него из вашего компонента, который перенаправит вас к полю Установите экран настройки в Classic.

Пример, который я использовал, был показан ниже, чтобы открыть страницу набора полей учетной записи из пользовательского компонента молнии.

Образец компонента:

<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
<aura:attribute name="myUrl" type="String" />

<a href="{!v.myUrl}">Account Field Set</a>

В контроллере JS заполните URL-адрес (жестко закодированный URL-адрес в компоненте не сохранял компонент, поэтому переместил его в JS)

doInit : function(cmp,event,helper){
    cmp.set("v.myUrl", "https://<my instance url>/_ui/common/config/entity/FieldSetListUI/d?retURL=%2Fui%2Fsetup%2FSetup%3Fsetupid%3DAccount&tableEnumOrId=Account&setupid=AccountFieldSets");
    ....
}
0
Jayant Das 5 Дек 2018 в 20:50
Спасибо. Да, в настоящее время я обнаружил нечто подобное, когда я получаю базовый URL-адрес с сохраненным заданным идентификатором Hard Coded FieldSet на APEX, а затем на моем контроллере JS объединяюсь в URL-адрес с помощью => window.location.href = baseUrl + '/' + fieldSetId + '?источник=lex'; Он работает, НО на самом деле это не рекомендуемый способ сделать это в молнии или не масштабируется между организациями из-за «жестко закодированного идентификатора». как-то динамически извлекать fieldSetId.
 – 
sfdx bomb
10 Авг 2018 в 21:02
Наверняка будут компромиссы, и именно здесь я упомянул, что не очень уверен в использовании этого. Однако с помощью ссылки, которую я упомянул, она может привести вас как минимум на страницу набора полей. И тогда вы всегда можете указать, как отображать эти ссылки, по крайней мере, в этом случае вам не нужен идентификатор. Таким образом, у вас, по крайней мере, есть выбор того, чего вы хотите достичь.
 – 
Jayant Das
10 Авг 2018 в 21:04
Правильно. хороший, не заметил этого - попробую - это может помочь избежать жестко закодированного идентификатора поля. будет ли это работать на пользовательском объекте? + Просто интересно, должно ли <a href="" совпадать с window.location.href - есть ли способ как-то обойти это?
 – 
sfdx bomb
10 Авг 2018 в 21:14
На самом деле не пробовал, я просто жестко закодировал это в своем тесте. Но я предполагаю, что это то же самое. Вы можете попробовать это.
 – 
Jayant Das
10 Авг 2018 в 21:29
Немного поиграл с ним, но похоже, что пользовательский объект не будет поддерживать ваш формат URL. из того, что я пробовал => Взлом URL-адреса будет работать только при переходе непосредственно к baseUrl + '/' + fieldSetId жесткого кода. Спасибо за ваше предложение.
 – 
sfdx bomb
10 Авг 2018 в 23:18