Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. CMS
  4. MODX
  5. Добавление ресурсов через API Modx

Добавление ресурсов через API Modx

Запланировано Прикреплена Закрыта Перенесена MODX
modxphp
1 Сообщения 1 Постеры 26 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • kirilljsxK Не в сети
    kirilljsxK Не в сети
    kirilljsx
    js
    написал отредактировано
    #1

    И так дело было вечером, делать было есть чего 😁 . Вообще Modx я пользуюсь давольно давно и часто, так как считаю ее универсальной CMF вообще почти для любых задач с кучей функционала и возможно кастомизацией. Ах жаль что она на php, а не на js, но сейчас не об этом.

    И так как же добавлять ресурсы в нашу систему modx через api? Для этого нам необходимо в корне проекта создать папка, пусть так и будет api:

    Снимок экрана 2025-11-19 в 15.15.46.png

    Внутри нашей новой папки создаем входной файл к которому уже будем обращаться извне 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. 😊

    1 ответ Последний ответ
    0

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com
    • Наш чат
    • Наш ТГ канал

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

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы