# Скрыть категории в зависимости от принадлежности к группе пользователей

**URL:** https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497
**Category:** Theme component
**Created:** [20.Июль.2019 10:55:10 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497 "2019-07-20T10:55:10Z")
**Posts on this page:** 17
**Page:** 1

<div class="post-metadata">

### Author: ![oca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/oca/32/156060_2.png) [@oca](https://meta.discourse.org/u/oca)
#### Post date: [20.Июль.2019 10:55:10 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/1 "2019-07-20T10:55:10Z")

</div>

Продолжение обсуждения из [Как разделить форум на две основные части (общее/группы) и отображать только подкатегории, в которых я могу создать новый пост?](https://meta.discourse.org/t/how-to-split-the-forum-into-two-main-parts-general-groups-and-how-to-display-only-subcategories-i-can-create-a-new-post-in/108923):

Всем привет,

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

Я не считаю код достаточно хорошим, поэтому не хочу рекомендовать его, пока он не будет проверен кем-то другим.

### Что он делает

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

### Репозиторий

[Ссылка на репозиторий](http://framagit.org/oca/discourse-theme-shroud-subcategories)  
`framagit.org/oca/discourse-theme-shroud-subcategories`

### Мотивация

У меня есть сообщество с множеством групп, и я хочу, чтобы люди мирно игнорировали то, что относится к другим группам, кроме их собственных. **Я не хочу ограничивать доступ к контенту, я просто не хочу, чтобы он отображался на главной странице**. Они должны иметь возможность получить к нему доступ, перейдя туда и выбрав эту категорию конкретно (например, чтобы узнать, о чём здесь обсуждают). Очевидно, подходящим инструментом была бы функция наблюдения/игнорирования, но поскольку для её настройки в интерфейсе требуется более двух кликов, никто в сообществе ею не пользуется. [Некоторые улучшения на странице категории](https://meta.discourse.org/t/favorites-select-your-favorite-categories/81959/18?u=oca) могли бы решить проблему, но они находятся за пределами моих навыков.

Поэтому я использую то, что достаточно просто для них: страницу группы. На одной и той же странице отображаются все группы, к которым они имеют доступ (свободно или нет), и их описание. Это идеально: им нужно просто кликнуть и выбрать их. Страница группы слишком скрыта для них (внутри «гамбургер-меню»), поэтому я мог бы разместить большую кнопку-ссылку на главной странице.

Теперь мне нужно связать членство в группе и отображение постов категории.

### Как это работает

Использованный мной трюк заключался в настройке прав доступа к категории следующим образом:

- **все** : чтение, запись
- **эта группа** : создание сообщения, чтение, запись

Затем для каждой темы в списке проверяется, есть ли ограничение категории, и если да, то к элементу темы добавляется класс `not-in-group`.

Затем CSS добавляет `display:none` соответствующим образом.

### Интерфейс

Администратор может выбрать страницы, на которых это поведение будет работать. Это не должно делаться на странице категории, потому что по определению именно там мы хотим получить доступ к контенту. На моём сайте все эти группы являются подкатегориями, скрытыми со страницы `latest`; мы получаем к ним доступ через страницу `/c/groups/`, поэтому используется именно эта страница.

### Улучшения

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

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [20.Июль.2019 21:15:02 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/2 "2019-07-20T21:15:02Z")

</div>

Для меня это не имеет смысла. Почему бы не использовать разрешения категорий, чтобы ограничить то, что видят группы?

---

<div class="post-metadata">

### Author: ![oca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/oca/32/156060_2.png) [@oca](https://meta.discourse.org/u/oca)
#### Post date: [21.Июль.2019 09:29:56 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/3 "2019-07-21T09:29:56Z")

</div>

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

Но на главной странице я не хочу, чтобы их засыпали темами, которые им не интересны. Лучший способ — использовать функцию «подписаться/игнорировать», но это слишком сложно для них. Другой вариант — зарегистрироваться в группе, перейти на страницу категории, чтобы прочитать, что обсуждается, а затем выйти из группы. Для большинства это слишком много кликов, к тому же они не рискнут это сделать.

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

Надеюсь, стало понятнее.

---

<div class="post-metadata">

### Author: ![oca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/oca/32/156060_2.png) [@oca](https://meta.discourse.org/u/oca)
#### Post date: [26.Сентябрь.2019 19:54:54 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/4 "2019-09-26T19:54:54Z")

</div>

> [@oca](#):
>
> ### Улучшения
> 
> - Возможность выбора родительской категории для отфильтрованных категорий (так что любая категория, не являющаяся дочерней по отношению к этой, не будет пропущена)
> - Добавление тегов, чтобы при наличии у темы этого тега она не удалялась.

Эти улучшения реализованы.

---

<div class="post-metadata">

### Author: ![debryc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/debryc/32/101652_2.png) [@debryc](https://meta.discourse.org/u/debryc)
#### Post date: [03.Октябрь.2019 01:58:42 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/5 "2019-10-03T01:58:42Z")

</div>

Мне это очень интересно. Не могли бы вы показать пример или подсказать, где можно найти форум, где установлен этот компонент?

---

<div class="post-metadata">

### Author: ![debryc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/debryc/32/101652_2.png) [@debryc](https://meta.discourse.org/u/debryc)
#### Post date: [03.Октябрь.2019 14:31:49 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/6 "2019-10-03T14:31:49Z")

</div>

Кроме того, приводит ли фильтрация с помощью этого компонента к тому, что посты не отправляются в сводном письме? Потому что это было бы ПРЕВОСХОДНО.

---

<div class="post-metadata">

### Author: ![oca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/oca/32/156060_2.png) [@oca](https://meta.discourse.org/u/oca)
#### Post date: [03.Октябрь.2019 16:03:55 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/7 "2019-10-03T16:03:55Z")

</div>

Нет, не удаляет.  
Это не лишает доступа к посту, а просто скрывает его с помощью CSS.  
Темы всё ещё отправляются пользователю, но с инструкцией не отображать их.  
Цель использования — не лишать доступа, а просто убрать пост с главной страницы (или любой другой выбранной страницы).

Извините, у меня нет установленной версии на форуме без авторизации, но вы можете задать вопросы здесь или в личных сообщениях.

---

<div class="post-metadata">

### Author: ![debryc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/debryc/32/101652_2.png) [@debryc](https://meta.discourse.org/u/debryc)
#### Post date: [03.Октябрь.2019 16:14:50 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/8 "2019-10-03T16:14:50Z")

</div>

Спасибо!

> [@oca](#):
>
> Темы всё ещё отправляются пользователю с инструкцией не отображать их.

Что означает эта часть?

---

<div class="post-metadata">

### Author: ![oca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/oca/32/156060_2.png) [@oca](https://meta.discourse.org/u/oca)
#### Post date: [03.Октябрь.2019 17:05:35 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/9 "2019-10-03T17:05:35Z")

</div>

Если посмотреть исходный код страницы, то информация о теме отправляется. Однако компонент темы приказывает её игнорировать.

---

<div class="post-metadata">

### Author: ![Mevo](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mevo/32/187732_2.png) [@Mevo](https://meta.discourse.org/u/Mevo)
#### Post date: [03.Октябрь.2019 20:02:34 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/10 "2019-10-03T20:02:34Z")

</div>

Это работает «только» с отображением элементов при просмотре. Это не функция отключения звука или игнорирования. Однако я считаю это решение очень интересным для некоторых случаев использования. Поздравляю @oca с этой работой!

---

<div class="post-metadata">

### Author: ![debryc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/debryc/32/101652_2.png) [@debryc](https://meta.discourse.org/u/debryc)
#### Post date: [03.Октябрь.2019 20:10:00 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/11 "2019-10-03T20:10:00Z")

</div>

> [@oca](#):
>
> Если вы посмотрите исходный код страницы, то увидите, что информация о теме отправляется. Но компонент темы приказывает её игнорировать.

Я внимательно это изучу. Ещё раз спасибо!

---

<div class="post-metadata">

### Author: ![debryc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/debryc/32/101652_2.png) [@debryc](https://meta.discourse.org/u/debryc)
#### Post date: [04.Октябрь.2019 17:51:18 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/12 "2019-10-04T17:51:18Z")

</div>

Привет! Я установил этот компонент темы, но теперь у меня возникли проблемы с его настройкой. Когда я пытаюсь выбрать теги и отфильтрованные категории, мои не отображаются. Например, у нас точно есть тег «faq», но мне не везёт — я не могу его выбрать. Я также пробовал просто вводить тег вручную, но это тоже не работает.

 ![Скриншот Google Chrome (10-4-19, 13:49:09)](https://global.discourse-cdn.com/meta/original/3X/9/9/995ab6dfe2932e24e7899d2a9c1976701f67db93.png)

---

<div class="post-metadata">

### Author: ![JimPas](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jimpas/32/148179_2.png) [@JimPas](https://meta.discourse.org/u/JimPas)
#### Post date: [04.Октябрь.2019 19:08:26 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/13 "2019-10-04T19:08:26Z")

</div>

Включены ли у вас теги в панели управления? Они находятся в разделе «Настройки/Теги». Первое поле вверху списка тегов предназначено для их включения. После этого созданные вами теги должны начать работать.

---

<div class="post-metadata">

### Author: ![debryc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/debryc/32/101652_2.png) [@debryc](https://meta.discourse.org/u/debryc)
#### Post date: [04.Октябрь.2019 19:09:48 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/14 "2019-10-04T19:09:48Z")

</div>

Да, теги включены.

---

<div class="post-metadata">

### Author: ![oca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/oca/32/156060_2.png) [@oca](https://meta.discourse.org/u/oca)
#### Post date: [04.Октябрь.2019 20:14:03 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/15 "2019-10-04T20:14:03Z")

</div>

Параметр настройки не знает, какие теги существуют. Вам нужно указать имя тега здесь, нажать `create: 'faq'`, и тогда имя тега будет выбрано. Вы можете выбрать столько тегов, сколько необходимо; достаточно любого из них, чтобы снять скрытие публикации.

Будьте внимательны: если ваша учётная запись имеет права администратора, то она обладает полным доступом ко всем категориям. Однако скрытие категории определяется тем, может ли учётная запись фактически создать новую публикацию. Ваша может, поэтому ваша учётная запись сможет видеть все публикации везде. Чтобы протестировать компонент, я рекомендую создать тестовую учётную запись и посмотреть то же самое, что видит обычный пользователь.

---

<div class="post-metadata">

### Author: ![debryc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/debryc/32/101652_2.png) [@debryc](https://meta.discourse.org/u/debryc)
#### Post date: [04.Октябрь.2019 20:36:18 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/16 "2019-10-04T20:36:18Z")

</div>

Спасибо. Я думаю, что мне удалось заставить это работать, и я очень рад узнать, как всё пойдёт. Моя признательность за вашу работу.

---

<div class="post-metadata">

### Author: ![debryc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/debryc/32/101652_2.png) [@debryc](https://meta.discourse.org/u/debryc)
#### Post date: [06.Октябрь.2019 19:34:15 UTC](https://meta.discourse.org/t/hide-categories-according-to-user-group-membership/123497/17 "2019-10-06T19:34:15Z")

</div>

Можно ли сделать исключение для людей, которые отслеживают категорию?
