Не получается внести изменение через хук. как через модуль изменить app/functions/fn.filters.php

не могу понять почему у меня не получается использовать fn_set_hook('get_filters_products_count_post', $params, $lang_code, $filters, $selected_filters);

Для сортировки фильтров хочу чтобы

foreach (array_keys($filters[$filter_id]['variants']) as $variant_id) {
                if (
                    !empty($available_variants)
                    && isset($available_variants[$filter_id])
                    && (
                        empty($available_variants)
                        || empty($available_variants[$filter_id])
                        || !empty($available_variants[$filter_id]['variants'][$variant_id])
                    )
                ) {
                    continue;
                }

                $filters[$filter_id]['variants'][$variant_id]['disabled'] = true;
            }

имело такой вид :

foreach (array_keys($filters[$filter_id]['variants']) as $variant_id) {
                if (
                    !empty($available_variants)
                    && isset($available_variants[$filter_id])
                    && (
                        empty($available_variants)
                        || empty($available_variants[$filter_id])
                        || !empty($available_variants[$filter_id]['variants'][$variant_id])
                    )
                ) {
                    continue;
                }
            
                $variant = $filters[$filter_id]['variants'][$variant_id];
                unset($filters[$filter_id]['variants'][$variant_id]);
            
                $variant['disabled'] = true;
                $filters[$filter_id]['variants'][$variant_id] = $variant;
            }

Но когда в init.php я подключаю

fn_register_hooks(
    'get_filters_products_count_post',
);

фильтры становятся неактивными.

в func.php я писал :

function fn_rm_changes_get_filters_products_count_post($params, $lang_code, &$filters, &$selected_filters) {
    foreach ($filters as $filter_id => $filter) {
        if (!empty($filter['variants'])) {
            foreach (array_keys($filter['variants']) as $variant_id) {
                if (
                    !empty($selected_filters)
                    && isset($selected_filters[$filter_id])
                    && (
                        empty($selected_filters)
                        || empty($selected_filters[$filter_id])
                        || !empty($selected_filters[$filter_id]['variants'][$variant_id])
                    )
                ) {
                    continue;
                }

                
                $variant = $filters[$filter_id]['variants'][$variant_id];
                unset($filters[$filter_id]['variants'][$variant_id]);

                
                $variant['disabled'] = true;
                $filters[$filter_id]['variants'][$variant_id] = $variant;
            }
        }
    }
}

Что я сделал неправильно подскажите, пожалуйста…

Навскидку, но это не ошибки

лишняя строка в условии.

чем хуже

$filters[$filter_id]['variants'][$variant_id]['disabled'] = true;

?

1 лайк

я не особо разбираюсь в в php, но в этом коде пытаюсь убрать из массива неактивные варианты и добавить их заново, таким образом они должны оказаться в конце списка… у меня получается сделать так как мне нужно заменяя код в самом файле функции, но хотелось бы сделать все правильно через модуль…

просто результат в обоих случаях идентичный.

ваш модуль - rm_changes ?

Да.

Но в том варианте как сейчас у меня неактивные фильтры отображаются на том же месте где они были, но при том варианте на который я хочу изменить код - неактивные фильтры переносятся вниз списка и те фильтры которые можно применить отображаются выше. то есть такая себе сортировка.

Вместо этого Screenshot by Lightshot

Получаю это Screenshot by Lightshot

Опустился вниз вариант который нельзя применить

Понял, то есть получается типа “сортировки по умолчанию” )
по поводу ошибок - вроде все в норме.
Вставьте в конец вашей функции fn_print_r($filters);
и в функции где этот хук вызывается - тоже
и посмотрите вообще обрабатывается или нет.
Если через ajax - или снимите класс ajax с кнопки, или смотрите в консоли браузера

Тут решение без модуля, прямо в код. вдруг пригодится.

видел, но это не совсем актуально в новой версии и не отвечает на вопрос как это сделать через модуль. В самом коде я могу решить эту проблему, не получается именно модулем это сделать… Я использовал тот же подход

1 лайк

если кому-то нужно будет то решил свою проблему так:

// недоступные вварианты фильтра
function fn_rm_changes_get_filters_products_count_post(&$params, &$lang_code, &$filters, &$selected_filters) {
    // удаление недоступных
    foreach ($filters as $filter_id => $filter) {
        if (isset($filter['variants'])) {
            foreach ($filter['variants'] as $variant_id => $variant) {
                if (isset($variant['disabled']) && $variant['disabled'] == 1) {
                    unset($filters[$filter_id]['variants'][$variant_id]);
                }
            }
        }

        // Если в фильтре не осталось вариантов, удаляем фильтр
        if (empty($filters[$filter_id]['variants'])) {
            unset($filters[$filter_id]);
        }
    }

    // убирать вниз недоступные
    // foreach ($filters as $filter_id => $filter) {
    //     if (isset($filter['variants'])) {
    //         // Сортируем варианты так, чтобы сначала шли доступные, а затем недоступные
    //         usort($filters[$filter_id]['variants'], function($a, $b) {
    //             $aDisabled = isset($a['disabled']) && $a['disabled'] == 1;
    //             $bDisabled = isset($b['disabled']) && $b['disabled'] == 1;

    //             if ($aDisabled && !$bDisabled) {
    //                 return 1; // Если a недоступен, а b доступен, a должен идти после b
    //             } elseif (!$aDisabled && $bDisabled) {
    //                 return -1; // Если a доступен, а b недоступен, a должен идти перед b
    //             } else {
    //                 return 0; // Если оба варианта доступны или оба недоступны, оставляем их в том же порядке
    //             }
    //         });
    //     }
    // }
}
// конец недоступные вварианты фильтра

пока вроде работает, если кто-то увидит ошибку дайте знать )

2 лайка