<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Добавление ресурсов через API Modx]]></title><description><![CDATA[<p dir="auto">И так дело было вечером, делать было есть чего <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f601.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--grin" style="height:23px;width:auto;vertical-align:middle" title=":grin:" alt="😁" /> . Вообще Modx я пользуюсь давольно давно и часто, так как считаю ее универсальной CMF вообще почти для любых задач с кучей функционала и возможно кастомизацией. Ах жаль что она на <code>php</code>, а не на <code>js</code>, но сейчас не об этом.</p>
<p dir="auto">И так как же добавлять ресурсы в нашу систему modx через api? Для этого нам необходимо в корне проекта создать папка, пусть так и будет <code>api</code>:</p>
<p dir="auto"><img src="/assets/uploads/files/64/ad/dc/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" alt="Снимок экрана 2025-11-19 в 15.15.46.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Внутри нашей новой папки создаем входной файл к которому уже будем обращаться извне <code>index.php</code>.</p>
<p dir="auto">Далее я приведу код с подробными комментариями что к чему</p>
<pre><code class="language-php">&lt;?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-&gt;initialize("web");

/* Получение или создание службы error с классом error.modError */
$modx-&gt;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" =&gt; "Unauthorized"]);
    exit();
}

// Далее нам потребуется принудительная авторизация пользователя
// В моем случаем мне хватает и admin, других решений я пока не смотрел 
$apiUserName = "admin";

// Получаем объект пользователя по имени
$user = $modx-&gt;getObject("modUser", ["username" =&gt; $apiUserName]);

// Теперь проверяем есть ли пользователь
// Это доп проверка если Вы уверены можете пропустить
if (!$user) {
    header("HTTP/1.1 500 Internal Server Error");
    header("Content-Type: application/json");
    echo json_encode([
        "message" =&gt; "API user '$apiUserName' not found in MODX",
    ]);
    exit(); // ВАЖНО: exit() после отправки заголовков ошибки
}

// Принудительно устанавливаем пользователя как текущего
// Это основной способ, как MODX узнает текущего пользователя для целей разрешений
$modx-&gt;user = $user;
// Загружаем атрибуты пользователя (группы, политики доступа)
$modx-&gt;user-&gt;getAttributes(); // ВАЖНО: вызываем метод для загрузки


// Этот код создает и настраивает объект REST-сервиса
// в MODX на базе класса modRestService
// указывая путь к контроллерам и параметры префиксов классов контроллеров
$rest = $modx-&gt;getService("rest", "rest.modRestService", "", [
    "basePath" =&gt; __DIR__ . "/controllers/",
    "controllerClassSeparator" =&gt; "",
    "controllerClassPrefix" =&gt; "mvController",
    "xmlRootNode" =&gt; "response",
    "requestParameter" =&gt; "_rest",
]);

$rest-&gt;prepare();
if (!$rest-&gt;checkPermissions()) {
    $rest-&gt;sendUnauthorized(true);
}

$rest-&gt;process();
</code></pre>
<blockquote>
<p dir="auto">Последние строчки про REST кротко - код инициализирует REST API, проверяет авторизацию и затем обрабатывает запрос к сервису в соответствии с логикой контроллеров по пути <code>basePath</code>.​</p>
</blockquote>
<p dir="auto">Все это в принципе есть в документации - <a href="https://docs.modx.com/current/ru/extending-modx/developing-restful-api" target="_blank" rel="noopener noreferrer">https://docs.modx.com/current/ru/extending-modx/developing-restful-api</a><br />
Кроме конечно той же проверки на авторизацию, так что читайте доку господа!</p>
<p dir="auto">Все теперь наш основной файл обработки запросов готов! Самое время перейти к логике контроллеров, для это мы создаем папку <code>controllers</code>, а внутри создадим файл к примеру <code>Resource.php</code> и снова пишем код:</p>
<pre><code class="language-php">&lt;?php
// Контроллер для создания ресурсов (статей).
// Который наследуется от modRestController

class mvControllerArticles extends modRestController {
    public function post($id = null)
    {
        // Получаем тело запроса как JSON-строку
        $rawBody = $this-&gt;modx-&gt;getOption(
            "post",
            $_POST,
            file_get_contents("php://input"),
        );
        // Декодируем JSON в ассоциативный массив
        $input = $this-&gt;modx-&gt;fromJSON($rawBody);

        if (empty($input)) {
            // Используем встроенный метод modRestController для возврата ошибки
            return $this-&gt;failure("No input data provided");
        }

        // Запускаем процессор создания ресурса MODX
        // $this-&gt;modx доступен из-за наследования от modRestController
        $response = $this-&gt;modx-&gt;runProcessor("resource/create", $input);

        if ($response-&gt;isError()) {
            // Возвращаем сообщение об ошибке от процессора
            return $this-&gt;failure($response-&gt;getMessage());
        }

        // Получаем результат выполнения процессора
        $responseObject = $response-&gt;getObject();
        if ($responseObject &amp;&amp; isset($responseObject["id"])) {
            // Возвращаем успешный ответ с ID созданного ресурса
            // Первый параметр - сообщение, второй - данные
            return $this-&gt;success("Resource created successfully", [
                "id" =&gt; $responseObject["id"],
            ]);
        } else {
            // Если ID не найден в ответе процессора
            return $this-&gt;failure(
                "Не удалось получить ID ресурса из ответа",
            );
        }
    }

    // Здесь можно переопределить другие методы (get, put, delete и т.д.)
    // или общие методы родительского класса, если нужно кастомное поведение.
    // Однако для создания ресурса нам нужен только POST.
}
</code></pre>
<p dir="auto">Ну вот в принципе и все, теперь можно обращаться по api к нашему сайту и создавать ресурсы.<br />
И наверное у новичков возникнет вопрос, а как же передавать данные? Ну так как я пишу в основном на <code>ЖС</code> то у меня есть для таких целей небольшой скрипт:</p>
<pre><code class="language-js">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) =&gt; response.text())
  .then((text) =&gt; {
    console.log("Необработанный ответ:", text);
    try {
      const data = JSON.parse(text);
      console.log("Parsed JSON:", data);
    } catch (e) {
      console.error("Ошибка парсинга JSON:", e);
    }
  })
  .catch((error) =&gt; {
    console.error("Ошибка:", error);
  });
</code></pre>
<p dir="auto">Если есть вопросы - задавайте попробуем разобраться вместе или возможно у Вас есть своим примеры как создавать ресурсы через api в modx. <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60a.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--blush" style="height:23px;width:auto;vertical-align:middle" title=":blush:" alt="😊" /></p>
]]></description><link>https://forum.exlends.ru/topic/309/dobavlenie-resursov-cherez-api-modx</link><generator>RSS for Node</generator><lastBuildDate>Wed, 20 May 2026 07:27:27 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/309.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Nov 2025 13:25:24 GMT</pubDate><ttl>60</ttl></channel></rss>