2016-05-25 23 views
5

Tôi đã cố gắng xuất bản các mục thông qua mã đã được thay đổi trong trình soạn thảo Sitecore. Nếu tôi cập nhật các giá trị trường một cách có lập trình và xuất bản những thay đổi đó, nó sẽ hoạt động tốt.Cách xuất bản các mục Sitecore theo chương trình đã được cập nhật bằng cách sử dụng trình soạn thảo

Trình chỉnh sửa quản lý nội dung của chúng tôi thường xuyên thực hiện các thay đổi trong trình chỉnh sửa mà không nhất thiết phải xuất bản chúng. Chúng tôi muốn cung cấp cho họ chức năng để nhấp vào một nút xuất bản tất cả các thay đổi có liên quan và xóa bộ nhớ cache Sitecore.

Tôi không muốn xuất bản toàn bộ trang web, chỉ một số mục được xác định trước.

Hiện tại chúng tôi đang sử dụng Sitecore.NET 6.4.1 (rev. 110720). Tôi không có khả năng cập nhật Sitecore.

tôi đã cố gắng các tùy chọn này:

Lựa chọn 1: instantiating một đối tượng xuất bản mới

Database master = Sitecore.Configuration.Factory.GetDatabase("master"); 
Database web = Sitecore.Configuration.Factory.GetDatabase("web"); 

Sitecore.Publishing.PublishOptions publishOptions = new Sitecore.Publishing.PublishOptions(master, 
         web, 
         Sitecore.Publishing.PublishMode.SingleItem, 
         item.Language, 
         System.DateTime.Now); 

Sitecore.Publishing.Publisher publisher = new Sitecore.Publishing.Publisher(publishOptions); 

publisher.Options.RootItem = item; 

publisher.Options.Deep = true; 

publisher.Publish(); 

Lựa chọn 2: sử dụng publishmanager tĩnh

Database db = Sitecore.Configuration.Factory.GetDatabase("web"); 
Database[] databases = new Database[1] { db }; 

Sitecore.Handle publishHandle = Sitecore.Publishing.PublishManager.PublishItem(item, databases, db.Languages, true, false); 

Cả hai phương pháp là bọc trong một tuyên bố sử dụng để sử dụng cùng một ccount được sử dụng bởi các biên tập viên quản lý nội dung.

string domainUser = @"sitecore\admin"; 

if (Sitecore.Security.Accounts.User.Exists(domainUser)) 
{ 
     Sitecore.Security.Accounts.User user = 
     Sitecore.Security.Accounts.User.FromName(domainUser, false); 

     using (new Sitecore.Security.Accounts.UserSwitcher(user)) 
     { 
      // publish code ... 
     } 

} 

Các bản ghi không hiển thị bất cứ điều gì đáng chú ý như xa như tôi có thể nói

ManagedPoolThread #7 13:41:46 INFO Job started: Publish to 'web' 
ManagedPoolThread #7 13:41:46 INFO HtmlCacheClearer clearing HTML caches for all sites (5). 
ManagedPoolThread #7 13:41:46 INFO HtmlCacheClearer done. 
ManagedPoolThread #7 13:41:46 INFO Job ended: Publish to 'web' (units processed: 2) 
ManagedPoolThread #5 13:41:46 INFO Job ended: Publish (units processed:) 

Đó là definetely không phải là một vấn đề bộ nhớ đệm, bởi vì khi xuất bản bằng tay trong trình soạn thảo trước khi thanh toán bù trừ bộ nhớ cache theo chương trình, các thay đổi được hiển thị trong mã.

Vì vậy, tôi đang tìm cách để xuất bản một cách lập trình danh sách các mục được cập nhật định sẵn, bỏ qua cách chỉnh sửa đã được thực hiện.

+0

Trong tùy chọn2 của bạn (người xuất bản), bạn đang xuất bản lên cơ sở dữ liệu chính. Bạn có thể thử cái đó với cơ sở dữ liệu web làm đích không? Ngoài ra, hãy chắc chắn rằng bạn đang sử dụng đúng ngữ cảnh cơ sở dữ liệu (có thể sử dụng trình chuyển đổi db để làm chủ db). – Gatogordo

+0

dường như không hoạt động. Tôi đã thêm một DatabaseSwitcher và thay đổi cơ sở dữ liệu thành web, cũng đã thử theo cách khác. – redrobot

+0

Tôi sử dụng tùy chọn 2, bạn có thể cập nhật mã trong câu hỏi với web không ?, Khác Mục tiêu xuất bản không phải lúc nào cũng là "web", tốt hơn không sử dụng mã này, 2) Nếu phụ huynh không tồn tại trong cơ sở dữ liệu web, mục này sẽ không được xuất bản –

Trả lời

4

Đây là cách tôi đã sử dụng để xuất bản các mục trong giải pháp Sitecore 6.5. Trông rất giống với giải pháp đầu tiên của bạn, và điều này vẫn hoạt động tốt cho tôi. Bạn có thấy bất kỳ nhật ký lỗi/thông tin nào trong nhật ký sitecore không?

 public void PublishItem(Database dbMaster, Database dbWeb, Item iParent) 
     { 
      try 
      { 
       PublishOptions po = new PublishOptions(dbMaster, dbWeb, PublishMode.SingleItem, Sitecore.Context.Language, DateTime.Now); 
       po.RootItem = iParent; 
       po.Deep = true; // Publishing subitems 

       (new Publisher(po)).Publish(); 
      } 
      catch (Exception ex) 
      { 
       Sitecore.Diagnostics.Log.Error("Exception publishing items from custom pipeline! : " + ex, this); 
      } 
     } 

Về việc lưu vào bộ nhớ cache, thao tác này sẽ được xử lý tự động trên cơ sở dữ liệu web.

Đôi khi tôi thao tác mục programatically trên cơ sở dữ liệu tổng thể, tôi buộc Sitecore để xóa bộ nhớ cache chỉ dành cho những mục có mã bên dưới:

 Item baseitem = Database.GetDatabase("master").SelectSingleItem(sitecore_path); 
     if (baseitem != null) 
     { 
        //Sitecore.Caching.CacheManager.ClearAllCaches(); 
        string load = String.Concat(new object[] { "item:load(id=", baseitem.ID, ",language=", baseitem.Language, ",version=", baseitem.Version, ")" }); 
        Sitecore.Context.ClientPage.SendMessage(this, load); 
        String refresh = String.Format("item:refreshchildren(id={0})", baseitem.Parent.ID); 
        Sitecore.Context.ClientPage.ClientResponse.Timer(refresh, 2); 
     } 
+0

Tôi đã thử sử dụng mã của bạn, nhưng về cơ bản là giống nhau là lựa chọn thứ nhất của tôi nên không có kết quả khác biệt. – redrobot

+0

Bạn có thấy gì trong nhật ký không? –

+0

Từ nhật ký, có vẻ như mọi thứ đều ổn, 2 mục đã được đẩy và bộ nhớ cache đã bị xóa. Vậy thì vấn đề là gì? Trang web của bạn có trỏ đến cơ sở dữ liệu web hay không hoặc bạn kiểm tra những thay đổi này ở đâu? –

0

Sau khi tất cả, vấn đề là không thực sự trong các mã nhưng đúng thứ tự làm việc và sử dụng đúng cơ sở dữ liệu.

  1. Cập nhật các lĩnh vực trong trình soạn thảo Sitecore
  2. Xóa cache cơ sở dữ liệu tổng thể
  3. Lấy mục một cách rõ ràng từ cơ sở dữ liệu tổng thể
  4. Publish mục với cơ sở dữ liệu "web" như mục tiêu
  5. rõ ràng bộ nhớ cache cơ sở dữ liệu "web"

Mã cuối cùng để xuất bản một mục:

using (new Sitecore.SecurityModel.SecurityDisabler()) 
{ 
    string itemId = "E7A2DE22-4338-49A6-840F-4B3124F1FFBD"; 

    Database webdb = Sitecore.Configuration.Factory.GetDatabase("web"); 
    Database masterdb = Sitecore.Configuration.Factory.GetDatabase("master"); 

    ClearSitecoreDatabaseCache(masterdb); 

    Item masterItem = masterdb.GetItem(new ID(itemId)); 

    // target databases 
    Database[] databases = new Database[1] { webdb }; 

    Sitecore.Handle publishHandle = Sitecore.Publishing.PublishManager.PublishItem(masterItem, databases, webdb.Languages, true, false); 

    ClearSitecoreDatabaseCache(webdb); 
} 

Mã để xóa bộ nhớ cache:

public void ClearSitecoreDatabaseCache(Database db) 
{ 
    // clear html cache 
    Sitecore.Context.Site.Caches.HtmlCache.Clear(); 

    db.Caches.ItemCache.Clear(); 
    db.Caches.DataCache.Clear(); 

    //Clear prefetch cache 
    foreach (var cache in Sitecore.Caching.CacheManager.GetAllCaches()) 
    { 
     if (cache.Name.Contains(string.Format("Prefetch data({0})", db.Name))) 
     { 
      cache.Clear(); 
     } 
    } 
} 
1

Theo tôi, thanh toán bù trừ tất cả các bộ nhớ đệm khi xuất bản không phải là một cách thiết thực. Nó sẽ tác động đến hiệu suất trang web rất nhiều.

Thực ra, sau khi chỉnh sửa nội dung từ dbbrowser, bạn chỉ cần xóa bộ nhớ cache của mục cụ thể (chỉ dành cho các mục đã chỉnh sửa). Để biết cách thực hiện điều đó, hãy kiểm tra - http://sitecoreblog.patelyogesh.in/2013/08/sitecore-partial-cache-clear-programmatically.html.

Phương tiện, bước bạn nên thực hiện: 1. Chỉnh sửa nội dung từ DBBrowser 2. Trước khi xuất bản, rõ ràng bộ nhớ cache cụ thể mục cho các hạng mục xuất bản 3. Không bổ sung "web" hoặc "bậc thầy" bộ nhớ cache thanh toán bù trừ cần xuất bản.

Tôi chắc chắn điều này sẽ giúp giải pháp của bạn.

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