3

フォーラムでもこれを尋ねましたが、まだ運がありません。私がする必要があるのは、特定のページの各コンテンツブロックのHTMLコンテンツを設定することです。html値は問題なく設定できるようですが、保存しても実際のページは更新されません。

コントロールになんらかの保存呼び出しが必要なためかどうか疑問に思います。そのような行動に利用できる方法はないようです。

foreach (var c in duplicated.Page.Controls)
{
    // go through the properties, se the ID to grab the right text
    foreach (var p in c.Properties)
    {
        if (p.Name == "ID")
        {
            var content = pageContent.Where(content_pair => content_pair.Key == p.Value).SingleOrDefault();
            var control = pageManager.LoadControl(c);
            if (control is ContentBlock)
            {
                var contentBlock = pageManager.LoadControl(c) as ContentBlock;
                contentBlock.Html = content.Value;
            }
        }
    }
}
pageManager.SaveChanges(); */

WorkflowManager.MessageWorkflow(duplicated.Id, typeof(PageNode), null, "Publish", false, bag);
4

1 に答える 1

4

次のコードは、必要なことを達成するのに役立つ場合があります。
最初にそのタイトルでページを取得します(コードで示されているように、「重複」というタイトルのページを探しています)。
現在のページの新しいドラフトを生成してから、そのコントロールを確認します。
コンテンツブロックとして検出されたコントロールは、foreachループで繰り返されます。
foreachループ内のコメントに書かれているように、明示的なID( "ID"という名前のプロパティによる)または関連する共有コンテンツブロック( "SharedContentID"という名前のプロパティによる)またはその他の条件によってコントロールを検出できます(または無視します)この状態全体で、ページ内のすべてのコントロールが更新されます。
手元に更新するコントロールができたら、プロジェクトのローカリゼーション設定に応じて新しい値を設定できます。
その後、ドラフトが保存および公開され、オプションで新しいバージョンが作成されます。

PageManager pageManager = PageManager.GetManager();
VersionManager vmanager = VersionManager.GetManager();
PageNode duplicated = pageManager.GetPageNodes().FirstOrDefault(p => p.Title == "duplicate");

if (duplicated != null)
{
    var draft = pageManager.EditPage(duplicated.Page.Id, true);
    string contentBlockTypeName = typeof(ContentBlock).FullName;

    PageDraftControl[] contentBlocks = draft.Controls.Where(contentBlock => contentBlock.ObjectType == contentBlockTypeName).ToArray();
    foreach (PageDraftControl contentBlock in contentBlocks)
    {
        Guid contentBlockId = contentBlock.Id;
        //User "SharedContentID" if you are looking up controls which are linked to a shared content block of a specific ID.
        //If you you are trying to locate a specific control by its own ID, use the explicit "ID" property instead of "SharedCotentID"
        if (contentBlock.Properties.Where(prop => prop.Name == "SharedContentID" && prop.Value.ToString() == contentItemIdstr).FirstOrDefault() != null)
        {
            ControlProperty htmlProperty = contentBlock.Properties.Where(prop => prop.Control.Id == contentBlockId && prop.Name == "Html").FirstOrDefault();
            if (htmlProperty != null)
            {
                if (AppSettings.CurrentSettings.Multilingual)
                {
                    htmlProperty.GetString("MultilingualValue").SetString(CultureInfo.CurrentUICulture, "New Value");
                }
                else
                {
                htmlProperty.Value = "New Value";
                }
            }
        }
    }
    draft = pageManager.SavePageDraft(draft);
    draft.ParentPage.LockedBy = Guid.Empty;
    pageManager.PublishPageDraft(draft);
    pageManager.DeletePageTempDrafts(draft.ParentPage);

    //Use the 2 next lines to create  a new version of your page, if you wish.
    //Otherwise the content will be updated on the current page version.
    vmanager.CreateVersion(draft, draft.ParentPage.Id, true);
    vmanager.SaveChanges();

    pageManager.SaveChanges();
}

このコードがお役に立てば幸いです。

アロン。

于 2012-08-17T14:29:36.187 に答える