Александр Туниеков

Александр Туниеков

Был в сети 9 часов назад
Заказы принимаю
2. А я добавил исключение
preg_match('/DISTINCT/i',
                        $fields)
В блоке
if ($fields == 'all' || $fields == '*' || empty($fields)) {
                        $fields = $this->modx->getSelectColumns($class, $alias);
                    } elseif(preg_match('/DISTINCT/i',
                        $fields)){
                    }else {
                        $fields = $this->modx->getSelectColumns($class, $alias, '',
                            array_map('trim', explode(',', $fields)));
                    }
3.
Это чудит xPDO.
В курсе. Если select строка, xPDO разбивает select по запятым и затем решает, что 1 это колонка и ставит апострофы.
Блок
if (is_string($fields) && strpos($fields, '(') !== false) {
                    // Commas in functions
                    $fields = preg_replace_callback('/\(.*?\)/', function($matches) {
                        return str_replace(",", "|", $matches[0]);
                    }, $fields);
                    $fields = explode(',', $fields);
                    foreach ($fields as &$field) {
                        $field = str_replace('|', ',', $field);
                    }
                    $this->query->select($fields);
                    $this->addTime('Added selection of <b>' . $class . '</b>: <small>' . str_replace('`' . $alias . '`.',
                            '', implode(',', $fields)) . '</small>', microtime(true) - $time);
                }
вообще не был бы нужен, если бы XPDO не чудила.

Но так как запрос простой и без логики, я бы не стал вообще использовать xPDO, а сделал бы маленький и лёгкий запрос (без кучи объектов xPDO)
У меня pdoTools в компонентах используется, чтобы изменить запрос не трогая сам компонент. Например из excelconvertrule
{
    "class": "MaterialZakupList",
    "leftJoin": {
        "MaterialZakup": {
            "class": "MaterialZakup",
            "on": "MaterialZakup.id = MaterialZakupList.order_id"
        },
        "gtsBAccount": {
            "class": "gtsBAccount",
            "on": "gtsBAccount.id = MaterialZakup.account_id"
        },
        "raschetsMaterial": {
            "class": "raschetsMaterial",
            "on": "raschetsMaterial.id = MaterialZakupList.mat_id"
        },
        "Orgs": {
            "class": "Orgs",
            "on": "Orgs.id = MaterialZakup.org_id"
        }
    },
    "select": {
        "MaterialZakupList": "*",
        "Orgs": "Orgs.shortname",
        "gtsBAccount": "gtsBAccount.label as account",
        "raschetsMaterial": "IF(MaterialZakupList.prihod_date IS NULL,'в дороге','получено') as status1,IF(MaterialZakupList.type_id = 3,raschetsMaterial.name,MaterialZakupList.tovar) as tovar1,raschetsMaterial.type,raschetsMaterial.metall,raschetsMaterial.ed_izm",
        "MaterialZakup": "MaterialZakup.date,MaterialZakup.document"
    },
    "sortby": {
        "MaterialZakupList.id": "ASC"
    }
}
При экспорте в excel без правок pdoTools на строке
IF(MaterialZakupList.prihod_date IS NULL,'в дороге','получено')
'в дороге' обрамляется апострофами.
Отправил соточку :). С наумкиным не сложилось PR отправлять. Ошибки в pdoTools такие: кавычки неправильно ставит собака. Часто подсчет строк в кавычках, на функциях и where может неправильно кавычки поставит. Как вспомню где именно так отправлю Issues. В моей версии pdoTools они поправлены. Хотя и костылями.
Ну вот :-(. На боевом сайте сразу тестировать не стоит. Надо копию, чтоб все обкатать можно было. У меня на локалке, после переноса с боевого, до всякого кеширования, сразу время работы с 4 секунд до минуты подлетело. Сейчас хотелось бы вне виндоус локалки протестировать. Можите все-таки сделать копию, чтоб не на локалке протестировать можно было?
Вообщем победил кеширование :-).
{'!mFilter2' | snippet : ['cacheTime'=>3600]}
Параметр cacheTime на 3600 включает кеширование запросов в базу. В mFilter2 кеширование не доработано. Сейчас 8 часов возился и сделал. Нужно заменить код файла core/components/msearch2/model/msearch2/msearch2.class.php кодом из
https://gist.github.com/touol/a1c46d7fd199c0889c361c4075c28d39
К сожалению, не правя компонент, не исправишь кеширование.
На виндоус локалке при кешировании время ответа на категории с 4000 товаров сокращается с 30-60сек до 3-8сек со включенными подсказками. На боевом сайте не тестировал.
Можите попробовать у себя.
Можно еще ускорить вывод страницы кешируя сам выводmfilter2. Но это если договоримся по работе. Если что мой час стоит 600р.
Я нашел тяжелый сайт уже :-). Не настолько тяжелый как у вас, но 4000 товаров в категории есть. В mfilter2 есть встроенное кеширование, но оно не работает. Сейчас вожусь пробую его завести. Копия на локалке без кеша отрабатывает 30с, а с кешем 3с. Но сейчас сама фильтрация не заводиться. Как победю напишу.
А после загрузки страницы фильтр быстро работает?
Мы как-то кешировали вывод mfilter2 на страницу. Страницы тогда грузились быстро, но если нажать что-нибудь в фильтре то все равно фильтр за 3 секунды только отрабатывал. Если что компонент что делали могу поискать и скинуть.
Посмотрел сайт. Фильтрация тоже 12с у вас занимает. Так что кешеровать только вывод не решит проблему. mfilter2 на больших сайтах тупит. Надо его переделывать как-нибудь
Ты либо между строк читаешь, либо тебе буквально на пальцах все нужно объяснять.
Ну значит ты не четко выразился. Взять из build.php, вставить в ресолвер, и дописать к нему сохранение…
вставить в ресолвер — пропустил, и твое предложение не однозначно читается.
Так зачем было заливать компонент, чтобы каждый его настраивал потом самостоятельно, просто дал бы ссылку на гит и все, и вопросов не было.
Уговорили. Убрал с модсторе. Пусть гит юзают.
А вообще, компонент может стать и нужным, если его довести до ума. Но, это уже твое дело.
Проблема в верстке. Её же универсальной не сделаешь :-(