Skip to content
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.


media/uploadFile

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


media/browse

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

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

Ответ: объект с полями 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-строку
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Загрузка изображения в Media Source; при ошибке — RuntimeException
uploadFile(array $file, int $resourceId): arrayЗагрузка файла-вложения
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 — массив включённых инструментов
  • presets — imageClass, linkClass, linkTarget, linkRel
  • locale — код языка
  • i18n, editorJsI18n — переводы UI

MODx.loadRTE / MODx.unloadRTE

mxEditorJs перехватывает стандартные хуки MODX для инициализации RTE: MODx.loadRTE(textareaId) при появлении поля, 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" } }
    }
  ]
}

Ответ API

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