#c# #dotnetnuke #2sxc
#c# #dotnetnuke #2sxc
Вопрос:
ПРИМЕЧАНИЕ: в настоящее время я застрял на 2sxc v9.43.2 в этом проекте.
После выбора набора записей из моего типа контента мне нужно иметь возможность дублировать их, изменяя 1 из полей по пути. Вот моя почти рабочая идея на данный момент. Вариант использования прост, у них есть программы, для которых люди могут зарегистрироваться. Они меняются каждый сезон, но лишь немного (цены, даты / время и т. Д.). И им нужен текущий сезон в реальном времени и без изменений, пока они редактируют следующий сезон. Итак, мы все еще находимся в осеннем сезоне (EntityId 1732) с 97 активными программами. Мы хотим нажать кнопку и клонировать все 97 программ как есть, но В новом следующем сезоне (1735 ниже).
Два вопроса:
- если этот способ работает, какой синтаксис будет работать с ent / Attributes для доставки «объекта» по мере необходимости в
fields.Add()
строке - есть ли другой способ 2sxc сделать это? Какой-то другой вариант App.Data.Метод Create() или какой-либо другой метод в API? Мне просто нужно дублировать запись с изменением 1 поля (сезона)?
- есть ли лучший способ сделать это в последних версиях 2sxc, v11.7 ?
// we are going to duplicate the current Season's programs in to the new season
// cheating for now, pre-made new 1735 in Seasons, current is 1732
var programs = AsDynamic(App.Data["Programs"])
.Where(p => ((List<DynamicEntity>)p.Season).First().EntityId == selectedSeason.EntityId);
// @programs.Count() // 97
foreach(var copy in programs)
{
var fields = new Dictionary<string, object>();
var ent = AsEntity(copy);
foreach(var attr in ent.Attributes)
{
if(attr.Key == "Season")
{
fields.Add(attr.Key, new List<int> { 1735 });
}
else
{
fields.Add(attr.Key, ent.GetBestValue(attr.Key)); // object??
}
}
App.Data.Create("Programs", fields);
}
Комментарии:
1. Это все еще проблема? Я хотел бы помочь, но уже месяц отсутствовал в SO, поэтому я не хочу тратить время на проблемы, которые уже закрыты.
2. Да, все еще открыт, не может быть разрешен. Пробовал много разных вращений и синтаксиса, но не смог создать () без выдачи ошибки. Мне все еще нужен способ в коде клонировать существующую сущность. И обновлять его перед его созданием или после обновления. Похоже, что где-то в API должно быть что-то простое, но я не могу его найти.
Ответ №1:
Существует как минимум 3 способа клонирования
- Простой способ с помощью edit-ui
- сложный способ с использованием c # / server api
- Полужесткий способ с использованием REST api
Простой способ — использовать пользовательский интерфейс редактирования. Вы можете увидеть пример в диалоговом окне замены, там есть кнопка копирования. Это откроет пользовательский интерфейс редактирования с существующим элементом, но сообщит ему, что это копия, поэтому при сохранении он создаст новый.
Объедините это с предварительным заполнением или чем-то еще, и я думаю, вам было бы хорошо пойти.
Второй способ — использование App.Data .Создайте — ваш код выглядит довольно хорошо. Я предполагаю, что это также работает, и вам просто интересно, был ли 1-liner — или я ошибаюсь?
Последний способ — использовать JS REST. В основном напишите некоторый JS, который получает элемент, изменяет объект (сбрасывает идентификатор) и отправляет его обратно в конечную точку для сохранения.
Комментарии:
1. Это не решает мою проблему, но есть много вариантов, и я могу заставить их работать на клиента. Моя основная проблема связана с Create() с типами полей сущностей и гиперссылок. Я либо получаю исключения с нулевыми ссылками, либо скопированный объект не совсем тот же. Я видел, что вы ответили на аналогичный вопрос о полях гиперссылок, я рассмотрю это и подумаю об этом еще раз. Вы читали мой пример использования? Мне кажется странным, что вы считаете пользовательский интерфейс возможным решением. 😉
2. Для полей гиперссылок, я думаю, ваша проблема в том, что когда вы ее читаете, вы получаете ссылку вместо сохраненного «file: 72». У меня есть два предложения: без обновления: сделать
AsEntity(original).GetBestValue<string>("name-of-link-field")
или с обновлением (11.11) есть новая команда для динамической сущностиoriginal.Get("name-of-link-field", convertLinks: false)
см. Также docs.2sxc.org/api/dot-net /…3. наконец, возвращаясь к этому, поскольку клиент ожидает скорого добавления новых сезонов. Я все заработал, я считаю, что у меня все типы полей, копирующие свои данные, соответствуют новым. Тем не менее, я делаю все по attribute.Key … Я мог бы значительно упростить и повторно использовать это, если бы вместо этого мог получить тип поля объекта. Итак, я хочу что-то вроде
if(AsEntity(original).FieldType == "HyperLink") { do this stuff}
. Я изучил документы API, но не обнаружил, как добраться до информации. Возможно ли это?
Ответ №2:
Просто наткнулся на ситуацию, когда мне нужно было создать объект и установить значение его поля, которое имеет тип другого объекта. Если это ваш вопрос № 1, вам нужно добавить туда EntityGuid
. fields.Add(attr.Key, attr.EntityGuid);
. Это должно связать один объект с другим. И нет, я не наткнулся на лучший способ скопировать сущность, чем просто создать новую. По крайней мере, пока.