Question

Je souhaite modifier mon contenu du wiki SharePoint par programmation. L’un des avantages serait d’ajouter automatiquement des index à l’environnement Wiki.

Quelqu'un a-t-il pu le faire? La langue n'a pas d'importance, mais vous recherchez une solution de script.

Était-ce utile?

La solution

Un wiki SharePoint est simplement un type spécial de bibliothèque de documents. J'ai eu quelques problèmes en essayant de le faire.

Une page wiki SharePoint se compose d'un fichier modèle et d'un élément de liste. Lorsque vous affichez la page, les champs de l'élément de liste sont insérés dans le fichier de modèle. Donc, pour mettre à jour une page wiki, il vous suffit de mettre à jour les champs corrects dans l'élément de liste. (Incidemment, cela signifie également que vous ne pouvez pas obtenir le modèle d'origine comme un fichier dans une bibliothèque de documents normale. Jusqu'à présent, la seule façon d'obtenir le modèle lui-même est de le télécharger via SharePoint Designer.)

De plus, SharePoint restitue automatiquement le contenu du wiki lorsque vous accédez à l'élément de liste par programme. Je n'ai donc jamais pu obtenir le contenu contenant "[[Nom de mon lien]]]," Par exemple, SharePoint renverrait toujours le code HTML rendu à la place, par exemple:

<A class=ms-wikilink href="/MyWikiLibrary/MyLinkName.aspx">My Link Name</A>

Avec un peu de travail de regex, vous devriez être capable de le reconvertir en contenu du wiki original.

Autres conseils

Oui. J'ai lancé ma propre API Metaweblog qui gère par programme les pages wiki dans Sharepoint 2010 et 2007.

Mes sources:

Le code de service pour SP 2010 et 2007 est à peu près identique, mais il y a quelques réserves:

  • En 2010, vous n'avez pas à vous soucier de la gestion du balisage des liens wiki (par exemple, [[crochets]]).
  • En 2007, le balisage wiki est converti à votre demande. Vous devez donc le reconvertir en balisage Wiki avant de poster. Lors de la publication, vous ne pouvez pas utiliser UpdateListItems, vous devez utiliser le service de copie. En effet, UpdateListItems échappera à tout balisage wiki, rendant ainsi vos efforts inutiles.
  • Dans notre environnement, nous exigeons que RecordType soit renseigné avant de procéder à l'enregistrement. Peut-être que c'est standard? Si vous ne définissez pas ce champ, votre page restera extraite pour vous. J'ai donc une condition qui définit ce champ pour SP2007.
  • En 2010, SP a ajouté une série de balises dans la valeur brute de WikiField. Si elle est manquante, elle pourrait gâcher les présentations. Je viens de l'insérer autour de la valeur affichée par WLW, puis de la supprimer pour l'obtenir. Voir ci-dessous.

J'utilise le service de copie comme dans le premier lien pour créer ET mettre à jour les pages du wiki. En 2010, vous pouvez utiliser le service de listes pour mettre à jour, mais pas pour ajouter. J'utilise le service d'imagerie pour télécharger automatiquement des images vers une bibliothèque d'images.

Voici une fonction qui remplace les "ms-wikilinks". vers le balisage wiki:

Remarque: j'utilise le HTMLAgilityPack au cas où le balisage renvoyé est incorrect. Vous pouvez aussi utiliser Regex pour faire cela. J'utilise également la bibliothèque Microsoft Anti-XSS 4.1 pour nettoyer le balisage.

Remarque 2: Ma fonction UrlDecode ne nécessite pas de dépendance de System.Web, extrait d'ici .

/// <summary>
/// Sharepoint 2007 is mean and converts [[wiki links]] once the page is saved in the Sharepoint editor.
/// Luckily, each link is decorated with class="ms-wikilink" and follows some conventions.
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
private static string ConvertAnchorsToWikiLinks(this string html)
{
    HtmlDocument htmlDoc = new HtmlDocument();

    htmlDoc.LoadHtml(html);

    var anchorTags = (from d in htmlDoc.DocumentNode.Descendants()
                      where d.Attributes.Contains("class") && d.Attributes["class"].Value == "ms-wikilink"
                      select d).ToList();

    foreach (var anchor in anchorTags)
    {
        // Two kinds of links
        // [[Direct Link]]
        // [[Wiki Page Name|Display Name]]
        var wikiPageFromLink = UrlDecode(anchor.Attributes["href"].Value.Split('/').LastOrDefault().Replace(".aspx", ""));
        var wikiPageFromText = anchor.InnerText;

        HtmlNode textNode = null;

        if (wikiPageFromLink == wikiPageFromText)
        {
            // Simple link
            textNode = HtmlTextNode.CreateNode("[[" + wikiPageFromText + "]]");
        }
        else
        {
            // Substituted link
            textNode = HtmlTextNode.CreateNode(String.Format("[[{0}|{1}]]", wikiPageFromLink, wikiPageFromText));
        }

        if (textNode != null)
        {
           anchor.ParentNode.ReplaceChild(textNode, anchor);
        }
    }

    return htmlDoc.DocumentNode.InnerHtml;
}

La fonction de suppression du code HTML SharePoint est la suivante:

/// <summary>
/// Gets editable HTML for a wiki page from a SharePoint HTML fragment.
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string GetHtmlEditableContent(string html)
{
    HtmlDocument htmlDoc = new HtmlDocument();

    htmlDoc.LoadHtml(html);

    HtmlNode divNode = (from d in htmlDoc.DocumentNode.Descendants()
                        where d.Attributes.Contains("class") && d.Attributes["class"].Value == "ms-rte-layoutszone-inner"
                        select d).FirstOrDefault();
    HtmlNode divNode2 = (from d in htmlDoc.DocumentNode.Descendants()
                         where d.Attributes.Contains("class") && d.Attributes["class"].Value.StartsWith("ExternalClass")
                         select d).FirstOrDefault();

    if (divNode != null)
    {
        // SP 2010
        return divNode.InnerHtml;
    }
    else if (divNode2 != null)
    {
        // SP 2007 or something else
        return divNode2.InnerHtml.ConvertAnchorsToWikiLinks();
    }
    else
    {
        return null;
    }
}

Et enfin, la fonction qui ajoute ce balisage à tout le dos:

/// <summary>
/// Inserts SharePoint's wrapping HTML around wiki page content. Stupid!
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string InsertSharepointHtmlWrapper(string html, SharePointVersion spVersion)
{
    // No weird wrapper HTML for 2007
    if (spVersion == SharePointVersion.SP2007)
        return Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(html);

    HtmlDocument htmlDoc = new HtmlDocument();

    htmlDoc.LoadHtml(@"<table id='layoutsTable' style='width:100%'>
                            <tbody>
                                <tr>
                                    <td>
                                        <div class='ms-rte-layoutszone-outer' style='width:99.9%'>
                                            <div class='ms-rte-layoutszone-inner' style='min-height:60px;word-wrap:break-word'>
                                            </div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <span id='layoutsData' style='display:none'>false,false,1</span>");

    HtmlNode divNode = (from d in htmlDoc.DocumentNode.Descendants()
                        where d.Attributes.Contains("class") && d.Attributes["class"].Value == "ms-rte-layoutszone-inner"
                        select d).FirstOrDefault();

    divNode.InnerHtml = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(html);

    return htmlDoc.DocumentNode.InnerHtml;
}

Cela fonctionne très bien.

  • Les pages conservent toujours le dernier utilisateur modifié et correct
  • Les pages conserveront toute leur histoire
  • Les pages sont plus faciles à gérer

Je songe à publier mon API. Ce n'est pas beaucoup de code qui, à mon avis, est extrêmement utile pour ceux d'entre nous qui souhaitent mieux gérer nos wikis Sharepoint. Avec WLW, je reçois un téléchargement automatique des images, une meilleure prise en charge de l'édition HTML et des plugins tels que PreCode Snippet. C'est génial!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top