2012-02-02 23 views
5

Tôi hiện đang chiến đấu với việc thêm các mục qua C# vào cơ sở dữ liệu Sitecore.Làm cách nào để lập trình các mục Sitecore (Thêm mục và trường)?

Mã bên dưới thực hiện chính xác, tuy nhiên các mục không được tạo.

Ngoài ra, tôi nhận thấy rằng mục ["FieldName"] = giá trị; cú pháp không thực sự phổ biến bộ sưu tập Fields.

Và bộ sưu tập Trường trên mục có vẻ chỉ đọc, vì vậy tôi không thể chỉ gọi .Thêm vào đó (phương thức này không tồn tại).

Vậy - cách tạo đúng mục con và điền vào trường của nó là gì?

Tôi đang sử dụng cơ sở dữ liệu Chính cho cả phần phụ trợ Sitecore và mã này.

Mã này tôi sử dụng dưới đây:

using (new Sitecore.SecurityModel.SecurityDisabler()) 
    { 

     Database db = Factory.GetDatabase(this.Database); 

     foreach (var vacancy in Articles.Tables[0].Rows) 
     { 
      var rootItem = db.GetItem(this.RootItem); 
      DataRow dr = (DataRow) vacancy; 

      var newItem = rootItem.Add(string.Format("{0} {1}", dr["numericID"], dr["job_name"]), 
             db.GetTemplate(new ID("{GUID}"))); 

      newItem.Editing.BeginEdit(); 
      newItem["Job Title"] = dr["job_name"].ToString();// 
      newItem.Editing.EndEdit(); 
     } 
} 

Thông tin thêm: newItem.Template.Fields trả về một bộ sưu tập với 100 lĩnh vực

newItem.Fields trả về một FieldCollection với chỉ 9 yếu tố trong đó.

Khi tôi chuyển qua mã newItem ["field"]. Value = value; nó không tăng số lượng bộ sưu tập newItem.Fields.

Tất nhiên, khóa "trường" là nhất quán với khóa hiện diện trong newItem.Template.Fields [x] .Name.

Trả lời

5

1) Kiểm tra một số điều đầu tiên f.ex:

đảm bảo mẫu biến và kiểm tra những gì bạn đạt được ở đó. và tốt hơn không làm điều đó bởi ID thay bằng đường dẫn:

var templateItem = db.GetTemplate("yourTemplatePath"); 

bây giờ kiểm tra cho dù đó là mẫu bạn muốn? chắc chắn rằng nó đã được xuất bản (nó luôn luôn có thể gây ra một số mâu thuẫn)

2) Đối với các lĩnh vực không phải là 'nhìn thấy', bạn đã thử: item.Fields.ReadAll()

3) Ý anh là gì bởi "các mục không được tạo ra "? làm thế nào bạn sẽ kiểm tra điều đó?

4) Ngoài ra - bạn có chắc chắn rằng this.Database == "master" không?

+0

2) Có, điều này đã giúp điền trước bộ sưu tập Fields, tôi sẽ cho bạn biết làm thế nào tôi có được cùng. –

+0

3) Tôi không thấy chúng trong Sitecore Content Editor khi sử dụng cơ sở dữ liệu Master. –

+0

4) Có ......... –

2

tôi sẽ đề nghị thiết lập các giá trị trường như

newItem.Fields["Job Title"].Value = dr["job_name"].ToString();// 

Mọi thứ khác trông ok.

+0

Cảm ơn, tôi sẽ thử ngay bây giờ –

+0

nếu "job_name" cho phép giá trị null, bạn cần phải kiểm tra xem giá trị có phải là không null trước khi bạn chuyển đổi thành chuỗi không. –

+0

Có thể đáng nói đến là bạn có thể sử dụng viết tắt newItem ["Chức danh"] = "bất kỳ" – geedubb

4

Tôi muốn giới thiệu hai sự thay đổi:

(1) Các mục đặt tên phương pháp:

var newItem = rootItem.Add(ItemUtil.ProposeValidItemName(string.Format("{0} {1}", dr["numericID"], dr["job_name"])), db.GetTemplate(new ID("{GUID}"))); 

Sự thay đổi này sẽ xử lý ký tự không hợp lệ trong tên đề xuất từ ​​nguồn dữ liệu khác của bạn.

(2) Các lĩnh vực thiết lập giá trị phương pháp:

newItem.Fields["Job Title"].Value = dr["job_name"].ToString(); 

này sẽ thiết lập giá trị thô của lĩnh vực này vào chuỗi cung cấp.

+0

Cảm ơn. Điều gì sẽ xảy ra nếu tôi chỉ định giá trị không hợp lệ (ví dụ: chuỗi văn bản thành trường Số nguyên)? Tôi sẽ nhận được một ngoại lệ tốt đẹp từ mã cơ sở Sitecore, hoặc chỉ (như trong trường hợp của tôi) không viết sẽ xảy ra? –

+0

Trường luôn chứa các giá trị chuỗi –

+0

Cảm ơn bạn đã gợi ý thông minh về ProposeValidName, tôi cũng đã bỏ lỡ điều đó, tuy nhiên đây không phải là vấn đề trong trường hợp này. Tôi chỉ có thể đánh dấu một câu trả lời là "được chấp nhận" mặc dù: ( –

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