CKE editor 5, настройка скрипта, Часть 2

В первой части создали собственный билд редактора CKE 5, теперь установим редактор, вставляем скрипты на страницу блога. Первым делом установим собранный билд редактора.

Напишем разметку формы для привязки редактора к id = mytextarea

Создадим функцию createEditor для запуска скрипта CKE editor 5

function createEditor(idTextarea) {
            ClassicEditor
                .create( document.querySelector('#mytextarea'), {
                  style: {
                    definitions: [
                      {
                        name: 'Button',
                        element: 'a',
                        classes: ['btn btn-default']
                      },
                      {
                        name: 'Headline',
                        element: 'span',
                        classes: ['table']
                      }
                    ]
                  },
                  extraPlugins: [MyCustomUploadAdapterPlugin],
                  htmlSupport: {
                    allow: [
                      {
                        name: /.*/,
                        attributes: true,
                        classes: true,
                        styles: true
                      }
                    ]
                  },
                  fontFamily: {
                    options: [
                      'default',
                      'Arial, Helvetica, sans-serif',
                      'Courier New, Courier, monospace',
                      'Georgia, serif',
                      'Lucida Sans Unicode, Lucida Grande, sans-serif',
                      'Tahoma, Geneva, sans-serif',
                      'Times New Roman, Times, serif',
                      'Trebuchet MS, Helvetica, sans-serif',
                      'Verdana, Geneva, sans-serif'
                    ],
                    supportAllValues: true
                  },
                  fontSize: {
                    options: [10, 12, 14, 'default', 18, 20, 22],
                    supportAllValues: true
                  },
                  heading: {
                    options: [
                      {model: 'paragraph', title: 'Paragraph', class: 'ck-heading_paragraph'},
                      {model: 'heading1', view: 'h1', title: 'Heading 1', class: 'ck-heading_heading1'},
                      {model: 'heading2', view: 'h2', title: 'Heading 2', class: 'ck-heading_heading2'},
                      {model: 'heading3', view: 'h3', title: 'Heading 3', class: 'ck-heading_heading3'},
                      {model: 'heading4', view: 'h4', title: 'Heading 4', class: 'ck-heading_heading4'},
                      {model: 'heading5', view: 'h5', title: 'Heading 5', class: 'ck-heading_heading5'},
                      {model: 'heading6', view: 'h6', title: 'Heading 6', class: 'ck-heading_heading6'}
                    ]
                  },

                })
                .then(editor => {
                  window.editor = editor;
                  editor.model.document.on( 'change:data', ( evt, data ) => 
                   {
                    $('textarea#tab_mytextarea').html(editor.getData());
                  });

                })
                .catch(err => {
                  console.log(err);
                });
          }

Рассмотрим подробнее, в блоке style находятся костомные стили кнопки , блоки и т.д можно добавлять от наличия потребностей для быстрой стилизации текста статьи. очень удобная штука рекомендую.

  style: {
                    definitions: [
                      {
                        name: 'Button',
                        element: 'a',
                        classes: ['btn btn-default']
                      },
                      {
                        name: 'Headline',
                        element: 'span',
                        classes: ['table']
                      }
                    ]
                  },

Сама загрузка картинки будет происходить через дополнительный плагин extraPlugins: [MyCustomUploadAdapterPlugin], обратите внимание что файл upload.php сохраняет картинку и возвращает url сохраненной картинки в формате json

function MyCustomUploadAdapterPlugin(editor) {
            editor.plugins.get('FileRepository').createUploadAdapter = (loader) => {
              return new MyUploadAdapter(loader);
            };
          }

          class MyUploadAdapter {
            constructor(loader) {
              // CKEditor 5's FileLoader instance.
              this.loader = loader;
              // Файл обработчик сохраняет картинки и возвращает url сохраненной картинки в формате json_encode(array('url'=>$full_path)).
              this.url = 'ckeditor/upload.php';
            }

            // Starts the upload process.
            upload() {
              return this.loader.file
                  .then(file => new Promise((resolve, reject) => {
                    this._initRequest();
                    this._initListeners(resolve, reject, file);
                    this._sendRequest(file);
                  }));
            }

            // Aborts the upload process.
            abort() {
              if (this.xhr) {
                this.xhr.abort();
              }
            }
            _initRequest() {
              const xhr = this.xhr = new XMLHttpRequest();
              xhr.open('POST', this.url, true);
              xhr.responseType = 'json';
            }
            _initListeners(resolve, reject, file) {
              const xhr = this.xhr;
              const loader = this.loader;
              const genericErrorText = 'Couldn\'t upload file:' + ` ${file.name}.`;
              xhr.addEventListener('error', () => reject(genericErrorText));
              xhr.addEventListener('abort', () => reject());
              xhr.addEventListener('load', () => {
                const response = xhr.response;
                if (!response || response.error) {
                  return reject(response && response.error ? response.error.message : genericErrorText);
                }
                // If the upload is successful, resolve the upload promise with an object containing
                // at least the "default" URL, pointing to the image on the server.
                resolve({
                  default: response.url
                });
              });

              if (xhr.upload) {
                xhr.upload.addEventListener('progress', evt => {
                  if (evt.lengthComputable) {
                    loader.uploadTotal = evt.total;
                    loader.uploaded = evt.loaded;
                  }
                });
              }
            }

            // Prepares the data and sends the request.
            _sendRequest(file) {
              const data = new FormData();
              data.append('upload', file);
              //csrf_token CSRF protection
              //data.append('csrf_token', requestToken);
              this.xhr.send(data);
            }
          }

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

 htmlSupport: {
                    allow: [
                      {
                        name: /.*/,
                        attributes: true,
                        classes: true,
                        styles: true
                      }
                    ]
                  },

Про настройку fontFamily, fontSize, heading итак все понятно редактируем, добавляем нужные настройки для редактора.

Для многих удобно добавлять данные в форму, а далее сохранять уже в базу, как вариант мы можем отправлять наш текст из редактора при каждом изменении в тег textarea, далее по кнопки submit отправить POST данные в обработчик. В функции за это отвечает этот фрагмент кода.

.then(editor => {
    window.editor = editor;
    editor.model.document.on( 'change:data', ( evt, data ) => {
      $('textarea#tab_mytextarea').html(editor.getData());
    });
 }

На этом пока все, редактор готов к работе!

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии