# Пользовательские компоненты: добавление кнопки или текста в любое место плагина

**URL:** https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629
**Category:** Theme component
**Created:** [29.Январь.2025 19:52:10 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629 "2025-01-29T19:52:10Z")
**Posts on this page:** 14
**Page:** 1

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [29.Январь.2025 19:52:10 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/1 "2025-01-29T19:52:10Z")

</div>

| | | |
| --- | --- | --- |
| ℹ | **Краткое описание** | Добавить кнопку или текст в любое место |
| 🛠 | **Репозиторий** | [https://github.com/literatecomputing/discourse-custom-components](https://github.com/literatecomputing/discourse-custom-components) |
| ❓ | **Инструкция по установке** | [Как установить тему или компонент темы](https://meta.discourse.org/t/how-do-i-install-a-theme-or-theme-component/63682) |
| 📖 | **Новичок в темах Discourse?** | [Руководство для начинающих по использованию тем Discourse](https://meta.discourse.org/t/beginners-guide-to-using-discourse-themes/91966) |

Установить этот компонент темы

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

Чтобы узнать, где находятся точки подключения, воспользуйтесь ссылкой [Introducing Discourse developer toolbar](https://meta.discourse.org/t/introducing-discourse-developer-toolbar/346215). Если вы не знаете, что такое точка подключения, ознакомьтесь с материалом [Using Plugin Outlet Connectors from a Theme or Plugin](https://meta.discourse.org/t/using-plugin-outlet-connectors-from-a-theme-or-plugin/32727). Однако этот компонент позволяет, с некоторыми ограничениями, вставлять текст в любую точку подключения без необходимости программирования или глубокого понимания того, что такое точка подключения.

 ![image](https://global.discourse-cdn.com/meta/original/4X/1/c/4/1c40fec47bb1599224c9bc234c686b641db260b8.png)

 ![На изображении показан интерфейс настроек для пользовательских кнопок, включающий поля для текста кнопки, заголовка, URL, класса, иконки и групп, с примером кнопки под названием «Custom Component Demo Button!». (Подпись сгенерирована ИИ)](https://global.discourse-cdn.com/meta/original/4X/f/6/9/f690cff41846bf4869061a0aa8b89033eec6da24.png)

 ![На изображении показан интерфейс настроек темы для редактирования пользовательских текстовых блоков в дизайне форума, с опциями отображения конкретных текстовых элементов, настройки точек подключения блоков, применения классов стилей и управления отображением в зависимости от групп пользователей. (Подпись сгенерирована ИИ)](https://global.discourse-cdn.com/meta/original/4X/3/5/2/35224da267b7ac857ca3ad23c3383e8a39c27c1c.png)

Я начал разрабатывать этот плагин для человека, который хотел отображать кнопку «Нажмите здесь, чтобы подписаться и отправить личные сообщения» на профилях пользователей и карточках пользователей. Они хотели, чтобы кнопка отображалась, если пользователь не может отправлять личные сообщения. Поскольку я не всегда так умен, как мне хотелось бы думать, я написал компонент, используя группы для определения того, должна ли отображаться кнопка. Одной из проблем такого подхода было то, что сотрудники не входили в группу подписчиков, поэтому они видели кнопку «Нужно подписаться», хотя могли отправлять личные сообщения. Кроме того, группа была скрыта, поэтому использовать её в компоненте темы было невозможно. Я [переписал этот компонент темы](https://github.com/literatecomputing/subscribe-to-message), чтобы использовать `currentUser.can_send_private_messages` для определения необходимости отображения кнопки.

### Для кого это?

Если вы хотите добавить кнопку со ссылкой или произвольный текст, который отображается или скрывается для определённых групп, этот компонент позволит вам вставить их в любую точку подключения. Хотите добавить кнопку-ссылку «Вам стоит подписаться» под каждым сообщением, кроме тех, кто не является участником? Это решит задачу. Хотите вставить произвольный HTML в точку подключения, чтобы посмотреть, как это будет выглядеть? Это тоже возможно.

### Как это помогает разработчикам

Эта тема содержит несколько простых примеров того, как:

- использовать тип [Objects type for theme setting](https://meta.discourse.org/t/objects-type-for-theme-setting/305009) для настроек темы;
- использовать `api.renderInOutlet` (как описано [здесь](https://meta.discourse.org/t/using-plugin-outlet-connectors-from-a-theme-or-plugin/32727/34?u=pfaffman)), чтобы вставить компонент Glimmer в точку подключения, управляемую настройкой, вместо создания файла в директории `connectors`;
- написать [простой компонент Glimmer](https://github.com/literatecomputing/discourse-custom-components/blob/main/javascripts/discourse/components/button-link.gjs), который обращается к `currentUser`;
- [обернуть компонент в другой (встроенный) шаблон](https://github.com/literatecomputing/discourse-custom-components/blob/main/javascripts/discourse/api-initializers/custom-components.gjs#L9-L11), чтобы передавать ему данные;
- отображать произвольный HTML из настройки темы без ограничений Markdown — конечно, можно использовать помощник `html-safe` в Ember, и он отобразит HTML вместо текста:

> [@Discourse](#):
>
> Здесь можно использовать помощник `html-safe` из Ember, и он отобразит HTML вместо текста.

однако, если вы пытаетесь сделать это внутри тега `<template>` внутри файла `.gjs`, всё работает немного иначе (например, `{{htmlSafe component.text}}`).

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [30.Январь.2025 03:11:29 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/2 "2025-01-30T03:11:29Z")

</div>

Пробел делает текст не жирным.

 ![На изображении содержится зацензурированный текст «Add Custom Outlet», где слово «Outlet» зачеркнуто. (Подпись сгенерирована ИИ)](https://global.discourse-cdn.com/meta/original/4X/9/2/a/92ada1256f4ff49f54d7ec9f2ef0b9c46df65dbe.jpeg)

* * *

Отличный компонент!

---

<div class="post-metadata">

### Author: ![jrgong](https://avatars.discourse-cdn.com/v4/letter/j/c57346/32.png) [@jrgong](https://meta.discourse.org/u/jrgong)
#### Post date: [04.Март.2025 10:25:06 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/3 "2025-03-04T10:25:06Z")

</div>

Возможно ли добавить плейсхолдеры в URL-адреса кнопок, например, чтобы URL содержал идентификатор темы, в которой находится пользователь?

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [04.Март.2025 16:07:22 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/4 "2025-03-04T16:07:22Z")

</div>

Я не совсем уверен. Если у вас есть бюджет, я посмотрю.

Что бы делала ваша кнопка, если бы у неё был ID темы?

Если вы разберётесь и захотите создать PR, я, скорее всего, приму его.

> [@jrgong](#):
>
> Возможно ли добавить плейсхолдеры в URL кнопок, например, чтобы URL содержал ID темы, в которой находится пользователь?

Я почти уверен, что ответ — нет, но вы можете использовать обходной путь, описанный здесь:

> [@Discourse](#):
>
> Вы также можете использовать другие компоненты Ember как блоки, вам просто нужно использовать правильное имя. Например, ядро включает компонент Ember `signup-cta`, и вы можете использовать его в боковой панели как есть. Обратите внимание, что вы не можете использовать компоненты, которые ожидают набор параметров, но вы _можете_ создать свой собственный компонент Ember в отдельной теме и ссылаться на него в настройках `blocks` боковой панели просто по имени.

---

<div class="post-metadata">

### Author: ![jrgong](https://avatars.discourse-cdn.com/v4/letter/j/c57346/32.png) [@jrgong](https://meta.discourse.org/u/jrgong)
#### Post date: [28.Апрель.2025 14:04:06 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/5 "2025-04-28T14:04:06Z")

</div>

Привет, @pfaffman

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

Таким образом, наши бизнес-клиенты смогут отправлять нам запросы на закрепление, выделение или «спонсирование» конкретных тем.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [28.Апрель.2025 14:10:40 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/6 "2025-04-28T14:10:40Z")

</div>

Как вы [знаете](https://meta.discourse.org/t/creating-pre-filled-personal-message-links/35984/60?u=pfaffman), можно создать URL, который откроет новый редактор темы. Вы можете сделать так, чтобы эта ссылка добавлялась компонентом темы.

> [@jrgong](#):
>
> которая затем включает текущий URL, на котором находится пользователь

Я не думаю, что это возможно сделать без добавления кода в компонент темы (но, возможно, это так?). Возможно, у кого-то есть идея на этот счет, и он предложит решение здесь (или в другой теме). Если нет, вы можете связаться со мной или написать в #Marketplace с описанием того, что вам нужно, и указанием бюджета.

---

<div class="post-metadata">

### Author: ![Cate\_Soule](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cate_soule/32/492770_2.png) [@Cate\_Soule](https://meta.discourse.org/u/Cate_Soule)
#### Post date: [14.Декабрь.2025 10:30:02 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/7 "2025-12-14T10:30:02Z")

</div>

Демонстрационный текстовый блок не выровнен с демонстрационной кнопкой и остальным содержимым. Я использую `extra-nav-item` в блоке outlet.

 ![Screenshot 2025-12-14 at 6.26.29 PM](https://global.discourse-cdn.com/meta/original/4X/e/d/0/ed0d1d4aa6249d6e85cac3fdc3637d89f9eae8aa.jpeg)

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [14.Декабрь.2025 10:57:46 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/8 "2025-12-14T10:57:46Z")

</div>

Думаю, вам нужно добавить класс этих других кнопок к той, которую вы уже добавили.

---

<div class="post-metadata">

### Author: ![Cate\_Soule](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cate_soule/32/492770_2.png) [@Cate\_Soule](https://meta.discourse.org/u/Cate_Soule)
#### Post date: [14.Декабрь.2025 11:20:58 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/9 "2025-12-14T11:20:58Z")

</div>

Что вы имеете в виду? Я попытался использовать тот же класс, что и у кнопки-демонстрации.

 ![Screenshot 2025-12-14 at 7.19.54 PM](https://global.discourse-cdn.com/meta/original/4X/d/6/1/d61d4b6a0cf16a9ba7d2dd583da9a42b8e6ded14.jpeg)

 ![Screenshot 2025-12-14 at 7.19.18 PM](https://global.discourse-cdn.com/meta/original/4X/a/5/6/a564df78c41fa3fd0d9b394611a3483655549cfc.jpeg)

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [14.Декабрь.2025 12:04:44 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/10 "2025-12-14T12:04:44Z")

</div>

Да. Поскольку это текст, а не кнопка, вам нужно добавить немного CSS, чтобы он выглядел как другие элементы, которые являются кнопками.

Компонент темы разместил текст там, где вы хотели, но он не предназначен для стилизации в том виде, который вам нужен.

Добавление этого в ваш CSS в какой-либо теме должно сработать.

```plaintext
.custom-component.btn-custom {
  display: inline-flex;
  align-self: center;
}

```

---

<div class="post-metadata">

### Author: ![Cate\_Soule](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cate_soule/32/492770_2.png) [@Cate\_Soule](https://meta.discourse.org/u/Cate_Soule)
#### Post date: [14.Декабрь.2025 12:41:33 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/11 "2025-12-14T12:41:33Z")

</div>

Привет, это не работает. Кроме того, даже если для групп текстовых блоков установлено значение «Все», текстовый блок не отображается для гостей.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [14.Декабрь.2025 13:09:30 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/12 "2025-12-14T13:09:30Z")

</div>

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

> [@Cate\_Soule](#):
>
> Также, даже если для групп текстовых блоков установлено значение «Все», текстовый блок не отображается для гостей.

Кроме того, вам следует изменить настройку так, чтобы она СКРЫВАЛА совпадающие группы, а не показывала их.

![image](https://cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/meta/optimized/4X/6/8/8/6880f83587ff46add83599fe3ebe13ee0d346816_2_690x46.png)

 ![image](https://global.discourse-cdn.com/meta/original/4X/e/b/c/ebc4743a4b4fa212fabd8b8920a4147dca2e354c.png)

 ![image](https://global.discourse-cdn.com/meta/original/4X/e/a/3/ea3b54020a8906329e7b1b29ec24031cc24e0ff5.png)

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

---

<div class="post-metadata">

### Author: ![Cate\_Soule](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cate_soule/32/492770_2.png) [@Cate\_Soule](https://meta.discourse.org/u/Cate_Soule)
#### Post date: [14.Декабрь.2025 13:26:47 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/13 "2025-12-14T13:26:47Z")

</div>

Спасибо! Мне удалось заставить CSS работать!

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [14.Декабрь.2025 13:50:09 UTC](https://meta.discourse.org/t/custom-components-add-button-or-text-at-any-plugin-outlet/349629/14 "2025-12-14T13:50:09Z")

</div>

Отлично! Рад, что всё работает! CSS-магия всё ещё вызывает у меня трудности.
