2009-01-07 29 views
7

Tôi muốn chỉnh sửa nội dung Sharepoint Wiki theo chương trình. Một trong những ưu điểm đó là tự động thêm các chỉ mục vào môi trường Wiki.Chỉnh sửa theo chương trình nội dung Wiki Sharepoint

Có ai có thể thực hiện việc này không? Ngôn ngữ không quan trọng, nhưng tìm kiếm giải pháp kịch bản.

Trả lời

3

SharePoint wiki chỉ là một loại thư viện tài liệu đặc biệt. Chỉ có một vài điều kỳ lạ mà tôi đã gặp phải khi cố gắng làm điều này.

Trang SharePoint wiki bao gồm tệp mẫu và mục danh sách. Khi bạn xem trang, các trường từ mục danh sách được chèn vào tệp mẫu. Vì vậy, để cập nhật một trang wiki, bạn chỉ cần cập nhật các trường chính xác trong mục danh sách. (Ngẫu nhiên, điều đó cũng có nghĩa là bạn không thể lấy mẫu ban đầu như bạn có thể tạo một tệp trong thư viện tài liệu bình thường. Cho đến nay, cách duy nhất tôi tìm thấy để lấy mẫu là tải xuống nó thông qua SharePoint Designer.)

Ngoài ra, SharePoint sẽ tự động hiển thị nội dung wiki khi bạn truy cập mục danh sách theo chương trình. Vì vậy, tôi đã không bao giờ có thể nhận được các nội dung có chứa "[[My Name Link]]", ví dụ - SharePoint sẽ luôn luôn trả về HTML rendered thay vào đó, như:

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

Với một tác phẩm regex ít bạn sẽ có thể chuyển đổi điều này trở lại nội dung wiki gốc.

+0

Có ai đã tìm ra cách lấy mẫu không có trình thiết kế chia sẻ không? –

+1

Các regex để phân tích các liên kết wiki rất dễ dàng; nhưng nó không hoạt động theo cách khác. Nếu bạn UpdateListItems và trong WikiField của bạn, hãy để [[ngoặc vuông]] SharePoint chuyển nó thành \\ [[ngoặc vuông] \\], nó hoàn toàn phản ánh tâm trí tôi. Tôi không thể tìm ra cách để tránh điều đó; nếu tôi tự chuyển đổi các liên kết, sau đó SharePoint sẽ coi chúng là liên kết từ đó (thay vì đánh dấu wiki thô). Thua mất. Trong SP2010, điều này là cố định và tất cả đều hoạt động tốt. Tôi đang cố gắng làm cho nó hoạt động trong SP2007. – kamranicus

+1

Tìm ra giải pháp. Bạn có thể sử dụng dịch vụ sao chép để chèn và cập nhật, chỉ cần giữ tên giống nhau. Sau đó, nó được đánh dấu là đánh dấu wiki thô và hoạt động như mong đợi. TUYỆT VỜI! – kamranicus

7

Có. Tôi đã lăn API MetaWeblog của riêng tôi mà lập trình quản lý các trang wiki trong Sharepoint 2010 và 2007.

nguồn của tôi:

Dịch vụ mã cho cả SP 2010 và 2007 tương đối giống nhau, nhưng có một vài cảnh báo:

  • Trong năm 2010, bạn không cần phải lo lắng về việc quản lý đánh dấu liên kết wiki (ví dụ: [[dấu ngoặc vuông]]).
  • Năm 2007, đánh dấu wiki được chuyển đổi theo yêu cầu của bạn, vì vậy bạn phải chuyển đổi lại thành đánh dấu Wiki trước khi đăng lại. Khi đăng lại, bạn không thể sử dụng UpdateListItems, bạn phải sử dụng dịch vụ Sao chép. Điều này là do UpdateListItems sẽ thoát khỏi bất kỳ đánh dấu wiki nào, có hiệu quả làm cho những nỗ lực của bạn vô dụng.
  • Trong môi trường của chúng tôi, chúng tôi yêu cầu RecordType phải được điền trước khi đăng ký. Có thể đây là tiêu chuẩn? Nếu bạn không đặt trường này, trang của bạn sẽ vẫn được kiểm tra cho bạn. Vì vậy, tôi có một điều kiện mà thiết lập lĩnh vực này cho SP2007.
  • Trong năm 2010, SP thêm một loạt các đánh dấu trong giá trị WikiField thô, và nếu nó thiếu nó có thể mess up bố trí. Tôi chỉ cần chèn nó xung quanh giá trị WLW được đăng, sau đó loại bỏ nó ra nhận được. Xem bên dưới.

Tôi sử dụng dịch vụ Sao chép như trong liên kết đầu tiên để tạo và cập nhật các trang wiki. Trong năm 2010, bạn có thể sử dụng dịch vụ Danh sách để cập nhật, nhưng không phải để thêm. Tôi sử dụng dịch vụ Imaging để tải ảnh tự động lên thư viện ảnh.

Đây là một chức năng để thay thế "ms-liên kết wiki" để đánh dấu wiki:

Lưu ý: tôi sử dụng HtmlAgilityPack trong trường hợp đánh dấu trở lại bị thay đổi. Bạn có thể sử dụng Regex để làm điều này quá. Tôi cũng sử dụng thư viện Microsoft Anti-XSS 4.1 để khử trùng đánh dấu.

Lưu ý 2: Chức năng UrlDecode của tôi không phụ thuộc vào System.Web, taken from here.

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

Chức năng dải HTML SharePoint là:

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

Và cuối cùng, chức năng có thêm đánh dấu rằng tất cả trở lại:

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

này hoạt động tuyệt vời.

  • Trang vẫn giữ được sửa đổi lần cuối và chính xác dùng
  • Trang sẽ giữ lại tất cả lịch sử của họ
  • trang được dễ dàng hơn để quản lý

Tôi đang nghĩ đến việc xuất bản API của tôi, nó không phải là rất nhiều mã tôi nghĩ là siêu hữu ích cho những người trong chúng ta muốn quản lý tốt hơn wiki Sharepoint của chúng tôi. Với WLW, tôi nhận được tải lên hình ảnh tự động, hỗ trợ chỉnh sửa HTML tốt hơn và hỗ trợ các plugin như Đoạn mã tiền tố. Thật tuyệt vời!

Các vấn đề liên quan