Fi1osof · 01 декабря 2016, 16:53 Лучше все-таки удалять средствами самого MODX, так как как правило нужные зависимости прописаны и связанные объекты удаляются автоматом. В phpMyAdmin вы можете просто пропустить связанные объекты. Ваша проблема сейчас связана с тем, что MODX просто не может получить весь объем документов из-за нехватки времени и/или памяти. Сделайте так: в консоли пропишите такой код: ini_set("max_execution_time", 0); ignore_user_abort(true); $q = $modx->newQuery("modResource", array( "deleted" => 1, )); print "<br />Документов на удаление: " . $modx->getCount("modResource", $q); $q->limit(10); foreach($modx->getIterator("modResource", $q) as $doc){ $doc->remove(); } print "<br />Удалено";Выполняйте, пока не будут удалены все документы. Лимит сами скорректируйте исходя из того, как быстро будет выполняться скрипт. Не забывайте предварительно сделать бэкап базы данных. Вопросы / Как удалить все товары и опции 6 +1 1
gg- · 29 ноября 2016, 17:24 В общем решение оказывается на поверхности. Переменная передается в расширенный шаблон, но закинуть ее в условие не получается. В итоге блок с переменными ставим в каждый шаблон. Меняем его по желанию. И условия начинают работать. {extends 'template:Base'} {block 'vars'} {var $city = '[[#COOKIE.city]]'} {/block} Вопросы / В расширенных шаблонах не работают условия fenom 5 +1 1
Володя · 29 ноября 2016, 14:03 вы выводите ресурс, значит и нужно проверять есть ли такой в наличии. if (!$modx->getCount('modResource', array('alias'=>$alias))) { $modx->sendErrorPage(); } Новые дополнения и их версии / [VirtualPage] - Виртуальные страницы. 183 0 1
Марат Марабар · 27 ноября 2016, 17:37 Полученный чанк при ajax-запросе нужно распарсить, допустим в своём классе это можно сделать так: private function getParserTag($content) { $maxIterations = (integer) $this->modx->getOption('parser_max_iterations', null, 10); $this->modx->getParser()->processElementTags('', $content, false, false, '[[', ']]', array(), $maxIterations); $this->modx->getParser()->processElementTags('', $content, true, true, '[[', ']]', array(), $maxIterations); return $content; } Вопросы / Аякс получение данных. 6 +1 2
Дмитрий · 27 ноября 2016, 17:36 Пример ajax.php, который использую в последних проектах. Работает исправно, все парсится и работает. <?php define('MODX_API_MODE', true); require 'index.php'; //подключаем pdoTools $pdo = $modx->getService('pdoTools'); // Откликаться будет ТОЛЬКО на ajax запросы if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') { return; } // Сниппет будет обрабатывать не один вид запросов, поэтому работать будем по запрашиваемому действию // Если в массиве POST нет действия - выход if (!empty($_POST['action'])) { switch ($_POST['action']) { case 'snippetName': $tvs = $_POST['tvs']; if (!empty($tvs)) { $res = $pdo->runSnippet('@FILE snippets/snippetName.php', array('tvs' => $tvs)); } if (empty($res)) { $res = 'Подходящих записей не найдено. Попробуйте упростить параметры поиска'; } break; } } else { return; } if (!empty($res)) { die($res); } Вопросы / Аякс получение данных. 6 0 3
Воеводский Михаил · 26 ноября 2016, 09:15 2) Это ошибка MS2 при сохранении свойств доставки. Когда-то столкнулся, но PR не подготовил, причин уже не помню. Надеюсь, Василий добавит исправление в MS2. В файлах /core/components/minishop2/processors/mgr/settings/delivery/create.class.php и /core/components/minishop2/processors/mgr/settings/delivery/update.class.php блок foreach ($prices as $field) { if ($tmp = $this->getProperty($field)) { $tmp = preg_replace(array('#[^0-9%\-,\.]#', '#,#'), array('', '.'), $tmp); if (strpos($tmp, '%') !== false) { $tmp = str_replace('%', '', $tmp) . '%'; } if (strpos($tmp, '-') !== false) { $tmp = str_replace('-', '', $tmp) * -1; } if (empty($tmp)) { $tmp = 0; } $this->setProperty($field, $tmp); } }необходимо заменить на следующий: foreach ($prices as $field) { if ($tmp = $this->getProperty($field)) { $isPercent = false; $tmp = preg_replace(array('#[^0-9%\-,\.]#', '#,#'), array('', '.'), $tmp); if (strpos($tmp, '%') !== false) { $tmp = str_replace('%', '', $tmp) . '%'; $isPercent = true; } if (strpos($tmp, '-') !== false) { $tmp = str_replace('-', '', $tmp) * -1; if ($isPercent) { $tmp .= '%'; } } if (empty($tmp)) { $tmp = 0; } $this->setProperty($field, $tmp); } }После этого минусовой процент начнет правильно сохраняться, а обработка такого значения в остальных местах происходит корректно. Вопросы / Пара вопросов по miniShop2 5 +3 4
Виталий Греков · 26 ноября 2016, 00:49 Попробуйте вот этот lmims Вопросы / Проблема с настройкой last-modified на modx Revo. 3 +1 1
Володя · 14 ноября 2016, 23:10 так я не предлагаю вам делать выборки по 5 ресурсов. Подберите то кол-во который ваш хостинг нормально обработает, например по 5000 шт. Указываете в роботс главный файл который выглядит примерно так <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemap> <loc>http://site.ru/sitemap1</loc> </sitemap> <sitemap> <loc>http://site.ru/sitemap2</loc> </sitemap> <sitemap> <loc>http://site.ru/sitemap3</loc> </sitemap> </sitemapindex>в каждом из них вызов pdoSitemap. вроде ничего сложного? Вопросы / Автоматически разбивать sitemap.xml на файлы 6 +3 4
Василий Наумкин · 12 ноября 2016, 10:27 Покопался в исходниках и написал пока такой фикс xPDO::getCriteria(): public function getCriteria($className, $type = null, $cacheFlag = true) { $c = $this->newQuery($className); $c->cacheFlag = $cacheFlag; if (!empty($type)) { if ($type instanceof xPDOCriteria) { $c->wrap($type); } elseif (is_array($type)) { $tmp = array(); array_walk_recursive($type, function ($v, $k) use (&$tmp) { if (!is_numeric($k)) { $tmp[$k] = $v; } }); if (count($tmp)) { $c->where($tmp); } } elseif (is_scalar($type)) { if ($pk = $this->getPK($className)) { $c->where(array($pk => $type)); } } else { $c->where($type); } } return $c; }Это запрещает все запросы на получения объекта xPDO произвольным SQL запросом. Можно использовать либо первичные ключи, либо массивы с прописанными ключами, которые будут проверены при запросе. По моим тестам работает хорошо, желающие могут проверить на себе — это файл core/xpdo/xpdo.class.php. Предложил код автору xPDO, буду ждать ответа. Безопасность / Критическая уязвимость в MODX Revolution 340 +9 4
Андрей · 31 октября 2016, 23:58 Массив только лучше задавать так: {set $a = ["5","8","9"]} {if $_modx->resource.parent in list $a} ..... {/if} Вопросы / Fenom + pdoMenu и динамический parent 3 +2 3
Плагин 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-с...
Fi1osof·Ваша проблема сейчас связана с тем, что MODX просто не может получить весь объем документов из-за нехватки времени и/или памяти.
Сделайте так: в консоли пропишите такой код:
Выполняйте, пока не будут удалены все документы. Лимит сами скорректируйте исходя из того, как быстро будет выполняться скрипт.
Не забывайте предварительно сделать бэкап базы данных.
Переменная передается в расширенный шаблон, но закинуть ее в условие не получается. В итоге блок с переменными ставим в каждый шаблон. Меняем его по желанию. И условия начинают работать.
Работает исправно, все парсится и работает.
В файлах /core/components/minishop2/processors/mgr/settings/delivery/create.class.php и /core/components/minishop2/processors/mgr/settings/delivery/update.class.php блок
необходимо заменить на следующий:
После этого минусовой процент начнет правильно сохраняться, а обработка такого значения в остальных местах происходит корректно.
в каждом из них вызов pdoSitemap.
вроде ничего сложного?
Это запрещает все запросы на получения объекта xPDO произвольным SQL запросом. Можно использовать либо первичные ключи, либо массивы с прописанными ключами, которые будут проверены при запросе.
По моим тестам работает хорошо, желающие могут проверить на себе — это файл core/xpdo/xpdo.class.php. Предложил код автору xPDO, буду ждать ответа.