Lors de la création d’un plugin avec des filtres de liste de sujets personnalisés (par exemple, par prix, localisation) en utilisant des paramètres de requête URL. L’URL se met à jour correctement (par exemple, ...?market_item_statuses=Available), mais les paramètres n’apparaissent pas dans topic_query.options côté serveur.
Configuration :
-
Enregistrement des paramètres côté client (
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 }); }); }); -
Tentative de liste blanche côté serveur (
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 # après_initialisation 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 } # Simplifié pour la clarté end Rails.logger.info "[Tecenc] Enregistré avec 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] Liste blanche étendue avec extra_options_whitelist." else Rails.logger.warn "[Tecenc] AVERTISSEMENT_PLUG : Impossible de trouver une méthode pour ajouter une liste blanche des paramètres pour TopicQuery." end -
Logique de filtrage côté serveur (
plugin.rb) :# plugin.rb (dans after_initialize / si activé) ::TopicQuery.add_custom_filter(:"tecenc_filters") do |topics, topic_query| opts = topic_query.options Rails.logger.info "[Tecenc_TopicQuery] Options : #{opts.inspect}" # LOG CRITIQUE # market_params_present = ::Tecenc::MARKET_PARAMS_KEYS.any? { |p| opts[p].present? } # si les paramètres du marché sont présents # # ... logique de filtrage utilisant opts[key] ... # fin topics # ou topics modifiés end
Problème (Logs) :
-
Échec de la liste blanche des paramètres :
[Tecenc] AVERTISSEMENT_PLUG : Impossible de trouver une méthode adaptée (add_custom_param_handler ou extra_options_whitelist) pour ajouter une liste blanche des paramètres personnalisés pour TopicQuery. -
optsdansTopicQuery.add_custom_filterne contient pas nos paramètres personnalisés :
Lorsqu’on ajoute...?market_item_statuses=Availabledans l’URL, le log montre :[Tecenc_TopicQuery] Options : {:category=>5, :filter=>"default", :topic_ids=>nil, :category_id=>5} ```Notre `market_item_statuses` (et d'autres paramètres personnalisés) ne sont pas présents.
Notre environnement :
Questions :
- Quelle est la meilleure pratique actuelle pour faire en sorte que les paramètres de requête URL personnalisés atteignent
topic_query.optionsdans les versions récentes de Discourse ? - Pourquoi nos tentatives d’utiliser
add_custom_param_handlerouextra_options_whitelistéchouent-elles avec l’avertissement “Could not find a suitable method” ? - Existe-t-il une méthode alternative pour la registration des paramètres avec
TopicQueryque nous devrions utiliser ?
Toute assistance serait grandement appréciée !