Зайдем на сайт https://ckeditor.com/ckeditor-5/online-builder/ . Соберем нужные нам функционал. Выберем язык и скачаем.
Зайдем в https://ckeditor.com/ckfinder/download/ и скачаем ckfinder для php. Либо установим пакет https://packagist.org/packages/ckfinder/ckfinder-laravel-package .
Разархивируем в папку всё в public/assets/admin .
Подключение
Смотрим документацию по подключению https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/installation.html , https://ckeditor.com/docs/ckfinder/ckfinder3/#!/guide/dev_ckeditor5
Подключаем в файле resources/views/admin/layouts/layout.blade.php:
<script src="{{ asset('/assets/admin/ckeditor5/build/ckeditor.js') }}"></script> <script src="{{ asset('/assets/admin/ckfinder/ckfinder.js') }}"></script>
Там же пропишем код инициализации для полей с id description и content:
<script type="text/javascript"> ClassicEditor .create( document.querySelector( '#content' ), { ckfinder: { uploadUrl: '/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files&responseType=json' }, toolbar: [ 'ckfinder', 'imageUpload', '|', 'heading', '|', 'bold', 'italic', '|', 'undo', 'redo' ] } ) .catch( function( error ) { console.error( error ); } ); </script> <script type="text/javascript"> ClassicEditor .create( document.querySelector( '#description' ), { ckfinder: { uploadUrl: '/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files&responseType=json' }, toolbar: [ 'ckfinder', 'imageUpload', '|', 'heading', '|', 'bold', 'italic', '|', 'undo', 'redo' ] } ) .catch( function( error ) { console.error( error ); } ); </script>
Настройка редактора
В head вставим код стилей для того, чтобы наши поля были для редактирования ck-editor минимум 300px по высоте:
<style> .ck-editor__editable_inline { min-height: 300px; } </style>
Для description уберем возможность добавлять картинки и файлы. Для этого из поля toolbar уберем нужные пункты. Инициализация в итоге будет такая:
<script type="text/javascript"> ClassicEditor .create( document.querySelector( '#description' ), { ckfinder: { uploadUrl: '/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files&responseType=json' }, toolbar: ['|', 'heading', '|', 'bold', 'italic', '|', 'undo', 'redo' ] } ) .catch( function( error ) { console.error( error ); } ); </script>
А для поля content добавим весь функционал, который мы собирали вначале. Он записан в тестовом файле public/assets/admin/ckeditor5/sample/index.html . Берем оттуда нужные данные и вставляем в инициализацию. В итоге инициализация получается такая:
<script type="text/javascript"> ClassicEditor .create( document.querySelector( '#content' ), { ckfinder: { uploadUrl: '/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files&responseType=json' }, toolbar: { items: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', '|', 'outdent', 'indent', '|', 'imageUpload', 'blockQuote', 'insertTable', 'mediaEmbed', 'undo', 'redo' ] }, language: 'ru', image: { toolbar: [ 'imageTextAlternative', 'imageStyle:full', 'imageStyle:side' ] }, table: { contentToolbar: [ 'tableColumn', 'tableRow', 'mergeTableCells' ] }, } ) .catch( function( error ) { console.error( error ); } ); </script>
Разрешение на загрузку файлов
Сейчас, если мы попытаемся прикрепить файл, то получим ошибку:
Чтобы решить эту проблему, заходим в файл конфигурации public/assets/admin/ckfinder/config.php и включаем настройку для авторизованных пользователей:
$config['authentication'] = function () { return true; };
По хорошему здесь нужно писать проверку авторизации пользователя. Но мы написали просто true, чтобы функция всегда возвращала положительный результат.
Можем пменять настройку $config[‘backends’][‘baseUrl’] (папка для файлов) на:
/ckfinder/userfiles/
Настроим проверку авторизации пользователя в CKFinder. В файле public/assets/admin/ckfinder/config.php пропишем:
$config['authentication'] = function () { require_once __DIR__ . '/../../../../vendor/autoload.php'; $app = require_once __DIR__ . '/../../../../bootstrap/app.php'; $response = $app->make('Illuminate\Contracts\Http\Kernel')->handle(Illuminate\Http\Request::capture()); $cookie = $_COOKIE[$app['config']['session']['cookie']] ?? false; if ($cookie) { $id = $app['encrypter']->decrypt($cookie, false); $session = $app['session']->driver(); $session->setId($id); $session->start(); } if (!$app['auth']->check() && !$app['auth']->user()->is_admin){ header('HTTP/1.0 403 Forbidden'); exit(); } return true; };
Теперь загружать файлы через CKFinder может только админ.
Выравнивание изображений
В файл resources/views/admin/layouts/layout.blade.php добавим настройки для выравнивания изображения, их мы нашли здесь: https://ckeditor.com/docs/ckeditor5/latest/features/image.html#presentational-styles
image: { toolbar: [ 'imageTextAlternative', 'imageStyle:full', 'imageStyle:side', ], // Configure the available styles. styles: [ 'alignLeft', 'alignCenter', 'alignRight' ], // Configure the available image resize options. resizeOptions: [ { name: 'resizeImage:original', label: 'Original', value: null }, { name: 'resizeImage:50', label: '50%', value: '50' }, { name: 'resizeImage:75', label: '75%', value: '75' } ], // You need to configure the image toolbar, too, so it shows the new style // buttons as well as the resize buttons. toolbar: [ 'imageStyle:alignLeft', 'imageStyle:alignCenter', 'imageStyle:alignRight', '|', 'resizeImage', '|', 'imageTextAlternative' ] },
Это мы добавили в инициализацию редактора для #content. В стили сайта нужно теперь добавить соответсвующие классы, чтобы выравнивание работало не только в редакторе, а на сайте тоже. Их мы тоже нашли в документации .image-style-align-left, .image-style-align-center and .image-style-align-right.
Добавим в mix файл app.css:
mix.styles([ 'resources/assets/admin/plugins/fontawesome-free/css/all.min.css', 'resources/assets/admin/plugins/select2/css/select2.css', 'resources/assets/admin/plugins/select2-bootstrap4-theme/select2-bootstrap4.css', 'resources/assets/admin/css/adminlte.min.css', 'resources/css/app.css' ], 'public/assets/admin/admin.css');
В него запишем:
.image-style-align-left { float: right; } .image-style-align-center{ text-align: center; margin: 0 auto; } .image-style-align-right { float: left; }
И выполним:
npm run dev