Личный контент в публичном посте?

Есть ли способ сделать контент внутри поста доступным только для авторизованных пользователей?

Сценарий, который я имею в виду, — это публикации о виртуальных мероприятиях. У нас в сообществе много рабочих групп, которые встречаются онлайн. Мы хотели бы, чтобы случайные посетители знали о существовании этих групп и встреч — и о том, когда они проходят, — но не хотим публиковать ссылки на Zoom открыто.

1 лайк

Привет, Марти!

Whispers делают именно это: Creating a whisper post

:information_source: Посты-шёпот нельзя «расшептать» после публикации, но это можно сделать с помощью этого компонента темы: Toggle Whisper 👁

2 лайка

Спасибо. Это уже близко. Идеальный вариант — это возможность форматировать контент внутри поста так, чтобы остальная часть поста была видна всем, а сообщение вроде «ссылка доступна только авторизованным пользователям» появлялось, если вы не вошли в систему. Но похоже, что «шепот» пока подойдёт отлично.

Я новый администратор, поэтому всё ещё пытаюсь разобраться со всем функционалом.

2 лайка

Я не очень хорошо разбираюсь в модификациях Discourse, но это кажется довольно сложным, и потребуется плагин, если вы не хотите, чтобы кто-то, кто умеет изменять клиентский код, обошел эту защиту.

1 лайк

Я разработал компонент темы, который позволяет скрывать посты на фронтенде для пользователей, не вошедших в систему. Конечно, если у них есть богатый опыт разработки, они могут легко получить их напрямую через бэкенд.

Я еще не упаковал этот компонент, поэтому используйте код ниже напрямую.

Тег Head:

<script type="text/discourse-plugin" version="1.6.0">

const user = api.getCurrentUser();

const I18n = require("I18n");

const pid = "post_hider"

const tl4_css = `
.d-editor-preview [data-theme-hide] {
  background: var(--tertiary);
  color: var(--secondary);
  border-top: 2px solid var(--secondary);
  position: sticky;
  top: 0;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.d-editor-preview [data-theme-hide]::before {
  content: "Этот пост скрыт";
}
`

api.addPostClassesCallback((attrs) => {
if (attrs?.cooked?.includes(`<div data-theme-hide="true">`)) {
  return ["lycoris-hiddened"];
} else {
  return [];
}
});

if (!user) {
    api.decorateCookedElement((el, helper) => {
        function hide_post() {
            setTimeout( () => {
                try {
                    document.querySelector(`[data-post-id="${helper?.widget?.attrs?.id}"]`)?.parentElement?.remove();
                } catch (err) {
                    console.log(el);
                    console.log(err);
                }
            }, 1000);
        }
        if (el?.querySelector(`[data-theme-hide="true"]`)) {
            el.innerHTML = `<p>Этот пост скрыт</p>`;
            hide_post();
        }
    }, {
        id: pid,
        afterAdopt: true,
        onlyStream: true,
    });
} else if (user?.trust_level == 4) {
    const s = document.createElement("style");
    s.innerHTML = tl4_css;
    document.body.appendChild(s);
    api.decorateCookedElement((el, helper) => {
        if (el?.querySelector(`[data-theme-hide="true"]`)) {
            el.innerHTML = `<div class="d-wrap" data-wrap="tips" data-type="warn"><p>Пост скрыт от незарегистрированных пользователей сообщества</p></div> ` + el.innerHTML;
        }
    }, {
        id: pid,
        afterAdopt: true,
        onlyStream: true,
    });
    if (!I18n.translations[I18n.currentLocale()].js.composer) {
        I18n.translations[I18n.currentLocale()].js.composer = {};
    }
    I18n.translations[I18n.currentLocale()].js.composer.hide_text = " ";
    I18n.translations[I18n.currentLocale()].js.composer.make_hide = "Скрыть этот пост";
    api.modifyClass("controller:composer", {
        pluginId: pid,
        actions: {
            insertHide() {
             this.get("toolbarEvent").applySurround(
                `<div data-theme-hide="true">`,
                `</div>\n`,
                "hide_text"
              );
            },
        },
    });
    api.addToolbarPopupMenuOptionsCallback(() => {
        return {
            action: "insertHide",
            icon: "far-eye-slash",
            label: "composer.make_hide",
        };
    });
}


    
</script>

CSS

.anon .lycoris-hiddened {
    display: none;

    .post-info.edits {
        display: none;
    
    }
}
2 лайка