Show post numbers

Is it possible to show post numbers for each post (Or easy to do via CSS or similar). My use case is running forum mafia, where allowing users to easily refer to a post without the bulk of quoting it would be amazing.

1 лайк

Just press the link button under each post, and the post number is visible there.

It is hard to say if this is what you are looking for, but it should get you close.

We use that CSS to put #1, #2, et al on a topic after the date/timestamp.

10 лайков

Yes, it is, this is amazing :slight_smile:

Thanks so much!

a.post-date span {
  margin-right: 1em;
}

a.post-date:after {
  content: "#"attr(data-post-number);
}

Похоже, это больше не работает. Есть ли сейчас способ отображать номера постов?

2 лайка

Теперь тег post не имеет идентификатора data-post-number, поэтому этот CSS-стиль не работает. Не знаю, есть ли другой способ решить эту проблему?

Нет, без JavaScript.

3 лайка

Спасибо за ответ. Это плагин, который нужно написать для вызова API, или это просто компонент темы?

Спасибо большое. Я решил проблему!

api.decorateCooked(() => {
          var add_post_number_timer = setTimeout(() => {
            var articles = document.getElementsByTagName("article");
            for (var i = 0; i < articles.length; i++) {
              var post_date = articles[i].getElementsByClassName("post-date");
              if (post_date.length != 0) {
                var post_number = articles[i].getAttribute("id").replace("post_", "");
                post_date[1].setAttribute("data-post-number", post_number);
              }
            }
            clearTimeout(add_post_number_timer);
          }, 500);
        }, {
        id: 'add_post_number'
    });

Отлично! Вы разобрались, как это сделать. :+1:

Вот несколько улучшений, которые вы можете внести:

  • api.decoratedCooked устарела и вызывается для каждого поста.
    Вместо неё используйте decorateCookedElement, которая работает без jQuery.

  • В API передаётся element, представляющий текущий пост; вы можете использовать его как контекст поста.

  • Вы можете использовать функцию schedule из Ember, чтобы дождаться рендеринга элемента.

import { schedule } from "@ember/runloop";
// const { schedule } = require("@ember/runloop");  // используйте это, если работаете в интерфейсе администратора

api.decorateCookedElement((element,  /* helper */) => {
  schedule("afterRender", () => {
    const article = element.closest("article");
    if (article) {
      article.dataset.postNumber = article.id.replace("post_", "");
    }
  });
});

image

3 лайка

:+1: Большое спасибо за исправление.