Passt die Startseite an, um Themen basierend auf den Interessen der Nutzer anzuzeigen

Ich möchte hören, was Sie zu diesem Plugin sagen. Ich arbeite an einem Plugin, das es Besuchern ermöglicht, je nach ihren Interessen ein neues Thema auf der Homepage anzuzeigen. Ich habe die Idee aufgeschrieben und diesen Schritt gezeichnet, aber ich habe noch nicht damit herumgespielt.

plugin.rb

# plugins/custom_homepage/plugin.rb
# frozen_string_literal: true

# name: custom-homepage
# about: Passt die Homepage an, um Themen basierend auf Benutzerinteressen anzuzeigen
# version: 0.1
# authors: MHAT
# url: https://domain.com

enabled_site_setting :custom_homepage_enabled

after_initialize do
  # nach der Initialisierung auszuführender Code
end
// plugins/custom_homepage/assets/javascripts/discourse/initializers/custom-homepage.js.es6

import { withPluginApi } from 'discourse/lib/plugin-api';

export default {
  name: 'custom-homepage',
  initialize(container) {
    withPluginApi('0.8', api => {
      api.modifyClass('component:topic-list', {
        didInsertElement() {
          this._super(...arguments);

          if (this.currentUser) {
            this.loadUserInterests();
          }
        },

        loadUserInterests() {
          const userId = this.currentUser.id;

          fetch(`/u/${userId}/preferences/interests`)
            .then(response => response.json())
            .then(data => {
              this.set('topics', this.sortTopicsByInterests(this.topics, data.interests));
            });
        },

        sortTopicsByInterests(topics, interests) {
          return topics.sort((a, b) => {
            const aScore = interests.includes(a.category_id) ? 1 : 0;
            const bScore = interests.includes(b.category_id) ? 1 : 0;

            return bScore - aScore;
          });
        }
      });
    });
  }
};
# plugins/custom_homepage/config/locales/server.en.yml
en:
  site_settings:
    custom_homepage_enabled: "Benutzerdefinierte Homepage aktivieren"

  user:
    preferences:
      interests: "Interessen"

# plugins/custom_homepage/config/discourse_plugin.yml
enabled_site_setting: custom_homepage_enabled

HTML für Einstellungen

<script type="text/x-handlebars" data-template-name="/connectors/user-preferences/interests">
  <div class="control-group">
    <label class="control-label">{{i18n 'user.preferences.interests'}}</label>
    <div class="controls">
      {{input value=currentUser.custom_fields.interests class="form-control"}}
    </div>
  </div>
</script>
# plugins/custom_homepage/plugin.rb

after_initialize do
  User.register_custom_field_type('interests', :string)

  add_to_serializer(:current_user, :interests) do
    object.custom_fields['interests']
  end
end

Vielen Dank für Ihr Feedback und Ihre Verbesserungsvorschläge.

Ich bin Thai. Meine Englischkenntnisse sind vielleicht nicht besonders gut. Ich habe versucht, sie während der Entwicklung von Discourse zu lernen.

Wo ist /preferences/interests implementiert?

Ich glaube, um Benutzerinteressen zu verwalten und sie in die Benutzereinstellungen zu integrieren, müssen die erforderlichen Routen, Controller-Aktionen und Vorlagen erstellt werden.

Das ist jedoch nur meine Sichtweise, und sie ist einfach konzipiert. Ich habe noch nicht mit dem Bau begonnen. Es könnte nicht wie geplant laufen, wenn ich es versuche.

Fügen Sie eine Route für Benutzereinstellungen hinzu:
- Fügen Sie eine Route hinzu, die Anfragen an /u/:username/preferences/interests bearbeitet.

```ruby
# plugins/custom_homepage/config/routes.rb
Discourse::Application.routes.append do
  get '/u/:username/preferences/interests' => 'custom_homepage#interests', constraints: { username: /[^\\/]+/ }
end
```

Erstellen Sie die Controller-Aktion:
- Definieren Sie einen Controller, der die Anfrage bearbeitet und die Interessen des Benutzers abruft.

```ruby
# plugins/custom_homepage/app/controllers/custom_homepage_controller.rb
class CustomHomepageController < ApplicationController
  requires_login
  
  def interests
    username = params[:username]
    user = User.find_by(username: username)
    
    if user
      render json: {
        interests: user.custom_fields['interests']
      }
    else
      render json: { error: 'User not found' }, status: 404
    end
  end
end
```

Fügen Sie das Interessenfeld in die Benutzereinstellungen ein:
- Ändern Sie die Vorlage für Benutzereinstellungen, um ein Eingabefeld für Interessen hinzuzufügen.

```html
<!-- plugins/custom_homepage/assets/javascripts/discourse/connectors/user-preferences/interests.hbs -->
<div class="control-group">
  <label class="control-label">{{i18n 'user.preferences.interests'}}</label>
  <div class="controls">
    {{input value=model.custom_fields.interests class="form-control"}}
  </div>
</div>
```

Erweitern Sie den Serializer:
- Erweitern Sie den Benutzer-Serializer, um das Interessenfeld einzuschließen.

```ruby
# plugins/custom_homepage/plugin.rb

after_initialize do
  User.register_custom_field_type('interests', :string)
  
  add_to_serializer(:current_user, :interests) do
    object.custom_fields['interests']
  end

  add_to_serializer(:admin_detailed_user, :interests) do
    object.custom_fields['interests']
  end
end
```

Ändern Sie das JavaScript zur Verarbeitung von Interessen:
- Verwenden Sie JavaScript, um die Interessen abzurufen und im Benutzerprofil zu speichern.

```javascript
// plugins/custom_homepage/assets/javascripts/discourse/initializers/custom-homepage.js.es6

import { withPluginApi } from 'discourse/lib/plugin-api';

export default {
  name: 'custom-homepage',
  initialize(container) {
    withPluginApi('0.8', api => {
      api.modifyClass('controller:preferences/account', {
        save() {
          const interests = this.model.custom_fields.interests;
          this.model.save().then(() => {
            fetch(`/u/${this.model.username}/preferences/interests`, {
              method: 'PUT',
              headers: {
                'Content-Type': 'application/json',
                'X-CSRF-Token': Discourse.CSRFToken
              },
              body: JSON.stringify({ interests })
            }).then(response => response.json()).then(() => {
              this.flash('Your preferences have been saved.');
            });
          });
        }
      });
    });
  }
};
```
  1. Behandeln Sie die PUT-Anfrage:

    • Implementieren Sie die Logik zur Behandlung der PUT-Anfrage und zum Speichern der Interessen im Controller.
    # plugins/custom_homepage/app/controllers/custom_homepage_controller.rb
    class CustomHomepageController < ApplicationController
      requires_login
    
      def interests
        if request.get?
          username = params[:username]
          user = User.find_by(username: username)
          
          if user
            render json: {
              interests: user.custom_fields['interests']
            }
          else
            render json: { error: 'User not found' }, status: 404
          end
        elsif request.put?
          user = current_user
          interests = params[:interests]
          user.custom_fields['interests'] = interests
          user.save_custom_fields
          render json: success_json
        end
      end
    end
    
2 „Gefällt mir“

Sieht interessant aus. Vielleicht finden Sie auch einige Ideen in diesem Plugin.