Skip to content
mxEditorJs
mxEditorJs
Блочный редактор Editor.js для MODX 3 — контент блоками вместо TinyMCE/CKEditor
  1. Компоненты
  2. mxEditorJs
  3. Для разработчика

API и интерфейсы

Коннектор assets/components/mxeditorjs/connector.php

Все запросы к коннектору выполняются с авторизацией в менеджере MODX. Ответы — JSON. Операции записи требуют права save_document.

Аутентификация

Неавторизованные запросы возвращают:

json
{ "success": false, "message": "Permission denied" }

content/get

Получить JSON-контент ресурса или TV.

ПараметрТипОбязательныйОписание
actionstringcontent/get
resource_idintID ресурса MODX
tmplvar_idintID TV (если не указан — основной контент)

Ответ (контент найден):

json
{
  "success": true,
  "data": {
    "content_json": { "time": 1709827200000, "blocks": [...], "version": "2.31.0" },
    "content_version": 3
  }
}

Ответ (контент не найден): { "success": true, "data": null }


content/save

Сохранить JSON-контент с валидацией и генерацией HTML-снимка.

ПараметрТипОбязательныйОписание
actionstringcontent/save
resource_idintID ресурса
tmplvar_idintID TV (если не указан — основной контент)
content_jsonstring/objectEditor.js OutputData

Ответ (успех):

json
{
  "success": true,
  "data": { "html": "<h2>Заголовок</h2>\n<p>Текст</p>" }
}

Логика: JSON валидируется (ContentValidator), HtmlRenderer генерирует HTML. Для основного контента JSON в sidecar, HTML в modResource.content. Для TV — в mxeditorjs_tv_content.


media/upload

Загрузить изображение (multipart/form-data).

ПараметрТипОбязательныйОписание
actionstringmedia/upload
resource_idintID ресурса
imagefileФайл изображения

Ответ (успех):

json
{
  "success": 1,
  "file": {
    "url": "/assets/images/resources/42/photo.jpg",
    "name": "photo.jpg",
    "size": 245760
  }
}

Валидация: расширение из mxeditorjs.allowed_image_types, MIME image/*, размер ≤ mxeditorjs.max_upload_size. Используется блоками Image и Gallery (загрузка через media/upload).


media/uploadFile

Загрузить файл-вложение (инструмент Attaches). Параметры: action=media/uploadFile, resource_id, file. Файл сохраняется по шаблону mxeditorjs.file_upload_path (независимо от пути изображений). Формат ответа как у media/upload.


media/browse

Просмотр файлов в Media Source.

ПараметрТипОбязательныйОписание
actionstringmedia/browse
resource_idintID ресурса
typestringimage (по умолчанию) или file
pathstringПуть относительно корня Media Source; __root__ или / — корень

Для type=image используется Media Source изображений, для type=file — Media Source вложений. Блок Gallery использует type=image (тот же обзор, что и Image).

Ответ: объект с полями files, folders, path, parentPath.


link/search

Поиск ресурсов MODX для автодополнения ссылок.

ПараметрТипОбязательныйОписание
actionstringlink/search
querystringПоисковый запрос (минимум 2 символа)
limitintМакс. результатов (по умолчанию 10, макс. 30)

Поиск по pagetitle, longtitle, точное совпадение по id. Удалённые ресурсы исключаются.


content/migrate

Миграция HTML-контента ресурса в формат Editor.js.

ПараметрТипОбязательныйОписание
actionstringcontent/migrate
resource_idintID ресурса
dry_runboolПредпросмотр без сохранения
confirmedboolПодтверждение перезаписи
forceboolПринудительная перезапись существующих данных

Ответы: при dry_run — preview и blocks_count. При перезаписи может потребоваться confirmed=true. При успехе — migrated, blocks_count, overwritten.


PHP-классы

MxEditorJs\Renderer\HtmlRenderer

Рендерит Editor.js OutputData в HTML.

МетодОписание
render(array $editorJsData): stringРендерит все блоки в HTML-строку (включая gallery)
registerBlockRenderer(string $type, callable $renderer): voidРегистрирует кастомный рендерер для типа блока. Сигнатура callable: function(array $data, array $block): string

MxEditorJs\Validator\ContentValidator

Валидация структуры Editor.js.

МетодОписание
validate(array $data): boolПроверяет структуру, возвращает true если валидно
getErrors(): arrayМассив строк с описаниями ошибок
getFirstError(): ?stringПервая ошибка или null

MxEditorJs\Repository\ContentRepository

Работа с основным контентом ресурса (JSON sidecar + HTML в modResource.content).

МетодОписание
findByResourceId(int $resourceId): ?arrayЗапись по ID ресурса или null
save(int $resourceId, array $jsonData, int $userId = 0): boolСоздание/обновление. Пропуск при неизменном хеше
deleteByResourceId(int $resourceId): boolУдаление записи

MxEditorJs\Repository\TvContentRepository

Работа с контентом TV (таблица sidecar для TV).

МетодОписание
findByResourceAndTv(int $resourceId, int $tmplvarId): ?arrayПоиск по (resource_id, tmplvar_id)
save(int $resourceId, int $tmplvarId, array $jsonData, int $userId = 0): boolСоздание/обновление
deleteByResourceAndTv(int $resourceId, int $tmplvarId): boolУдаление одной TV-записи
deleteByResourceId(int $resourceId): boolУдаление всех TV-записей ресурса

MxEditorJs\Service\MediaUploader

Загрузка и просмотр медиа.

МетодОписание
upload(array $file, int $resourceId): arrayЗагрузка изображения. Путь из mxeditorjs.image_upload_path
uploadFile(array $file, int $resourceId): arrayЗагрузка файла-вложения. Путь из mxeditorjs.file_upload_path
browse(int $resourceId, string $type = 'image', string $subPath = ''): arrayВозвращает {files, folders, path, parentPath}

MxEditorJs\Service\HtmlMigrator

Конвертация HTML в Editor.js OutputData.

МетодОписание
convert(string $html): arrayПринимает HTML, возвращает {time, blocks, version}

Поддерживаются элементы: p, h1h6, ul/ol, blockquote, hr, pre/code, figure/img, img, table, div/section/article (как paragraph).


JavaScript API

window.mxEditorJsConfig

Конфигурация, доступная после OnDocFormPrerender:

  • connectorUrl — URL коннектора
  • resourceId — ID текущего ресурса
  • assetsUrl — URL директории ассетов
  • profile — имя профиля
  • enabledTools — массив включённых инструментов
  • galleryMaxCount — лимит изображений в блоке Gallery (0 = без лимита)
  • presets — imageClass, linkClass, linkTarget, linkRel
  • locale — код языка
  • i18n, editorJsI18n — переводы UI

MODx.loadRTE / MODx.unloadRTE

mxEditorJs перехватывает стандартные хуки MODX для инициализации RTE. Аргумент elements нормализуется (строка, массив ID или объект с полем id) — это устраняет ошибку TypeError: e.split is not a function при открытии статических ресурсов.

javascript
// Вызывается MODX при появлении textarea
window.MODx.loadRTE(textareaId);

// Вызывается при удалении textarea
window.MODx.unloadRTE(textareaId);

Форматы данных

Editor.js OutputData

json
{
  "time": 1709827200000,
  "version": "2.31.0",
  "blocks": [
    {
      "id": "abc123",
      "type": "paragraph",
      "data": { "text": "Hello world" },
      "tunes": { "alignmentTune": { "alignment": "left" } }
    }
  ]
}
json
{
  "type": "gallery",
  "data": {
    "files": [
      { "url": "/assets/images/resources/42/photo1.jpg", "name": "photo1.jpg" },
      { "url": "/assets/images/resources/42/photo2.jpg", "name": "photo2.jpg" }
    ],
    "style": "fit",
    "caption": "Подпись галереи"
  }
}

Поле style: fit (сетка) или slider (горизонтальный скролл). HTML-снимок: <figure class="mxeditorjs-gallery mxeditorjs-gallery--{style}"> с изображениями в .mxeditorjs-gallery__track.

Ответ API

Успех: { "success": true, "data": { ... } } Ошибка: { "success": false, "message": "..." }