Mentre costruisco un plugin con filtri personalizzati per la lista di argomenti (ad esempio, per prezzo, posizione) usando i parametri di query URL. L’URL si aggiorna correttamente (ad esempio, ...?market_item_statuses=Available), ma i parametri non appaiono in topic_query.options sul server.
Configurazione:
-
Registrazione dei Parametri lato 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 }); }); }); -
Tentativo di whitelisting lato Server (
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 } # Semplificato per brevità end Rails.logger.info "[Tecenc] Registrato con 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] Esteso extra_options_whitelist." else Rails.logger.warn "[Tecenc] PLUGIN_WARN: Impossibile trovare il metodo per whitelisting i parametri di TopicQuery." end end -
Logica di Filtering lato Server (
plugin.rb) (after_initialize/if enabled):# plugin.rb (all'interno di after_initialize / se abilitato) ::TopicQuery.add_custom_filter(:"tecenc_filters") do |topics, topic_query| opts = topic_query.options Rails.logger.info "[Tecenc_TopicQuery] Opzioni: #{opts.inspect}" # LOG CRITICO # market_params_present = ::Tecenc::MARKET_PARAMS_KEYS.any? { |p| opts[p].present? } # if market_params_present # # ... logica di filtraggio usando opts[key] ... # end topics # o topics modificati end
Il Problema (Log):
-
La whitelist dei parametri fallisce:
[Tecenc] PLUGIN_WARN: Impossibile trovare un metodo adatto (add_custom_param_handler o extra_options_whitelist) per whitelisting dei parametri personalizzati per TopicQuery. -
optsinTopicQuery.add_custom_filtermanca dei nostri parametri personalizzati:
Quando l’URL è...?market_item_statuses=Available, il log mostra:[Tecenc_TopicQuery] Opzioni: {:category=>5, :filter=>"default", :topic_ids=>nil, :category_id=>5}
I nostri market_item_statuses (e altri parametri personalizzati) non sono presenti.
Il nostro ambiente:
Domande:
- Qual è la migliore pratica attuale per garantire che i parametri personalizzati dell’URL raggiungano
topic_query.optionsnelle versioni recenti di Discourse? - Perché i nostri tentativi di usare
add_custom_param_handleroextra_options_whitelistfalliscono con l’avviso “Could not find a suitable method”? - Esiste un metodo alternativo per la registrazione dei parametri con
TopicQueryche dovremmo usare?
Ogni aiuto sarebbe molto apprezzato!