Personnalise la page d'accueil pour afficher des sujets en fonction des intérêts de l'utilisateur

J’aimerais avoir votre avis sur ce plugin. Je travaille sur un plugin qui permettra aux visiteurs de choisir un nouveau sujet à afficher sur la page d’accueil en fonction de leurs intérêts. J’ai noté l’idée et dessiné cette étape, mais je n’y ai pas encore touché.

plugin.rb

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

# name: custom-homepage
# about: Personnalise la page d'accueil pour afficher des sujets basés sur les intérêts de l'utilisateur
# version: 0.1
# authors: MHAT
# url: https://domain.com

enabled_site_setting :custom_homepage_enabled

after_initialize do
  # code à exécuter après l'initialisation
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: "Activer la page d'accueil personnalisée"

  user:
    preferences:
      interests: "Intérêts"

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

HTML pour les paramètres

<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

Merci pour vos commentaires et suggestions d’amélioration.

Je suis Thaïlandais. Mes compétences en anglais ne sont peut-être pas particulièrement bonnes. J’ai essayé de l’apprendre pendant que je développais Discourse.

/preferences/interests est-il implémenté ?

Je pense que pour gérer les centres d’intérêt des utilisateurs et les intégrer dans leurs préférences, les routes, les actions de contrôleur et les modèles requis doivent être créés.

Cependant, ce n’est que mon point de vue, et c’est simplement une conception. Je n’ai pas encore commencé à le construire. Cela pourrait ne pas se dérouler comme prévu si j’essaie.

Ajouter une route pour les préférences utilisateur :
- Ajoutez une route qui gérera les requêtes vers /u/:username/preferences/interests.

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

Créer l’action du contrôleur :
- Définissez un contrôleur pour gérer la requête et récupérer les centres d’intérêt de l’utilisateur.

```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
```

Ajouter le champ centres d’intérêt dans les préférences utilisateur :
- Modifiez le modèle des préférences utilisateur pour inclure un champ pour les centres d’intérêt.

```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>
```

Étendre le sérialiseur :
- Étendez le sérialiseur utilisateur pour inclure le champ centres d’intérêt.

```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
```

Modifier le JavaScript pour gérer les centres d’intérêt :
- Utilisez JavaScript pour récupérer et enregistrer les centres d’intérêt dans le profil utilisateur.

```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. Gérer la requête PUT :

    • Implémentez la logique pour gérer la requête PUT et enregistrer les centres d’intérêt dans le contrôleur.
    # 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 « J'aime »

Ça a l’air intéressant. Vous pourriez également trouver des idées dans ce plugin.