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).
Nguồn
2013-08-05 14:13:16
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. –
Đ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. –