2013-08-02 13 views
6

Tôi có mẫu Tham số hiển thị được áp dụng cho một lớp con. Nó có một trường Droptree duy nhất trên nó, và tôi muốn đặt Nguồn của trường đó thành truy vấn Sitecore để tôi có thể giới hạn các tùy chọn có sẵn cho trường đó.Đặt nguồn có thể truy vấn trên trường Mẫu tham số Rendering

Nguồn có thể là:

query:./*

hoặc

query:./ancestor-or-self::*[@@templatename='MyTemplate']/

Truy vấn chỉ cần lấy mục liên quan đến các mục nội dung mà chúng đang ở trên. Điều này thường làm việc với các trường Droptree trong trình soạn thảo nội dung.

Tuy nhiên, tôi thấy rằng truy vấn không hoạt động ở đây vì chúng tôi đang ở trong các tham số hiển thị, vì vậy, nó không sử dụng mục nội dung như ngữ cảnh của nó. Truy vấn không thành công và tôi chỉ nhận được toàn bộ cây Sitecore.

Tôi thấy điều này có thể được cố định lên cho trường Datasource với 'Locations queryable Datasource' tại liên kết này: - http://www.cognifide.com/blogs/sitecore/reduce-multisite-chaos-with-sitecore-queries/

Tuy nhiên tôi không biết bắt đầu từ đâu để có được điều này làm việc cho hiển thị khác các trường tham số.

Bất kỳ ý tưởng nào? (Tôi đang sử dụng Sitecore 6.6 Update 5)

+0

Nếu bạn đặt nguồn dữ liệu thành loại "cấu hình" với trường này, nó có thể kiểm soát Droptree bình thường với nguồn truy vấn như bạn đã mô tả. Ngoài ra kể từ khi bạn đang gắn bó với Datasource kiểm soát của bạn sẽ dễ dàng cá nhân hoá và đa biến có thể kiểm tra. –

+0

Điều Cá nhân hóa và kiểm tra là đúng, tuy nhiên điều khiển này đã sử dụng trường DataSource làm thuộc tính khác trên điều khiển. Mặc dù vậy, tôi đồng ý, DataSource có thể được sử dụng thay thế nếu đó là thuộc tính có thể chọn duy nhất. –

Trả lời

7

Thật không may, đường ống được đề cập trong Adam Najmanowicz's answer hoạt động đối với một số loại khác, như Droplink và Multilist, nhưng đường ống không chạy cho các trường Droptree.

Sau khi xem xét này sâu sắc hơn tôi thấy rằng nguồn của một trường Droptree IS sử dụng mục bối cảnh sai, như Adam đã đề cập, nhưng mã xuất phát từ lĩnh vực Droptree bản thân: -

Sitecore.Shell.Applications.ContentEditor.Tree, Sitecore.Kernel

Bằng cách sử dụng mã chuỗi truy vấn từ câu trả lời của Adam, chúng ta có thể tạo trường tùy chỉnh 'cố định' Droptree, gần như giống với Droptree thông thường nhưng thay vào đó sẽ sử dụng đúng mục ngữ cảnh. Mã sẽ kế thừa từ kiểm soát Cây thông thường và chỉ thay đổi cách thuộc tính Nguồn được đặt.

public class QueryableTree : Sitecore.Shell.Applications.ContentEditor.Tree 
{ 
    // override the Source property from the base class 
    public new string Source 
    { 
     get 
     { 
      return StringUtil.GetString(new string[] 
      { 
       base.Source  // slightly altered from the original 
      }); 
     } 
     set 
     { 
      Assert.ArgumentNotNull(value, "value"); 
      if (!value.StartsWith("query:", StringComparison.InvariantCulture)) 
      { 
       base.Source = value;   // slightly altered from the original 
       return; 
      } 
      Item item = Client.ContentDatabase.GetItem(this.ItemID); 

      // Added code that figures out if we're looking at rendering parameters, 
      // and if so, figures out what the context item actually is. 
      string url = WebUtil.GetQueryString(); 
      if (!string.IsNullOrWhiteSpace(url) && url.Contains("hdl")) 
      { 
       FieldEditorParameters parameters = FieldEditorOptions.Parse(new UrlString(url)).Parameters; 
       var currentItemId = parameters["contentitem"]; 
       if (!string.IsNullOrEmpty(currentItemId)) 
       { 
        Sitecore.Data.ItemUri contentItemUri = new Sitecore.Data.ItemUri(currentItemId); 
        item = Sitecore.Data.Database.GetItem(contentItemUri); 
       } 
      } 

      if (item == null) 
      { 
       return; 
      } 
      Item item2 = item.Axes.SelectSingleItem(value.Substring("query:".Length)); 
      if (item2 == null) 
      { 
       return; 
      } 
      base.Source = item2.ID.ToString();   // slightly altered from the original 
     } 
    } 

Đoạn mã trên là khá nhiều giống như tài sản Nguồn trên cơ sở Tree lĩnh vực, ngoại trừ việc chúng ta tìm ra các mục ngữ cảnh thích hợp từ URL nếu chúng tôi đã phát hiện ra rằng chúng ta đang ở hộp thoại thông số hiển thị.

Để tạo trường tùy chỉnh, bạn chỉ cần chỉnh sửa tệp Web.Config như được mô tả here. Sau đó, thêm trường tùy chỉnh vào cơ sở dữ liệu lõi như được mô tả here.

Điều này có nghĩa là các thông số giờ đây có thể có các truy vấn cho nguồn của chúng, cho phép chúng tôi giới hạn các mục khả dụng cho trình chỉnh sửa nội dung. (Hữu ích cho các giải pháp đa trang web).

5

Điều quan trọng ở đây là đặt ngữ cảnh của Field Editor tương đối so với mục bạn đang chỉnh sửa thay vì tham số Rendering (mặc định là mặc định). Vì vậy, bạn có thể có bộ vi xử lý:

public class ResolveRelativeQuerySource 
{ 
    public void Process(GetLookupSourceItemsArgs args) 
    { 
     Assert.IsNotNull(args, "args"); 
     if (!args.Source.StartsWith("query:")) 
      return; 
     Item contextItem = null; 
     string url = WebUtil.GetQueryString(); 
     if (!string.IsNullOrWhiteSpace(url) && url.Contains("hdl")) 
     { 
      FieldEditorParameters parameters = FieldEditorOptions.Parse(new UrlString(url)).Parameters; 
      var currentItemId = parameters["contentitem"]; 
      if (!string.IsNullOrEmpty(currentItemId)) 
      { 
       Sitecore.Data.ItemUri contentItemUri = new Sitecore.Data.ItemUri(currentItemId); 
       contextItem = Sitecore.Data.Database.GetItem(contentItemUri); 
      } 
     } 
     else 
     { 
      contextItem = args.Item; 
     } 
    } 
} 

nối như:

<sitecore> 
    <pipelines> 
    <getLookupSourceItems> 
    <processor patch:before="*[@type='Sitecore.Pipelines.GetLookupSourceItems.ProcessQuerySource, Sitecore.Kernel']" 
     type="Cognifide.SiteCore.Logic.Processors.ResolveRelativeQuerySource, Cognifide.SiteCore" /> 
    </getLookupSourceItems> 
    </pipelines> 
</sitecore> 

Cùng với ResolveQueryableDatasources từ blog Przemek của điều này sẽ giải quyết vấn đề của bạn.

+1

Câu hỏi khác nhau nhưng bạn đã vô tình giải quyết một vấn đề mà tôi đã phải vật lộn với cả ngày quá lớn cảm ơn bạn =) http://sdn.sitecore.net/forum/ShowPost.aspx?PostID=62695#62695 – getsetcode

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