Громов Антон

Громов Антон

С нами с 20 июня 2015; Место в рейтинге пользователей: #421

Оптимизации и тонкости работы с БД для больших магазинов на MODX Revolution

Небольшое вступление

Данная статья не претендует на универсальное решение. Всегда пользуйтесь собственной головой. Всё описанное ниже актуально для MODX Revolution 2.8.3-pl, miniShop2 2.9.1-pl.

wfoojjaec
16 сентября 2021, 19:09
modx.pro
31
2 893
+26

Быстрый AJAX поиск для pdoPage

Добрый день.

Подскажите, пожалуйста, есть ли быстрый ajax поиск по типу как в datatables.net/, но для работы в связке с pdoPage?

Планируется выводить более 30000 записей и подобный поиск очень бы пригодился.
Сергей
11 июня 2021, 18:31
modx.pro
2
714
0

[СДЕЛАЙ САМ] mFilter2 фильтрация по диапазону дат.

Приветствую, к сожалению не нашёл приемлемого для себя решения данной задачи поэтому «написал» своё, в кавычках потому что немного подправил. На мой взгляд очевидно, что дата это число, а в mFilter2 есть фильтрация по диапазону чисел, значит нужно превратить дату в число. Чтобы при обновлении компонента ничего не сломалось, создадим свой класс фильтрации customfilter.class.php в папке core/components/msearch2/custom/filters/, потом прописываем в системную настройку mse2_filters_handler_class = CustomFiltersHandler
Артур Шевченко
29 марта 2021, 00:14
modx.pro
9
1 272
+8

Магазин на 500 000+ товаров

Добрый день.
Есть задача сделать магазин на 570 000 товраов.
Товары простые — у них почти нет свойств, кроме изображения, описания и цены.

Первая проблема — это напролнение.
Модуль Импорт/Экспорт вешается. По моим расчетам ему надо 3-4 недели чтобы все загрузить )))

Это решилось импортом напрямую через запрос в БД. Слава mysql и после импорта 4 таблиц все товары на месте примерно за 15-20 минут.

Но начинается новый прикол, что до 300 000 товаров сайт еще более-менее живой и время отклика «около вменяемое» порядка 1000-1500 м/сек.

Но как только мы переваливаем за 400 тыс, время отклика уходит в 3-5 м/сек, а после 500 000 товаров доходит до 7 м/сек.
А в некоторых случаях сайт просто начинает отдавать 500 ошибку прямо с главной страницы.

Как быть с таким количеством наименований?
это просто магазин крепежа — куча разных винтиков разного размера и разной фасовки.

Тут нет модификаций, нет связей, один товар — одна категория.
yuri
19 марта 2021, 13:41
modx.pro
1
848
0

Кэширование данных

Добрый день,
делаю кэширование данных
$cacheName = "cachename";
$output = $modx->cacheManager->get($cacheName);
if (empty($output))
{

...

$modx->cacheManager->set($cacheName, $output, 8640000);
}
return $output;
Все работает, кэш сохраняется в core/cache/default/. при сохранении страниц, кэш не очищается, очищается только при выборе меню Управление->Очистить кэш.
Но еще он очищается при сохранении любого чанка, сниппета и т.п.
Можно как-то сохранять кэш, чтобы он не очищался при редактировании чанков/сниппетов. Но чистился при очистке всего кэша?
Аркадий
08 февраля 2021, 16:26
modx.pro
2
908
0

[СДЕЛАЙ САМ] Поиск на сайте по-быстрому

ВАЖНО!!!

Данное решение не является учебным и рекомендуется к использованию только на собственных проектах, с целью освоения работы с api modx. Для изучения лучших практик, анализируйте код дополнений с сайта https://modstore.pro/

Я знаю, что есть два отличных компонента для организации поиска по сайту это SimpleSearch, который по-моему не работает с чанками на fenom, и mSearch2, который платный и большой. В связи с этим я решил написать свой вариант поиска — максимально простой и понятный, да неуниверсальный, но позволяющий по нескольким ключевым словам найти нужный ресурс. По сути это форма. которая через ajax отправляется на сервер, где формируется sql-запрос в БД и результат возвращается на фронт. Итак перейдём к коду.
Артур Шевченко
22 января 2021, 21:08
modx.pro
5
2 792
+10

Управления плагинам minishop2 или добавление полей в ms2_products через компонент [msAddField]

Все давно уже познакомились с методом добавления полей через плагины который написал Василий еще в каком то 17 или 2018 году, может раньше

Давно уже написал класс для управления полями через мой компонент который так и не представился миру msCml (синхронизация 1С с характеристикам msOptionsPrice2).

На этих выходных все таки дошли руки и собрал таки компонент msAddField (пока только на github, для самых маленьких))))): там же ссылка на яндекс диск)
Андрей Степаненко
13 октября 2020, 17:11
modx.pro
30
4 618
+22

Модуль оплаты для сервиса Яндекс.Касса по новому протоколу

Всем привет!
Возникла необходимость написать собственный модуль оплаты по Яндекс.Кассе, набросал за пару дней — делюсь.
Дмитрий
12 сентября 2020, 14:07
modx.pro
8
1 325
+12

Выдаем вместо кэша html файлик

Предыстория. Возник такой вопрос. Есть какой то сайт, и в нем получается в каталоге было так. В вызов mFilter2 вложено в чанк еще парочка вызовов msProducts ну и так далее. В итоге, раздел грузился за овер 10 секунд. Да, сейчас напишите, что вот надо оптимизировать. Это понятно, но я решил подойти с другой стороны.
Итак, идея была такая, что бы вместо кэша выдавать уже готовую разметку целой страницы.
В итоге, у нас есть плагин:
<?php
switch($modx->event->name){
    case 'OnWebPagePrerender':
        // Тут просто условие, чтобы срабатывал только на категории (можно по сути задавать разные условия)
        if($modx->resource->class_key != 'msCategory'){
            return;
        }
        //Забираю отрендеренный ресурс
        $_output = &$modx->resource->_output; //Забираю отрендеренный ресурс
        // Создаю файлик разметки этого ресурса (можно по сути указать любой путь и так далее, сейчас и так сойдет)
        $file = MODX_BASE_PATH . 'resourcecache/' . $modx->resource->uri . '/' . $modx->resource->id . '.txt';
        if(is_file($file)){
            // Если такой файлик уже существует, то просто отдаю его содержимое
            $output = file_get_contents($file);
        }else{
            // Если файлика нету, то записываю туда отрендеренную страницу
            $cache = $modx->getCacheManager();
            $cache->writeFile($file, $_output);
            $output = $_output;
        }
        
        // Подменяю вывод на готовый
        $modx->resource->_output = $output;
        
        break;
        
    case 'OnLoadWebPageCache':
        // Это событие срабатывает до рендера страницы, оно проверяет, есть ли кэш страницы, и если он есть...
        $file = MODX_BASE_PATH . 'resourcecache/' . $modx->event->params['resource']->uri . '/' . $modx->event->params['resource']->id . '.txt';
        
        //...мы проверяем файлик, так как страница уже грузилась и файлик есть и подменяем кэш на содержимое неашего файлика.
        if(is_file){
            $modx->event->params['resource']->_content = file_get_contents($file);
        }
        
        break;
}
Итог, раздел грузился за 10 секунд (ну да, такой раздел, идея в другом), после плагина уже за 0.006 секунды, так как выдается готовая разметка.
Вопрос знатокам, на сколько такой подход вообще жизнеспособный по отношению к системе? Очень бы хотелось услышать комментарии.

Спасибо за донаты:
@Павел Бигель
Михаил
20 февраля 2020, 10:55
modx.pro
11
1 415
+16

Выведение опций товара по категориям

Сниппет msProductOptions выводит товары общим массивом. В принципе, никто не запрещает в чанке вывода делать с этим массивом всё что угодно, в том числе и делить по категориям. Однако всё чаще поступает запрос от клиента не только вывести категории, но и соблюсти их сортировку.

Для этих целей мне пришлось msProductOptions переписать. Мой вариант сниппета воспроизводит запрос msProductData::loadOptions с сортировкой по полю rank категории, затем группирует все опции по категориям с соблюдением сортировки самих опций.
mngatoff
24 ноября 2019, 06:44
modx.pro
8
2 640
+6