Как заставить два экземпляра одного и того же приложения (DNN / 2sxc) читать из одного потока?

Извините, если мой вопрос глупый, но я новичок в DNN / 2sxc, я потратил весь день, пытаясь понять это, но безуспешно ..

У меня есть два экземпляра одного и того же приложения, один на домашней странице, а другой на отдельной странице, каждый из которых должен иметь свой собственный шаблон представления (я использую Razor).

Моя проблема в том, что я не могу найти способ заставить два приложения читать одни и те же данные, поэтому каждое добавление / редактирование / удаление / повторная сортировка в одном из них будет отражаться в другом, в настоящее время каждое приложение имеет свои собственные данные, и поэтому они непригодны в моем случае.

Я пытался использовать EntityTypeFilter внутри Data Query и использовать его в обоих представлениях (как в демонстрационном видео News-Simple), он работал и дал мне все элементы в двух представлениях, но еще две проблемы прийти с этим решением:

1- теперь я не могу использовать панель инструментов для (добавления / удаления / изменения порядка и т. Д.) Любого из элементов, как вы можете видеть в этом image, что меня не устраивает,

примечание: это панель инструментов, которую я использую:

@foreach(var item in AsDynamic(Data["Default"]))
{
...
@Edit.Toolbar(target: item, actions: "new,edit,replace,remove,moveup,movedown,instance-list")

2 - «Демо-элемент контента» также отображается в списке, но это не так важно, поскольку я могу удалить его и использовать один из реальных элементов данных в качестве демо-элемента.

Я ценю любую помощь. Спасибо.


person Amer    schedule 20.02.2017    source источник


Ответы (1)


Итак, первое, что вы должны знать, - это разница при использовании элементов содержимого в качестве данных (для запроса и т. Д.) И при использовании их в качестве назначенных элементов (где каждый экземпляр модуля имеет подмножество элементов). Вот блог, который должен помочь вам понять разницу: http://2sxc.org/en/blog/post/12-differences-when-templating-data-instead-of-content

Поэтому, если вы хотите «вручную и легко контролировать точные отображаемые элементы, их порядок и т. Д.» вы хотите использовать «content-assign-to-instance», который также дает вам простые кнопки добавления и удаления, поскольку они на самом деле ничего не удаляют, а просто удаляют назначение из экземпляра модуля.

Теперь ваш случай немного особенный, поскольку вы хотите повторно использовать тот же набор в другом экземпляре модуля. Это можно сделать несколькими способами:

То же мнение

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

другой взгляд

если это другой вид (может быть, более компактный и т. д.), у вас снова есть несколько вариантов. Первый - отразить / продублировать с помощью функции dnn и просто поместить if-im-on-this-page-then-show-differently или ввести другой CSS. Это, наверное, самый простой способ без каких-либо знаний разработчиков.

Более сложный, но, возможно, более приятный способ - это фактически использовать новый шаблон и сказать ему, чтобы он извлекал элементы так, как они настроены в другом модуле - скажем, модуль 1 является исходным, модуль 2 имеет другой шаблон, требующий для доступа к элементам модуля 1 в том же порядке, что и в 1. Это простой способ, но для этого требуется несколько строк кода C # в модуле 2.

Вам необходимо создать новый ModuleDataSource (https://2sxc.org/en/Docs/Feature/feature/4542) и сообщите ему, что он из Модуля 1. Если вы никогда этого не делали, то, по сути, ваш код может создавать запросы точно так же, как визуальный дизайнер, но у вас больше контроля - см. вики https://github.com/2sic/2sxc/wiki/DotNet-DataSources-All. Module-Data-Source в визуальном конструкторе запросов не позволяет вам «переключать» модули (расширенный параметр, который мы можем добавить в будущем), но у объекта есть свойство ModuleId, которое вы можете установить перед доступом к данным, заставляя его "переключиться" на этот Модуль. вот псевдокод в вашем модуле # 2 бритвы ...

var otherModData = CreateSource<ModuleDataSource>();
otherModData.ModuleId = 1;

foreach(var itm in AsDynamic(otherModData["Default"])) {
    ...
}

Это должно сработать :)

person iJungleBoy    schedule 21.02.2017
comment
Создание нового ModuleDataSource с определенным ModuleId - это именно то, что я искал, теперь он отображает все элементы из исходного модуля. большое спасибо за подробный ответ. - person Amer; 21.02.2017
comment
в то время как панель инструментов (добавить / редактировать / ..) теперь видна для каждого элемента во втором (не исходном) модуле, кажется, что все действия кнопок нацелены на источник данных этого модуля (а не на исходный с этим идентификатором в код), поэтому добавление нового элемента добавит его к этому источнику данных модуля и больше не будет отображаться, то же самое касается удаления, редактирования и т. д. есть ли способ убедиться, что действия нацелены на 'mainModuleDS' (источник данных модуля с определенным идентификатором)? - person Amer; 21.02.2017
comment
@ using ToSic.SexyContent.DataSources; @ {var mainModuleDS = CreateSource ‹ModuleDataSource› (); mainModuleDS.ModuleId = 562; } @foreach (var item в AsDynamic (mainModuleDS [Default])) {@ Edit.Toolbar (target: item, actions: new, edit, replace, remove, moveup, movingown, instance-list)} - person Amer; 21.02.2017
comment
Когда вы находитесь в Модуле 2, изменения применяются к Модулю 2. Вы можете использовать данные из Модуля 1, но это не меняет контекста. Если вам действительно нужна полная редактируемость в обоих случаях, вам нужно использовать один и тот же модуль и условно изменить способ его отображения на основе tabid или чего-то еще. - person iJungleBoy; 22.02.2017