Project

General

Profile

Заметки по CKEditor » History » Version 1

Denis Kildishev, 02/12/2021 03:10 PM

1 1 Denis Kildishev
h1. Заметки по CKEditor
2
3
CKEditor представляет собой WYSIWYG редактор поставляемый в том числе в виде архива со всеми необходимыми ресурсами. Найти можно по ссылке https://ckeditor.com/
4
Может функционировать в различных режимах, мы на практике использовали "стандартный" редактор и inline. Стандартный пример последнего можно найти по ссылке https://ckeditor.com/docs/ckeditor5/latest/examples/builds/inline-editor.html
5
Наша конфигурация несколько отличалась от стандартной. Первое отличие в тулбаре
6
7
<pre><code class="javascript">
8
CKEDITOR.config.toolbar_Requality = [
9
	{ name: 'document',    items : [ 'Sourcedialog','-','RequalitySave', 'RequalityExit' ] },
10
	{ name: 'clipboard',   items : [ 'SelectAll', 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ] },	'/',
11
	{ name: 'indents', items :['Outdent', 'Indent']},
12
	{ name: 'basicstyles', items : [ 'Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', 'RequalityPre', '-', 'RemoveFormat', '-', 'NumberedList', 'BulletedList' ] },
13
	{ name: 'links',       items : [ 'SimpleImage', 'Link', 'Unlink', '-', 'Table', 'HorizontalRule', 'SpecialChar' ] },
14
];
15
</code>
16
</pre>
17
18
Мы добавили пару кнопок 'RequalitySave', 'RequalityExit' в своем плагине. Первая вызывала сохранение и закрытие редактора вторая просто все закрывала.
19
Делалось все при помощи плагина в папке plugins/requality/plugin.js
20
21
https://forge.ispras.ru/projects/reqdb/repository/requality/revisions/master/entry/jstools/ckeditor/plugins/requality/plugin.js
22
23
По сути происходит только вызов onClose(ed); который также вызывается при щелчке мыши мимо редактора и ряде других действий. В основном коде был метод вида
24
25
<pre><code class="javascript">
26
function saveEditor(id/* uuid */) {
27
	var i=0;
28
	var arr=[];
29
	for(var name in CKEDITOR.instances)
30
	{
31
		try{
32
			arr[i++]=CKEDITOR.instances[name];
33
		}
34
		catch (ex){printToConsole(ex.name+" "+ex.message+" "+ex.trace);}
35
	}
36
	var ed = CKEDITOR.currentInstance;
37
	if(!ed && ed != null && e.status !="destroyed")
38
		arr[i++]=CKEDITOR.currentInstance;
39
	for(var j=0;j<i;j++){
40
		try{
41
			var editor = arr[j];
42
			if(editor.checkDirty())
43
				editor.execCommand('requalitySave');
44
			else	
45
				editor.execCommand('requalityExit');
46
		}
47
		catch (ex){printToConsole(ex.name+" "+ex.message+" "+ex.trace);}
48
	}
49
}
50
</code>
51
</pre>
52
53
который и занимался закрытием и вызовом зарегистрированных команд из плагина
54
Данные при сохранении получались примерно так
55
56
<pre><code class="javascript">
57
editor.on('beforeCommandExec', function(e){
58
		if (e!=null && e.data.name == 'requalitySave') {
59
			if(e.editor.status!="ready")
60
			{
61
				return false;
62
			}
63
			var elem = $(e.editor.element.$);
64
			var new_data = e.editor.getData();
65
               }
66
}
67
</code>
68
</pre>
69
70
После этого можно используя данные о элементе и полученный из редактора html отправлять его в систему.
71
Но как производится вызов редактора?
72
У нас в момент времени существует только один экземпляр редактора хранимый в переменной editor. Есть две разновидности - упрощенный и полнофункицональный
73
74
<pre><code class="javascript">
75
if (simplified) {
76
		// Simplified version of the editor: no toolbar, no statusbar,
77
		// special skin without borders
78
		editor = CKEDITOR.inline( elem.id, {
79
			bodyClass: 'miniCKE',
80
			bodyId: 'editor'+elem.id,
81
			autoUpdateElement:false,
82
			disableObjectResizing:true,
83
			language: 'en',
84
			autoParagraph: false,
85
			skin: 'simple',
86
			removePlugins: 'toolbar',
87
			startupShowBorders: true,
88
			resize_enabled: false,
89
	        forcePasteAsPlainText: true,
90
			toolbarCanCollapse: true,
91
			extraPlugins: 'requality'+add,
92
			keystrokes:
93
				   [
94
				      [13,                  '']
95
				   ]
96
		});
97
	}
98
	else {
99
		editor = CKEDITOR.inline( elem.id, {
100
			bodyClass: 'normalCKE',
101
			bodyId: 'editor'+elem.id,
102
			autoUpdateElement:false,
103
			disableObjectResizing:true,
104
			language:'en',
105
			autoParagraph:false,
106
			startupShowBorders:true,
107
			toolbar:"Requality",
108
			toolbarStartupExpanded:true,
109
			toolbarCanCollapse:false,
110
			extraPlugins:'SimpleImage,sourcedialog,requality'+add,
111
			forcePasteAsPlainText:true
112
		} );
113
	}
114
</code>
115
</pre>
116
elem - узел для которого вызывается редактор, у нас выбирался по классу при двойном клике на нем
117
$('.editable').live('dblclick'
118
Единственное что мы по умолчанию отключали inline редактирование и отмечали что его вызывать на тексте не нужно через параметр elem а
119
contenteditable="false".
120
Также в начале скрипта указывали 
121
CKEDITOR.disableAutoInline = true;
122
123
Кстати на закрытие также вешался обработчик
124
125
<pre><code class="javascript">
126
editor.onClose = function(e){
127
       	if(editorJavaDialog)
128
			return false;
129
		var n_html, view;
130
	     editor.destroy(true);
131
       f.attr("contenteditable", false);
132
       f.removeClass("cke_focus");
133
       f.css("position","");
134
       return true;
135
    };
136
</code>
137
</pre>