Обновляйте содержимое редактора непосредственно перед сохранением в плагине CKEditor.

Я разрабатываю плагин для CKEditor, который должен внести некоторые изменения в содержимое редактора непосредственно перед сохранением. В FCKeditor я добился этого с помощью события OnAfterLinkedFieldUpdate, но мне пока не удалось найти эквивалентный способ сделать это в CKEditor. Я надеялся, что будет подходящее событие, к которому можно подключиться, но, похоже, его нет. Кто-нибудь знает способ сделать это?


person Tim Down    schedule 16.02.2010    source источник
comment
Какое save событие/функцию вы используете? Кнопка сохранения?   -  person Pekka    schedule 16.02.2010
comment
да. Плагин будет использоваться владельцами сайтов, которые уже настроили CKEditor так, как они считают нужным, поэтому я бы предпочел, чтобы мой плагин был как можно более чистым, что означает не заменять стандартную кнопку сохранения, если это возможно. Я просмотрел исходный код, и мне кажется, что лучше всего добавить обработчик событий submit в форму, содержащую редактор, но вряд ли это можно назвать чистым.   -  person Tim Down    schedule 16.02.2010


Ответы (2)


Вы можете использовать событие getData, но будьте осторожны, потому что оно также запускается для внутреннего использования.

Я зарегистрировал http://dev.fckeditor.net/ticket/5254, чтобы воссоздать предыдущий событие

person AlfonsoML    schedule 27.02.2010
comment
В сочетании с созданием собственного обработчика события отправки формы? - person Tim Down; 02.03.2010
comment
Это было бы альтернативным решением. На самом деле, это то, что я бы выбрал на данный момент, потому что с ним может быть проще правильно обращаться, пока CKEditor не сгенерирует правильное событие (я действительно не знаю, что вы хотите сделать, поэтому я предполагаю, что это должно быть что-то сложное, что нужно делать только после обновления текстовой области) - person AlfonsoML; 02.03.2010
comment
Мой подключаемый модуль позволяет пользователю встраивать элементы содержимого, хранящиеся на другом сервере, в основной HTML-контент. Они представлены в содержимом редактора в виде изображений-заполнителей, чтобы предотвратить их редактирование в CKEditor. Непосредственно перед сохранением редактора я хочу заменить эти изображения-заполнители содержимым HTML, которое они представляют, а когда редактор загружается, я хочу преобразовать специальный HTML в заполнители (что я могу сделать с существующими событиями). Возможно, есть другой подход, который я должен использовать? - person Tim Down; 04.03.2010
comment
Да, в этом случае вы должны добавить свою обработку аналогично обработке якорей или тегов объектов: вы также захотите показать HTML, если они нажмут кнопку источника (но я предполагаю, что вы могли удалить эту кнопку, так что это для вас это не проблема). К сожалению, я сейчас не помню хорошего примера того, как сделать эту обработку (у FCKeditor был один такой пример) - person AlfonsoML; 05.03.2010
comment
Спасибо, вы очень помогли. На самом деле я, вероятно, предпочел бы, чтобы он не редактировался в исходном режиме, но я, кажется, помню, что видел события для переключения режимов в CKEditor, так что это не должно быть проблемой. - person Tim Down; 05.03.2010

Поскольку в приведенной выше ссылке на самом деле нет решения для события substitude OnAfterLinkedFieldUpdate, я написал короткий пост о том, как его обойти.

Вот форма:

<form id="my_form" action="submit.php" method="post" name="my_form">
   <textarea id="my_text" name="my_text"></textarea>
   <input id="submitForm" type="submit" name="submitForm" value="Submit" />
</form>

JavaScript:

var formSubmitted = false;
$("#submitForm").live('click', function(event) {
    if (formSubmitted === true) {
        formSubmitted = false;
        return;
    }
    event.preventDefault();
    //put here function to edit content == OnAfterLinkedFieldUpdate
    var editor = CKEDITOR.instances.my_text;
    var html = editor.getData();
    html.replace(searchvalue, newvalue);
    editor.setData(html);
    formSubmitted = true;
    $(this).trigger('click');
});

Код находится здесь.

person Milan    schedule 22.08.2012