Разрешить пользователям скрывать лайки на постах через настройки пользователя или поле пользователя

Недавно на форуме, который я администрирую, развернулась большая дискуссия о том, следует ли убрать функцию «Нравится». Половина участников хочет её удалить, другая половина — оставить. Я нашёл компонент темы, который скрывает возможность ставить лайки для пользователей уровня TL0 и анонимных пользователей, и в основном адаптировал его под наши нужды. Однако я не уверен, как связать его с созданным мною булевым полем пользователя («Включить лайки»). В оригинальном компоненте темы используется что-то вроде «settings.hide_for_anon_user», и в файле settings.yml создаётся настройка темы с таким же именем, но её может переключать только администратор, а не на уровне пользователя.

Как мне обратиться к этому пользовательскому полю? Я уже добавил его в public_user_custom_fields, но не знаю, как ссылаться на него в JS-файле компонента. Я пробовал userCustomFields.user_field_10, settings.current_user.custom_fields.user_field_10 и current_user.custom_fields.user_field_10, но ни один из этих вариантов не работает — они просто скрывают все сообщения в теме.

Буду очень признателен за любую помощь.

2 лайка

Я думаю, что вы можете создать группу без лайков и использовать её, чтобы скрыть лайки, как это делает tl0. Настройте группу так, чтобы любой мог вступить.

1 лайк

Как же в этом случае ссылаться на группу?

Я заменил
this.currentUser.trust_level === 0;
на
this.currentUser.no_likes;

но это не сработало. Снова неясно, как ссылаться на пользовательские группы. Похоже, что, как и в случае с полями пользователя, это нигде чётко не описано в документации.

Это, похоже, работает для пользовательской группы:

<script type="text/discourse-plugin" version="0.8">
api.reopenWidget("post-menu", {
    menuItems() {
        const user = Discourse.User.current();
        if(user.primary_group_name.toLowerCase() === "no_likes") {
            return this.siteSettings.post_menu
                .split("|")
                .filter((item) => item !== "like");
        }
        return this.siteSettings.post_menu.split("|").filter(Boolean);
    },
});
</script>

Но я всё же хотел бы узнать, можно ли сделать это так, чтобы проверялось булево значение пользовательского поля, а не принадлежность к группе. Я изучал другие плагины, чтобы понять, как это реализовать, но пока ничего не сработало.

Дополнительно: Это, похоже, работает, но после установки или снятия галочки в пользовательском поле нужно обновить страницу.

<script type="text/discourse-plugin" version="0.8">
api.reopenWidget("post-menu", {
    menuItems() {
        const user = Discourse.User.current();
        if(user.custom_fields['user_field_10']) {
            return this.siteSettings.post_menu
                .split("|")
                .filter((item) => item !== "like");
        }
        return this.siteSettings.post_menu.split("|").filter(Boolean);
    },
});
</script>
2 лайка

Похоже, это скрывает посты, когда пользователи не авторизованы. Я не уверен, как изменить код — есть ли у кого-нибудь предложения?

<script type="text/discourse-plugin" version="0.8">
api.reopenWidget("post-menu", {
    menuItems() {
        const user = Discourse.User.current();
        if (api.getCurrentUser() == null || user.custom_fields['user_field_10'])  {
            return this.siteSettings.post_menu
                .split("|")
                .filter((item) => item !== "like");
        }
        return this.siteSettings.post_menu.split("|").filter(Boolean);
    },
});
</script>

Похоже, это работает. Если есть более чистый способ сделать это, не стесняйтесь сообщить мне.

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