タイトル: CKEditor
SEOタイトル: CKEditor 5 導入ガイド(CDN / npm / 設定 / 画像アップロード / Laravel・Django 統合)
| この記事の要点 |
|
CKEditor とは
CKEditor は CKSource 社が開発する OSS の WYSIWYG リッチテキストエディタ。WordPress、GitLab、SAP 等で採用。現行バージョンは CKEditor 5(CKEditor 4 はサポート終了済み)。
| ビルド | 特徴 | 用途 |
|---|---|---|
| Classic | 固定ツールバー + 編集領域 | CMS / フォーム / ブログ投稿 |
| Inline | 編集領域そのものに直接編集 | インライン編集 / Wiki |
| Balloon | 選択時にツールバーが浮かぶ | ミニマルな UI |
| Document | Word 風の見た目 | 長文ドキュメント編集 |
CDN で最速導入
npm でカスタムビルド
npm install @ckeditor/ckeditor5-build-classic
# またはより細かく
npm install @ckeditor/ckeditor5-editor-classic \
@ckeditor/ckeditor5-essentials \
@ckeditor/ckeditor5-paragraph \
@ckeditor/ckeditor5-basic-styles \
@ckeditor/ckeditor5-link \
@ckeditor/ckeditor5-list \
@ckeditor/ckeditor5-imageimport ClassicEditor from '@ckeditor/ckeditor5-build-classic';
ClassicEditor
.create(document.querySelector('#editor'), {
toolbar: [
'heading', '|',
'bold', 'italic', 'underline', '|',
'link', 'bulletedList', 'numberedList', '|',
'imageUpload', 'blockQuote', 'insertTable', '|',
'undo', 'redo'
],
image: {
toolbar: ['imageTextAlternative', 'imageStyle:full', 'imageStyle:side']
},
table: {
contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells']
},
language: 'ja',
})
.then(editor => {
console.log('Editor was initialized', editor);
})
.catch(error => console.error(error));
主要 API
// HTML を取得
const html = editor.getData();
// '編集された内容
'
// HTML をセット
editor.setData('差し替える内容
');
// 編集領域を破棄
editor.destroy();
// イベント
editor.model.document.on('change:data', () => {
console.log('変更検知:', editor.getData());
});
// 読み取り専用
editor.enableReadOnlyMode('lockId');
editor.disableReadOnlyMode('lockId');
// フォーカス
editor.focus();
画像アップロード: SimpleUploadAdapter
標準で組み込まれている最も簡単な方法。サーバ側に POST し、JSON で URL を返すだけ:
ClassicEditor.create(document.querySelector('#editor'), {
simpleUpload: {
uploadUrl: '/api/upload-image',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
Authorization: 'Bearer ' + token,
}
}
});
サーバ側(Laravel 例):
validate([
'upload' => 'required|image|max:5120', // CKEditor は 'upload' フィールドで送る
]);
$path = $request->file('upload')->store('uploads', 'public');
$url = asset('storage/' . $path);
// CKEditor が期待するレスポンス形式
return response()->json([
'url' => $url,
]);
}
Django 統合
# pip install django-ckeditor-5
# settings.py
INSTALLED_APPS = [
# ...
'django_ckeditor_5',
]
CKEDITOR_5_CONFIGS = {
'default': {
'toolbar': ['heading', '|', 'bold', 'italic', 'link',
'bulletedList', 'numberedList', 'blockQuote', 'imageUpload'],
},
}
# models.py
from django_ckeditor_5.fields import CKEditor5Field
class Article(models.Model):
body = CKEditor5Field('Body', config_name='default')
# urls.py
urlpatterns = [
path('ckeditor5/', include('django_ckeditor_5.urls')),
]
CKEditor 4 との違い
| 項目 | CKEditor 4 | CKEditor 5 |
|---|---|---|
| 初期化 | CKEDITOR.replace('id') | ClassicEditor.create(el) |
| API | グローバル CKEDITOR | モジュラー / ES6 |
| データモデル | DOM 直接 | 独自仮想 DOM |
| 取得 | editor.getData() | editor.getData() |
| プラグイン | 多数あり | 選り抜き(リライト中) |
| 共同編集 | 非対応 | 対応(商用機能) |
| サポート | 2023 EOL | 現行 |
セキュリティ(XSS 対策)
CKEditor で入力した HTML を表示するときは、サーバ側で必ずサニタイズ:
purify($request->input('content'));
// または自前で許可タグだけ残す
$clean = strip_tags(
$request->input('content'),
'
FAQ
Q: 日本語化したい
A: 設定で language: 'ja'。CDN ビルドには日本語訳も同梱されています。
Q: 文字数カウントを表示したい
A: WordCount プラグインを追加。toolbar ではなく editor.plugins.get('WordCount').wordCountContainer でカウンタ要素を取得して挿入します。
Q: 完全に無料で使えるか
A: 基本機能は GPL/MIT 系で無料。共同編集 / 高度な変更履歴 / コメント機能は商用ライセンス(CKEditor Premium)が必要です。
📸 参考画像
※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。
