2009-01-07 84 views

cevap

3

Bir SharePoint wiki, yalnızca özel bir belge kitaplığı türüdür. Bunu yapmaya çalışırken karşılaştığım birkaç tuhaflık var.

Bir SharePoint wiki sayfası bir şablon dosyası ve bir liste öğesinden oluşur. Sayfayı görüntülediğinizde, liste öğesinden alanlar şablon dosyasına eklenir. Dolayısıyla bir wiki sayfasını güncellemek için liste öğesindeki doğru alanları güncellemeniz yeterlidir. (Bu, aynı zamanda, normal bir belge kitaplığında bir dosyaya sahip olabileceğiniz gibi orijinal şablona ulaşamayacağınız anlamına da geliyor. Şimdiye kadar, şablonun kendisini bulmayı başardığım tek yol, SharePoint Designer aracılığıyla indirmektir.) Ayrıca, liste öğesine program aracılığıyla eriştiğinizde, SharePoint otomatik olarak wiki içeriğini oluşturur. Yani, örneğin, "[[My Bağlantı Adı]]," içeriyordu içeriği almak mümkün değildi - SharePoint herzamanki gibi yerine render HTML döneceğini: Biraz regex çalışmayla

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

sen olsa da, bunu orijinal wiki içeriğine dönüştürebilir.

+0

Herkes, sharepoint tasarımcısı olmadan şablonun nasıl oluşturulacağını anladı mı? –

+1

Viki bağlantılarını ayrıştırmak için düzenli ifade kolaydı; ama başka şekilde çalışmıyor. UpdateListItems'i ve WikiField öğesinde [[parantez]] 'i terk ederseniz, SharePoint onu tamamen beynimden koruyan \\ [[parantez]] konumuna dönüştürür. Bunu nasıl önleyeceğimi bilemiyorum; Bağlantıları el ile değiştirirseniz, SharePoint bunları daha sonra bağlantı olarak ele alır (ham wiki işaretlemesi yerine). Kaybet-kaybet. SP2010'da, bu sabit ve her şey iyi çalışıyor. SP2007'de çalışmaya çalışıyorum. – kamranicus

+1

Çözümü öğrendim. Ekleme ve güncelleme için kopya servisini kullanabilirsiniz, sadece ismi aynı tutun. Daha sonra işaretlemeyi ham viki işaretlemesi olarak alır ve beklendiği gibi çalışır. HARİKA! – kamranicus

7

Evet. -

hizmet

  • http://sites.google.com/site/sharepointwikiuploader/
  • http://blogs.msdn.com/b/dwinter/archive/2008/06/28/migrating-wiki-pages-remotely-part-01.aspx (6 Parçaları 1): Ben programlı wiki Sharepoint 2010'da sayfaları ve 2007.

    Benim kaynaklarını yöneten kendi MetaWeblog API yuvarlanmış SP 2010 ve 2007 için kod hemen hemen aynıdır, ancak bazı uyarılar vardır:

    • 2010'da, wiki bağlantı işaretlemesini yönetme konusunda endişelenmenize gerek yok (ör. [[parantez]]).
    • 2007'de, wiki işaretlemesi isteğinize dönüştürülür, bu nedenle geri göndermeden önce Wiki biçimlendirmesine yeniden dönüştürmeniz gerekir. Geri gönderirken, UpdateListItems kullanamazsınız, Kopyalama hizmetini kullanmalısınız. Bunun nedeni UpdateListItems'in herhangi bir wiki işaretlemesinden kaçması ve çabalarınızı gereksiz yere kullanmasıdır.
    • Ortamımızda, kontrol edilmeden önce doldurulması için RecordType gerekir. Belki bu standarttır? Bu alanı ayarlamazsanız, sayfanız size teslim alınmış olarak kalır. Yani, bu alanı SP2007 için ayarlayan bir koşul var.
    • 2010'da SP, ham WikiField değerinde bir grup işaretleme ekliyor ve eğer eksikse, düzenleri bozabilir. Ben sadece WLW'nin gönderdiği değerin etrafına yerleştiriyorum, sonra aldığımdan çıkarıyorum. Aşağıya bakınız.

    wiki sayfalarını oluşturmak ve güncellemek için İlk bağlantıdaki gibi Kopyala hizmetini kullanıyorum. 2010'da, numaralı telefonu numaralı listeyi güncelleştirmek için Listeler hizmetini kullanabilir, ancak ekleyemezsiniz. Görüntüleri bir resim kitaplığına otomatik olarak yüklemek için Görüntüleme hizmetini kullanıyorum.İşte

    "ms-vikibağlantılar" yerine bir işlevdir işaretlemeyi wiki için:

    Not: Ben döndü biçimlendirme hatalı biçimlendirilmiş olması durumunda HTMLAgilityPack kullanın. Bunu yapmak için Regex'i de kullanabilirsiniz. İşaretlemeyi dezenfekte etmek için Microsoft Anti-XSS 4.1 kütüphanesini de kullanıyorum.

    Not 2: UrlDecode işlevim System.Web, taken from here üzerinde bir bağımlılık almaz. SharePoint'in HTML şerit

    /// <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; 
    } 
    

    fonksiyonudur: nihayet

    /// <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; 
        } 
    } 
    

    Ve hepsi geri işaretlemenin ekler fonksiyonu: Bu harika çalışıyor

    /// <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; 
    } 
    

    .

    • Sayfalar hala son değişiklik ve doğru kullanıcıya muhafaza
    • Sayfalar benim API yayıncılık düşünüyorum

    yönetmek için

  • Sayfalar kolaydır tüm geçmişi korunur, bu bir sürü değil Bence bizim Sharepoint wikis yönetmek daha iyi isteyenler için süper yararlı olduğunu düşünüyorum. WLW ile otomatik resim yükleme, daha iyi HTML düzenleme desteği ve PreCode Snippet gibi eklentiler için destek alıyorum. Bu harika!