Добавление ресурсов через API Modx
-
И так дело было вечером, делать было есть чего
. Вообще Modx я пользуюсь давольно давно и часто, так как считаю ее универсальной CMF вообще почти для любых задач с кучей функционала и возможно кастомизацией. Ах жаль что она на php, а не наjs, но сейчас не об этом.И так как же добавлять ресурсы в нашу систему modx через api? Для этого нам необходимо в корне проекта создать папка, пусть так и будет
api:
Внутри нашей новой папки создаем входной файл к которому уже будем обращаться извне
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.

© 2024 - 2025 ExLends, Inc. Все права защищены.