При создании плагина с пользовательскими фильтрами списка тем (например, по цене, местоположению) с использованием параметров запроса URL. URL обновляется корректно (например, ...?market_item_statuses=Available), но параметры не отображаются в topic_query.options на сервере.
Настройка:
-
Регистрация параметров на стороне клиента (
tecenc-discovery-params.js):// tecenc-discovery-params.js import { apiInitializer } from "discourse/lib/api"; export default apiInitializer("1.37.3", (api) => { const MARKET_PARAMS_KEYS = [ "market_price_min", "market_price_max", "market_location", "market_conditions", "market_warranty", "market_item_statuses" ]; MARKET_PARAMS_KEYS.forEach(paramKey => { api.addDiscoveryQueryParam(paramKey, { replace: true, refreshModel: true }); }); }); -
Попытка добавления в белый список на стороне сервера (
plugin.rb):# plugin.rb module ::Tecenc MARKET_PARAMS_KEYS = [ :market_price_min, :market_price_max, :market_location, :market_conditions, :market_warranty, :market_item_statuses ].freeze end # after_initialize do if SiteSetting.tecenc_enabled? if defined?(::TopicQuery.add_custom_param_handler) ::Tecenc::MARKET_PARAMS_KEYS.each do |param_key| ::TopicQuery.add_custom_param_handler(param_key) { |value| value } # Упрощено для краткости end Rails.logger.info "[Tecenc] Registered with add_custom_param_handler." elsif defined?(::TopicQuery) && ::TopicQuery.methods.include?(:extra_options_whitelist) current_whitelist = ::TopicQuery.extra_options_whitelist || [] new_whitelist = (current_whitelist + ::Tecenc::MARKET_PARAMS_KEYS).uniq ::TopicQuery.extra_options_whitelist(*new_whitelist) Rails.logger.info "[Tecenc] Extended extra_options_whitelist." else Rails.logger.warn "[Tecenc] PLUGIN_WARN: Could not find method to whitelist params for TopicQuery." end -
Логика фильтрации на стороне сервера (
plugin.rb):# plugin.rb (внутри after_initialize / если включено) ::TopicQuery.add_custom_filter(:"tecenc_filters") do |topics, topic_query| opts = topic_query.options Rails.logger.info "[Tecenc_TopicQuery] Opts: #{opts.inspect}" # КРИТИЧЕСКИЙ ЛОГ # market_params_present = ::Tecenc::MARKET_PARAMS_KEYS.any? { |p| opts[p].present? } # if market_params_present # # ... логика фильтрации с использованием opts[key] ... # end topics # или modified_topics end
Проблема (логи):
-
Добавление параметров в белый список не удается:
[Tecenc] PLUGIN_WARN: Could not find a suitable method (add_custom_param_handler or extra_options_whitelist) to whitelist custom params for TopicQuery. -
В
optsвнутриTopicQuery.add_custom_filterотсутствуют наши пользовательские параметры:
Когда URL выглядит как...?market_item_statuses=Available, в логе отображается:[Tecenc_TopicQuery] Opts: {:category=>5, :filter=>"default", :topic_ids=>nil, :category_id=>5}Наши
market_item_statuses(и другие пользовательские параметры) отсутствуют.
Наша среда:
Вопросы:
- Какова текущая лучшая практика для обеспечения того, чтобы пользовательские параметры запроса URL попадали в
topic_query.optionsв последних версиях Discourse? - Почему наши попытки использовать
add_custom_param_handlerилиextra_options_whitelistмогут завершаться неудачей с предупреждением “Could not find a suitable method”? - Существует ли альтернативный подход к регистрации параметров с
TopicQuery, который нам следует использовать?
Любая помощь будет очень ценной!