Дмитрий

Дмитрий

Был в сети 12 декабря 2022, 13:59
Заказы не принимаю
Чистил кеш.
msocfilters.class.php
<?php

class msocFilters extends mse2FiltersHandler
{

    public function getMsocValues(array $tmp, array $ids)
    {
        $filters = $fields = $keys = array();
        foreach ($tmp as $v) {
            $v = explode('~', $v);
            $fields[array_shift($v)] = implode('~', $v);
            $keys = array_merge($keys, $v);
        }
        $keys = array_keys(array_flip($keys));
        $keys = array_merge(array('rid', 'key', 'value'), $keys);

        $classColor = 'msocColor';
        $classProductOption = 'msProductOption';
        $q = $this->modx->newQuery($classColor);
        $q->innerJoin($classProductOption, $classProductOption,
            "{$classProductOption}.key = {$classColor}.key AND {$classProductOption}.value = {$classColor}.value AND {$classProductOption}.product_id = {$classColor}.rid AND {$classColor}.active = 1");
        $q->where(array(
            "{$classColor}.rid:IN"         => $ids,
            "{$classProductOption}.key:IN" => array_keys($fields),
        ));

        $q->select($this->modx->getSelectColumns($classColor, $classColor, '', $keys, false));
        $tstart = microtime(true);
        if ($q->prepare() && $q->stmt->execute()) {
            $this->modx->queryTime += microtime(true) - $tstart;
            $this->modx->executedQueries++;
            while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
                $key = strtolower($row['key']);

                //$value = str_replace(array_keys($row), array_values($row), $fields[$key]);

                $value = implode('~', array_intersect_key($row, array_flip(explode('~', $fields[$key]))));

                if (!is_array($filters[$key])) {
                    $filters[$key] = array();
                }
                if (isset($filters[$key][$value])) {
                    $filters[$key][$value][$row['rid']] = $row['rid'];
                } else {
                    $filters[$key][$value] = array($row['rid'] => $row['rid']);
                }
            }
        } else {
            $this->modx->log(modX::LOG_LEVEL_ERROR,
                "[mSearch2] Error on get filter params.\nQuery: " . $q->toSql() . "\nResponse: " . print_r($q->stmt->errorInfo(),
                    1));
        }

        return $filters;
    }
}
— вызов в mFilter2
Необходимо положить кастомный класс фильтрации msocfilters.class.php в папку и указать в настройке mse2_filters_handler_class класс msocFilters
/core/components/msearch2/custom/filters/
Спасибо. Всё сделал, сайт упал. «Не может обработать запрос»
Попробовал, кеш почистил, не получилось))
array (
      'dbtype' => 'decimal',
      'precision' => '12,4',
      'phptype' => 'float',
      'null' => true,
      'default' => 0.0,
    ),

В админке цена так:
В корзине так:

Округляет последние 2 цифры и всё… Накинули версию, что возможно CSS, но прям сомнения.((
В таком случае он просто перестает считать общую сумму. Ради интереса попробовал вообще убрать default.js, относительно работает, но сумму так же в корзине округляет 0.4400, хотя в БД 0.4389 и в админке тоже правильно))
Такое ощущение, что берет из Бд, хотя я уже везде там выставил у cost и price decimal(12,4) ((
Есть еще версии?)
В /assets/components/minishop2/js/web/default.js нашел такое, оно?:
miniShop2.Utils = {
        empty: function (val) {
            return (typeof(val) == 'undefined' || val == 0 || val === null || val === false || (typeof(val) == 'string' && val.replace(/\s+/g, '') == '') || (typeof(val) == 'object' && val.length == 0));
        },
        formatPrice: function (price) {
            var pf = miniShop2Config.price_format;
            price = this.number_format(price, pf[0], pf[1], pf[2]);

            if (miniShop2Config.price_format_no_zeros && pf[0] > 0) {
                price = price.replace(/(0+)$/, '');
                price = price.replace(/[^0-9]$/, '');
            }

            return price;
        },
Т.е. в админке теперь всё норм, даже сохраняет. А на самом сайте, например в корзине — округляет))