1

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

我的管理屏幕中还有一些页面,我使用了控制器和操作来允许用户编辑我的模块的设置。

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

任何帮助,将不胜感激。

4

2 回答 2

4

在进一步探索并考虑到@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 步:内容部分

我创建了一个简单的 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 步:内容处理程序

我做的下一件事是将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);
    }

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

第 5 步:视图

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

@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.

于 2013-05-31T13:57:16.007 回答
3

您不能将任何东西焊接到自定义页面上 - 它不能像这样工作。

零件焊接到内容项目上,例如Site. 与其他内容项(例如等Site)没有什么不同,但有一个例外 -每个租户始终只有一个项。当您转到“设置”中的任何部分时,您实际看到的是该项目的编辑器(每个部分都显示该编辑器的一部分,对应于一个命名组)。此功能仅适用于物品。UserPageSiteSite

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

于 2013-05-31T00:26:26.640 回答