2013-04-06 2 views
9

사용자가 쓸 수있는 길이가 무제한 <div contenteditable="true" />입니다.
div의 데이터는 MySQL 데이터베이스의 타임 스탬프와 함께 변경시 저장됩니다.타임 스탬프로 contenteditable에 변경 내용 저장

이제 내 목표는 문서의 각 부분이 만들어 졌을 때 사용자에게 알려주는 약간의 메모를 남기는 것입니다 (해상도는 며칠이어야 함).

이제 질문은 다음과 같습니다. 언제 정보를 저장할 수 있습니까?

는 지금까지 다음과 같은 옵션을 고려 모두 개선 가능 보인다되는 : 사용자가 문서의 끝 부분에있는 사이트를 방문

  1. 때마다 내가 플래그 (클래스와와 예 emtpy 범위를 삽입 편집 시작을 저장하는 데이터 속성). 이 플래그는 저장 스크립트가 호출 될 때 데이터베이스에 저장됩니다. 이 옵션을 사용하면 측면에 날짜를 표시하는 것이 매우 쉽습니다. 빈 스팬과 동일한 높이에 스팬을 배치하면 스팬에서 날짜를 알려줍니다. 단점은 다음과 같습니다. 사용자가 실수로 타임 스탬프 범위를 삭제할 수 있고 사용자가 창을 오랫동안 닫지 않으면 새로운 시간 범위가 삽입되지 않습니다 (X 분마다 새로운 타임 스탬프 범위를 삽입하여 피할 수 있음). 관련성이 높음)
  2. 데이터가 저장 스크립트로 전달 될 때마다 문자열 비교 비교를 시도하고 타임 스탬프가있는 diff 만 저장합니다. 그런 다음 페이지가로드되면 모든 부품을 올바른 순서로 함께 넣고 Javascript에서 날짜 메모를 올바른 위치에 놓습니다. 이것은 오래된 부품이 변경되었을 때 두 파트가 하나가 될 수있을 때 + 나를위한 많은 오버 헤드처럼 들리지만,이 모든 옵션은 매우 복잡하게 들립니다.

모든 의견/아이디어/제안을 높이 평가합니다.

+0

콘텐츠 유형이 구조화되었거나 구조화되지 않았습니까? 구조화되지 않은 경우 (예 : 코드 기반), armel이 제공 한 솔루션을 사용하는 것이 좋습니다. 구조화되었거나 구조화 될 수 있다면 솔루션은 MrFishie와 저에게 제공됩니다. –

+0

콘텐츠 유형이 구조화되었거나 구조화되어 있지 않습니까? 구조화되지 않은 경우 (예 : 코드 기반), armel이 제공하는 병합 솔루션을 사용하는 것이 좋습니다. 구조화되었거나 구조화 될 수 있다면 솔루션은 MrFishie와 저에게 제공됩니다. 구조화되지 않은 문서는 처리하기가 더 복잡합니다. 적절한 계층 구조를 결정하기가 어렵 기 때문입니다. (이것은 Lotus Notes의 여러 서버에 걸쳐 복제 할 때 항상 매우 문제가되는 문제였습니다.) 이것은 사용자가 고려하고 싶습니다. –

+0

@LoekBergman : 입력은 사용자 생성이며 특정 구조를 따르지 않습니다. – Horen

답변

12

구현하고자하는 것은 소스 코드 컨트롤에서 "주석 달기"또는 "비난"이라고하는 기능입니다. 단, date + 작성자 또는 단순히 작성자가 아닌 업데이트 날짜가 필요합니다.

제대로하려면 diffs (php-diff이 작업을 수행 할 수 있음)를 작성하고 텍스트 버전을 얻는 방법이 필요합니다. 이 몇 가지 전략은 다음과 같습니다

  • 가게 최신 버전 만 델타를 유지 (예 : 통합 차이점으로, 내 취향)

  • 상점의 모든 버전과 즉석에서 델타를 계산

일단 현재 버전과 델타 목록이 있으면 (수십 델타를 말하면서 목록을 짧게 만들 수 있고 사용자가 더 중요한 경우 더 많이 묻도록 할 수 있습니다). 델타를 함께 구성하면 주석 처리 단계가 발생하여 각 행의 버전이 무엇인지 기억할 수 있습니다. 작곡은 사실 아주 간단합니다 (최신 버전부터 시작하여 최신 패치 라인에 추가 된 모든 라인을 최신 버전부터 설명해야합니다. 따라서 다음 패치로 다시 시작하십시오) 나머지 줄은 해당 버전 또는 가장 초기 버전이므로 일부 플래그가 '이전'또는 '이전'을 사용할 수 있음).

Google has a diff library for Javascript 사용자 컴퓨터에서 모든 작업을 수행 할 수 있습니다. 그들은이 라이브러리에도 패치 부분을 가지고 있습니다. 주석/비난 라이브러리를 찾지 못했습니다.

+0

감사합니다. 좋은 생각 인 것 같습니다. 그냥 잘 이해하기 : 저장 : 1) 가장 최신 버전을 저장합니다. 2) 동시에 현재 버전과 함께 제공되는 diff를 저장합니다. 그런 다음로드 중입니다 (구성이라고합니다). 1) 현재 버전으로 시작합니다. 2) 최신 diff를 가져 와서 현재 버전에 적용합니다. Google 자바 스크립트 패치, 3) 완료 될 때까지 다음 이전 diff로 2 단계를 반복합니다. 나는 그 말이 맞습니까? – Horen

+0

예, "저장 중"트랜잭션이 작동하는지 확인하십시오 (현재 저장 + 패치 저장). "로드 중"작업을 수행하려면 패치를 적용해야합니다.패치가 라인 지향적이기 때문에, 주석/패치 애플리케이션은 "작성자 및/또는 날짜"의 배열을 조작하여 라인 좌표에서만 작업하고 패치에서 텍스트를 홀로 처리하는 것으로 줄일 수 있습니다 (단, 복원 기능 또는 diff-to-version). Google 도서관은 주석 부분을 대신하지 않지만 코드에서 영감을 얻을 수 있습니다. – armel

+0

그는 주석을 작성하거나 비난 (또는 칭찬) 절차를 요청하지 않습니다. 누가 코드를 위탁했는지 알아내는 과정이기 때문입니다. 그것은 현재 버전 검색과는 아무런 관련이 없습니다. 당신이 설명하는 과정은 MrFishie와 제가 제안한 것에 대한 합병과 좋은 대안입니다. 일반적인 질문에 대한 의견을 참조하십시오. –

4

당신이 할 수있는 한 가지 방법은 div의 개정판을 준비하는 것입니다. 모든 경우에 콘텐츠와 타임 스탬프가 포함 된 새로운 항목을이 표에 추가 할 수 있으므로 편집의 모든 수정 사항을 추적 할 수 있습니다. 그런 다음 변경 내용을 확인하기 위해 두 항목을 비교하여 추가 된 항목, 동일하게 유지 된 항목 및 제거 된 항목을 간단하게 비교할 수 있습니다.

+0

좋은 생각입니다. 내가 보는 유일한 문제는 추가, 변경 및 제거 된 항목을 찾는 방법과 왼쪽에 표시된 생성 날짜와 일치시키는 방법입니다. 어떤 아이디어? – Horen

+0

정규식을 사용하여이 작업을 수행 할 수있는 방법이 있어야합니다. – cpdt

4

사용자가 정보를 제출하면이 정보를 저장해야합니다. 사용자가 정보를보고 싶어하는 순간에는 거의 계산이 없어야합니다.

백엔드에서는 두 개의 테이블을 만듭니다. 한 테이블에서 'currentdocs'라고 부르면 항상 최신 버전의 데이터를 저장합니다. 사용자가 문서를로드하면 'currentdocs'테이블에서 모든 정보가 제공됩니다. 다른 테이블에서 'docsintime'이라고하면 다른 모든 저장이 저장됩니다. 그것은 'currentdocs'테이블에 대한 외래 키를 가지고 있으며 외래 키가있는 최대 ID를 선택함으로써이 테이블 'docsintime'의 마지막 행을 찾을 수 있습니다. select 문은 다음과 같을 수 있습니다.

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

두 테이블 모두에서 변경된 최신 시간 스탬프를 각 관련 부분에 저장합니다.

새 문서가 저장되면 'docsintime'테이블에서 마지막으로 저장된 버전을 가져옵니다. 모든 관련 부분을 해당 레코드의 데이터와 비교합니다. 차이가 없다면 저장할 새 레코드의 해당 부분의 타임 스탬프를 복사합니다. 차이가있는 경우 관련 부분에 대한 새 타임 스탬프를 만듭니다. 비교 후에 'currentdocs'및 'docsintime'테이블에 새 레코드를 저장합니다. 'currentdocs'테이블을 업데이트하고 'docsintime'테이블에 새 레코드를 삽입합니다. 새 문서 만 있으면 'currentdocs'테이블에 삽입하게됩니다. 해당 문서에 대한 다음 요청시 'currentdocs'테이블에서 정보를 수집하면됩니다. 그리고 그 과정이 다시 시작됩니다.

관련 문제