Skip to content
  1. Компоненты
  2. mxEditorJs
  3. Для разработчика

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

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

Запросы требуют авторизации в менеджере MODX. Ответы: JSON, Content-Type: application/json.

Обычное сохранение ресурса идёт через POST формы и OnBeforeDocFormSave, не через connector. content/save нужен для AJAX и интеграций.

Права по action ​

Actionsave_document
content/getНет
content/saveДа
content/fromHtmlНет (достаточно сессии менеджера)
content/migrate (без dry_run)Да
content/migrate (dry_run=1)Нет
media/upload, media/uploadFileДа
media/browseНет
link/searchНет

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

Неавторизованный запрос: HTTP 200, тело JSON (текст из лексикона, ru/en):

json
{ "success": false, "message": "Доступ запрещён." }

content/get ​

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

ПараметрТипОбязательныйОписание
actionstring✓content/get
resource_idint✓ID ресурса MODX
tmplvar_idint—ID 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-снимок.

ПараметрТипОбязательныйОписание
actionstring✓content/save
resource_idint✓ID ресурса
tmplvar_idint—ID TV (если не указан: основной контент)
content_jsonstring/object✓Editor.js OutputData

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

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

ContentValidator проверяет JSON. HtmlRenderer собирает HTML. Основной контент: JSON в sidecar, HTML в modResource.content. TV: таблица mxeditorjs_tv_content.


media/upload ​

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

ПараметрТипОбязательныйОписание
actionstring✓media/upload
resource_idint✓ID ресурса
imagefile✓Файл изображения

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

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

Проверка файла:

  • расширение из mxeditorjs.allowed_image_types
  • MIME из ALLOWED_IMAGE_MIME: image/jpeg, image/png, image/gif, image/webp, image/svg+xml
  • размер ≤ mxeditorjs.max_upload_size

Блоки Image и Gallery вызывают этот action.


media/uploadFile ​

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


media/browse ​

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

ПараметрТипОбязательныйОписание
actionstring✓media/browse
resource_idint✓ID ресурса
typestring—image (по умолчанию) или file
pathstring—Путь относительно корня Media Source; __root__ или / — корень

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

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


link/search ​

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

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

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


content/fromHtml ​

Конвертация HTML в OutputData без записи sidecar. Параметр html. Ответ: {time, blocks, version}. Клиент вызывает это при storageMode === 'inline' (поля MIGX и аналоги).


content/migrate ​

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

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

При dry_run в ответе: preview и blocks_count. Перезапись может потребовать confirmed=true. После confirmed пишутся sidecar и HTML в modResource.content. Успех: migrated, blocks_count, overwritten, html.


PHP-классы ​

MxEditorJs\Renderer\HtmlRenderer ​

Собирает HTML из Editor.js OutputData.

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

MxEditorJs\Validator\ContentValidator ​

Проверка структуры Editor.js.

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

MxEditorJs\Repository\ContentRepository ​

Sidecar mxeditorjs_content. HTML в modResource.content пишет connector content/save или клиент формы, не этот класс.

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

MxEditorJs\Repository\TvContentRepository ​

Sidecar TV: таблица mxeditorjs_tv_content.

МетодОписание
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, h1–h6, 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 = без лимита)
  • tmplvarId: необязательный ID TV у экземпляра (из имени tv[N] / tvN)
  • mxGallery: {enabled, connectorUrl, pickerUrl, authToken}. enabled = есть каталог core/components/mxgallery/
  • 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);

window.MxEditorJsFlush() сбрасывает HTML в textarea перед submit окна MIGX (onBeforeSubmit в migxmxeditorjs.tpl).

Режимы хранения: main (#ta, sidecar ресурса), tv (tv[N], sidecar TV), inline (не #ta и не TV: без скрытого JSON, загрузка через content/fromHtml).


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

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.

Структура блока mxGallery ​

json
{
  "type": "mxgallery",
  "data": {
    "mode": "ids",
    "ids": [12, 34],
    "collectionId": null
  }
}

mode: ids или collection. HtmlRenderer выводит сниппет [[!mxGallery]]. Коллекция: параметр collection и picture=1. Одно id: id. Несколько: ids и sort=selection. Toolbox блока только если установлен mxGallery.

Ответ API ​

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