[ELMA3] Добавление собственного раздела настроек для модуля с пользовательским отображением формы просмотра и редактирования
В статье приведен пример добавления собственного раздела настроек для модуля, в котором задаются настройки подключения к СУБД MSSQL Server, а именно: Имя пользователя, Пароль, DataSource, InitialCatalog. Для реализации собственного раздела настроек необходимо наследоваться от классов:
- EleWise.ELMA.Runtime.Settings.GlobalSettingsBase - Базовый класс для глобальных настроек, хранит настройки в полях объекта.
- EleWise.ELMA.Runtime.Settings.GlobalSettingsModuleBase<TSettings> - В данном классе определяется название модуля, его раздел в системе, а также для загрузки/сохранения настроек.
- EleWise.ELMA.Web.Mvc.Models.Settings.GlobalSettingsModuleControllerBase<TSettings, TSettingsModule> - Данный класс необходим для определения положения настроек модуля, а также для отрисовки форм просмотра/редактирования.
Пример отображения данных

Рис. 1. Раздел настроек для модуля
Методы класса GlobalSettingsBase
/// <summary> /// Получить данные по свойству /// </summary> /// <param name="property">Свойство</param> /// <returns>Словарь с данными</returns> protected virtual IDictionary<string, string> GetStorageValue(PropertyInfo property) /// <summary> /// Пропускать ли свойство при автоматическом формировании данных /// </summary> /// <param name="property">Свойство</param> /// <returns><c>true</c>, если пропускать</returns> protected virtual bool SkipProperty(PropertyInfo property) /// <summary> /// Установить значение свойства по словарю с данными /// </summary> /// <param name="property">Свойство</param> /// <param name="values">Словарь с данными</param> protected virtual void SetStorageValue(PropertyInfo property, IDictionary<string, string> values) /// <summary> /// Получить настройки из объекта /// </summary> /// <returns>Словарь с настройками</returns> public virtual IDictionary<string, string> GetStorageValues() /// <summary> /// Установить настройки в объект /// </summary> /// <param name="values">Словарь с настройками</param> public virtual void SetStorageValues(IDictionary<string, string> values) /// <summary> /// Полные данные настроек /// </summary> [HiddenInput(DisplayValue = false)] public virtual IDictionary<string, string> SettingsData
Пример класса, наследованного от класса GlobalSettingsBase
public class MSSQLConnectionSettings : GlobalSettingsBase
{
/// <summary>
/// Определяет, что пароль не изменен
/// </summary>
public const string PASSWORD_NOT_CHANGED = "($PASSWORD_NOT_CHANGED$)";
public MSSQLConnectionSettings()
{
DataSource = "(local)";
InitialCatalog = "BASEMESSAGES";
}
[DisplayName(typeof(@__Resources_MSSQLConnectionSettings), "DataSource")]
[Description(typeof(@__Resources_MSSQLConnectionSettings), "DataSourceDescription")]
[Required(true)] //Обязательность заполнения поля
public string DataSource { get; set; }
[DisplayName(typeof(@__Resources_MSSQLConnectionSettings), "InitialCatalog")]
[Description(typeof(@__Resources_MSSQLConnectionSettings), "InitialCatalogDescription")]
[Required(true)] //Обязательность заполнения поля
public string InitialCatalog { get; set; }
[DisplayName(typeof(@__Resources_MSSQLConnectionSettings), "UserId")]
[Description(typeof(@__Resources_MSSQLConnectionSettings), "UserIdDescription")]
[Required(true)] //Обязательность заполнения поля
public string UserId { get; set; }
[DisplayName(typeof(@__Resources_MSSQLConnectionSettings), "Password")]
[Description(typeof(@__Resources_MSSQLConnectionSettings), "PasswordDescription")]
[Required(true)] //Обязательность заполнения поля
public string Password
{
get { return ServerPassword; }
set
{
if (value != PASSWORD_NOT_CHANGED)
{
ServerPassword = value;
}
}
}
private string ServerPassword;
}
/// <summary>
/// Ресурсы
/// </summary>
internal class @__Resources_MSSQLConnectionSettings
{
public static string DataSource { get { return SR.T("DataSource"); } }
public static string DataSourceDescription { get { return SR.T("Коннект до базы"); } }
public static string InitialCatalog { get { return SR.T("InitialCatalog"); } }
public static string InitialCatalogDescription { get { return SR.T("Имя базы данных"); } }
public static string UserId { get { return SR.T("Имя пользователя"); } }
public static string UserIdDescription { get { return SR.T("Имя пользователя для подключения к БД"); } }
public static string Password { get { return SR.T("Пароль"); } }
public static string PasswordDescription { get { return SR.T("Пароль для подключения к БД"); } }
}
Методы класса GlobalSettingsModuleBase
/// <summary> /// Название модуля /// </summary> public abstract string ModuleName /// <summary> /// Текущие типизированные настройки /// </summary> public virtual TSettings Settings /// <summary> /// Сохранить настройки /// </summary> public virtual void SaveSettings() /// <summary> /// Идентификатор модуля /// </summary> public abstract Guid ModuleGuid /// <summary> /// Объект с текущими настройками /// </summary> object IGlobalSettingsModule.Settings /// <summary> /// Загрузить настройки /// </summary> protected virtual void LoadSettings()
Пример класса, наследованного от класса GlobalSettingsModuleBase
[Component]
public class MSSQLConnectionSettingsModule : GlobalSettingsModuleBase<MSSQLConnectionSettings>
{
public static Guid UID = new Guid("{7BFF13D5-D31D-4225-8452-0176EF571939}");
public override Guid ModuleGuid
{
get { return UID; }
}
/// <summary>
/// Название модуля
/// </summary>
public override string ModuleName
{
get { return SR.T("Настройки подключения к базе MSSQL для отправки сообщений"); }
}
}
Методы класса GlobalSettingsModuleControllerBase
/// <summary> /// Переопределите данный метод для возвращения дополнительных строк /// </summary> /// <returns></returns> protected virtual IEnumerable<RowDriverForModel<TSettings>> GetRows() /// <summary> /// Текущий типизированный модуль /// </summary> public TSettingsModule Module /// <summary> /// Связанный модуль с настройками, не может быть <c>null</c>. /// </summary> IGlobalSettingsModule IGlobalSettingsModuleController.Module /// <summary> /// Рендер представления "для чтения" /// </summary> /// <param name="html">Хелпер</param> /// <returns>Представление</returns> public virtual MvcHtmlString RenderDisplay(HtmlHelper html) /// <summary> /// Рендер представления "для редактирования" /// </summary> /// <param name="html">Хелпер</param> /// <returns>Представление</returns> public virtual MvcHtmlString RenderEdit(HtmlHelper html)
Пример класса, наследованного от класса GlobalSettingsModuleControllerBase
[Component(Order = 260)]
public class MSSQLConnectionSettingsModuleController : GlobalSettingsModuleControllerBase<MSSQLConnectionSettings, MSSQLConnectionSettingsModule>
{
public MSSQLConnectionSettingsModuleController(MSSQLConnectionSettingsModule module)
: base(module)
{
}
public override MvcHtmlString RenderDisplay(HtmlHelper html)
{
return html.Action("View", "Home", new {area = RouteProvider.AreaName});
}
public override MvcHtmlString RenderEdit(HtmlHelper html)
{
return html.Action("Edit", "Home", new { area = RouteProvider.AreaName });
}
}
Пример кода контроллера Home:
public MSSQLConnectionSettingsModule SettingsModule { get; set; }</span><br>public MSSQLConnectionSettings Settings
{
get
{
return SettingsModule.Settings;
}
}
[HttpGet]
public ActionResult View()
{
return PartialView(Settings);
}
[HttpGet]
public ActionResult Edit()
{
return PartialView(Settings);
}
Пример кода представления View:
@using EleWise.ELMA
@model Permissions.Web.Extensions.MSSQLConnectionSettings
@using (Html.TableForm(v => v.ViewType(EleWise.ELMA.Model.Views.ViewType.Display).Attributes(a => a.@class = "settings_table")))
{
@Html.Property(m => m.DataSource)
@Html.Property(m => m.InitialCatalog)
@Html.Property(m => m.UserId)
<tr>
<td class="captionCell">@Html.Caption(m => m.Password)</td>
<td><span class="comment3">@(!String.IsNullOrEmpty(Model.Password) ? SR.T("Установлен") : SR.T("Не задан"))</span></td>
</tr>
}
Пример кода представления Edit:
@using EleWise.ELMA
@using EleWise.ELMA.Web.Mvc.Html
@using Permissions.Web.Extensions
@model MSSQLConnectionSettings
@using (Html.TableForm(v => v.ViewType(EleWise.ELMA.Model.Views.ViewType.Edit).Attributes(a => a.@class = "settings_table")))
{
@Html.EditableProperty(m => m.DataSource)
@Html.EditableProperty(m => m.InitialCatalog)
@Html.EditableProperty(m => m.UserId)
<tr>
<td class="captionCell">
@Html.Caption(m => m.Password, a => a.Required = true)
</td>
<td>
@Html.Hidden("Password", MSSQLConnectionSettings.PASSWORD_NOT_CHANGED)
<a href="#" onclick="@Html.OpenPopup("SetPasswordPopup");return false;">
@(string.IsNullOrEmpty(Model.Password) ? SR.T("Установить пароль") : SR.T("Изменить пароль"))
</a>
@Html.PopupWindow("SetPasswordPopup", SR.T("Установка пароля"), @<div>@Html.Partial("SetPasswordForm")</div>, width: 200)
</td>
</tr>
}

Рис. 2. Редактирование настроек модуля
В представлении Edit вызывается popup-окно SetPasswordPopup для установки пароля, пример кода которого представлен ниже:
@using EleWise.ELMA
<div>
@Html.Password("NewPassword", string.Empty, new { style = "width:100%", TextMode = "Password" })
</div>
<div>
<div class="popup-buttons">
<input type="button" class="confirm" value="@SR.T("Сохранить")" onclick="$(’#Password’).val($(’#NewPassword’).val()); @Html.ClosePopup("SetPasswordPopup")" />
<input type="button" value="@SR.T("Отмена")" onclick="@Html.ClosePopup("SetPasswordPopup")" />
</div>
</div>

Рис. 3. Установка пароля в поле «Пароль»
В данном примере реализованы настройки для подключения к СУБД MSSQL, в которой реализован собственный канал сообщений. Чтобы использовать данные настройки, необходимо их загрузить и использовать полученные данные. Пример использования настроек при подключении к СУБД MSSQL:
public static string MssqlConnectionString()
{
var settings = Locator.GetService<MSSQLConnectionSettingsModule>();
if (settings.Settings.DataSource.IsNullOrWhiteSpace() ||
settings.Settings.InitialCatalog.IsNullOrWhiteSpace() ||
settings.Settings.UserId.IsNullOrWhiteSpace() ||
settings.Settings.Password.IsNullOrWhiteSpace())
return string.Empty;
else
{
var connectionstring = new SqlConnectionStringBuilder()
{
DataSource = settings.Settings.DataSource,
InitialCatalog = settings.Settings.InitialCatalog,
UserID = settings.Settings.UserId,
Password = settings.Settings.Password
};
return connectionstring.ToString();
}
}
public static void SqlQuery(string query, Dictionary<string, object> parameters = null)
{
if (MssqlConnectionString().IsNullOrWhiteSpace())
return;
else
{
SqlConnection MssqlConnection = new SqlConnection(MssqlConnectionString());
if (MssqlConnection.State == ConnectionState.Closed) //если соединение закрыто - откроем его
MssqlConnection.Open();
//Дальнейший ваш код
}
}
Ссылки на элементы API
GlobalSettingsBase (для версий 3.13, 3.15, 4.0)