如何在 2sxc v10.20+ 之后访问另一个模块的内容和演示项目
How to access Another Module's Content and Presentation Items after 2sxc v10.20+
这是通过 2sxc 10.9.1 运行的代码。虽然我能够获取 TabID、ModuleID 的 CmsBlock 并将其获取到 .Render(),但我需要更多。这是旧代码。不确定它有什么区别,但此视图使用正常的 Link content-type 并且在旧版本的内容应用程序(appx 3.03=ish)中是 运行。 2sxc 已经升级,现在是 11.22.0 LTS。
我删除了不必要的东西,所以我怀疑它是否能按原样运行...
@using ToSic.Razor.Blade
@using ToSic.SexyContent.Environment.Dnn7
@{
var Helpers = CreateInstance("_Helpers.cshtml");
// Display the items from the Manage Links module, we go in 'sideways'
// this gives us just the Content items with their Presentations settings, etc.
var sxci = Factory.SxcInstanceForModule(3360, 606); // ModuleID of Manage Links
var dyn = Factory.CodingHelpers(sxci);
var allLinks = dyn.AsDynamic(dyn.Data["Default"]);
}
@* other stuff *@
<div class="row co-documents justify-content-center align-items-center">
@foreach (var linkItem in allLinks) {
var linkInfo = Helpers.LinkInfos(linkItem.Link, linkItem.Window, linkItem.Icon);
string iconStyle = linkItem.IconStyle ?? "fas";
int linkColumns = (int)linkItem.Presentation.Columns;
string linkIconAlign = linkItem.Presentation.IconAlign;
string linkIconBGColor = linkItem.Presentation.IconBGColor;
@* other stuff *@
}
</div>
所以很容易弄清楚的是如何将模块作为 CmsBlock 获取,我可以按原样 Render() (如下),但我需要做的是正确访问内容项列表以及他们的演示数据(如上,allLinks
)。
ToSic.Sxc.Dnn.Factory.CmsBlock(606, 3360).Render();
我错过了什么?我怎样才能像以前一样访问其他模块的数据?在这种情况下,我在网站上的 3 个不同位置执行此操作。因此,为了用英语概述这一点,我有一个模块,客户端管理一些特殊链接,这些链接显示在 MegaMenus、其他特殊导航中,并直接显示在几个页面上。在每个地方,它们呈现不同。在他们被编辑的“主页”模块中,他们看起来很无聊:
我意识到它是这样的:
var allLinks = something1.AsList(something2.Data["Default"]);
我知道 something2
是一个应用程序实例,但如何在其他模块的上下文中创建它?
现在 something1
是什么?以及如何实例化它?看起来它是一个 new ToSic.Sxc.Code.DynamicCode()
,但我无法弄清楚如何以我可以使用或不只是抛出错误的方式构建它。
提前感谢您的任何见解!!
好的,经过了一些测试、反复试验。而且我还错过了 DynamicCode() 是工厂方法 class。现在回想起来确实很容易。
所以首先你得到 BlockBuilder
var block = Factory.CmsBlock(606, 3360);
然后你从中得到 DynamicCode 实例 (Code.DnnDynamicCodeRoot)
var dc = Factory.DynamicCode(block);
然后一切正常
var allLinks = AsList(dc.Data["Default"]);
其余代码与以前一样工作;我可以通过 Header(从 ListContent 重命名)和 Presentation(现在 Content.Presentation)的链接按预期工作。
如果您在 2sxc 视图的 C# Razor 模板中,上述答案可以正常工作。但是,如果您在外面,例如在 DDR 菜单的 Razor 模板中怎么办?
与上面相同的两个步骤(获取块和 dc),但是您无法访问 AsList() 或应用程序。值得庆幸的是,您已经拥有 DynamicCode,因此您可以像这样获取 Bibliography 内容类型中的所有记录:
<ul>
var items = dc.AsList(dc.App.Data["Bibliography"]);
foreach (var item in items)
{
<li>@item.EntityTitle</li>
}
</ul>
因此,一旦您获得 dc
,您就可以使用所有常见的 2sxc 玩具。
这是通过 2sxc 10.9.1 运行的代码。虽然我能够获取 TabID、ModuleID 的 CmsBlock 并将其获取到 .Render(),但我需要更多。这是旧代码。不确定它有什么区别,但此视图使用正常的 Link content-type 并且在旧版本的内容应用程序(appx 3.03=ish)中是 运行。 2sxc 已经升级,现在是 11.22.0 LTS。
我删除了不必要的东西,所以我怀疑它是否能按原样运行...
@using ToSic.Razor.Blade
@using ToSic.SexyContent.Environment.Dnn7
@{
var Helpers = CreateInstance("_Helpers.cshtml");
// Display the items from the Manage Links module, we go in 'sideways'
// this gives us just the Content items with their Presentations settings, etc.
var sxci = Factory.SxcInstanceForModule(3360, 606); // ModuleID of Manage Links
var dyn = Factory.CodingHelpers(sxci);
var allLinks = dyn.AsDynamic(dyn.Data["Default"]);
}
@* other stuff *@
<div class="row co-documents justify-content-center align-items-center">
@foreach (var linkItem in allLinks) {
var linkInfo = Helpers.LinkInfos(linkItem.Link, linkItem.Window, linkItem.Icon);
string iconStyle = linkItem.IconStyle ?? "fas";
int linkColumns = (int)linkItem.Presentation.Columns;
string linkIconAlign = linkItem.Presentation.IconAlign;
string linkIconBGColor = linkItem.Presentation.IconBGColor;
@* other stuff *@
}
</div>
所以很容易弄清楚的是如何将模块作为 CmsBlock 获取,我可以按原样 Render() (如下),但我需要做的是正确访问内容项列表以及他们的演示数据(如上,allLinks
)。
ToSic.Sxc.Dnn.Factory.CmsBlock(606, 3360).Render();
我错过了什么?我怎样才能像以前一样访问其他模块的数据?在这种情况下,我在网站上的 3 个不同位置执行此操作。因此,为了用英语概述这一点,我有一个模块,客户端管理一些特殊链接,这些链接显示在 MegaMenus、其他特殊导航中,并直接显示在几个页面上。在每个地方,它们呈现不同。在他们被编辑的“主页”模块中,他们看起来很无聊:
我意识到它是这样的:
var allLinks = something1.AsList(something2.Data["Default"]);
我知道 something2
是一个应用程序实例,但如何在其他模块的上下文中创建它?
现在 something1
是什么?以及如何实例化它?看起来它是一个 new ToSic.Sxc.Code.DynamicCode()
,但我无法弄清楚如何以我可以使用或不只是抛出错误的方式构建它。
提前感谢您的任何见解!!
好的,经过了一些测试、反复试验。而且我还错过了 DynamicCode() 是工厂方法 class。现在回想起来确实很容易。
所以首先你得到 BlockBuilder
var block = Factory.CmsBlock(606, 3360);
然后你从中得到 DynamicCode 实例 (Code.DnnDynamicCodeRoot)
var dc = Factory.DynamicCode(block);
然后一切正常
var allLinks = AsList(dc.Data["Default"]);
其余代码与以前一样工作;我可以通过 Header(从 ListContent 重命名)和 Presentation(现在 Content.Presentation)的链接按预期工作。
如果您在 2sxc 视图的 C# Razor 模板中,上述答案可以正常工作。但是,如果您在外面,例如在 DDR 菜单的 Razor 模板中怎么办?
与上面相同的两个步骤(获取块和 dc),但是您无法访问 AsList() 或应用程序。值得庆幸的是,您已经拥有 DynamicCode,因此您可以像这样获取 Bibliography 内容类型中的所有记录:
<ul>
var items = dc.AsList(dc.App.Data["Bibliography"]);
foreach (var item in items)
{
<li>@item.EntityTitle</li>
}
</ul>
因此,一旦您获得 dc
,您就可以使用所有常见的 2sxc 玩具。