1

発行サイトに、オーディエンス ターゲティング フィールドを持つリストからニュース項目を表示する必要がある Web パーツがあります。CAML クエリを使用して、少数の最新ニュース項目を取得しています。

CAML クエリでターゲット オーディエンスを指定することはできますか? そうでない場合、どうすればよいですか?すべての結果を取得し、ループでフィルターを適用しますか?

実質的にコンテンツ クエリ Web パーツを複製しており、カスタム Web パーツでオーディエンス ターゲティングが必要です。

4

2 に答える 2

1

いいえ、CAML クエリでオーディエンス ターゲティングを指定することはできません。これは、CAML クエリが WSS であり、オーディエンスが MOSS 共有サービスであることに関係していると思います。CAML クエリに対象者フィールドを含める必要があります。つまり、<FieldRef Name='Target_x0020_Audiences'/> を SPQuery.ViewFields プロパティに追加します。次に、各リスト アイテムの対象者別にコードごとに結果をフィルター処理します。現在のユーザーがオーディエンスのメンバーであるかどうかをテストするには、AudienceManager クラスを使用します。

于 2009-04-17T13:30:32.493 に答える
0

これに対する回避策を見つけました。現在のユーザーが特定の発行ページの対象ユーザーのメンバーであるかどうか、およびその対象ユーザーの名前を確認しようとしたときに問題が発生しました。これが私が思いついた回避策です。


// Run through the pages building the list items
foreach (SPListItem li in pages)
{
  // Get a reference to the publishing page
  PublishingPage p = PublishingPage.GetPublishingPage(li);

  // Make sure the page has been approved
  if (li.ModerationInformation.Status == SPModerationStatusType.Approved)
  {
    // Check if this page has an audience
    if (string.IsNullOrEmpty(p.Audience))
      // Add to everyone list
    else
    {
      // Split the audiences
      string[] Audiences = p.Audience.Split(';');

      // Check each audience to see if this user can see it
      foreach (string audPart in Audiences)
      {
        AudienceManager audienceManager = new AudienceManager();

        // Get a reference to the audience
        // IsGuid is an extenstion method i wrtoe
        if (audPart.IsGuid())
        {
          if (audienceManager.Audiences.AudienceExist(new Guid(audPart)))
            aud = audienceManager.Audiences[new Guid(audPart)];
        }
        else
        {
          if (audienceManager.Audiences.AudienceExist(audPart))
            aud = audienceManager.Audiences[audPart];
        }

        // Ensure we have a reference to the audience
        if (aud != null)
        {

          // store the item in the temp variables
          switch (aud.AudienceName)
          {
            case "All site users":
              // Add to everyone list
              break;

            case "Some List":
              if (audienceManager.IsMemberOfAudience(web.CurrentUser.LoginName, aud.AudienceID))
              {
                // Add to other list
              }
              break;

            case "Other List":
              if (audienceManager.IsMemberOfAudience(web.CurrentUser.LoginName, aud.AudienceID))
              {
                // Add to other list
              }
              break;
          }

        }
      }
    }
  }
}

ご覧のとおり、AudienceManager.Audiences.AudienceExist を使用してオーディエンスが存在するかどうかを確認し、デフォルトのアクセサ AudienceManager.Audiences[GUID]; を使用してオーディエンスへの参照を取得するだけです。

于 2010-04-19T16:59:47.170 に答える