0

これは以前に尋ねられたに違いないと思います。しかし、私は何か役に立つものを見つけることができませんでした。

カスタムモジュールのインストールの一部として、いくつかのウィジェット(既存のウィジェットタイプ、メニュー、プロジェクション)を作成したいと思います。いくつかのクエリとプロジェクションページもあります。

新しいメニュー(果樹園1.5.1)だけでなく、セットアップモジュールのコードからメニュー部分を見つけました

..。

    // create a project menu
    var projectMenu = _menuService.Create("new Menu");

    // assign the project items to all current menu items
    foreach (var menuItem in _menuService.Get().Where(x => x.ContentItem.ContentType == "Project"))
    {
        // if they don't have a position or a text, then they are not displayed
        if (string.IsNullOrWhiteSpace(menuItem.MenuPosition) || string.IsNullOrEmpty(menuItem.MenuText))
    {
       continue;
    }
    menuItem.Menu = projectMenu.ContentItem;

ウィジェットとプロジェクションを追加するために、移行に何かを含めることはできますか?

Orchard Recipeモジュールを見てきましたが、ウィジェットを設定するコマンドを実行するためのコードがそこにあることがわかりました。しかし、これをどのように活用するのが最善かわかりません...

レシピのインスタンスを作成して管理し、レシピ全体を実行するのは少し複雑に思えます。

4

1 に答える 1

0

あなたが使用できる場所のいたるところにいくつかの非常に有用な一見文書化されていないサービスがあります。

次のコンストラクターを使用

public class MigrationProjectType : DataMigrationImpl 
    {
        private readonly IMenuService _menuService;
        private readonly IContentManager _contentManager;
        private readonly IQueryService _queryService;
        private readonly IWidgetsService _widgetsService;

        public MigrationProjectType(IMenuService menuService, IContentManager contentManager,  IQueryService queryService, IWidgetsService widgetsService)
        {
            _menuService = menuService;
            _contentManager = contentManager;
            _queryService = queryService;
            _widgetsService = widgetsService;
        }
...
}

Autofacがサービスのインスタンス化を処理します

それから

public int UpdateFrom2()
        {
            // create a project menu
            var projectMenu = _menuService.Create("Projects Menu");

            // assign the project items to all current menu items
            foreach (var menuItem in _menuService.Get().Where(x => x.ContentItem.ContentType == "Project"))
            {
                // if they don't have a position or a text, then they are not displayed
                if (string.IsNullOrWhiteSpace(menuItem.MenuPosition) || string.IsNullOrEmpty(menuItem.MenuText))
                {
                    continue;
                }
                menuItem.Menu = projectMenu.ContentItem;
            }

            // create layer part 
            _widgetsService.CreateLayer("SideBar", "desc", "url(\"~\")");

            var defaultLayer = _widgetsService.GetLayers().First(x => x.Name == "Default");

            var widget =  _widgetsService.CreateWidget(defaultLayer.Id, "MenuWidget", "Projects Menu", "2", "Navigation");

            var menuWidget = widget.As<MenuWidgetPart>();
            menuWidget.Record.Menu = projectMenu.ContentItem.Record;

            _contentManager.Publish(menuWidget.ContentItem);

            return 3;
        }

クエリにも同様のサービスがありますが、プロジェクション用にクエリにフィルタを追加する方法がわかりません...

アップデート

クエリとフィルタを追加する方法は次のとおりです

public int UpdateFrom7()
        {


            // create a project menu
            var projectMenu = _queryService.CreateQuery("My projects 3");

            var form = new Form { ContentTypes = "Project" };
            var xmlSerializer = new XmlSerializer(form.GetType());
            StringWriter sww = new StringWriter();
            XmlWriter writer = XmlWriter.Create(sww);
            xmlSerializer.Serialize(writer, form);
            var state = sww.ToString();


            projectMenu.FilterGroups[0].Filters.Add(new FilterRecord
            {
                Category = "Content",
                Description = "My filter",
                Position = 0,
                State = state,
                Type = "ContentTypes"
            });

            _contentManager.Publish(projectMenu.ContentItem);


            return 8;
        }

[Serializable]
    public class Form
    {
        public string Description { get; set; }
        public string ContentTypes { get; set; }

    }
于 2012-08-05T20:22:47.133 に答える