Comment lier des images avec un sujet

Bonjour @Discourse,

J’ai créé un plugin qui télécharge une image dans des sujets et j’enregistre le chemin du fichier dans des custom_fields. Cependant, Discourse supprime toutes les images téléchargées pour les sujets en considérant qu’elles sont orphelines car elles ne sont pas liées aux sujets.

Par conséquent, quelqu’un peut-il me guider sur la façon de lier les images téléchargées aux sujets respectifs ?

J'ai essayé de mettre à jour l'image_upload_idmais d'une manière ou d'une autre, la valeur de la colonne dans la tabletopic n'est pas mise à jour.

Tout conseil serait d’une grande aide !

Merci !

Il existe une fonctionnalité d’API de plugin register_upload_in_use

Pour un exemple sur la façon de l’utiliser, voir le code dans le plugin Chat.

1 « J'aime »

Désolé, ce n’était qu’une réponse partielle, elle empêchera seulement les images d’être orphelines. Vous devriez pouvoir définir topic.image_upload_id à partir de votre code, mais il sera écrasé lorsque le HTML d’un message sera re-cuit. Vous devriez donc également vous accrocher au code de re-cuisson.

Pouvez-vous me guider sur la façon dont je peux faire cela ? Si vous pouvez partager quelques exemples, car je ne connais pas beaucoup Ruby, mais je peux travailler avec JavaScript et je suis nouveau sur Discourse, donc je ne connais pas grand-chose à la personnalisation de Discourse :sweat_smile:

Voici le code qui met à jour le sujet image_upload_id, il se trouve dans CookedPostProcessor::update_post_image

Vous pourriez donc faire un monkey patch de cette fonction et ensuite faire quelque chose comme

def update_post_image
  super # appel à l'original
  if @post.custom_fields[:your_field_name_upload_id]
    upload_id = @post.custom_fields[:your_field_name_upload_id]
    @post.update_column(:image_upload_id, upload_id) # post
    if @post.is_first_post? # sujet
        @post.topic.update_column(:image_upload_id, upload_id)
    end
  end
end

Il a mis à jour l’image_upload_id pour les publications et les sujets, mais les images sont toujours supprimées. J’ai utilisé la fonction API register_upload_in_use.

J’ai ajouté le code ci-dessous pour vérifier dans les custom_fields du sujet où topic_file_upload est le nom du champ. Est-ce la bonne façon de faire ?

  if respond_to?(:register_upload_in_use)
    register_upload_in_use do |upload|
        TopicCustomField.where(
            name: 'topic_file_upload',
            value: [upload.url, upload.sha1]
        ).exists?
    end
  end

Que contient TopicCustomField ? Je suppose qu’il contient l’ID de téléchargement ?

Dans ce cas, cela devrait plutôt ressembler à ceci :

  if respond_to?(:register_upload_in_use)
    register_upload_in_use do |upload|
        TopicCustomField.where(
            name: 'topic_file_upload',
            value: upload.id
        ).exists?
    end
  end
1 « J'aime »

Il a l’URL de l’image mais j’ai ajouté un nouveau champ dans les champs personnalisés pour l’ID de l’image et je vérifie maintenant l’ID comme vous l’avez mentionné dans le code. Je pense que si j’avais utilisé le code ci-dessous, cela aurait peut-être fonctionné ?

TopicCustomField.where(
            name: 'topic_file_upload',
            value: upload.url
        ).exists?

Étrange - s’il avait l’URL, cela aurait dû fonctionner auparavant, car value: [upload.url, upload.sha1] correspondrait à l’URL ainsi qu’au SHA1 :thinking:

Merci @RGJ pour votre aide ! Id a fonctionné pour moi à la place de url

1 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.