Создайте пользовательский тип данных на основе значений enum в Ucommerce

#c# #umbraco-ucommerce

#c# #umbraco-ucommerce

Вопрос:

Кто-нибудь может мне помочь в том, как я могу создать пользовательский тип данных, который работает точно так же, как у enum, но редактор должен вызываться, в моем случае, «переключателем». Таким образом, значения будут заполнены с помощью опции «Создать тип данных Enum».

Я прочитал документацию на https://docs.ucommerce.net/ucommerce/v8.1/extending-ucommerce/custom-data-type.html , но не ясно, как я могу получить данные подобным образом, это просто объясняет, как я получаю информацию из источника данных (_priceGroupRepository в примере).

Нравится этот макет.

Пример того, как я хочу настроить переключатель

Пример того, как я хочу добавить данные

Ответ №1:

Из отправленной вами документации похоже, что вам просто нужно будет вернуть RadioButtonList, а не DropDownList, попробуйте использовать System.Web.UI.WebControls.RadioButtonList

Чтобы заменить тип данных enum, вы захотите вернуть редактор как «Enum» вместо «PriceGroupPicker», и при регистрации компонента вы захотите использовать этот идентификатор id="DropDownListControlFactory" , поскольку вы хотите перезаписать фабрику перечислений.

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

1. Привет, Андерс, и спасибо, что нашли время ответить! Возможно, я не прояснил свою проблему. В примере в документации данные для выпадающего списка поступают из _priceGroupRepository. Выберите(). В моем случае мне нужно, чтобы данные были определены пользователем аналогично тому, как работает тип данных enum. (Я добавил новое изображение к вопросу) Щелчок по многоточию. Создайте тип данных Enum. Затем эти параметры будут отображены в списке radiobutton.

Ответ №2:

Я протестировал, как локально добиться желаемого поведения переключателя, вот мои выводы:

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

ControlFactory должен выглядеть следующим образом:

Вы можете видеть, что я расширяю IEnumerable<DataTypeDefinition> функциональность Enum. А также замените начало каждой ценовой группы на начало каждого DefinitionFields.Типы данных — значения.

 using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ucommerce.EntitiesV2;
using Ucommerce.EntitiesV2.Definitions;
using Ucommerce.Presentation.Web.Controls;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ucommerce.Infrastructure.Components.Windsor;
using Ucommerce.Security;
namespace UcommerceSamples.Extensions.Code
{
    public class RadioButtonControlFactory: IControlFactory, IEnumerable<DataTypeDefinition>
    {
        private readonly IDataTypeDefinitionInspector _dataTypeDefinitionInspector;
        private DataTypeDefinition Definition = new DataTypeDefinition("Enum");
        [Mandatory]
        public ITextSanitizer TextSanitizer { get; set; }
        public RadioButtonControlFactory(IDataTypeDefinitionInspector dataTypeDefinitionInspector )
        {
            _dataTypeDefinitionInspector = dataTypeDefinitionInspector;
        }
        public bool Supports(DataType dataType)
        {
            var dataTypeDefinitionName = _dataTypeDefinitionInspector.GetDataTypeDefintion(dataType);
            return dataTypeDefinitionName.Equals(Definition.Name, StringComparison.InvariantCultureIgnoreCase);
        }
        public Control GetControl(IProperty property)
        {
            string stringValue = property.GetValue() != null ? TextSanitizer.SanitizeOutput(property.GetValue().ToString())
                : "";
            var radioButtonListControl = new RadioButtonList()
            {
                ID = TextSanitizer.SanitizeOutput(property.GetDefinitionField().Name)
            };
            foreach (var enumValue in property.GetDefinitionField().DataType.DataTypeEnums.OrderBy(x => x.SortOrder))
            {
                var listItem = new ListItem(TextSanitizer.SanitizeOutput(enumValue.Value),
                    TextSanitizer.SanitizeOutput(enumValue.Value));
                radioButtonListControl.Items.Add(listItem);
            }
            if (radioButtonListControl.Items.FindByValue(stringValue) != null)
                radioButtonListControl.SelectedValue = stringValue;
            radioButtonListControl.CssClass = "uc-drop-down-list";
            return radioButtonListControl;
        }
        public IEnumerator<DataTypeDefinition> GetEnumerator()
        {
            yield return Definition;
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
}
  

Конфигурация должна выглядеть следующим образом, чтобы переопределить DropDownListControlFactory (читать EnumListControlFactory ):

 <configuration>
        <components>
                <component
                        id="DropDownListControlFactory"
                        service="Ucommerce.Presentation.Web.Controls.IControlFactory, Ucommerce.Presentation"
                        type="UcommerceSamples.Extensions.Code.RadioButtonControlFactory, UcommerceSamples.Extensions" />
        </components>
</configuration>
  

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