Override штатной функции

Хочу внести нужные мне изменения в пару штатных функций из файла /app/functions/fn.promotions.php

Есть у карта возможность переопределить своим модулем (сделать override) этого файла? Хочется сделать мои изменения отключаемыми.

Нет. файлы fn. подключаться при инициализации. Которую в принципе можно переписать пре или пост контроллером init.pre.php или init.post.php (оверрайда нет). Но лучше пользоваться хуками в функциях.

Т.е. через init.post.php например можно как-то инициализировать свою версию файла fn. ? Можно подробнее?
Хуки не подходят, сильно поменял код и логику штатной функции, хуками этого не сделать.

Скорее через pre, полностью переписать контроллер, и как-то выйти, чтобы обойти сам контроллер…

Вобщем неправильно всё ))
файл /init.php
массив $fn_list - закомментировать переписанный файл с функциями и добавить свой - здесь и идет подключение. свой файл положить в папку functions
файл почти не меняется, обновления редко когда затронут, а если затронут - надо будет восстановить

1 лайк

Может глупость напишу, а сработает ли вариант если в init.post.php добавить require моего файла, где где штатная функция изменена, но имя ее остается прежним (штатным). Не перезапишет она в этом случае штатную функцию? Или ошибку сгенерит из-за повторного включения функции с тем же названием?

нет, выдаст ошибку - повторная декларация функции - штука недопустимая :slight_smile:

Эх, а счастье было так близко)

А что меняете? Там большинство функций через схему promotions вызываются. Может в схеме вам указывать нужные функции для вызова?

Согласен, если бы автор больше рассказал что он хочет поменять и на что это должно влиять, то возможно нашлось больше вариантов для реализации.

Вот в эти функции из файла fn.promotions вносил изменения. В первые 2 вкрапления кода, последняя переписана почти вся. Входные параметры в функциях не менял.

function fn_promotion_apply_bonuses($promotion, &$data, &$auth, &$cart_products)
function fn_promotion_apply($zone, &$data, &$auth = NULL, &$cart_products = NULL)
function fn_promotion_apply_discount($promotion_id, $bonus, &$product, $use_base = true, &$cart = null, &$cart_products = null)

Пока склоняюсь просто к изменению штатного файла fn.promotions и проверке включенности моего модуля. Если включен, то выполняем мой код, если выключен - штатный код. Только вот пока не знаю как это проверить. Так хоть можно быстро из админки отключать свой модуль и возвращать штатное поведение функций. С init.php для отключения надо вспомнить все и менять там руками обратно.

Суть модуля изменение логики расчета скидок. У каждой промо теперь есть чекбокс “считать скидку от list_price”. (если list_price не задана, то работает от price) Акции с таким признаком включают друг друга, т.е. если товар одновременно в двух таких акциях, то скидки по этим акциям не суммируются, а берется максимальная скидка.
Допустим по одной акции товар одного бренда продается всегда со скидкой 5%, а на этой неделе скидку даем на определенные модели этого бренда 10%. Теперь достаточно просто добавить акцию с новым признаком и в итоге скидка будет 10% (как наибольшая), а не как в штатной реализации 5%+10%. Плюс ко всему избавился этого бреда, когда у товара уже указаны 2 цены (list_price и price) товар был со скидкой 20% и мы еще добавили новую акцию 5%, то карт скроет list_price, покажет просто price и скидку 5% нарисует. Хотя по факту скидка же больше 20% выходит. У меня всегда показывает макс цену и всю накопленную скидку.
Это кратко

Я не супер специалист, но по моему это можно было бы реализовать через хуки. Как минимум есть такой хук promotion_apply_before_get_promotions и ещё такой promotion_apply_pre

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

Схему bonuses поищу посмотрю, благодарю. Чисто хуками не сделать к сожалению. В последней из приведённых мною функций хуков нет, а там основная логика изменений.

Походу встречается последняя функция только в 3 местах
function fn_promotion_apply_discount($promotion_id, $bonus, &$product, $use_base = true, &$cart = null, &$cart_products = null) [position 413:10]
fn_promotion_apply_discount($bonus[‘promotion_id’], $bonus, $product); [position 478:13]
&& fn_promotion_apply_discount($bonus[‘promotion_id’], $bonus, $cart_products[$k], true, $cart, $cart_products) [position 546:24]
и только в файле fn.promotions.php (запустил поиск по тексту по всему ядру, правла на 4.10)