2012-05-05 29 views
11

Tôi đang viết phần mở rộng cho lệnh "Lưu", về cơ bản tôi muốn xác thực một số trường nhất định và hiển thị cửa sổ bật lên cho phép trình chỉnh sửa chọn một từ khóa nhất định hoặc các giá trị khác dựa trên ngày hiện tại, # và một số thuộc tính khác.Nhận giá trị _current_ của một trường trong Trình chỉnh sửa thành phần? (Tridion 2011 SP1)

Tôi nghĩ rằng tôi đã tiến triển tốt cho đến khi cuối cùng tôi đã tìm ra rằng $display.getItem() đang trả lại mục như được lưu trữ trong CM, chứ không phải giá trị hiện tại mà trình chỉnh sửa có thể đã thay đổi.

Có phương pháp tích hợp để cung cấp cho tôi thông tin này không? Hay tôi cần phải phân tích cú pháp DOM để tìm ra nó?

Đây là mã Tôi hiện đang có

var item = $display.getItem(); 
if (item.getItemType() == "tcm:16") { 
    if (item.getSchema().getStaticTitle() == "Test Schema") { 
     var content = $xml.getNewXmlDocument(item.getContent()); 
     var fieldXml = $xml.getInnerText(content, "//*[local-name()='NewField']"); 
     alert(fieldXml); 
    } 
} 

Nó đang làm việc - tôi nhận được giá trị của "Newfield" - nhưng đây là giá trị mục khi nó đã được nạp, không phải là hiện tại Giá trị.

Thật thú vị, item.getTitle() hiển thị giá trị hiện tại của trường Tiêu đề, vì vậy tôi hy vọng có thể có cách để đạt được điều này cho trường tùy chỉnh.

Trả lời

9

Tôi không biết đây có phải là cách thích hợp để thực hiện hay không, nhưng bạn có thể kích hoạt sự kiện "collectdata" trên mục - sẽ cập nhật dữ liệu của nó với nội dung đã được nhập trên màn hình chỉnh sửa.

var item = $display.getView().getItem(); 
item.fireEvent("collectdata"); 
$log.message(item.getXml()); 
3

Cách tiếp cận của Peter sao chép các giá trị từ các điều khiển trong HTML vào XML của mục. Đây là một cách tiếp cận tuyệt vời nếu bạn không nhớ mục đang được cập nhật, vì nó cho phép bạn chỉ cần thao tác XML thay vì HTML.

Nhưng nếu bạn không muốn mục này được cập nhật, bạn không còn cách nào khác ngoài việc tìm đúng (các) điều khiển trong HTML và đọc giá trị từ đó.

tôi đã viết lên chức năng helper ít này cho nó:

function getControlForFieldName(name) 
{ 
    var fieldBuilder = $display.getView().properties.controls.fieldBuilder; 
    var fieldsContainer = fieldBuilder.properties.input; 
    var fieldsNode = fieldsContainer.getElement(); 
    var fieldContainer = $dom.getFirstElementChild(fieldsNode); 
    while (fieldContainer) 
    { 
     var labelNode = $dom.getFirstElementChild(fieldContainer); 
     var fieldNode = $dom.getNextElementSibling(labelNode); 
     var control = fieldNode.control; 
     if (control.getFieldName() == name) 
     { 
      return control; 
     } 
     fieldContainer = $dom.getNextElementSibling(fieldContainer); 
    } 
} 

Với chức năng này ở vị trí bạn chỉ có thể tìm kiếm sự kiểm soát đối với một lĩnh vực nhất định tên của nó. Khi bạn có quyền kiểm soát, bạn có thể nhận được các giá trị từ nó một cách dễ dàng.

var fieldControl = getControlForFieldName('Body'); 
if (fieldControl) 
{ 
    var values = fieldControl.getValues(); 
    // values is an array, since it caters for multi-value fields 
    // if this is a single-value field, get the value from values[0] 
} 

Lưu ý rằng cách tiếp cận của tôi yêu cầu mã nhiều hơn của Peter và chạm vào một số API không công khai.

+0

Tôi lưu ý rằng FieldBuilder dường như không có sẵn trong XM (Giao diện người dùng). Có bất cứ điều gì tương tự/rất hữu ích OOTB? –

+0

Đối tượng FieldBuilder xây dựng biểu mẫu để chỉnh sửa Thành phần trong cửa sổ bật lên. Vì giao diện người dùng XPM mới không có dạng như vậy, nhưng thay vào đó cho phép bạn chỉnh sửa nội dung trong trang web thông thường của bạn, FieldBuilder không có ý nghĩa trong ngữ cảnh này. Bạn có thể lấy thông tin về trường đã chọn từ '$ display.getView() ._ getSelectedFieldData()'. –

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