И так дело было вечером, делать было есть чего . Вообще Modx я пользуюсь давольно давно и часто, так как считаю ее универсальной CMF вообще почти для любых задач с кучей функционала и возможно кастомизацией. Ах жаль что она на php, а не на js, но сейчас не об этом.
И так как же добавлять ресурсы в нашу систему modx через api? Для этого нам необходимо в корне проекта создать папка, пусть так и будет api:
[image: 1763554551026-%C3%B0-%C3%B0-%C3%B0-%C3%B0-%C3%B0-%C3%B0%C2%BA-%C3%B1-%C3%B0%C2%BA%C3%B1-%C3%B0-%C3%B0-%C3%B0-2025-11-19-%C3%B0-15.15.46.webp]
Внутри нашей новой папки создаем входной файл к которому уже будем обращаться извне index.php.
Далее я приведу код с подробными комментариями что к чему
<?php
@include dirname(__DIR__) . "/config.core.php";
if (!defined("MODX_CORE_PATH")) {
define("MODX_CORE_PATH", dirname(__FILE__) . "/core/");
}
/* Класс modX */
@include_once MODX_CORE_PATH . "model/modx/modx.class.php";
$modx = new modx();
/* Инициализация контекста сайта "web" в системе MODX */
$modx->initialize("web");
/* Получение или создание службы error с классом error.modError */
$modx->getService("error", "error.modError", "", "")
// Далее мы запускаем службу получаемых заголовков
/* И проверяем API ключа */
$headers = getallheaders();
// Переменная для заголовка авторизации
$authHeader = $headers["Authorization"] ?? "";
// Ключ можете как прописать строкой так и записать его-то где-то в БД
// у нужного пользователя или же любым другим способов удобным для вас
$validKey = "key";
// Наше условие для проверки api ключа
// Если все окей то код выполняется дальше
if ($authHeader !== "Bearer $validKey") {
header("HTTP/1.1 401 Unauthorized");
header("Content-Type: application/json");
echo json_encode(["message" => "Unauthorized"]);
exit();
}
// Далее нам потребуется принудительная авторизация пользователя
// В моем случаем мне хватает и admin, других решений я пока не смотрел
$apiUserName = "admin";
// Получаем объект пользователя по имени
$user = $modx->getObject("modUser", ["username" => $apiUserName]);
// Теперь проверяем есть ли пользователь
// Это доп проверка если Вы уверены можете пропустить
if (!$user) {
header("HTTP/1.1 500 Internal Server Error");
header("Content-Type: application/json");
echo json_encode([
"message" => "API user '$apiUserName' not found in MODX",
]);
exit(); // ВАЖНО: exit() после отправки заголовков ошибки
}
// Принудительно устанавливаем пользователя как текущего
// Это основной способ, как MODX узнает текущего пользователя для целей разрешений
$modx->user = $user;
// Загружаем атрибуты пользователя (группы, политики доступа)
$modx->user->getAttributes(); // ВАЖНО: вызываем метод для загрузки
// Этот код создает и настраивает объект REST-сервиса
// в MODX на базе класса modRestService
// указывая путь к контроллерам и параметры префиксов классов контроллеров
$rest = $modx->getService("rest", "rest.modRestService", "", [
"basePath" => __DIR__ . "/controllers/",
"controllerClassSeparator" => "",
"controllerClassPrefix" => "mvController",
"xmlRootNode" => "response",
"requestParameter" => "_rest",
]);
$rest->prepare();
if (!$rest->checkPermissions()) {
$rest->sendUnauthorized(true);
}
$rest->process();
Последние строчки про REST кротко - код инициализирует REST API, проверяет авторизацию и затем обрабатывает запрос к сервису в соответствии с логикой контроллеров по пути basePath.
Все это в принципе есть в документации - https://docs.modx.com/current/ru/extending-modx/developing-restful-api
Кроме конечно той же проверки на авторизацию, так что читайте доку господа!
Все теперь наш основной файл обработки запросов готов! Самое время перейти к логике контроллеров, для это мы создаем папку controllers, а внутри создадим файл к примеру Resource.php и снова пишем код:
<?php
// Контроллер для создания ресурсов (статей).
// Который наследуется от modRestController
class mvControllerArticles extends modRestController {
public function post($id = null)
{
// Получаем тело запроса как JSON-строку
$rawBody = $this->modx->getOption(
"post",
$_POST,
file_get_contents("php://input"),
);
// Декодируем JSON в ассоциативный массив
$input = $this->modx->fromJSON($rawBody);
if (empty($input)) {
// Используем встроенный метод modRestController для возврата ошибки
return $this->failure("No input data provided");
}
// Запускаем процессор создания ресурса MODX
// $this->modx доступен из-за наследования от modRestController
$response = $this->modx->runProcessor("resource/create", $input);
if ($response->isError()) {
// Возвращаем сообщение об ошибке от процессора
return $this->failure($response->getMessage());
}
// Получаем результат выполнения процессора
$responseObject = $response->getObject();
if ($responseObject && isset($responseObject["id"])) {
// Возвращаем успешный ответ с ID созданного ресурса
// Первый параметр - сообщение, второй - данные
return $this->success("Resource created successfully", [
"id" => $responseObject["id"],
]);
} else {
// Если ID не найден в ответе процессора
return $this->failure(
"Не удалось получить ID ресурса из ответа",
);
}
}
// Здесь можно переопределить другие методы (get, put, delete и т.д.)
// или общие методы родительского класса, если нужно кастомное поведение.
// Однако для создания ресурса нам нужен только POST.
}
Ну вот в принципе и все, теперь можно обращаться по api к нашему сайту и создавать ресурсы.
И наверное у новичков возникнет вопрос, а как же передавать данные? Ну так как я пишу в основном на ЖС то у меня есть для таких целей небольшой скрипт:
import dotenv from "dotenv";
dotenv.config();
const data = {
pagetitle: "Тестовая статья", // Заголовок
content: "Это пример тестового контента через API.", // Сам контент
template: 1, // Это выбор шаблона страницы
parent: 1, // Выбираем родителя
published: 1, // Включаем опубликован или нет
createdby: 1, // Пользователь под которым создан ресурс
};
const apiKey = process.env.API_KEY; // Ваш ключ вы можете прописать строкой сюда или же взять из .env файла
// Обратите внимание на ?_rest=Resource эта настройка обращения из index.php
fetch("https://site.ru/api/index.php?_rest=Resource", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify(data),
})
.then((response) => response.text())
.then((text) => {
console.log("Необработанный ответ:", text);
try {
const data = JSON.parse(text);
console.log("Parsed JSON:", data);
} catch (e) {
console.error("Ошибка парсинга JSON:", e);
}
})
.catch((error) => {
console.error("Ошибка:", error);
});
Если есть вопросы - задавайте попробуем разобраться вместе или возможно у Вас есть своим примеры как создавать ресурсы через api в modx.