Während beim Erstellen eines Plugins mit benutzerdefinierten Themenlistenfiltern (z.B. nach Preis, Standort) unter Verwendung von URL-Abfrageparametern die URL korrekt aktualisiert wird (z.B. ...?market_item_statuses=Available), erscheinen die Parameter nicht in topic_query.options auf dem Server.
Einrichtung:
-
Client-seitige Param-Registrierung (
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 }); }); }); -
Serverseitiges Whitelisting, Versuch (
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 # nach_initialisierung 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 } # Vereinfachung für die Kürze end Rails.logger.info "[Tecenc] Registriert mit 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] Erweiterung der extra_options_whitelist." else Rails.logger.warn "[Tecenc] PLUGIN_WARN: Konnte keine Methode finden, um Parameter für TopicQuery zu whitelisten." end -
Serverseitige Filter-Logik (
plugin.rb):# plugin.rb (innerhalb von nach_initialisierung / wenn aktiviert) ::TopicQuery.add_custom_filter(:"tecenc_filters") do |topics, topic_query| opts = topic_query.options Rails.logger.info "[Tecenc_TopicQuery] Opts: #{opts.inspect}" # Kritischer Log # market_params_present = ::Tecenc::MARKET_PARAMS_KEYS.any? { |p| opts[p].present? } # if market_params_present # # ... Filter-Logik unter Verwendung von opts[key] ... # end topics # oder modifizierte_themen end
Das Problem (Logs):
-
Parameter-Whitelist ist fehlgeschlagen:
[Tecenc] PLUGIN_WARN: Konnte keine passende Methode (add_custom_param_handler oder extra_options_whitelist) finden, um benutzerdefinierte Parameter für TopicQuery zu whitelisten. -
optsinTopicQuery.add_custom_filterenthält unsere benutzerdefinierten Parameter nicht:
Wenn URL...?market_item_statuses=Availableist, zeigt das Log:[Tecenc_TopicQuery] Opts: {:category=>5, :filter=>"default", :topic_ids=>nil, :category_id=>5}
Unsere market_item_statuses (und andere benutzerdefinierte Parameter) sind nicht vorhanden.
Unsere Umgebung:
Fragen:
- Was ist die aktuelle Best Practice, um sicherzustellen, dass benutzerdefinierte URL-Query-Parameter in den aktuellen Discourse-Versionen bei
topic_query.optionsankommen? - Warum könnten unsere Versuche,
add_custom_param_handleroderextra_options_whitelistzu verwenden, mit der Warnung “Could not find a suitable method” fehlschlagen? - Gibt es eine alternative Herangehensweise an die Parameterregistrierung mit
TopicQuery, die wir verwenden sollten?
Jede Hilfe wäre sehr willkommen!