Андрей Степаненко · 12 февраля 2019, 07:17 Схема работы с RESTfull для modx реализована по документации Что нужно сделать, пошагово: Создаем index файл для обработки запросов rest/index.php https://gist.github.com/webnitros/b8e56c0482a797c926e69ff507a72aa9Создаем контроллер: пример файла контроллера для получения способов оплаты из minishop rest/Controllers/payment.php https://gist.github.com/webnitros/bc2cf0417df58a945202a55683519d1eВ конфиге nginx прописываем вот так: location /rest/ { try_files $uri @modx_rest; } location @modx_rest { rewrite ^/rest/(.*)$ /rest/index.php?_rest=$1&$args last; }Обащение происходит https://mysite.ru/rest/paymentВернет массив данных в json формате Код выше выдернуть из рабочего проект, кое где кое что убрал, так что с первого раза может не запустить. Дальше уже включаем фантазию и разбираемся с классом rest.modRestService И тут вот чтобы не ошибатся yadi.sk/i/MyAlG1dNdIEOWQ MyController — это название основного префикса? и прописывается он в rest/index.php То есть если у вас контроллер называется вот так resource то класс для него будет MyControllerResource rest/Controllers/resource.phpКстати контроллер работает имено в связке vue с modx Вопросы / Modx restfull api 19 0 2
Денис · 21 мая 2018, 15:01 Создайте плагин на событие OnManagerPageBeforeRender с следующим кодом: switch ($modx->event->name) { case 'OnManagerPageBeforeRender': if($controller->config['controller'] == "security/user") { $controller->addHTML(' <script> Ext.ComponentMgr.onAvailable("modx-panel-users", function () { this.items[1].items[1].baseParams = { action: "security/user/getList", usergroup: MODx.request["usergroup"] ? MODx.request["usergroup"] : "", sort: "id" }; }); </script> '); } break; } Вопросы / Как запомнить сортировку в админке? 3 +3 3
Sergey Leleko · 19 декабря 2017, 09:12 с горем пополам оттолкнулся от docs.modx.com/revolution/2.x/developing-in-modx/advanced-development/developing-rest-servers Сайты на MODX / АСУ для кофеен. Часть 5 9 0 1
Hetzerok · 14 ноября 2017, 16:47 По умолчанию отправляет через mail(), однако может отправлять и через SMTP — нужно проверить системные настройки почты. В качестве хука email выступает метод email() класса fiHooks. Расположен он в файле formit/model/formit/fihooks.class.php. Вопросы / Как FormIt отправляет письма? 8 0 1
Сергей Шлоков · 27 октября 2017, 07:06 Не хотел отвечать — думал ты стебаешься. А сейчас думаю, ты скорее всего до конца не вник. Не имеет значения, что ты укажешь — паттерн или стили или еще чего с фигурными скобками. ignore не работает из-за специфики парсинга MODX. Попробуй добавить в примере выше (доступ я давал) в секцию HEAD следующий код {ignore}<style>body {color: red}</style>{/ignore}Fenom выдаст ошибку компиляции. Новые дополнения и их версии / [pdoTools] 2.10.1 - исправление кэширования скриптов и стилей 79 +1 1
Василий Наумкин · 10 октября 2017, 12:39 Если покопаться в MODX API то можно научиться выводить любой ресурс в плагине на нужном событии: $modx->resource = $modx->getObject('modResource', $modx->getOption('site_start')); $modx->resource->set('content', $pdoTools->runSnippet('@FILE snippets/get_panel.php')); $modx->request->prepareResponse();Здесь, как видно, еще и замена контента на свой идёт, на лету. Можно так на лету и виртуальные ресурсы делать, со своими pagetitle и прочими свойствами. При желании, можно вообще весь сайт без ресурсов сделать =) Готовые решения / Одностраничники на базе MODx без контекстов 16 +5 6
Борис · 05 сентября 2017, 16:30 Поправил описание, добавил примеры. Вопросы / Группировка товаров по категории 7 0 1
Максим Кузнецов · 19 мая 2017, 00:31 Оум, спасибо..) Ну, контексты здесь больше не для визуального разграничения, а для того, чтобы менеджерам не мозолить глаза техническими страницами (контекст для них спрятан). По виджетам тоже настройка довольно простая, вроде даже рассказывать нечего… Разве только дефолтный shopStats переписан. Если есть какой-то конкретный вопрос по модулю — спрашивайте, расскажу.) Из интересного там, на мой взгляд, комплексный маршрутизатор характеристик — т.к. ассортимент товаров разнообразный, вставал вопрос с отображением в списках товаров только нужных параметров, при этом не плодя под каждый вариант свой чанк/шаблон/категорию. В итоге все удалось решить при помощи 1 плагина + селектора для категории. Ну да тут в двух словах не описать. Надеюсь, как закрою большую часть проектов, доберусь написать какой-нибудь комплексный гайд по созданию сайта, с учетом fenom-a и относительно свежих решений..) Объявления о работе / Оптимизировать скорость загрузки 13 +2 1
Максим Кузнецов · 09 апреля 2017, 13:08 Вообще, для сео это совсем не критично, т.к: — если вам необходимо добавить страницы пользователей в sitemap, то это можно сделать в рамках pdoUsers — если вам необходимы динамичные заголовки и мета-теги, то можно сделать примерно так: 1. В плагине создаем плейсхолдер user_id 2. В мета-тегах проверяем его наличие: {block 'meta'} {var $user_id = $_modx->getPlaceholder('user_id')} {if $user_id | length > 0} {var $user_name = $_modx->getPlaceholder('user_name')} {var $pagetitle = $user_name ~ ' / Профиль пользователя'} <title>{$pagetitle ~' :: '~ $_modx->config.site_name}</title> ... {else} {parent} //обычный набор мета-тегов {/if} {/block} — надеюсь логика понятна..) Что же до примера со вторым вариантом, то примерно вот так: 1. Создание страницы пользователя (тикетом) <?php if ($modx->event->name == 'OnUserActivate') { if ($user) { if ($profile = $user->getOne('Profile')) { $user_id = $user->get('id'); $fullname = $profile->get('fullname'); /* Можно распределять пользователей в зависимости от их группы */ if ($user->isMember('Users')) { //указываем родителя и шаблон $parent = 21; $template = 28; } if (isset($parent)) { //Дополнительно может потребоваться проверка на то, создана ли уже страница для пользователя //(на случай, если у вас возможна повторная активация-деактивация пользотвалея $page = $modx->getObject('modResource', array( 'parent' => $parent, 'createdby' => $user_id )); if (!$page) { /* Формируем uri по айди пользователя */ $parent_alias = $modx->getObject('modDocument', $parent)->get('alias'); $parent_alias .= '/' . $user_id; $ticket = $modx->newObject('modDocument'); $ticket->set('parent', $parent); $ticket->set('template', $template); $ticket->set('class_key', 'Ticket'); $ticket->set('show_in_tree', 0); $ticket->set('published', 1); $ticket->set('author', $user_id); $ticket->set('createdby', $user_id); $ticket->set('pagetitle', $fullname); $ticket->set('uri_override', 1); $ticket->set('uri', $parent_alias); $ticket->set('alias', $user_id); $ticket->save(); } } } } } 2. Синхронизируем данные (в одну сторону — от пользователя к странице). Соответственно, если есть потребность редактировать поля пользователя из админки через его страницу, потребуется еще один плагин. <?php if ($modx->event->name == 'OnUserFormSave' && $mode != 'new') { if ($user) { if ($profile = $user->getOne('Profile')) { $user_id = $user->get('id'); if ($user->isMember('Users')) { $parent = 21; } if (isset($parent)) { //Ищем страницу пользователя $page = $modx->getObject('modResource', array( 'parent' => $parent, 'createdby' => $user_id )); if ($page) { $extended = $profile->get('extended'); //Обновляем дефолтное поле страницы $page->set('pagetitle', $profile->get('fullname')); //Обновляем тв-поле if (isset($extended['phone'])) { $page->setTVValue('user_phone', $extended['phone']); } //Дополнить требуемыми полями по вкусу %) $page->save(); } } } } } Вопросы / Вывод всех пользователей и просмотр их профиля 7 +2 3
Дмитрий · 18 марта 2017, 16:07 Я пару месяцев назад тоже делал поиск по ресурсам, но так так SimpleSearch мало что умеет, а нужно было делать примерно такую штуку написал, как и предложил Олег в комментарии выше, заполнение параметров в WHERE в pdoResources. Можно попробовать сделать примерно такое же, только для Tickets. Код конечно, так себе, но работает неплохо. Из 4000 ресурсов выборка идет довольно быстро. <?php $pdo = $modx->getService('pdoTools'); $query = $modx->newQuery('modResource'); $query->select('modResource.id'); $query->leftJoin('modTemplateVarResource', 'TAG', 'modResource.id=TAG.contentid'); $query->leftJoin('modTemplateVarResource', 'RATING', 'modResource.id=RATING.contentid'); if (($_GET['search'] != '')) { $search = $_GET['search']; $string = array( array( 'modResource.pagetitle:LIKE' => '%' . $search . '%', 'OR:modResource.content:LIKE' => '%' . $search . '%' ), array( 'modResource.template:=' => 4 ) ); } else { $string = array( 'modResource.template:=' => 4 ); } if ($_GET['cat'] != 0) { if ($_GET['cat']!=5046){ $cat = $_GET['cat']; $categories = array( 'AND:modResource.parent:=' => $cat ); } else { $cat = array(5030,5031,5032,5037,5038,5039,5040,5041); $categories = array( 'AND:modResource.parent:IN' => $cat ); } } else { $categories = array( ); } if ($_GET['tag'] != '0') { $tag = $_GET['tag']; $tags = array( 'AND:TAG.tmplvarid:=' => 1, 'AND:TAG.value:LIKE' => '%' . $tag . '%' ); } else { $tags = array( ); } $pdoWhere = ''; $sortby = 'createdon'; switch ($_GET['searchlast']) { case 0: $query->sortby('modResource.createdon', 'ASC'); $sortby = 'createdon'; $rating = array(); break; case 1: $rating = array( 'AND:RATING.tmplvarid:=' => 43 ); $query->sortby('RATING.value', 'DESC'); $sortby = 'HitsPage'; break; case 2: $rating = array(); $sortby = 'starSum'; break; case 3: $rating = array(); $pdoWhere = '{"atention:=":"1"}'; break; } $where = array_merge($string, $categories, $tags, $rating); $query->distinct(); $query->where($where); $query->prepare(); $query->stmt->execute(); $res = $query->stmt->fetchAll(PDO::FETCH_COLUMN, 0); $ids = implode(',', $res); //$raw = $query->toSQL(); //return $raw; if (($ids!='')){ $output = $pdo->runSnippet('pdoPage', array( 'parents' => '5009', 'limit' => 15, 'hideContainers' => 1, 'pageLimit' => 11, 'tplPageWrapper' => '@INLINE {$prev}{$pages}{$next}', 'tplPageActive' => '@INLINE <li><span class="pagenav">{$pageNo}</span></li>', 'tplPage' => '@INLINE <li><a href="{$href}" class="pagenav">{$pageNo}</a></li>', 'tplPagePrev' => '@INLINE <li class="pagination-prev"><a href="{$href}">Назад</a></li>', 'tplPageNext' => '@INLINE <li class="pagination-next"><a href="{$href}">Вперед</a></li>', 'tplPagePrevEmpty' => '@INLINE <li class="pagination-prev"><span class="pagenav">Назад</span></li>', 'tplPageNextEmpty' => '@INLINE <li class="pagination-next"><span class="pagenav">Вперёд</span> </li>', 'resources' => $ids, 'includeTVs' => 'HitsPage,isVideo,starSum,atention', 'where' => $pdoWhere, 'sortby' => $sortby, 'sortdir' => 'DESC', 'prepareTVs' => 1, 'processTVs' => 1, 'tpl' => '@FILE:chunks/infocenter/search.row.tpl' )); $output .= '<div class="k2Pagination"> <ul> {$_modx->getPlaceholder("page.nav")} </ul> <div class="clr"></div> </div>'; } else { $output = '<h3>Ничего не найдено. Попробуйте упростить запрос</h3>'; } return $output; Вопросы / Tickets + SimpleSearch 4 0 1
[Решено] Обновление MODX 3.2.2 компонент FetchIt ломает сайт PHP 8.3 Второй стенд: PHP 8.1 MODX 3.0.5 FetchIt 3.1.2 FormIt 5.0.1 Результат тот же: При обновлении Formit до 5.2.4 фронтенд падает. При отключении сниппетов FetchIt — работоспособно...
Плагин EnvBadge: визуальный индикатор окружения в админке MODX3 Расскажите пожалуйста как вы настраиваете сайт на MODX 3 чтобы был dev, prod, stage. Можете описать workflow? Допустим у меня 80% — это магазины, там клиенты, продажи, все онлай...
MaxNotify Обновление компонента 1.3.0-pl (22.07.2026) — добавлено автоматическое получение полей через msOrder->toArray(); — массивы и объекты безопасно пропускаются; — стандартные...
MyFavorites MyFavorites — 3.0.0-beta Первая версия для MODX Revolution 3.x — компонент полностью переписан с нуля (PHP >= 8.4, namespaced-ядро MODX 3, PSR-4, сервис-ориентированная архит...
mxBoard: канбан-доска для команд, людей и ИИ-агентов в MODX 3 Для начала перейдем на Markdown, а дальше будет видно
MaxNotify3 Вышло обновление 1.3.0-pl (20.07.2026) — добавлены уведомления о заявках FormIt через hook-сниппет maxNotify3FormIt; — добавлены уведомления о заявках SendIt через hook-с...
Что нужно сделать, пошагово:
Создаем index файл для обработки запросов
Создаем контроллер: пример файла контроллера для получения способов оплаты из minishop
В конфиге nginx прописываем вот так:
Обащение происходит
Вернет массив данных в json формате
Код выше выдернуть из рабочего проект, кое где кое что убрал, так что с первого раза может не запустить.
Дальше уже включаем фантазию и разбираемся с классом rest.modRestService
И тут вот чтобы не ошибатся
yadi.sk/i/MyAlG1dNdIEOWQ
MyController — это название основного префикса? и прописывается он в rest/index.php
То есть если у вас контроллер называется вот так resource то класс для него будет
Кстати контроллер работает имено в связке vue с modx
В качестве хука email выступает метод email() класса fiHooks. Расположен он в файле formit/model/formit/fihooks.class.php.
Fenom выдаст ошибку компиляции.
Здесь, как видно, еще и замена контента на свой идёт, на лету.
Можно так на лету и виртуальные ресурсы делать, со своими pagetitle и прочими свойствами. При желании, можно вообще весь сайт без ресурсов сделать =)
Ну, контексты здесь больше не для визуального разграничения, а для того, чтобы менеджерам не мозолить глаза техническими страницами (контекст для них спрятан).
По виджетам тоже настройка довольно простая, вроде даже рассказывать нечего… Разве только дефолтный shopStats переписан.
Если есть какой-то конкретный вопрос по модулю — спрашивайте, расскажу.)
Из интересного там, на мой взгляд, комплексный маршрутизатор характеристик — т.к. ассортимент товаров разнообразный, вставал вопрос с отображением в списках товаров только нужных параметров, при этом не плодя под каждый вариант свой чанк/шаблон/категорию. В итоге все удалось решить при помощи 1 плагина + селектора для категории.
Ну да тут в двух словах не описать.
Надеюсь, как закрою большую часть проектов, доберусь написать какой-нибудь комплексный гайд по созданию сайта, с учетом fenom-a и относительно свежих решений..)
— если вам необходимо добавить страницы пользователей в sitemap, то это можно сделать в рамках pdoUsers
— если вам необходимы динамичные заголовки и мета-теги, то можно сделать примерно так:
1. В плагине создаем плейсхолдер user_id
2. В мета-тегах проверяем его наличие:
— надеюсь логика понятна..)
Что же до примера со вторым вариантом, то примерно вот так:
1. Создание страницы пользователя (тикетом)
2. Синхронизируем данные (в одну сторону — от пользователя к странице). Соответственно, если есть потребность редактировать поля пользователя из админки через его страницу, потребуется еще один плагин.
написал, как и предложил Олег в комментарии выше, заполнение параметров в WHERE в pdoResources. Можно попробовать сделать примерно такое же, только для Tickets.
Код конечно, так себе, но работает неплохо. Из 4000 ресурсов выборка идет довольно быстро.