Андрей Степаненко · 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
mxApi — быстрый внешний API для MODX Revolution • зафиксировать публичный контракт EndpointInterface / метаданных по semver, чтобы наш провайдер не ломался на обновлениях;Фактически это уже так, beta стоит просто на всякий случа...
Как я использую mxBoard для работы с ИИ-агентами зачем здесь MODXДа собственно ни зачем. Просто Modx рабоатет на любом шаред-хостинге и для меня это самый знакомый стэк. Я рассматривал вариант взять что-то готовое, но счёл развёр...
YaSmartCaptcha - защитите ваши формы от спама умной капчей от Яндекс Вообще не понял о чем речь) В системной настройке service_js сейчас указана ссылка smartcaptcha.cloud.yandex.ru/captcha.js Я предложил очистить эту настройку, тогда компонент н...
mxBackup — обезличенные копии MODX в пару кликов Ещё нет, я там разом почти полтора десятка пакетов выложил модератор, вероятно, а шоке.
Gallery3x 3.4.0 - вставка галерей прямо из визуального редактора (CKEditor и TinyMCE RTE) Здравствуйте. Есть консольный скрипт Вот почитайте: docs.ivan345.com/books/gallery3x/page/import-ms2galleryphp
[mSync] Новая версия синхронизации с 1С Всем привет. В какой то момент начали сыпаться ошибки: Error 23000 executing statement: INSERT INTO `modx_msync_products` (`product_id`, `uuid_1c`) VALUES ...
Checkbox для модального окна Они не отключены, они платные, чтобы писали только те, кому действительно очень надо. Когда бесплатно люди начинают думать, что я им должен.
Что нужно сделать, пошагово:
Создаем 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 ресурсов выборка идет довольно быстро.