Регистрация  |  Вход

Храним в Salesforce настройки для приложения

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



В общем причин использовать настройки в приложении может быть много. А результат один - вам не придется менять изменять код и заново заливать на production org. Тем более сразу вас обрадую - на  production в Salesforce нельзя так просто взять и поменять код (открыть исходники и изменить что-нибудь), вам придется вносить изменения на dev орге и проходить весь путь по переносу кода на prod.



Для хранения настроек можно использовать базу данных (создать специальный объект и создавать записи с определенными параметрами), но в Salesforce о нас уже позаботились и предоставили удобный инструмент  Custom Settings (Setup->Develop->Custom Settings).



Custom Settings очень похожи на обычные объекты базы данных и позволяют создавать различные наборы данных и привязывать эти наборы к оргу, профилю или отдельному пользователю. Все custom settings находятся в кеше приложения, поэтому получить к ним доступ можно без использования запроса к базе данных (не тратятся лимиты).



Сохраненные в custom settings данные можно  использовать в  formula fields, validation rules, apex.



Существует два разных типа custom settings: List Custom Settings и Hierarchy Custom Settings.



List Custom Settings - тип custom settings, который позволяет хранить часто используемые непосредственно приложением статические данные, которые не зависят от пользователя или типа его профиля. Например это могут быть сокращения стран, международные префиксы телефонных номеров. Преимущество использования custom settings такого типа в отсутствии учета лимитов при обращении к ним.



Hierarchy Custom Settings - тип custom settings, который позволяет построить "персонализированную" структуру данных для определенных пользователей и профилей. При запросе данных из Custom Settings данного типа, происходит проверка профиля и типа пользователя после чего возвращаются данные наиболее точно подходящие для запросившего. Данные можно отдельно указать в следующей иерархии - Org Wide (общие) -> для Профиля -> для Пользователя.



Создание Custom Settings Setup -> Develop -> Custom Settings -> New  



salesforce-custom-settings-5



Сперва создадим тестовый custom settings с типом List.



!Важно:  Параметр Visibility имеет значение если вы создаете managed пакет. В этом случае при выборе значения Private доступ к настройкам можно будет получить ТОЛЬКО из пакета. Ни посмотреть, ни записать значения напрямую не получится. При создании пакета и хранении в custom settings закрытых данных Salesforce требует чтобы использовались именно Custom settings c visibility = Private, а доступ к ним (изменения) выполнялись через кастомную страницу с соблюдением всех мер по безопасности.



В нашем случае пакета у нас нет, поэтому значение visibility  можно выбрать любое. После сохранение открывается окно с настройками где необходимо задать поля необходимого типа для хранения данных. Этот шаг очень похож на создание custom object, но отличается лишь набором типов полей.



salesforce-custom-settings-3



Я создал одно поле Code типа Text(2)



salesforce-custom-settings-6



Напомню что по умолчанию Salesforce создает набор стандартных полей, в том числе и поле Name (его создавать не надо). По данному полю записи в Custom settings идентифицируются. В нашем случае будет туда сохранять название стран. Переходим к заполнению, для необходимо нажать кнопку Manage и далее создаем записи. Я создал несколько тестовых записей. Вот как выглядит мой экран (немного подправил View чтобы выводилось наше поле Code). 



salesforce-custom-settings-7



Все custom settings типа List созданы. Ниже я покажу как их можно использовать в коде. Создадим тестовый Custom settings типа Hierarchy и посмотрим в чем отличие. Для примера будем хранить множитель для зарплаты. На этапе создания отличий нет. Переходим к заполнению данными. Вот тут самое интересное. Мы можем задать значение для созданного нами поля для всего орга (глобальное значение - Org Wide) и также отдельно значения для Профиля или пользователя.



salesforce-custom-settings-8



salesforce-custom-settings-9  



Как пользоваться Custom Settings из кода.



Для типа List




Map<String, Countries__c> countries = Countries__c.getAll();
String USA_Code = countries.get('USA').Code__c // => USA_Code = 'US'

Countries__c USA = Countries__c.getValues('USA');
String USA_Code = USA.Code__c


Для типа Hierarchy




Test_Hierarchy_Settings__c th = Test_Hierarchy_Settings__c.getOrgDefaults();
Integer r1 = th.Ratio__c // r1 = 2
Test_Hierarchy_Settings__c th = Test_Hierarchy_Settings__c.getInstance(Profile_or_User_ID);


Также Hierarchy Custom Settings можно использовать в Formula Fields




{!$Setup.Test_Hierarchy_Settings__c.Ratio__c}