2013-04-06 42 views
9

Tôi có một số <div contenteditable="true" /> mà người dùng có thể viết trong đó có nhiều giới hạn về độ dài.
Dữ liệu trong div được lưu trên thay đổi với dấu thời gian trong cơ sở dữ liệu MySQL.Lưu các thay đổi trong nội dung có thể chỉnh sửa được bằng dấu thời gian

Bây giờ mục tiêu của tôi là có một ghi chú nhỏ ở bên trái cho người dùng biết khi nào từng phần của tài liệu đã được tạo (độ phân giải phải là ngày).

Bây giờ, câu hỏi là: Làm cách nào để lưu thông tin (phần nào đã thay đổi khi nào) nhất?

tôi coi các tùy chọn sau cho đến nay mà cả hai dường như có thể làm tốt thêm:

  1. Mỗi khi người dùng truy cập các trang web ở phần cuối của tài liệu tôi chèn một lá cờ (ví dụ như một nhịp cầu emtpy với một lớp và một thuộc tính dữ liệu lưu trữ bắt đầu chỉnh sửa). Cờ này sau đó được lưu vào cơ sở dữ liệu khi tập lệnh lưu được gọi. Tùy chọn này sẽ làm cho nó rất dễ dàng để hiển thị ngày ở bên cạnh - Tôi chỉ cần đặt chúng trên cùng một chiều cao như khoảng trống và khoảng cho tôi biết ngày tháng. Nhược điểm là: Người dùng có thể vô tình xóa dấu thời gian và nếu người dùng không đóng cửa sổ trong một thời gian dài không có khoảng thời gian mới được chèn vào (điều này có thể tránh được bằng cách chèn dấu thời gian mới kéo dài sau mỗi X phút để phần xóa phù hợp hơn)
  2. Cố gắng thực hiện so sánh khác biệt chuỗi mỗi lần dữ liệu được chuyển đến tập lệnh lưu và chỉ lưu chênh lệch với dấu thời gian. Sau đó, khi trang được tải đặt tất cả các phần lại với nhau theo thứ tự đúng và trong Javascript, hãy đặt ghi chú ngày vào đúng vị trí. Điều này nghe có vẻ như rất nhiều chi phí cho tôi mặc dù + khi các bộ phận cũ được thay đổi hai phần có thể trở thành một, vv Tất cả trong tất cả các tùy chọn này có vẻ rất phức tạp.

Bất kỳ đầu vào/ý tưởng/đề xuất nào được đánh giá cao!

+0

Loại nội dung có cấu trúc hoặc không có cấu trúc? Nếu nó không có cấu trúc (như một cơ sở mã trong thời gian), thì tôi sẽ đề nghị sử dụng giải pháp được cung cấp bởi armel. Nếu nó được cấu trúc hoặc có thể được cấu trúc, thì giải pháp được cung cấp bởi MrFishie và tôi. –

+0

Loại nội dung có cấu trúc hoặc không có cấu trúc? Nếu nó không có cấu trúc (như một cơ sở mã trong thời gian), thì tôi sẽ đề nghị sử dụng giải pháp hợp nhất được cung cấp bởi armel. Nếu nó được cấu trúc hoặc có thể được cấu trúc, thì giải pháp được cung cấp bởi MrFishie và tôi. Một tài liệu không có cấu trúc phức tạp hơn để xử lý, bởi vì nó thường khá khó để giải quyết hệ thống phân cấp thích hợp của các thay đổi. (Điều này luôn luôn là một vấn đề rất có vấn đề với nhân rộng trên các máy chủ khác nhau trong Lotus Notes.) Đây là phiên bản của nhận xét tôi muốn bạn đưa vào tài khoản. –

+0

@LoekBergman: Dữ liệu nhập là người dùng được tạo và không tuân theo bất kỳ cấu trúc cụ thể nào. – Horen

Trả lời

12

Điều bạn đang cố triển khai là tính năng được gọi là "chú thích" hoặc "đổ lỗi" trong thế giới kiểm soát mã nguồn (mặc dù bạn chỉ muốn ngày cập nhật thay vì ngày + tác giả hoặc đơn giản là tác giả).

Để làm điều đó đúng cách, bạn cần một cách để tạo sự khác biệt (php-diff có thể thực hiện công việc) và nhận các phiên bản của văn bản. Có một số chiến lược:

  • cửa hàng phiên bản mới nhất và giữ chỉ đồng bằng châu thổ (như diffs thống nhất, sở thích của tôi)

  • lưu trữ tất cả các phiên bản và tính toán đồng bằng châu thổ on the fly

Khi bạn có phiên bản hiện tại và danh sách các vùng đồng bằng (bạn có thể rút ngắn danh sách nếu nhiều hơn một vài chục delta và để người dùng hỏi thêm nếu thực sự quan trọng). Bạn soạn các vùng đồng bằng với nhau, đây là nơi giai đoạn chú thích xảy ra khi bạn có thể thực hiện phần này ghi nhớ từ phiên bản nào đến từng dòng. Soạn thảo là khá đơn giản trong thực tế (bắt đầu từ mới nhất, tất cả các dòng được thêm vào trong bản vá dẫn đến từ bản mới nhất, phần còn lại cần được giải thích, vì vậy hãy bắt đầu lại với bản vá tiếp theo cho đến khi bạn đạt được bản vá cổ nhất mà bạn muốn xử lý , các dòng còn lại là từ phiên bản đó hoặc sớm nhất để một số cờ nói 'at hoặc before' có thể được sử dụng).

Google has a diff library for Javascript để có thể thực hiện tất cả công việc khó khăn trên máy của người dùng. Họ cũng có phần bản vá trong thư viện này. Tôi không tìm thấy thư viện chú thích/đổ lỗi.

+0

Cảm ơn - điều đó nghe như một ý tưởng hay. Chỉ cần để hiểu rõ hơn: Tiết kiệm: 1) Tôi lưu phiên bản mới nhất, 2) Đồng thời tôi lưu phần khác đi kèm với phiên bản hiện tại. Sau đó tải (bạn gọi nó là sáng tác): 1) Bắt đầu với phiên bản hiện tại, 2) Sử dụng phiên bản mới nhất và áp dụng nó cho phiên bản hiện tại, ví dụ: google javascript patch, 3) lặp lại bước 2 với các phiên bản cũ hơn cho đến khi kết thúc. Tôi có hiểu điều đó đúng không? – Horen

+0

có điều gì đó tương tự như vậy, trong quá trình "Lưu", hãy đảm bảo làm việc giao dịch (lưu bản lưu + lưu). Trong quá trình "Đang tải", bạn sẽ phải áp dụng các bản vá để thực hiện công việc chú thích.Lưu ý rằng, như các bản vá được định hướng dòng, ứng dụng chú thích/vá có thể được giảm xuống để thao tác một mảng "tác giả và/hoặc ngày", chỉ hoạt động trên các tọa độ đường và cho phép văn bản trong các bản vá lỗi (mặc dù chúng có thể sinh lợi cho một khôi phục tính năng hoặc phiên bản khác). Thư viện của Google sẽ không làm phần chú thích cho bạn, nhưng bạn có thể lấy cảm hứng từ mã của họ. – armel

+0

Anh ấy không yêu cầu về quá trình chú thích hoặc đổ lỗi (hoặc khen ngợi), bởi vì đó là quá trình tìm ra ai đã cam kết mã. Điều đó không liên quan gì đến việc tìm kiếm phiên bản hiện tại. Quá trình bạn mô tả là hợp nhất và một lựa chọn tốt cho những gì MrFishie và tôi đã đề xuất. Xem nhận xét về câu hỏi chung. –

4

Một cách mà bạn có thể thực hiện đó là có bảng cho các bản sửa đổi của div. Thường xuyên, bạn có thể thêm một mục mới vào bảng này, chứa nội dung và dấu thời gian, và do đó theo dõi tất cả các sửa đổi của chỉnh sửa. Sau đó, để tìm hiểu những gì được thay đổi, bạn có thể chỉ cần so sánh hai trong số các mục nhập để tìm hiểu những gì đã được thêm vào, vẫn như cũ, và loại bỏ.

+0

Đó là một ý tưởng hay. Vấn đề duy nhất tôi thấy là "làm thế nào" để tìm thấy những gì đã được thêm vào, thay đổi và loại bỏ và làm thế nào để phù hợp với điều này với vị trí của ngày nó được tạo ra được hiển thị bên trái. Bất kỳ ý tưởng? – Horen

+0

Nên có một số cách để làm điều này với regex, mặc dù tôi không phải là rất tốt với nó. – cpdt

4

Bạn nên lưu thông tin này khi người dùng gửi thông tin. Khoảnh khắc người dùng muốn xem thông tin, hầu như không có bất kỳ tính toán nào.

Trong chương trình phụ trợ, bạn tạo hai bảng. Trong một bảng, hãy gọi nó là 'currentdocs', bạn luôn lưu trữ phiên bản mới nhất của dữ liệu. Khi người dùng tải tài liệu, tất cả thông tin đến từ bảng 'currentdocs' này. Trong bảng khác, hãy gọi nó là 'docsintime', bạn lưu mọi lưu mới. Nó có khóa ngoài với bảng 'currentdocs' và bạn có thể tìm thấy hàng cuối cùng trong bảng 'docsintime' này bằng cách chọn id tối đa với khóa ngoài đó. Một tuyên bố chọn có thể được cái gì đó như:

select id from docsintime where cur_key = x order desc limit 1; 

Trong cả hai bảng làm bạn lưu trữ cho mỗi bộ phận có liên quan dấu thời gian mới nhất mà nó đã được thay đổi.

Khi tài liệu mới được lưu, bạn sẽ nhận được phiên bản đã lưu cuối cùng trong bảng 'docsintime'. Bạn so sánh tất cả các phần có liên quan với dữ liệu từ bản ghi đó. Nếu nó không khác nhau thì bạn sao chép dấu thời gian của phần liên quan đó vào bản ghi mới sẽ được lưu lại. Nếu nó khác nhau thì bạn có tạo một dấu thời gian mới cho phần liên quan đó không. Sau khi so sánh, bạn lưu bản ghi mới trong cả hai bảng 'currentdocs' và 'docsintime'. Bạn cập nhật bảng 'currentdocs' và chèn một bản ghi mới vào bảng 'docsintime'. Chỉ với một tài liệu mới, bạn sẽ thực hiện chèn trong bảng 'currentdocs'. Với yêu cầu tiếp theo cho tài liệu đó, bạn sẽ chỉ phải thu thập thông tin từ bảng 'currentdocs'. Và quá trình bắt đầu lại từ đầu.