Перейти к содержанию

CMS

WordPress, Joomla, MODX, Headelss CMS, Payload CMS, NodeBB! Создание сайтов, темы, плагины, SEO-оптимизация, безопасность, интеграция с API. Решайте ошибки, делитесь лайфхаками, изучайте обновления. Помощь новичкам и экспертные кейсы.

9 Темы 19 Сообщения

Подкатегории


  • Обсуждайте WordPress: от создания сайтов до продвинутых тем! Разработка тем и плагинов, SEO-оптимизация, безопасность, работа с WooCommerce и Elementor. Решайте ошибки, делитесь лайфхаками, изучайте обновления WordPress 6.0+. Помощь новичкам, обмен опытом между разработчиками и веб-мастерами. Актуальные гайды, тренды и лучшие практики.

    0 0
    0 Темы
    0 Сообщения
    Нет новых сообщений
  • Обсуждайте MODX: от основ до продвинутых тем! Создание сайтов, шаблоны, плагины, безопасность, API, оптимизация. Решайте ошибки, делитесь лайфхаками, изучайте MODX 3.0+. Помощь новичкам и экспертные кейсы. Актуальные гайды, тренды.

    8 13
    8 Темы
    13 Сообщения
    kirilljsxK
    И так дело было вечером, делать было есть чего . Вообще 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.
  • Bitrix24 приложение открывает сделку

    bitrix24 битрикс24
    6
    0 Голоса
    6 Сообщения
    103 Просмотры
    SkitRaS
    А попробуй создать новый ярлык с конкретным URL, которые ты сам задашь, ну или как вариант можно просто переустановить полностью с очисткой кеша