Wie überschreibe ich die buildQuote-Funktion?

Hi!

I’d like to try to modify the buildQuote function so it adds a new line before the opening [quote] tag.

Basically, modifying this:

  return `[quote="${params.join(", ")}"]\n${contents.trim()}\n[/quote]\n\n`;

to this:

  return `\n[quote="${params.join(", ")}"]\n${contents.trim()}\n[/quote]\n\n`;

Is it possible to do such a thing with a theme component? How do I override this function? :smiley:

I’ve managed to achieve it, but is there a prettier solution?

<script type="text/discourse-plugin" version="0.8.23">
    function buildQuote(post, contents, opts = {}) {
      if (!post || !contents) {
        return "";
      }
    
      const params = [
        opts.username || post.username,
        `post:${opts.post || post.post_number}`,
        `topic:${opts.topic || post.topic_id}`
      ];
    
      if (opts.full) params.push("full:true");
    
      return `\n[quote="${params.join(", ")}"]\n${contents.trim()}\n[/quote]\n\n`;
    }
    api.modifyClass('controller:composer', {
        actions: {
            importQuote(toolbarEvent) {
              const postStream = this.get("topic.postStream");
              let postId = this.get("model.post.id");
        
              // If there is no current post, use the first post id from the stream
              if (!postId && postStream) {
                postId = postStream.get("stream.firstObject");
              }
        
              // If we're editing a post, fetch the reply when importing a quote
              if (this.get("model.editingPost")) {
                const replyToPostNumber = this.get("model.post.reply_to_post_number");
                if (replyToPostNumber) {
                  const replyPost = postStream.posts.findBy(
                    "post_number",
                    replyToPostNumber
                  );
        
                  if (replyPost) {
                    postId = replyPost.id;
                  }
                }
              }
        
              if (postId) {
                this.set("model.loading", true);
        
                return this.store.find("post", postId).then(post => {
                  const quote = buildQuote(post, post.raw, {
                    full: true
                  });
        
                  toolbarEvent.addText(quote);
                  this.set("model.loading", false);
                });
              }
            }
        }
    });
</script>
2 „Gefällt mir“

Entschuldigen Sie, dass ich ein altes Thema wieder aufgreife, aber funktioniert das bei Ihnen noch/mussten Sie es überhaupt aktualisieren? Ich habe versucht, dies zum Laufen zu bringen, und es funktioniert überhaupt nicht, aber ich hatte eine schreckliche Zeit mit allem, was mit modifyClass zu tun hat.

Ich habe es gerade ausprobiert und es funktioniert immer noch :+1:

Ich habe es buchstäblich in mein Theme kopiert und eingefügt, und es hat ohne Änderungen funktioniert.

1 „Gefällt mir“

Siehe api.modifyClass sometimes(!) not working - #12 by RGJ

Ich bin mir nicht sicher, ob dies gelöst wurde?

Siehe auch verwandtes, aber anderes: Issues overriding getters in a controller (3.0.0)

2 „Gefällt mir“

Vielen Dank, @merefield und @Canapin. Ich habe versucht, die Discourse-Plugin-API zu lernen und mit Dingen herumzuspielen, die sich wie einfache Dinge anfühlen sollten, aber modifyClass ist so inkonsistent, wann es funktioniert und wann nicht. Ich habe eine kleine Theme-Komponente (die, in der Sie @merefield erwähnt wurden), bei der zwei modifyClass-Aufrufe funktionieren, ein dritter jedoch nicht. Es ist sehr frustrierend zu versuchen herauszufinden, ob ich etwas falsch mache oder ob es nur modifyClass ist.

Entschuldigen Sie das OT in Ihrem Thema und danke für die schnelle Antwort, @Canapin.

Update:

1 „Gefällt mir“

Keine Sorge, ich weiß nicht, was OT bedeutet, aber wir sind hier, um zu helfen!

1 „Gefällt mir“

Dieses Thema wurde 30 Tage nach der letzten Antwort automatisch geschlossen. Neue Antworten sind nicht mehr gestattet.