Сайт публикации SharePoint 2007 и таргетинг на аудиторию в веб-части - PullRequest
1 голос
/ 17 апреля 2009

На сайте публикации у меня есть веб-часть, которая должна отображать новости из списка с полем таргетинга на аудиторию. Я использую CAML-запрос для получения небольшого количества последних новостей.

Можно ли указать целевую аудиторию в запросе CAML? Если нет, как мне это сделать? Получить все результаты и чем применить фильтр в цикле?

Я практически дублирую веб-часть запроса контента, и мне нужно настроить таргетинг на аудиторию в своей пользовательской веб-части.

Ответы [ 2 ]

1 голос
/ 17 апреля 2009

Нет, невозможно указать таргетинг на аудиторию в запросе CAML. Я думаю, что это связано с тем, что CAML-запросы - это WSS, а аудитории - это MOSS Shared Service. Вам нужно включить поле аудитории в запрос CAML, т.е. добавить в свойство SPQuery.ViewFields. Затем отфильтруйте код результатов по аудитории в каждом элементе списка. Используйте класс AudienceManager, чтобы проверить, является ли текущий пользователь членом аудитории.

0 голосов
/ 19 апреля 2010

Ну, я нашел обходной путь для этого, у меня возникла проблема при попытке проверить, является ли текущий пользователь членом аудитории для определенной страницы публикации и как называется эта аудитория. Вот обходной путь, который я придумал.


// 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 и получить ссылку на нее, просто используя accesor по умолчанию AudienceManager.Audiences [GUID];

...