Андрей Степаненко

Андрей Степаненко

С нами с 28 октября 2014; Место в рейтинге пользователей: #7
23 марта 2020, 15:12
0
Я к тому что ничего пришло
prnt.sc/rl5gmk
23 марта 2020, 09:57
0
Если не секрет, куда донатил?))))))
18 марта 2020, 13:48
0
Нет, они отображаются если в корне есть директория Extras/mycomponent/
Там обычная проверка файла идет file_exits.
18 марта 2020, 11:41
0
а ну вот и проблема с ним.
Вообще вот здесь все происходит
prnt.sc/ri8x24

core/xpdo/transport/xpdovehicle.class.php 187 строка
18 марта 2020, 11:22
0
Собственно назревает вопрос, что нужно сделать, чтобы после удаления компонента папка с шаблонами не тёрлась?
// Files resolvers
        $vehicle->resolve('file', [
            'source' => $this->config['core'],
            'target' => "return MODX_CORE_PATH . 'components/';",
            xPDOTransport::RESOLVE_FILES_REMOVE => false
        ]);
вот эта опция, только надо проверить, помню с ней какая та проблема была!
18 марта 2020, 05:22
1
+6
Может пригодиться моя сборка modExtra
github.com/webnitros/siteDev/tree/master/core/components/sitedev/Extras/modExtra

Еще считаю полезно прицепить вот такие кнопки

А то вспоминать откуда у тебя компонента скачивается, постоянное мучение.

Ссылка на то как кнопки добавить:
https://github.com/webnitros/siteDev/blob/103270a49c69539d934bafc4ff9f9891dde7a684/core/components/sitedev/Extras/modExtra/core/components/modextra/controllers/home.class.php#L91

Можно конечно в какой нибудь плагин завернуть, но я не стал заморачиваться, добавил их в контроллер с проверкой на существования папки Extras/myComponent, в случае если папка существует то кнопки показываются
18 марта 2020, 05:05
0
3. Как поправить ресолвер таким образом, чтобы добавление системных настроек и остальных данных из папки elements происходило после создания таблиц из схемы в базу, и установки всех добавляемых компонентов?
Назови резолвер так чтобы по алфавиту твой резолвер был последним. Тогда и запускаться он будет позже.

4. Каким образом сделать выбор компонентов при установке как в компоненте modMySettings
Здесь все есть:
https://github.com/webnitros/modMySettings/blob/master/_build/setup.options.php

Еще момент: при удалении компонента, резолверы удаляют и папку с шаблоном. То есть все что положиться в core/elements/ будет уделено
10 марта 2020, 22:03
0
Да, через лог можно контролировать, чтением каждую секунду сообщений.

Хотя последнее время, прихожу к идее, что любые массовые операции нужно фиксировать в таблице. После чего из нее получать к примеру последние 30 записей и производить массовые операции.
В этом плане и лог не нужен будет.

Получаем 30 записей отправляем их на exec_bg_script.
Ждем пока у этих 30 записей поставиться метка: завершено.
После чего получаем следующие 30 и продолжаем дальше.
Пока из обработки не уйдут все записи во временной таблице.

Так всегда можно отследить когда был запуск и завершение.

В общем нужна очередь, и какой то цикл который будет перезапускать всю эту процедуру.
10 марта 2020, 21:43
0
Если отключить сессии и не дожидаться ответа, то получится аналогичный функционал:
Через ajax посылать все запросы разом к примеру в 1000 запросов, и не ждать ответа. Что то типо через цикл запустить.
10 марта 2020, 21:34
0
А как контролировать?
Понятно что на 1000 ресурсов можно использовать. А если обновляется 100к ресурсов, Получается ответ не получен!
Очередь таких заданий забьет память и процессор.
Просто думаю как это встроить к примеру в msPre так как достаточно долго обновляется даже те же 2000 ресурсов при объеме в 100к.
Точней даже понимаю что это работать будет только, в безконтрольном режиме. И это проблема.
06 марта 2020, 21:23
0
При учете что мне к примеру не нежно ничего получать из site_content а только id, оно еще быстрее будет.
Ноооооо если мы используем getCollection) То innerJoin не позволит сделать select!
Так что скорость ощутим упадет))
Кстати, твой код, исключает getCollection. О чем я писал когда говорил о IN.
Так что если по играть, с кодом, то явно увидишь разницу.
06 марта 2020, 20:37
0
if($objectCount = $modx->getCount('msProductData', $q)) {
return $objectCount;
}
в $objectCount запишется 0
Приходилось встречаться что в итоге 0 это тоже true, скорей всего это в старом каком то php
по этому лучше так
if($count = (boolean)$modx->getCount('modResource', array())){
    
}
06 марта 2020, 20:34
0
ну это интересно)) Запомню на будущие.
А теперь тоже самое только к примеру с получением pagetitle и price)
Вот тут явно увидите разницу
06 марта 2020, 20:11
0
Как)) Мне просто интересно?
getCollection — дергает все поля как с site_content так и c ms2_products
Как он может быть быстрее даже с этого ракурса?
Обращение к msProduct?
06 марта 2020, 20:07
0
Покажите код? Один и другой
06 марта 2020, 20:05
0
Наверное поле куда делался IN, без индекс, и это обычное текстов поле.
05 марта 2020, 12:06
0
И еще за актуальность временных таблиц следить. Причем разных нужных данных может быть много вариантов. Вроде кол-во перестановок пропорционально n! Если 2 таблицы по 5 колонок, то кол-во возможных выборок 10! = 3628800 вариантов :-).
Временная таблица!
Актуальность в одну минут, вообще не принципиально)))
05 марта 2020, 09:14
1
+1
'select' => ['*
        FROM `modx_tsklad_detail_naryad_smena_link` AS `tSkladDetNSLink`
        LEFT JOIN `modx_tsklad_order_list` `Detail` ON Detail.id=tSkladDetNSLink.det_id
        LEFT JOIN `modx_tsklad_orders` `Order` ON Order.id=Detail.sk_order_id
        LEFT JOIN `modx_tsklad_naryad` `Naryad` ON Naryad.id=tSkladDetNSLink.naryad_id
        LEFT JOIN `modx_tsklad_smena` `Smena` ON Smena.id=tSkladDetNSLink.smena_id
        LEFT JOIN `modx_nomenclature_detail_nom` `DetailNom` ON DetailNom.id=Detail.nom_id
        LEFT JOIN `modx_nomenclature_detail_class` `DetailClass` ON DetailClass.id=DetailNom.class_id
        LEFT JOIN `modx_nomenclature_type_job` `NomTypeJob` ON NomTypeJob.id=DetailClass.type_job_id
        LEFT JOIN (
            SELECT NextDNL.det_id AS next_det_id, NextDNL.naryad_id AS next_naryad_id, NextN.name AS next_naryad_name, NextDNL.smena_id AS next_smena_id, NextS.date AS next_smena_date, NextS.number AS next_smena_number
            FROM `modx_tsklad_detail_naryad_smena_link` AS `NextDNL`
            LEFT JOIN `modx_tsklad_smena` `NextS` ON NextS.id=NextDNL.smena_id
            LEFT JOIN `modx_tsklad_naryad` `NextN` ON NextN.id=NextDNL.naryad_id
            ORDER BY NextS.date ASC, NextS.number ASC) `NextDNL1` 
                ON tSkladDetNSLink.det_id = NextDNL1.next_det_id AND 
                (NextDNL1.next_smena_date > Smena.date OR (NextDNL1.next_smena_date = Smena.date AND NextDNL1.next_smena_number > Smena.number)
        ) 
        AND NextDNL1.next_smena_id = (
            SELECT NextDNL.smena_id AS on_next_smena_id
            FROM `modx_tsklad_detail_naryad_smena_link` AS `NextDNL`
            LEFT JOIN `modx_tsklad_smena` `NextS` ON NextS.id=NextDNL.smena_id
            LEFT JOIN `modx_tsklad_naryad` `NextN` ON NextN.id=NextDNL.naryad_id
            WHERE NextS.date > Smena.date OR (NextS.date = Smena.date AND NextS.number > Smena.number)
            ORDER BY NextS.date ASC, NextS.number ASC
            LIMIT 1
        )
        LEFT JOIN `modx_plazma_list` `PlazmaList` ON PlazmaList.det_id=tSkladDetNSLink.det_id
    '],
Никогда не понимал зачем такие мега запросы писать. Бесполезных join-нов куча. Этаж сколько выборка этого всего идти будет. А потом еще сидеть постоянно разбирать что там написано.

Для таких запросов проще временную таблицу сделать куда будут данные сливаться на бэкенде, и потом уже готовые данные забирать на фронте.
Такими запросами, только фронт напрягать.

Почему то всегда охота все в один запрос запихать, но по опыту еще больше времени тратишь на всякие такие выборки.
Еще как вариант делать несколько запросов и получать id которые уже потом идут where в виде product_id IN (тут список id из какой то таблицы)

На примере получения товаров:
Этот код будет делать выборку в десятки раз быстрее:
$ids = [];
$q = $modx->newQuery('modResource');
$q->select('id');
$q->where(array(
    'published' => 1,
    'class_key' => 'msProduct',
));
if ($q->prepare() && $q->stmt->execute()){
    while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
        $ids[] = $row['id'];
    }
}


/* @var msProductData $object*/
$q = $modx->newQuery('msProductData');
$q->where(array(
    'id:IN' => $ids
));
if($objectList = $modx->getCollection('msProductData', $q)) {
    foreach ($objectList as $object) {
       echo '<pre>';
       print_r( $object->toArray()); die;
    }
}


Чем
/* @var msProduct $object*/
$q = $modx->newQuery('msProductData');
$q->where(array(
    'Product.published' => 1,
    'Product.class_key' => 'msProduct',
));
$q->innerJoin('msProduct','Product','Product.id = msProductData.id');
if($objectList = $modx->getCollection('msProductData', $q)) {
    foreach ($objectList as $object) {
        echo '<pre>';
        print_r( $object->toArray()); die;
    }
}
join — зло еще то))