3 votes

Filtrer une liste SharePoint par audience

En utilisant le kit de développement SharePoint, j'essaie de récupérer une liste et d'afficher le contenu dans un contrôle composite. La liste est consciente du public cible et j'aimerais le maintenir dans mon contrôle. Comment puis-je obtenir cette liste, filtrée par public cible, en utilisant le SDK SharePoint? Voici une partie du code avec lequel je travaille :

SPWeb currentWeb = SPContext.Current.Site.RootWeb;
SPList shortcuts = currentWeb.Lists["Shortcuts"];

6voto

Chris Stewart Points 1862

Voici une partie du code que j'utilise maintenant, et cela ne fonctionne pas tout à fait pour moi. Selon la façon dont les publics cibles sont configurés, je devrais obtenir des résultats :

protected override void CreateChildControls()
{
dropdown = new DropDownList();
dropdown.Items.Add(new ListItem("Sélectionner...", ""));

SPWeb currentWeb = SPContext.Current.Site.RootWeb;
SPList shortcuts = currentWeb.Lists["Raccourcis"];

ServerContext context = ServerContext.GetContext(currentWeb.Site);
AudienceManager audManager = new AudienceManager(context);
AudienceCollection audiences = audManager.Audiences;
AudienceLoader audienceLoader = AudienceLoader.GetAudienceLoader();

foreach (SPListItem listItem in shortcuts.Items)
{
    string audienceFieldValue = (string)listItem["Cibles"];

    if (AudienceManager.IsCurrentUserInAudienceOf(audienceLoader, audienceFieldValue, false))
    {
        dropdown.Items.Add(new ListItem(listItem.Title, listItem.Url));
    }
}

Controls.Add(dropdown);
base.CreateChildControls();
}

Sur :

if (AudienceManager.IsCurrentUserInAudienceOf(audienceLoader, audienceFieldValue, false))

Cela ne retourne jamais true, même quand cela devrait être le cas.

1voto

CBono Points 2507

Voici un extrait de code plus concis. Les principaux changements sont la suppression d'objets inutilisés et une version plus efficace de la boucle foreach.

protected override void CreateChildControls()
{
  dropdown = new DropDownList();
  dropdown.Items.Add(new ListItem("Sélectionner...", ""));

  SPWeb currentWeb = SPContext.Current.Site.RootWeb;
  SPListItemCollection scItems = currentWeb.Lists["Raccourcis"].Items;

  AudienceLoader audienceLoader = AudienceLoader.GetAudienceLoader();

  // Itérer sur une copie de la collection pour éviter de multiples requêtes à la liste
  foreach (SPListItem listItem in scItems)
  {
    string audienceFieldValue = (string)listItem["Cibles d'audience"];

    if (AudienceManager.IsCurrentUserInAudienceOf(audienceLoader, audienceFieldValue, false))
    {
      dropdown.Items.Add(new ListItem(listItem.Title, listItem.Url));
    }
  }

  Controls.Add(dropdown);
  base.CreateChildControls();
}

0voto

Magnus Points 15064

Voici un extrait de code qui pourrait être utile pour déterminer le public cible de chaque élément :

SPList raccourcis = currentWeb.Lists["Raccourcis"];
SPListItemCollection items = list.Items;

Audience siteAudience;

ServerContext context = ServerContext.GetContext(site);
AudienceManager audManager = new AudienceManager(context);
foreach (SPListItem item in items)
{
  string ID = item["Publics cibles"].ToString();
  string NewID = ID.Remove(36);
  Guid guid = new Guid(NewID);
  siteAudience = audManager.GetAudience(guid);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X