четверг, 20 июня 2013 г.

Razor в Composite C1 CMS 4.0 (5): Виджеты для параметров Razor-функций

Когда пользователь вставляет C1-функцию на странице или шаблон страницы и т.п. и если у функции есть параметры, у него есть возможность настроить ее поведение через эти самые параметры.

Для редактирования значения параметра, в диалоге "Свойства функции" предоставляется элемент управления (виджет) типа текстовое поле, ниспадающий список и т.п.

Мы уже выяснили, что публичные свойства, объявленные в директиве @functions в Razor-функциях, автоматически становятся параметрами этих функций. И в зависимости от типа значения свойства, ему назначается виджет по умолчанию.

Мы также выяснили, что для более "тонкой настройки" параметра в Razor-функции, следует использовать атрибут FunctionParameter. И, в частности, если нам для параметра понадобиться другой виджет для параметра функции, то мы можем воспользоваться одним из параметров этого атрибута, чтобы сделать замену.

Давайте рассмотрим как можно назначить другой виджет такому параметру.

Сменить виджет у параметра  Razor-функции можно с помощью одного из следующих трех параметров атрибута FunctionParameter:
  • WidgetFunctionName
  • WidgetMarkup
  • WidgetFactoryMethod

WidgetFunctionName


Виджеты в Composite C1 - это фактически функции. Если у такой виджет-функции нет параметров или параметры все опциональные и используют значения по умолчанию, то можно воспользоваться WidgetFunctionName ("название виджет-функции"), чтобы назначить виджет. 

Как понятно из названия, значением будет полное название виджет-функции, использующейся в системе. Например для использования виджета визуального редактора (Composite.Widgets.String.VisualXhtmlEditor) для свойства типа строки (вместо стандартного текстового поля), нужно сделать так:

@functions{
  [FunctionParameter(WidgetFunctionName = "Composite.Widgets.String.VisualXhtmlEditor")]
  public string Description { get; set; }
}

И хотя у виджет-функции VisualXhtmlEditor имеются параметры, они - опциональны. И если нам не нужно задать значение такого параметра, то мы можем воспользоваться указанным выше простым способом.


WidgetMarkup


Если же мы как раз хотим задать значение параметру виджет-функции, или у виджет функции есть обязательный параметр, тогда нам нужно использовать XML-код этой виджет-функции, в который будет включен нужный параметр с нужным значением. Для этого используется WidgetMarkup.

Например, у того же виджета VisualXhtmlEditor имеется необязательный параметр ClassConfigurationName. Чтобы задать ему значение, нужно сделать так:

@functions {
  [FunctionParameter(WidgetMarkup = "<f:widgetfunction name='Composite.Widgets.String.VisualXhtmlEditor' xmlns:f='http://www.composite.net/ns/function/1.0'><f:param name='ClassConfigurationName' value='custom' /></f:widgetfunction>")]
  public string Description { get; set; }
}

Возникает вопрос: откуда брать этот XML-код виджета?

  1. В разделе "Функции", раскройте "Все виджет-функции", и найдите виджет, который вам нужен, например, Composite.Widgets.String.VisualXhtmlEditor.
  2. Выберите его и нажмите кнопку "Информация" на панели кнопок.
  3. В открывшемся виде, скопируйте код виджета.
  4. В этом коде, замените двойные кавычки одинарными.
  5. И укажите нужные значения в нужных параметрах.
  6. Вставьте этот код в качестве значения WidgetMarkup.
В коде, кстати, обозначены обязательные ([Required Value]) и необязательные ([Optional Value]) значения.


WidgetFactoryMethod


Вы также можете создавать свои собственные виджеты -  с помощью фабричного метода для виджетов.

Для указания такого виджета нужно использовать WidgetFactoryMethod:

@functions{
  [FunctionParameter(WidgetFactoryMethod = "CustomBoolSelector")]
  public bool AwesomeBooleanSelector { get; set; }
  // нестандартный виджет
  public static IWidgetFunction CustomBoolSelector(string parameterName)
  {
    return Composite.Functions.StandardWidgetFunctions.GetBoolSelectorWidget("Да, пожалуйста.", "Нет, спасибо.").WidgetFunction;
  }
}

Если же виджет определен в отдельном классе, то в атрибуте FunctionParameter этот класс тоже можно указать с помощью WidgetFactoryClass:

@functions{
  [FunctionParameter(WidgetFactoryMethod = "GetCustomBoolSelector", WidgetFactoryClass=typeof("CustomWidgets"))]
  public bool AwesomeBooleanSelector { get; set; }
  // класс с нестандартным виджетом
  public class CustomWidgets
  {
    public static WidgetFunctionProvider GetCustomBoolSelector (System.Reflection.PropertyInfo propertyInfo)
    {
      return Composite.Functions.StandardWidgetFunctions.GetBoolSelectorWidget("Yes, please.", "No, thanks.");
    }
  }
}

В следующем сообщении мы рассмотрим, как можно изменить тип возвращаемого значения Razor-функции.

Комментариев нет:

Отправить комментарий