Подайте идею реализации заметок пользователей в тексте

Farsh

~ on ~ high ~ wave ~
Подайте идею реализации заметок пользователей в тексте

Представим, что вы конечный пользователь.
Нужно сделать вот такой функционал:
1) вы заходите на страницу с просмотром, например, новости
2) вы можете выбрать какой-то кусок текста и оставить к нему какую-то заметку
3) теперь при просмотре Вами этой новости выбранный кусок текста будет выделен и при наводе к нему будет всплывать заметка

Сейчас это сделано говнокодом, извращаясь яваскриптом / selection; нужно переделать, и переделать грамотно, красиво.

Что у меня на уме:
1) на сервере, перед отдачей новости, каждое слово в тексте обрамляется каким-то тегом, путь будет <z></z> ( на валидность пох ).
У каждого z элемента будет уникальный генерируемый последовательный номер.
То есть:
<z id="1">Я</z> <z id="2">пошел</z> <z id="3">отмечать</z> <z id="4">НГ</z>
2) при клике на кнопку добавления заметки появляется блок, в который можно ввести заметку.
3) этот блок можно драгать, можно бросить к любому слову. ( z - droppable )
4) при дропе мы берем уникальный номер z элемента, в котором был сделан drop, и отправляем его на сервер
5) на сервере повторяем пункт 1, кое-как, не без извращения, определяем на основе этого позицию, куда был сделан дроп.
6) сохраняем эту позицию в бд, а потом при повторном показе этой новости этому пользователю - на место этой позиции вставляем то, что нужно

Главная проблема:
Новость может редактироваться ( скажем админом )... Нужно как-то в tinymce сделать, что если удалят какой-то кусок текста, то заново рассчитать новую позицию заметки. Если текст, в котором была заметка хотят удалить - выдать предупреждение.

Но как-то мне этот подход не особо нравится.
Может у кого-то есть идея, как сделать это круто? Может кто с таким сталкивался ?
Заранее спасибо.
 

С.

Продвинутый новичок
Привязаться можно только к цельным сущностям, как то "новость". Твоя попытка сделать из слов сущности конечно просто ужасна. Утвержадаю, что задача в идеальном виде не решается.
 

Farsh

~ on ~ high ~ wave ~
Автор оригинала: С.
Твоя попытка сделать из слов сущности конечно просто ужасна.
Это понятно, особенно если учесть то, что размер текстов может превышать mysql -> mediumtext.
Но сущностью то и будет новость, а обрамляются слова в теги лишь для того, чтоб из них можно было сделать droppable + узнать, куда же пользователь кинул блок с заметкой ( точная позиция в тексте ).

Сейчас у меня сделано так:
1) пользователь выделяет текст
2) в конец последнего выделенного слова вставляется картинка
3) самое жесткое - на сервер отправляется innerHTML и этот текст сохраняется ;))))))))

Так все-таки, что-нибудь предложите? :rolleyes:
 

Shasoft

Новичок
Предлагаю такой вариант:
1) пользователь выделяет текст
2) жмет кнопку "добавить заметку"
3) вводит текст заметки
4) отправляем на сервер начальную и конечную позиции текста новости, к которому добавляется заметка + текст заметки
5) на сервере вытаскиваем из БД текст новости и вставляем теги в начальную и конечную позиции (к примеру теги картинок) с идентификаторами вида id='start-<id пользователя>-<id заметки>' и id='end-<id пользователя>-<id заметки>' сохраняем текст новости + текст заметки в БД

P.S. Есть некоторые непонятки с одновременным добавлением заметок сразу от двух пользователей, так как теоретически теги могут вставиться не в то место, куда хотел пользователь.
 

Farsh

~ on ~ high ~ wave ~
Shasoft
вопрос по пункту 4 - а каким образом можно узнать начальную и конечную позицию текста новости, к которому добавляется заметка ( на клиенте, если я правильно понял ) ? :)
 

dimagolov

Новичок
Вообще-то получется что-то вроде wiki. Так как тексты большие, то скорее всего это тупо перегнанные какие-то материалы. Может есть смысл задуматься о викификации этих текстов, выделении зголовков, разбиении на разные статьи и т.п.? А разные вики имеют и механизмы как редактирования, так и обсуждения статей, которые по логике будут удобнее того, что ты изложил здесь.
 

Shasoft

Новичок
Farsh
javascript. Если я правильно понял, то заметку можно делать к тексту новости. Соответственно всю новость заключаем в тэги
<div class='news'>сама новость</div>. При нажатии кнопки определяем начало и конец выделения. Я не профи по javascript-у, но раз атрибуты в wysiwyg можно выставить для выделенного куска текста, то значит можно определить и границы выделения.
 

Farsh

~ on ~ high ~ wave ~
Shasoft
Дело в том, что innerHTML у разных браузеров отличается. Насколько я понял, узнать это точно нельзя. Именно поэтому я тупо брал весь innerHTML и отправлял на сервер ;))

Хотя можно сделать так:
1) человек выделяет текст
2) кликает на оставить заметку, появляется блок
3) после ввода заметки и нажав кнопку сохранить - выделенный текст обрамляется в теги и весь innerHTML отправляется на сервер.
4) весь контент пропускаем через tidy, находим выделенный пользователем текст ( позиции начала и конца ), удаляем теги, сохраняем в БД ( и текст и позиции )
5) при редактировании статьи в tinymce заметки будут выделены, не буду давать возможность их удалить ( наверное ;))

Все, так и поступлю.
 
Сверху