[решено + дополнено] pdoPage спамит в отчет об ошибках

Вот такие ошибки сыпятся очень часто:

[2021-07-15 12:18:01] (ERROR @ /сайт/public_html/core/cache/includes/elements/modsnippet/17.include.cache.php : 152) PHP warning: A non-numeric value encountered
[2021-07-15 12:18:01] (ERROR @ /сайт/public_html/core/cache/includes/elements/modsnippet/17.include.cache.php : 152) PHP warning: Division by zero

сама строка
$cache = !empty($cache) || (!$modx->user->id && !empty($cacheAnonymous));
$url = $pdoPage->getBaseUrl();
$output = $pagination = $total = $pageCount = '';

$data = $cache
    ? $pdoPage->pdoTools->getCache($scriptProperties)
    : array();

if (empty($data)) {
    $output = $pdoPage->pdoTools->runSnippet($scriptProperties['element'], $scriptProperties);
    if ($output === false) {
        return '';
    } elseif (!empty($toPlaceholder)) {
        $output = $modx->getPlaceholder($toPlaceholder);
    }

    // Pagination
    $total = (int)$modx->getPlaceholder($totalVar);
    $pageCount = !empty($scriptProperties['limit']) && $total > $offset
----- ОШИБКА ---->>>        ? ceil(($total - $offset) / $scriptProperties['limit'])
        : 0;
что надо сделать чтобы это исправить (где и что я сделал не так ), заранее спасибо?

ДОПОЛНЕНО. ВАЖНО
Если будете изменять moderrorhandler.class.php — не забудьте его потом вернуть обратно, когда найдете ошибки.

У нас на одном из сайтов из-за этой правки были проблемы на бэкэнде
miniShop2 не выводит список товаров в документе Категория товаров (под админкой)
Shedko Denis
15 июля 2021, 12:52
modx.pro
729
0

Комментарии: 10

Andrey
15 июля 2021, 17:16
0
Там написано, что встречено нечисловое значение, а потом деление на ноль. Отследите значения по переменным и типам переменных: $total, $offset, $scriptProperties['limit'], например.
upd: А, это кусок кода оригинального pdoPage?) Думаю тогда стоит посмотреть, как выводите пагинацию и нет ли странного в параметрах сниппета.
    Роман
    16 июля 2021, 11:48
    0
    В вызове сниппета посмотрите, что указано в limit?
      Shedko Denis
      23 июля 2021, 15:33
      0
      Спасибо за ответы.

      Но есть нюанс — уж больно много страниц и не понимаю как отследить на какой странице и в каком чанке/снипете эта(и) ошибки.

      Можно ли как-то в логи об ошибках MODX добавить URI источника ошибки?
        Andrey
        23 июля 2021, 16:43
        0
        В вызове pdopage посмотрите не стоит ли в лимите 0.
          Shedko Denis
          23 июля 2021, 16:59
          0
          Проблема в том что:


          Да это число можно уменьшить в разы, тут считает все вызовы pdoPage даже в снипетах, но число зашкаливает все равно.

          Потому и хотелось бы узнать страницу(ы) источник ошибки.
            Andrey
            23 июля 2021, 17:39
            2
            +1
            Ну, можно побаловаться с выводом в журнал… Вот вывод id ресурса, например:
            $modx->log(MODX_LOG_LEVEL_ERROR, $modx->resource->get('id'));
            Можно с пояснительным текстом:
            $modx->log(MODX_LOG_LEVEL_ERROR, 'ID ресурса: ' . $modx->resource->get('id'));
              Shedko Denis
              23 июля 2021, 17:59
              0
              Огромное спасибо.
              Теперь хоть будет понятно где искать.

              в файле \core\model\modx\error\moderrorhandler.class.php

              case E_WARNING:
                              $handled= true;
                              $errmsg= 'PHP warning: ' . $errstr;
                              $this->modx->log(modX::LOG_LEVEL_ERROR, $errmsg, '', '', $errfile, $errline);
                              break;
              поменял на
              case E_WARNING:
                              $handled= true;
                              $errmsg= 'PHP warning: ' .  $this->modx->resource->get('id') . ' ' . $errstr;
                              $this->modx->log(modX::LOG_LEVEL_ERROR, $errmsg, '', '', $errfile, $errline);
                              break;
              и да теперь хоть вижу на какой странице искать ошибку/опечатку.

              в первой попавшейся было
              [[pdoPage? &element=`msProducts`&parents=`26` &limit='250' &sortby=`{"menuindex":"asc"}` ]]`]]
              т.е. не кавычки в limit=
                Andrey
                23 июля 2021, 19:11
                0
                Можно по условию дебажить прямо в сниппете с выводом различных данных. Что-то такое добавить в pdopage:
                if (!is_int($scriptProperties['limit']) || $scriptProperties['limit'] < 1) {
                    $modx->log(MODX_LOG_LEVEL_ERROR, 'Ошибка pdopage. Параметр limit содержит: [' . $scriptProperties['limit'] . ']. В ресурсе: ' . $modx->resource->get('id'));
                }
                В общем, можно поиграться по-всякому.
                  Shedko Denis
                  24 июля 2021, 00:16
                  0
                  OK. c pdo — все норм, но как отловить
                  [2021-07-23 23:56:45] (ERROR @ /home/***/public_html/core/model/modx/modparser.class.php : 541) Could not find snippet with name Рассрочка под 0%.
                  да понимаю, что это парень-«набивщик» который наполняет сайт заказанными текстами ошибся где-то в скобках, но ИМХО как-то не очень удачно (опять же по моему мнению) сделан лог ошибок — не видно где ошибка, если вызов чанков/снипетов.
                  добавил доп поля вывода в логах в
                  case E_STRICT:
                  но не уверен, что эта ошибка там «отметится»
                    Andrey
                    26 июля 2021, 18:15
                    +1
                    Не совсем понял, но в modparser.class.php, в строке 541, добавить например:
                    $this->modx->log(xPDO::LOG_LEVEL_ERROR, "Could not find snippet with name {$tagName}. Resource ID: {$this->modx->resource->get('id')}.");
                    Да, регистрация ошибок могла бы быть информативней «из коробки», согласен.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          10