Ckeitor5の画像アップロード

CKEditorで画像をアップロードしたい

・CDNのverで入れる

・クラシックを利用

・simpleUploader

・Config設定

・importmap

・simpleUplode

・JS、非同期通信

 

Ckeditor5を使って、画像を指定したフォルダに登録します。

画像をアップロードするには、json、JSの理解が必要になります。

 

フォルダを作成して画像をアップロードする場合は、ControllerにUploade.phpをつくり、処理を書いています。

JSで非同期通信をしています。

 

Q.CDN or DLどっちにするか?

DLバージョンの設定情報が少ないため、CDNバージョンにした。

理由は、「Command line」だとNode.js前提の情報しかない。
「CDN」だとバグ改修とか勝手にやってくれて便利だろうけど外部依存になるので、変更があった場合に、いきなり止まる可能性があります。

(何%の可能性なのか?分からないので、とりあえず、今回はCDNバージョンを使ってみます。

 

【参照】

https://jpn.itlibra.com/article?id=20803

 

【cssの読込み】

<link rel="stylesheet" href="https://cdn.ckeditor.com/ckeditor5/43.0.0/ckeditor5.css">

 

【ライセンス】

与えられたCKEditorライセンスのオープンソース制限に従う限り、あなたの商用ウェブサイトや製品に無料で修正、統合、使用することができます。

CKEditor 5はGPL 2+の条項でライセンスされています。

 

【WYSIWYGエディタ】

WYSIWYGエディタという。直感的に操作ができます。

 

 

1.データの取得と設定

【初期データ】

initialData: `<?php echo $txts['value']; ?>`, // PHPから初期データを渡す

 

初期データのセット。

$txts['value']; ?は、コードイグナイター3.2の変数です。

これでJSに初期値を設定できます。

 

【データを飛ばす】

simpleUpload: {

uploadUrl: '<?= base_url("/upload/image_upload/$room_id01") ?>',//ここでアップロード処理を書いたコントローラに飛ぶ
withCredentials: true,

headers: {
'X-CSRF-TOKEN': 'CSRF-Token',
Authorization: 'Bearer <JSON Web Token>'
}

 

データをセットしたい場合はsetData関数を使用する。
editor.setData( '<p>Some text.</p>' );

 

逆に取り出したい場合はgetData関数を使用する。
const data = editor.getData();

 

【参照】

JavaScriptのimportmapとは>>

 

2.import-maps

import-maps

異なるモジュールバージョンを同じプロジェクト内で使い分けることが可能になります。

 JSON オブジェクトです。

 

<script type="importmap">
{
"imports": {
"react": "/node_modules/react/umd/react.production.min.js",
"react-dom": "/node_modules/react-dom/umd/react-dom.production.min.js"
}
}
</script>

import React from 'react';
import ReactDOM from 'react-dom'; というように使える

 

importmapを一度指定すると、ドキュメント全体で、エイリアスを使ったimport構文が書けるようになります。

Import Mapsを使うことで、複数のファイルから読み込まれるJavaScriptのパスが変わった時に、書き換える場所を一箇所だけにすることができます。

 

【ckeditor5では】

<script type="importmap">
{
"imports": {
"ckeditor5": "https://cdn.ckeditor.com/ckeditor5/43.0.0/ckeditor5.js",
"ckeditor5/": "https://cdn.ckeditor.com/ckeditor5/43.0.0/"
}
}
</script>

 

としてCDNを読み込んでいます。

 

 

3.KCFinder

 

KCFinderは無料で使える。CKFinderは、有料です。

今回は力技で解決していきます。

KCFinderは開発が止まってしまい、色々な修整が必要になります。

 

 

・使わなくてよい

 

【参照】

https://unispot.net/php/kcfinder-php-fix.html

「PHP8.1でKCFinderが動かない」>>

 

 

4.ツールバー

 

ボタン名称 役割

Undo

操作の取り消し

Redo

操作のやり直し(Undoした内容を元に戻す)

Style

書式設定スタイルの組み合わせをテキストに適用する

Special Characters

記号一覧のパネルが表示されて、選択した記号を入力できる

Underline

下線(アンダーライン)をつける

Code Block

プログラミング言語を選択してコードブロックを追加する

Strikethrough

打ち消し線をつける

Subscript

下付き文字をつける

Superscript

上付き文字をつける

Horizontal Line

水平線を追加する

Text Alignment

文字揃えを行う(「text-align-center」などのclassがつく)

Remove Format

選択した文字の装飾を削除する

Table

行と列を指定してテーブルを追加する

Indent

文字やリストのインデントをする

Outdent

文字やリストのアウトデントをする

Language

言語の設定をする(lang属性がつく)

Bold

太字にする

Italic

斜体にする

Link

リンクをつける

Bulleted List

箇条書きリスト(<ul>タグ)を追加する

Numbered List

番号付きリスト(<ol>タグ)を追加する

Block Quote

引用ブロックを追加する

Image

画像を追加する

Source

ソースコード表示に切り替える

Heading

見出しを選択する(タグは後述する「Headings」で選択可能)

Code

コード(<code>タグ)をつける

Divider

ツールバー上で区切りの役割をするアイコンを表示する

Wrapping

このボタン以降をツールバーの次の行へ移動する

 

 

以下のように設定しました。

 

 

画像のアイコンが2つあります。

左のアイコンが、アップロードアイコンです。画像をアップロードするために使います。

 

クリックすると、ローカルのブラウザが立ち上がり、JSによってControllerに飛ぶようにします。

コントローラで引数を受け取り、画像をフォルダに保存する処理をします。

 

■必要なコードについて

1.headerに入力

2.初期値を入れる

3.importmapを追加

4.Config名を設定

5.idを使う

6.

 

1.【headerに入力する】

<link rel="stylesheet" href="//cdn.ckeditor.com/ckeditor5/43.0.0/ckeditor5.css">

 

 

2.【初期値を入れる】

$page_contents['value']=set_value('page_contents', isset($result['page_contents']) ? htmlspecialchars_decode($result['page_contents']) : '少々お待ちくださいませ',false);

 

初期値を設定する。

htmlspecialchars_decodeで<>の文字を回避する。

CI3.2での書き方です。

 

3.【importmap】

<script type="importmap">
{
"imports": {
"ckeditor5": "https://cdn.ckeditor.com/ckeditor5/43.0.0/ckeditor5.js",
"ckeditor5/": "https://cdn.ckeditor.com/ckeditor5/43.0.0/"
}
}
</script>

 

importmapを一度指定すると、ドキュメント全体でエイリアスを使ったimport構文が書けるようになります。

 

4.【Config名を設定】

const editorConfig01 = {

...

..

initialData: `<?php echo $page_contents01['value']; ?>

...

ClassicEditor.create(document.querySelector('#editor01'), editorConfig01)
.catch(error => {
console.error('通信に失敗しました', error);
});

 

 

 

5. idを追加する。

$page_contents01['id'] = 'editor01';

 

テキストエリアの部分にIDを追加して、結び付ける。

 

■参照

JSのimportmapについて知ろう>>

 

6.【module】の部分について

<script type="module">


import {
ClassicEditor,
AccessibilityHelp,
Autoformat,
AutoImage,
Autosave,
BalloonToolbar,BlockQuote,BlockToolbar,
Bold,CloudServices,
Essentials,
FullPage,
GeneralHtmlSupport,
Heading,
HtmlComment,HtmlEmbed,
ImageBlock,
ImageCaption,
ImageInline,
ImageInsertViaUrl,
ImageResize,
ImageStyle,
ImageTextAlternative,
ImageToolbar,
ImageUpload,
Indent,
IndentBlock,
Italic,
Link,
LinkImage,
List,
ListProperties,
Paragraph,
SelectAll,
ShowBlocks,
SourceEditing,
Table,
TableCaption,
TableCellProperties,
TableColumnResize,
TableProperties,
TableToolbar,
TextTransformation,
TodoList,
Underline,
Undo,
SimpleUploadAdapter
} from 'ckeditor5';

import translations from 'ckeditor5/translations/ja.js';



const editorConfig = {
toolbar: {
items: [
'undo',
'redo',
'|',
'bold',
'uploadImage',
'insertImageViaUrl',
'link',
'|',
'sourceEditing',
'showBlocks',
'|',
'heading',
'|',
'insertTable'
],
shouldNotGroupWhenFull: false
},
plugins: [
SimpleUploadAdapter,
AccessibilityHelp,
Autoformat,
AutoImage,
Autosave,
BalloonToolbar,
BlockQuote,
BlockToolbar,
Bold,
CloudServices,
Essentials,
FullPage,
GeneralHtmlSupport,
Heading,
HtmlComment,
HtmlEmbed,
ImageBlock,
ImageCaption,
ImageInline,
ImageInsertViaUrl,
ImageResize,
ImageStyle,
ImageTextAlternative,
ImageToolbar,
ImageUpload,
Indent,
IndentBlock,
Italic,
Link,
LinkImage,
List,
ListProperties,
Paragraph,
SelectAll,
ShowBlocks,
SourceEditing,
Table,
TableCaption,
TableCellProperties,
TableColumnResize,
TableProperties,
TableToolbar,
TextTransformation,
TodoList,
Underline,
Undo
],
balloonToolbar: ['bold', 'italic', '|', 'link', '|', 'bulletedList', 'numberedList'],
blockToolbar: ['bold', '|', 'link', 'insertTable', '|',],
heading: {
options: [
{
model: 'paragraph',
title: 'Paragraph',
class: 'ck-heading_paragraph'
},

{
model: 'heading3',
view: 'h3',
title: 'Heading 3',
class: 'ck-heading_heading3'
},

]
},
htmlSupport: {
allow: [
{
name: /^.*$/,
styles: true,
attributes: true,
classes: true
}
]
},
image: {
toolbar: [
'toggleImageCaption',
'imageTextAlternative',
'|',
'imageStyle:inline',
'imageStyle:wrapText',
'imageStyle:breakText',
'|',
'resizeImage',
'imageStyle:full',
'imageStyle:side'
],



upload: {
types: ['jpg','jpeg', 'png', 'gif', 'bmp', 'webp'],
panel: {
items: [
'insertImage',
'resizeImage'
]
}
}
},

simpleUpload: {
// The URL that the images are uploaded to.

uploadUrl: '<?= base_url("/upload/image_upload/$ataiwokaku") ?>',//ここでアップロード処理を書いたコントローラに飛ぶ

// Enable the XMLHttpRequest.withCredentials property.
withCredentials: true,

// Headers sent along with the XMLHttpRequest to the upload server.
headers: {
'X-CSRF-TOKEN': 'CSRF-Token',
Authorization: 'Bearer <JSON Web Token>'
/*'room_id': '//php echo $room_id01 ?>' // Pass room_id dynamically*/
}
},
beforeSend: (xhr, formData) => {
formData.append('room_id', '<?= $room_id01 ?>'); // formDataに`room_id`を追加
},

initialData: `<?php echo $tuyomi_txts['value']; ?>`, // PHPから初期データを渡す
language: 'ja',

link: {
addTargetToExternalLinks: true,
defaultProtocol: '',
decorators: {
toggleDownloadable: {
mode: 'manual',
label: 'Downloadable',
attributes: {
download: 'file'
}
}
}
},
list: {
properties: {
styles: true,
startIndex: true,
reversed: true
}
},
menuBar: {
isVisible: true
},
placeholder: 'テキストを入力してください',
table: {
contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells', 'tableProperties', 'tableCellProperties']
},
translations: [translations]
};

ClassicEditor.create(document.querySelector('#editor'), editorConfig)
.catch(error => {
console.error('通信に失敗しました', error);
});

</script>

 

 

【ファイル形式】

upload: {
types: ['jpg','jpeg', 'png', 'gif', 'bmp', 'webp'],

 

'jpg','jpeg',は違うので注意が必要です。

 

 

7.【simpleUploadの部分】

simpleUpload: {
//アップロード先のURL
uploadUrl: '<?= base_url("/upload/image_guide_upload") ?>',//ここでアップロード処理を書いたコントローラに飛ぶ

// Enable the XMLHttpRequest.withCredentials property.
withCredentials: true,

 

// Headers sent along with the XMLHttpRequest to the upload server.
headers: {
'X-CSRF-TOKEN': 'CSRF-Token',
Authorization: 'Bearer <JSON Web Token>'
}
},

...

..

 

simpleUploadを使って、XMLHttpRequest通信、jsonで書いて、情報の受け渡しをします。

 

 

以下を読むと、サーバー側の設定が必要と書いてあります。画像がアップロード出来る環境があれば、大丈夫です。

シンプルなアップローダ>>

 

 

uploadUrl: '<?= base_url("/upload/image_upload/$ataiwokaku") ?>',

 

コントローラで「Upload」ファイルを作り

image_upload関数を作ります。引数に$ataiwokakuを取る事で画像を保存する処理をします。

 

 

5.画像の拡張子

upload: {
types: ['jpg','jpeg', 'png', 'gif', 'bmp', 'webp'],

 

画像ファイルが表示されない場合、'jpg','jpeg'と二つを書くこと。

これで、エラーが減ります。

 

 

1画面に複数つくる

 

ClassicEditor.create(document.querySelector('#editor'), editorConfig)
.catch(error => {
console.error('通信に失敗しました', error);
});

 

1つの画面で複数使う場合

「editorConfig」と「id」の名前を変える事で、複数作る事ができます。

 

const editorConfig = {
toolbar: {
items: [ 'undo', 'redo', '|', 'bold', 'uploadImage', ],

 

これを設定して、呼び出している訳です。

 

 

6.考察

設定するのに、5日ほどかかりました。

とにかく画像をアップロードする部分が理解できませんでした。SimpleUploderをどうやって使うのか?については情報が少ないので困りました。

JSではディレクトリ作成などの、ファイル操作が完了しないので、サーバーサイドのPHPで処理をしましょう。

コントローラで飛ばしている最中にmkdir()などの処理はしない方がいいです。

という訳で、長い戦いは終わり、処理ができました。

 

追記

importmapを忘れずに

 

【参照】

シンプルなアップローダ >>

JavaScriptのimportmapとは >>

新しいPHPにおけるKCfinder修正メモ >>

「PHP8.1でKCFinderが動かない」>>

 

PHPの勉強方法

目安は1日3~5時間の勉強で100日程度です。現在4年以上が経過しています。毎日4時間、さらに実践で4年です。すると、SQLの細かい所まで分かります。

 

 

PHPを学ぶには、独自の言葉を覚える必要があります。「・」が付いているものは、外部のサイトへ飛びます。

 

 

【フレームワーク】

基本的には、ララベルを学ぶ方がよい。 ララベルはコンポーザー

 

 

MYSQLについて

MYSQLの学習方法について。DBの操作方法を覚えます。 四大操作をまずは覚えておきましょう。

 

■ 基本編 ■

MYSQLとは?

CURDについて

更新について

削除について

アップデートについて

 

フェッチするとは?

 

■ 設計について■

UMLとは何か?

ER図を覚えよう

 

 

 

 

コードイグナイターの勉強方法

 

コードイグナイターを学んでいきましょう。「・」が付いているものは、外部のサイトへ飛びます。

 

■ 基本編 ■

コードイグナイター

3つの環境設定

URI の設定

 

■ フレームワーク ■

フレームワークは何を使ったらいいのか?

ララベルとは?

コードイグナイターとは?

オートロードとは

無名関数とは?

MVCとは何か?

 

 

【フレームワーク】

基本的には、ララベルを学ぶ方がよい。 ララベルはコンポーザーが入っている。

 

 

参照サイト

オブジェクト指向とは?

PDOとは何か?

mysql_connect()

アロー演算子とは?

データベースへのアクセスについて

 

大変申し訳ありませんが、当社ではサービスの質を落とさないために、月の契約は5件までとさせていただいております。 契約をお待ちいただく可能性もございますので、ご了承のほどよろしくお願いいたします

 

 

 

 

この記事を読んだ人は、こんな記事も読んでいます

 

SEO対策の基本 外部要因とは?

SEO対策の基本的である、外部要因とは何か?

SEO対策をするなら絶対に知っておきたい、基本知識です。

 

売れるサイトを作るのに知って起きたい知識

サーチエンジンマーケティングという言葉をご存知でしょうか?

ホームページで商品やサービスを売る時に知っておきたいマーケティング

についてご紹介いたします。

seo対策をするメリットとは

SEO対策をする5つのメリットとは?

なぜ上位表示させることが大事なのか?なぜSEO対策をする必要があるのか

についてご紹介させていただきます。

 

内部要因とは

SEO対策の内部要因とは?

上位表示させるためには、内部要因について知っておくことも大事です。

キーワードを上位表示させるために必要なのは、ソースコードを最適化することです

内部要因の対策について知りたい方はこちらへ

 

キーワード対策をするまえに

キーワード対策をする前に

そのキーワード対策。ちょっと待ってください。

そのまま対策をすると、必ずお金を損してしまいます。個人事業主や中小企業は

そんな大きなキーワードで対策をしてはいけません。

広告費用が高くなる理由とは

広告費用が高くなる本当の理由とは?

売れないサイトに集めていませんか?広告費用がかかるわりには

お問い合わせが少ない・・・と感じる方は多いはずです。

購入率の悪いサイトに集客をしている可能性があります。

 

 

 

 

【SEO対策・web広告・webコンサルティングのプラスワーク対応エリアについて】

プラスワークでは、東京、神奈川、千葉、埼玉を中心に全国でwebコンサルティング、SEO対策、ホームページの更新、ホームページのリニューアル運営代行をしております。売上アップをお考えならお気軽にご相談ください。

 

【SEO対策・web広告・webコンサルティングのプラスワーク 対応地域】

北海道 [ 北海道 ]

東北  [ 青森 | 岩手 | 山形 | 福島 | 秋田 | 宮城 ]

関東  [ 東京 | 埼玉 | 千葉 | 茨城 | 栃木 | 群馬 | 神奈川 ]

甲信越 [ 山梨 | 長野 | 新潟 ]

北陸  [ 石川 | 福井 | 富山 ]

東海  [ 愛知 | 静岡 | 岐阜 | 三重 ]

近畿  [ 大阪 | 兵庫 | 京都 | 滋賀 | 奈良 | 和歌山 ]

中国  [ 島根 | 山口 |鳥取 | 広島 | 岡山 ]

四国  [ 徳島 | 香川 | 愛媛 | 高知 ]

九州  [ 福岡 | 佐賀 | 長崎 | 熊本 | 大分 | 宮崎 | 鹿児島 ]

プラスワークでは全国でSEO対策、ホームページ更新、制作をしております。中小企業専門SEO対策・ホームページ更新制作会社、ダイレクト レスポンス マーケティング、ウェブ マーケティング、マーケティング 分析、口コミのよいSEO対策会社をお探しならプラスワークにお任せくださいませ。

 

 

【コンテンツ】

トップへ

更新レスキュー

料金について

制作実績

お客様の声

よくある質問

会社概要

お問い合わせ

【更新レスキュー】

ライトコース

ゴールドコース

プラチナコース

 

【その他】

ニュース

メルマガ登録

特別資料プレゼント

相互リンク募集中

【課題から探す】

ホームページの課題

SEO対策とは

SEO対策がダメな理由

上位表示されない理由

相互リンクとは

順位が落ちてしまう原因

 

 

フェイスブック  ツイッター