9

SitecoreパブリッシングAPIを使用してSitecoreマスターDBのスケジュールされたパブリッシングを実行しています。次のコードを実行するWebサービスを日中にスケジュールされた間隔で呼び出します(読みやすくするために少し要約されています)。

// grab the root content node from sitecore
Item contentNode = dbSource.Items[ID.Parse("{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}")];

PublishOptions options = new PublishOptions(sourceDatabase, targetDatabase, PublishMode.Smart, lang, DateTime.Now);

options.RootItem = contentNode;

options.Deep = true;

Publisher p = new Publisher(options);

p.PublishAsync();

上記のコードを実行すると、ワークフローの状態に関係なく、すべての子孫を含むすべてがコンテンツノードに公開されます。ワークフローを完全に無視しているようなものです。これは私たちが求めているものではなく、私たちのライブWebサイトで多くの問題を引き起こしています。

Sitecoreデスクトップ内から同じアクションを実行すると、すべての子孫を含め、公開可能なコンテンツノードのすべてが公開されますつまり、ワークフローの最終段階にあります)。まだドラフトモードになっているツリー内のアイテムは公開されません。これは必要な動作です。

上記のコードを次のusingステートメントで囲むことにより、非管理者ユーザーとしてコードを実装しようとしました。

string userName = @"sitecore\******";

Sitecore.Security.Accounts.User user = Sitecore.Security.Accounts.User.FromName(userName, true);

user.RuntimeSettings.IsAdministrator = false;

using (new Sitecore.Security.Accounts.UserSwitcher(user))
{
    ...
}

残念ながら、これは効果がありませんでした。

私が見逃した明らかな何かがありますか、それとも私はそれを正しく行っていて、Sitecoreはそれを間違っていますか?誰か助けてもらえますか?

また、私が気付いた奇妙なことは、公開されたドラフトアイテムが、ライブデータベースで表示されたときに、フィールドまたはメタデータに関してSitecoreデスクトップにまったく表示されなかったことです。また、「現在のアイテムには「英語:英語」のバージョンがありません」という警告が表示されていました。

4

2 に答える 2

15

おそらく問題は、ワークフローが有効になっているサイトコンテキスト内でWebサービスが実行されていないことです。

コード内でこれを行う最も簡単な方法は、を使用SiteContextSwitcherして「シェル」サイトに変更することです。

using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("shell")))
{
    //do your publish
}

バージョンなしで公開されたアイテムについて:理論的には、それは通常の公開でも発生します。ワークフローは、アイテム自体ではなく、アイテムバージョンの公開を制限します。item.Versions.Count > 0コードでは、アイテムを繰り返すときなど、レンダリングする前にチェックする必要があります。

于 2012-09-05T15:51:48.847 に答える
4

TL; DRルートコンテンツノードに別の言語のバージョンがあるか、そのバージョンを削除するか、英語でのみ公開すると、ドラフトモードでのアイテムの公開が妨げられました

OK、@ techphoria414の提案されたコードを試した後、コンテキストが問題ではないことが明らかになりました。出版社は結局ワークフローに固執していましたが、問題は別の言語のバージョンを持つルートコンテンツノード(日本語-これがどのようにしてそこに到達したのか私に聞かないでください)であることが判明しましたが、子孫ノードには日本語のバージョンがありませんまったく。実際、私たちのマスターデータベースは言語として英語のみを持つように構成されているため、管理者以外のユーザーが別の言語でバージョンを追加することさえできないはずです。

いくつかのテストを行ったところ、発行元が別の言語で存在するアイテムのワークフローを無視していることがわかりました。次のシナリオを検討してください。

1)フォルダとその下のワークフローを持つアイテム(「テストワークフローアイテム」)を追加します。ドラフトモードでバージョン1のままにして、アイテムをコミットしないでください(つまり、公開できないようにする必要があります)。含まれているフォルダには、1つの言語(英語)のバージョンが1つだけあります。

ワークフローを持つフォルダとその下のアイテムを追加します フォルダには英語版のみがあります

2)(私の質問のコードを使用して)Webデータベースにディープ公開してフォルダーを公開します。これにより、次のようになります(フォルダーは追加されましたが、ドラフト「テストワークフローアイテム」は追加されていません)。これは予想される動作です-イェーイ!

ディープ公開でフォルダーを公開します

3)新しいバージョンを別の言語で含まれているフォルダに追加します。

別の言語で含まれているフォルダに新しいバージョンを追加します

4)言語として日本語が選択されているので、子アイテムのワークフローの状態を確認します。ガターでは、ドラフトモードであるとは表示されなくなりましたが、日本語のバージョンはまったくありません(右の図を参照)。

言語として日本語が選択されたので、子アイテムのワークフローの状態を確認します

5)以前とまったく同じように、すべての言語で含まれているフォルダーをWebデータベースに公開します。「テストワークフローアイテム」が公開されましたが、バージョンがまったくないことに注意してください。これは、公開されるべきではなかった無数のアイテムが公開されたことを意味するルートコンテンツノードを除いて、公開で起こったことです。

まったく同じコードを使用して再公開する

さて、ルートコンテンツノードに日本語のバージョンがある理由は完全に謎ですが、少なくともドラフトアイテムが公開された理由はわかっているので、将来それを防ぐことができます。過去2年間のアップグレード日にほぼ対応する日本語のバージョンが2つあるので、Sitecoreのアップグレードと関係があるのではないかと思います。

于 2012-09-11T14:24:33.713 に答える