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

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

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
21 августа 2021, 10:30
0
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,'в дороге','получено')
'в дороге' обрамляется апострофами.
Александр Туниеков
17 августа 2021, 19:37
+1
Отправил соточку :). С наумкиным не сложилось PR отправлять. Ошибки в pdoTools такие: кавычки неправильно ставит собака. Часто подсчет строк в кавычках, на функциях и where может неправильно кавычки поставит. Как вспомню где именно так отправлю Issues. В моей версии pdoTools они поправлены. Хотя и костылями.
Александр Туниеков
17 августа 2021, 19:27
0
Всем кому интересно. Где-то неверно скопировали. Сам применил и все заиграло как надо :-).
Александр Туниеков
17 августа 2021, 17:37
0
Ну вот :-(. На боевом сайте сразу тестировать не стоит. Надо копию, чтоб все обкатать можно было. У меня на локалке, после переноса с боевого, до всякого кеширования, сразу время работы с 4 секунд до минуты подлетело. Сейчас хотелось бы вне виндоус локалки протестировать. Можите все-таки сделать копию, чтоб не на локалке протестировать можно было?
Александр Туниеков
17 августа 2021, 16:43
0
Параметр cacheTime на 3600 включает кеширование запросов в базу
Параметр cacheTime больше 0 включает кеширование запросов в базу. 3600 это час жизни кеша.
Чтот косноязычно выражаюсь :-).
Александр Туниеков
17 августа 2021, 13:06
2
+1
Вообщем победил кеширование :-).
{'!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р.
Александр Туниеков
17 августа 2021, 10:59
0
Я нашел тяжелый сайт уже :-). Не настолько тяжелый как у вас, но 4000 товаров в категории есть. В mfilter2 есть встроенное кеширование, но оно не работает. Сейчас вожусь пробую его завести. Копия на локалке без кеша отрабатывает 30с, а с кешем 3с. Но сейчас сама фильтрация не заводиться. Как победю напишу.
Александр Туниеков
17 августа 2021, 03:50
0
Хотел разобраться, где mfilter2 тупит на больших сайта, но нет под рукой большого сайта примера. Можите сделать копию сайта и скинуть мне доступ?
Александр Туниеков
17 августа 2021, 03:26
0
А после загрузки страницы фильтр быстро работает?
Мы как-то кешировали вывод mfilter2 на страницу. Страницы тогда грузились быстро, но если нажать что-нибудь в фильтре то все равно фильтр за 3 секунды только отрабатывал. Если что компонент что делали могу поискать и скинуть.
Посмотрел сайт. Фильтрация тоже 12с у вас занимает. Так что кешеровать только вывод не решит проблему. mfilter2 на больших сайтах тупит. Надо его переделывать как-нибудь
Александр Туниеков
05 июля 2021, 11:17
0
1 Страница теста, скрытая из меню. На нее поместите
[[!UserTest? &answer_page_id=`22`]]
Александр Туниеков
04 июля 2021, 02:06
0
Да ресолвер лучше. Просто не приходилось ресурсы в пакет запихивать и сомнения обуяли :-)
Александр Туниеков
04 июля 2021, 02:03
0
Ну опыт сын ошибок… В следующий раз буду знать, что ресурсы лучше ресолвером создавать. Как-то не приходилось ресурсы в пакет включать.
Александр Туниеков
04 июля 2021, 01:28
0
Ты либо между строк читаешь, либо тебе буквально на пальцах все нужно объяснять.
Ну значит ты не четко выразился. Взять из build.php, вставить в ресолвер, и дописать к нему сохранение…
вставить в ресолвер — пропустил, и твое предложение не однозначно читается.
Александр Туниеков
04 июля 2021, 00:58
0
Так зачем было заливать компонент, чтобы каждый его настраивал потом самостоятельно, просто дал бы ссылку на гит и все, и вопросов не было.
Уговорили. Убрал с модсторе. Пусть гит юзают.
А вообще, компонент может стать и нужным, если его довести до ума. Но, это уже твое дело.
Проблема в верстке. Её же универсальной не сделаешь :-(
Александр Туниеков
04 июля 2021, 00:53
0
И что? Пусть ресурсы создаются с правильным id, а во всех чанках вместо
[[~103]]
указываем переменную и потом при создании чанка меняем переменную на нужный тег. Главное чтобы ресурсы создавались первыми.
Вот это все не понял. В смысле с правильным id? Это с каким?
Александр Туниеков
03 июля 2021, 23:53
0
Ну от вас такого не ожидал О_О.
Build.php только создает vehicle файл в транспортный пакет. И при установке из vehicle ресурсы создаются установщиком MODX без участия какого-то моего кода. Конечно можно написать ресолвер, который после установки выловит id ресурсов по их алиас, и записать их в системные настройки, но еще надо будет опять же ресолвером установить родителей ресурсов.
Не такой уж и важный пакет чтоб этим заморачиваться. Я на тестах его использую, а для заказчиков обычно Office ставлю.
Александр Туниеков
03 июля 2021, 23:38
0
Расскажешь, что проблемного в том, чтобы взять кусок кода из build.php, отвечающий за создание ресурсов, и дописать к нему сохранение id хоть в свою таблицу, хоть в системные настройки?
Ну ну :-). Вообще-то build.php только собирает транспортный пакет и при установке пакета (при создании ресурсов) никак не выполняется. Так что твое предложение лажа :-).
но у новичков с ним возникнет больше головной боли, чем пользы
Новичкам, наверно, полезно самим настроить login, а не через пакет. И только потом решать пользоваться пакетом или нет.
Вообще мне при создании тестовых сайтов и своих требуется авторизация и каждый раз ее с нуля поднимать геморойно. А пакетом быстро поставил и тестируй дальше.
Александр Туниеков
03 июля 2021, 20:36
-2
В чем проблема создать эти ресурсы и сохранить их id динамически, это непосильная задача?
Это проблемная задача. Если хочешь реши ее и всем будет счастье :-). Вообще тон твоего комментария вызывает впечатление, что тебе лишбы погавкать :-). Извиняюсь конечно за прямоту, но вот такое впечатление у меня.
Александр Туниеков
03 июля 2021, 20:30
0
pdoTools просто чтоб был. Мне он нужен. А Theme.Bootstrap — это готовая верстка шаблона. В личный кабинет подтягивается шаблон из Theme.Bootstrap и под него верстка чанков Login делается. Без Theme.Bootstrap компонент вообще нельзя было бы написать. Проблема в том какую верстку под страницы писать.
для универсального использования (что как бы подразумевается для пакетов)
Такой пакет как этот нельзя сделать для универсального использования. На каждом сайте своя верстка.