我怎么能焊接部分到果园CMS管理页面

本文关键字:CMS 管理 果园 怎么能 接部 | 更新日期: 2023-09-27 18:16:13

在Orchard CMS中,我可以创建一个部件并使用Filters.Add(new ActivatingFilter<TermsAndConditionSettingsPart>("Site"));将其焊接到站点,并在站点设置中显示该部件的编辑器。

我也有几个页面在我的管理屏幕,我已经使用控制器和动作,允许用户编辑设置为我的模块。

我想知道我如何能焊接到我的一个自定义管理页面的一部分。我想我需要做一些类似于上面提到的代码,但我不太确定我应该焊接什么(即-我应该用什么代替"站点")?我需要为每个管理页面创建一个内容类型吗?

任何帮助都会很感激。

我怎么能焊接部分到果园CMS管理页面

在进一步探索并考虑了@Piotr的出色答案后,我成功地实现了我想要做的事情。

步骤1:迁移

    private readonly IOrchardServices _services;
    public Migrations(IOrchardServices services) {
        _services = services;
    }
    public int Create() 
    {
        ContentDefinitionManager.AlterTypeDefinition("PlayerSearch", cfg => { });
        var content = _services.ContentManager.New("PlayerSearch");
        _services.ContentManager.Create(content);
        return 1;
    }

在上面的例子中,"PlayerSearch"是我的内容类型的名称(即我将焊接我的部件的项目)。这段代码只是创建了一个PlayerSearch类型,并创建了它的一个实例,然后将其持久化。

步骤2:ContentPart

我创建了一个简单的POCO类作为ContentPart。这是我想要焊接到我的PlayerSearch页面:

public class PlayerSearchPart : ContentPart
{
    public string String1 { get; set; }
    public string String2 { get; set; }
    public string String3 { get; set; }
    public int Int1 { get; set; }
    public int Int2 { get; set; }
    public int Int3 { get; set; }      
}

步骤3:ContentHandler

我做的下一件事,是焊接我的PlayerSearchPart到我的PlayerSearch类型在迁移中定义:

public class PlayerSearchHandler : ContentHandler
{
    public PlayerSearchHandler()
    {
        Filters.Add(new ActivatingFilter<PlayerSearchPart>("PlayerSearch"));
    }
}

我在ContentHandler中使用ActivatingFilter .

第4步:控制器

现在我们需要在管理屏幕中创建一个能够向用户显示所有焊接部件的页面:

    private readonly IOrchardServices _services;
    public PlayerManagementController(IOrchardServices services) {
        _services = services;
    }
    [HttpGet]
    public ActionResult PlayerSearch()
    {
        var playerSearchType = _services.ContentManager.Query().ForType(new[] {"PlayerSearch"}).Slice(0, 1).FirstOrDefault();
        var model = _services.ContentManager.BuildEditor(playerSearchType);
        // Casting to avoid invalid (under medium trust) reflection over the protected View method and force a static invocation.
        return View((object)model);
    }

此操作检索我在Migrations文件中创建的PlayerSearch类型的实例,为其构建编辑器,然后将其传递给视图。

步骤5:View

我们的操作当然需要一个视图,一旦你知道怎么做,它就很简单了:

@using (Html.BeginFormAntiForgeryPost()) {
    @Html.ValidationSummary()
    @Display(Model.Content)
    <fieldset>
        <button class="primaryAction" type="submit">@T("Save")</button>
    </fieldset>
}

步骤6:驱动程序

这里没有什么不寻常的:

    // GET
    protected override DriverResult Editor(PlayerSearchPart part, dynamic shapeHelper)
    {
        return ContentShape("Parts_PlayerSearch_Edit",
            () => shapeHelper.EditorTemplate(
                TemplateName: "Parts/PlayerSearch",
                Model: part,
                Prefix: Prefix));
    }
    // POST
    protected override DriverResult Editor(PlayerSearchPart part, IUpdateModel updater, dynamic shapeHelper)
    {
        updater.TryUpdateModel(part, Prefix, null, null);
        return Editor(part, shapeHelper);
    }

步骤7:显示部件的编辑器

这里的最后一步是为您的部件创建编辑器模板,并确保您在placement.info中有一个部件的记录,以便Orchard知道在哪里呈现它。

这项技术是从网站设置工作的方式中获得的。要了解这一点,并了解Post操作是如何工作的,请查看Orchard.Core.Settings.Controllers.AdminController的控制器。

您不能将任何内容焊接到自定义页面上-它不是这样工作的。

部件被焊接到内容项上,如SiteSite与其他内容项(如UserPage等)没有什么不同,只有一个例外——每个租户总是有一个Site项。当您进入Settings中的任何部分时,您实际看到的是该项的编辑器(并且每个部分显示该编辑器的一部分,对应于命名组)。此功能仅针对Site项。

如果您需要现场范围的设置,最好的方法是始终将部件焊接到Site项目上。然后,您可以提供链接(或选项卡等),从自定义视图中指向特定的编辑器。