2012-06-27 17 views
5

Tôi đang xây dựng một phần mở rộng GUI bằng cách sử dụng SDL Tridion 2011 SP1. Tôi muốn thu thập một số đầu vào của người dùng khi trình chỉnh sửa chạm vào nút "Lưu và nhận xét" mới. Nút này sẽ thu thập một số đầu vào của người dùng và sau đó kích hoạt các lệnh lưu sẵn của CME.Có thể chuyển các giá trị từ một phần mở rộng SDL Tridion 2011 GUI sang SaveEventArgs trong một trình xử lý sự kiện

Sau đó sử dụng Trình xử lý sự kiện, tôi muốn nắm bắt đầu vào của người dùng đó và thực hiện một số xử lý tùy chỉnh với nó. xử lý sự kiện đơn giản của tôi là như sau:

using System; 
using System.Text; 
using Tridion.ContentManager.Extensibility.Events; 
using Tridion.ContentManager.Extensibility; 
using Tridion.ContentManager.ContentManagement; 
using System.IO; 

namespace UrbanCherry.Net.SDLTridion.EventHandlers 
{ 
    [TcmExtension("VersionCommenting")] 
    public class VersionCommenting : TcmExtension 
    { 
    public VersionCommenting() 
    { 
     Subscribe(); 
    } 

    public void Subscribe() 
    { 
     EventSystem.Subscribe<Component, SaveEventArgs>(AddCommentToItemVersion, 
                 EventPhases.Initiated); 
    } 

    private void AddCommentToItemVersion(Component source, SaveEventArgs args, 
             EventPhases phase) 
    { 
     //Do some work here 
    } 
    } 
} 

Có thể gia hạn GUI của tôi bằng cách nào đó thêm giá trị cho các SaveEventArgs, hoặc bằng cách sử dụng args.ContextVariables hoặc một số phương pháp khác?

+0

Tôi sẽ không tư vấn trộn trạng thái giữa các sự kiện, điều gì sẽ xảy ra nếu nhiều người nhấp vào nút Lưu và nhận xét (gần như) đồng thời, bạn sẽ theo dõi những người như thế nào? –

+0

Bạn có ý định lưu nhận xét trong trường siêu dữ liệu không? –

+0

Tôi thực sự hy vọng để lưu nó trong lĩnh vực bình luận được sử dụng trên rollback/forward, nhưng đó là thách thức tiếp theo –

Trả lời

1

Không có cách trực tiếp nào để chuyển các tham số từ tiện ích GUI sang trình xử lý sự kiện. Vì vậy, cách duy nhất tôi có thể tưởng tượng là bằng cách thêm thông tin bổ sung vào cấu trúc dữ liệu hiện có. Dữ liệu ứng dụng (như Will được đề xuất) là một cấu trúc dữ liệu như vậy, nhưng bạn cũng có thể xem xét piggybacking thông tin vào Component XML hiện có.

Vì bạn có cả tiện ích mở rộng GUI và Trình xử lý sự kiện, về cơ bản bạn có thể làm bất cứ điều gì bạn muốn trước đây, miễn là bạn "hoàn tác" những thay đổi sau này.

Vì vậy, một cách mà tôi có thể tưởng tượng:

  1. trong phần mở rộng giao diện của bạn, tiêm một yếu tố tùy chỉnh với những nhận xét vào XML Component
  2. trong Event Handler của bạn, trích xuất các bình luận và loại bỏ các yếu tố tùy chỉnh

Tôi chưa thử nghiệm phương pháp này, nhưng đã thực hiện điều tương tự với Trình mở rộng dữ liệu tùy chỉnh: thay đổi lệnh hoặc dữ liệu được gửi đến máy chủ và sau đó trên máy chủ phát hiện thay đổi đó và hành động trên nó (trước khi chuyển nó đến TCM).

Tất nhiên bạn phải đảm bảo trình xử lý sự kiện trong trường hợp này sẽ xóa nhận xét khỏi XML thành phần theo một trong các giai đoạn trước đó.

Nếu bạn muốn làm điều đó một cách an toàn, bạn nên lấy nhận xét khỏi XML thành phần trong giai đoạn sự kiện rất sớm và sau đó chỉ lưu nhận xét trong giai đoạn trước cam kết/sau cam kết. Ở giữa các giai đoạn đó, bạn phải lưu trữ chú thích ở đâu đó, nhưng ít nhất dữ liệu đã được tạo từ GUI đến máy chủ lúc đó.

+0

Bạn có nghĩa là thêm nhận xét dưới dạng giá trị + trường tùy chỉnh vào XML nội dung, mà không xác định trường trong Giản đồ? –

+0

Đó sẽ là một cách, mặc dù bạn có thể phải tăng thêm FieldBuilder để đảm bảo rằng "trường giả" không làm cho nội dung không hợp lệ. Ngoài ra, bạn có thể đưa nó vào các phần khác của Component XML hoặc thậm chí gắn nó vào Title nếu bạn muốn. Hãy nhớ rằng: vì bạn đang viết cả hai mặt của phương trình ở đây, bạn hoàn toàn kiểm soát được những gì xảy ra. –

1

Chỉ là một ý tưởng, và không biết làm thế nào để thực sự làm điều đó trong phần mở rộng GUI, nhưng bạn có nghĩ đến việc thiết lập chú thích là Dữ liệu ứng dụng trên mục khi bạn bấm vào nút không?

+0

Yup - Nghĩ về điều đó - tôi coi đó là phương sách cuối cùng, vì nó không thể được Content Ported vv. đã là trường "Nhận xét hệ thống" được sử dụng để cuộn lại, chuyển tiếp và cập nhật v.v., vì vậy tôi thực sự muốn tận dụng điều đó nếu có thể. Có lẽ tôi cần phải thực hiện một yêu cầu nâng cao để thêm vào API với một cái gì đó như Component.Save (Boolean FinishEditing, String Comment) –

+0

Vâng, bạn có thể sử dụng dữ liệu ứng dụng như lưu trữ tạm thời để truyền dữ liệu từ GUI đến hệ thống sự kiện, loại bỏ nó khỏi dữ liệu ứng dụng khi bạn đã đặt nó trong System Comment – Will

+0

Yup, tôi nghĩ đó là những gì tôi sẽ phải làm.Tôi đã hy vọng có một cách tiếp cận thanh lịch hơn –

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