Forum categories

Плагин “Custom Extrafields” - знакомство и поддержка плагина

Введение в плагин кратко. Исходные сведения для работы с плагином. Обсуждение, вопросы, помощь и поддержка плагина пользовательских экстраполей для статей со своей собственной таблицей БД


webitproff
webitproff • 2026-04-24 08:59 #1

Что это вообще такое

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

Сразу после установки вы получаете 15 демонстрационных полей всех поддерживаемых типов – готовую шпаргалку для настройки под свои задачи.

Реальный функционал плагина (что он умеет из коробки)

  1. Создаёт отдельную таблицу cot_xtradbrowpage для хранения значений экстраполей, связанную со страницами внешним ключом.
  2. Автоматически регистрирует все созданные экстраполя в системе, и они сразу становятся доступны для редактирования через админку (раздел «Экстраполя»).
  3. Добавляет демо-набор из 15 полей при первой установке — по одному на каждый поддерживаемый тип: input, textarea, select, checkbox, radio, datetime, country, range, checklistbox, file, double, inputint и т.д.
  4. Выводит поля на странице редактирования (page.edit.tpl) простым циклом, используя блок <!-- BEGIN: XTRA_EXTRAFLD -->.
  5. Сохраняет все значения при обновлении страницы, включая правильную обработку дат, чекбоксов, чисел, файлов и строк.
  6. Корректно обрабатывает загрузку файлов:
    • Создаёт защищённую папку datas/exflds/xtradbrowpage при установке.
    • Файлы физически перемещаются в эту папку, старые автоматически удаляются при замене.
    • Предусмотрена возможность удалить загруженный файл отдельной галочкой.
  7. Отображает значения на странице просмотра (page.tpl) двумя способами:
    • Динамический вывод всех заполненных полей через <!-- BEGIN: XTRA_EXTRAFLD -->.
    • Индивидуальные теги вида {XTRA_ИМЯ_ПОЛЯ}, {XTRA_ИМЯ_ПОЛЯ_TITLE} и {XTRA_ИМЯ_ПОЛЯ_VALUE}.
  8. Добавляет тег {XTRA_EXTRAFIELD_NAME} внутрь динамического блока, позволяя задавать уникальные CSS-классы под каждое поле (например, class="extrafield-demo_date").
  9. Выводит экстраполя в списках страниц (категории, поиск, теги) через штатную функцию cot_generate_pagetags() — используются теги с префиксом PAGE_XTRA_....
  10. Поддерживает вывод в <head> для SEO – через хук header.tags формируются теги {XTRA_HEADER_ИМЯ_ПОЛЯ} (например, для вставки мета-тегов или OpenGraph).
  11. Автоматически удаляет свои данные при удалении страницы (через внешний ключ ON DELETE CASCADE) и очищает записи хука page.edit.delete.done.
  12. Полностью удаляет за собой всё при деинсталляции:
    • Удаляет саму таблицу cot_xtradbrowpage.
    • Вычищает все соответствующие записи из системной таблицы cot_extra_fields.
  13. Безопасен для префиксов таблиц: использует переменные $db_xtradbrowpage, поэтому не падает на сайтах с нестандартным префиксом БД.
  14. Устойчив к ошибкам установки: если при первой установке что-то пошло не так, достаточно очистить записи в cot_extra_fields для location cot_xtradbrowpage и переустановить плагин – он создаст все поля заново.

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

Что плагин даёт «из коробки»

После активации плагина в разделе админки «Экстраполя → cot_xtradbrowpage» вы видите 15 готовых полей. Их можно сразу наполнять при редактировании любой страницы, не дописывая ни строчки кода.
Каждое поле – это не просто пример, а реальный инструмент для определённого типа данных. Ниже – зачем нужно каждое.


Список полей и их практическое применение

  1. Название события (input)
    Обычное текстовое поле. Можно использовать для любого короткого заголовка, имени, дополнительного названия – что угодно, что должно быть выведено строкой.
  2. Описание программы события (textarea)
    Многострочный текст. Годится для развёрнутого описания, технического задания, примечаний, любой длинной информации, прикреплённой к странице.
  3. Начало события (datetime)
    Выбор даты и времени. Идеально для любых событийных страниц: дата начала акции, вебинара, публикации, крайний срок. Сохраняется в БД как timestamp, легко сортировать и выводить в нужном формате.
  4. Стоимость билета (double)
    Число с плавающей точкой. Можно вводить цену, вес, рейтинг, любой дробный показатель. В БД хранится корректно, никаких проблем с запятыми/точками.
  5. Сезон (select)
    Выпадающий список с предопределёнными значениями. Защищает от опечаток и разнобоя. Пригодится для тегов, фильтров, рубрикации.
  6. Пример целого числа (inputint)
    Целое число. Удобно для счётчиков, количества, ID, приоритетов – всего, что не должно иметь дробной части.
  7. Пример числа с плавающей точкой (double) – ещё один демо‑пример. Показывает, как можно задать два разных поля одного типа, если нужно несколько чисел.
  8. Пример выпадающего списка (select)
    Показывает, как сделать простое поле выбора без привязки к конкретной логике. Можно заменить варианты на свои и использовать для статусов, типов, любых перечислений.
  9. Пример флажка (checkbox)
    Простой «да/нет». Удобен для флагов: «показывать на главной», «премиум», «завершено» и т.п. Хранится как 1/0, легко проверять в шаблонах.
  10. Пример радиокнопок (radio)
    Выбор одного из двух‑трёх вариантов. Полезно, когда вариантов немного и важно исключить случайный выбор нескольких.
  11. Пример выбора даты и времени (datetime) – второй экземпляр. Можно использовать как «дату окончания» или «дату публикации», если у страницы несколько дат.
  12. Пример загрузки файла (file)
    Позволяет прикрепить к странице файл: PDF, ZIP, картинку. Файл сохраняется в защищённой папке, старый автоматически удаляется при замене. Идеально для документации, сертификатов, дополнительных материалов.
  13. Пример выбора страны (country)
    Выпадающий список всех стран мира. Значение хранится как двухбуквенный код. Удобно при создании страниц, привязанных к географии, для фильтрации, экспорта.
  14. Пример ползунка (range)
    Выбор числа из диапазона. Хотя в форме это выпадающий список, семантически это ползунок: быстро задать уровень, сложность, процент выполнения.
  15. Пример списка с флажками (checklistbox)
    Множественный выбор из нескольких опций. Очень удобно для тегов, категорий, отметок – можно выбрать сразу несколько значений, сохраняются строкой через запятую.

Как это меняет жизнь

  • Раньше: чтобы добавить к странице дату события или файл, приходилось либо использовать общие экстраполя в таблице pages, которые выводились у всех страниц, либо городить отдельные поля в БД, править PHP и шаблоны.
  • Теперь: вы просто выбираете нужный тип поля в админке, настраиваете пару параметров – и оно появляется в форме редактирования и на странице без программирования.
    Все 15 полей служат одновременно и шпаргалкой, и фундаментом – их можно сразу применять и подгонять под конкретную задачу, просто меняя названия и варианты.

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

Что делает плагин 

  • Добавляет отдельную таблицу cot_xtradbrowpage для хранения экстраполей страниц. Каждая запись привязана к странице через itempagid = page_id с каскадным удалением.
  • Регистрирует локацию cot_xtradbrowpage в админке «Расширения → Экстраполя».
  • При редактировании страницы автоматически выводит все активные экстраполя этой локации (форма с префиксом rxtra_, теги {PAGEEDIT_FORM_XTRA_ИМЯПОЛЯ}). Сохраняет их при обновлении страницы.
  • На странице просмотра предоставляет теги {XTRA_ИМЯПОЛЯ}, {XTRA_ИМЯПОЛЯ_TITLE}, {XTRA_ИМЯПОЛЯ_VALUE}, а также блок <!-- BEGIN: XTRA_EXTRAFLD --> для перебора всех полей.
  • В списках страниц (через cot_generate_pagetags()) доступны теги с префиксом {LIST_ROW_XTRA_...}.
  • В <head> (хук header.tags) можно использовать {XTRA_HEADER_ИМЯПОЛЯ}.
  • При удалении страницы запись из cot_xtradbrowpage удаляется каскадно или явно (хук page.edit.delete.done).
  • Предоставляет три API-функции для ручной работы. 

Требования 

  • Cotonti 0.9.26+
  • PHP 8.4+
  • Модуль page должен быть установлен 

Установка 

  1. Скопировать папку плагина в /plugins/xtradbrowpage.
  2. В админке «Расширения → Плагины» нажать «Установить». 

Установочный SQL (выполняется автоматически): 

CREATE TABLE IF NOT EXISTS `cot_xtradbrowpage` (
 `itempagid` int UNSIGNED NOT NULL,
 PRIMARY KEY (`itempagid`),
 CONSTRAINT `fk_xtradbrowpage_pages` FOREIGN KEY (`itempagid`) REFERENCES `cot_pages` (`page_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Добавление экстраполей 

  1. В админке: «Расширения → Экстраполя».
  2. Выбрать локейшен cot_xtradbrowpage (появится после установки плагина).
  3. Создать поля нужных типов. Допустимые типы: input, textarea, select, datetime, double и любые другие, поддерживаемые ядром Cotonti. 

Пример набора полей (из дампа БД) 

Имя поляТипHTML-шаблонВарианты / ПараметрыОписание
event_nameinput<input class="form-control" type="text" name="{$name}" value="{$value}" maxlength="255">Название события 
event_descriptiontextarea<textarea class="form-control" name="{$name}" rows="{$rows}" cols="{$cols}" maxlength="255">{$value}</textarea>Описание программы события 
event_startdatetime<div class="row g-2"> ... </div> (см. дамп)2024,2030,d.m.Y H:iНачало события
event_ticketpricedouble<input class="form-control" type="text" name="{$name}" value="{$value}" maxlength="255">Стоимость билета 
event_sesonselect<select class="form-select" name="{$name}">{$options}</select>unknown,winter,summer,autumn,springСезон

Шаблоны и теги 

1. Форма редактирования (page.edit.tpl) 

Блок для автоматического вывода всех полей:

<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="form-group">
 <label>{PAGEEDIT_FORM_XTRA_EXTRAFLD_TITLE}</label>
 {PAGEEDIT_FORM_XTRA_EXTRAFLD}
</div>
<!-- END: XTRA_EXTRAFLD -->

Индивидуальные поля (пример для event_name):

<div class="mb-3">
 <label>{PAGEEDIT_FORM_XTRA_EVENT_NAME_TITLE}</label>
 {PAGEEDIT_FORM_XTRA_EVENT_NAME}
</div>

2. Страница просмотра (page.tpl)

Блок для всех полей:

<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="extrafield">
 <strong>{XTRA_EXTRAFIELD_TITLE}:</strong>
 <span>{XTRA_EXTRAFIELD_VALUE}</span>
</div>
<!-- END: XTRA_EXTRAFLD -->

Индивидуальное поле:

<!-- IF {XTRA_EVENT_START} -->
 <p>{XTRA_EVENT_START_TITLE}: {XTRA_EVENT_START}</p>
<!-- ENDIF -->

Значения форматируются согласно типу поля (datetime будет отформатирован в d.m.Y H:i).

3. Списки страниц (page.list.tpl, news.tpl и т.д.)

Используются теги {LIST_ROW_XTRA_ИМЯПОЛЯ}, например:

<!-- IF {LIST_ROW_XTRA_EVENT_NAME} -->
 <small>{LIST_ROW_XTRA_EVENT_NAME_TITLE}: {LIST_ROW_XTRA_EVENT_NAME}</small>
<!-- ENDIF -->

Эти теги добавляются через хук pagetags.main внутри функции cot_generate_pagetags().

4. Секция <head> (header.tpl)

<!-- IF {XTRA_HEADER_EVENT_NAME} -->
 <meta name="event" content="{XTRA_HEADER_EVENT_NAME}">
<!-- ENDIF -->

API для разработчиков

Функции находятся в /plugins/xtradbrowpage/inc/xtradbrowpage.functions.php.

Получение всех зарегистрированных полей

$fields = xtradbrowpage_getExtrafields(); // массив из Cot::$extrafields['cot_xtradbrowpage']

Загрузка записи для страницы

$data = xtradbrowpage_load($page_id); // возвращает ассоциативный массив с ключами field_name

Сохранение (INSERT или UPDATE)

$values = [
 'event_name' => 'Новое событие',
 'event_start' => 1715011200, // UNIX timestamp
 'event_ticketprice' => 100.50
];
xtradbrowpage_save($page_id, $values);

Хуки плагина и их назначение

ХукФайлДействие
admin.extrafields.firstxtradbrowpage.admin.extrafields.first.phpДобавляет локацию в белый список экстраполей
header.tagsxtradbrowpage.header.tags.phpНазначает теги XTRA_HEADER_* для текущей страницы
page.edit.tagsxtradbrowpage.page.edit.tags.phpВыводит поля в форме редактирования и парсит блок XTRA_EXTRAFLD
page.edit.update.donextradbrowpage.page.edit.update.done.phpСохраняет переданные значения в cot_xtradbrowpage
page.edit.delete.donextradbrowpage.page.edit.delete.done.phpЯвно удаляет запись для страницы
page.tagsxtradbrowpage.page.tags.phpНазначает теги для страницы просмотра, парсит блок XTRA_EXTRAFLD
pagetags.mainxtradbrowpage.pagetags.phpДобавляет в $temp_array теги LIST_ROW_XTRA_*

Практический пример: создание событий

1. Добавление полей

Создайте через админку поля: event_name, event_description, event_start, event_ticketprice, event_seson с параметрами, как в таблице выше.

2. Шаблон редактирования

<!-- В page.edit.tpl -->
<div class="card mt-3">
 <div class="card-header">Параметры события</div>
 <div class="card-body">
 <!-- BEGIN: XTRA_EXTRAFLD -->
 <div class="mb-3">
 <label class="form-label">{PAGEEDIT_FORM_XTRA_EXTRAFLD_TITLE}</label>
 {PAGEEDIT_FORM_XTRA_EXTRAFLD}
 </div>
 <!-- END: XTRA_EXTRAFLD -->
 </div>
</div>

3. Шаблон просмотра

<!-- В page.tpl -->
<!-- IF {XTRA_EVENT_NAME} -->
<div class="event-details">
 <h2>{XTRA_EVENT_NAME}</h2>
 <!-- BEGIN: XTRA_EXTRAFLD -->
 <p><strong>{XTRA_EXTRAFIELD_TITLE}:</strong> {XTRA_EXTRAFIELD_VALUE}</p>
 <!-- END: XTRA_EXTRAFLD -->
</div>
<!-- ENDIF -->

4. Вывод в списке

<!-- В page.list.tpl внутри блока LIST_ROWS -->
<div class="list-item">
 <a href="{LIST_ROW_URL}">{LIST_ROW_TITLE}</a>
 <!-- IF {LIST_ROW_XTRA_EVENT_START} -->
 <span class="date">{LIST_ROW_XTRA_EVENT_START}</span>
 <!-- ENDIF -->
</div>

Особенности работы с типами полей

  • datetime: хранится как int (UNIX timestamp). В форме редактирования предоставляются выпадающие списки. На вывод форматируется согласно параметру field_params (например, d.m.Y H:i).
  • select: в field_variants значения через запятую; выбранное сохраняется как строка.
  • double: сохраняется как число с плавающей точкой.
  • Все поля экранируются при выводе через cot_build_extrafields_data() и htmlspecialchars().

Примечания

  • Плагин не добавляет колонки в таблицу cot_pages.
  • Если страница создаётся без немедленного сохранения экстраполей, запись в cot_xtradbrowpage появится при первом обновлении страницы через форму редактирования.
  • Для массовой вставки данных используйте API-функцию xtradbrowpage_save().
  • Кеш Cotonti очищать не требуется, но при проблемах с отображением очистите кеш в админке.
This post was edited by webitproff (2026-04-25 19:56, 2 months ago)
1/1/0

losdriver
losdriver • 2026-04-24 18:50 #2

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

webitproff
webitproff • 2026-04-25 04:59 #3

#511 losdriver: 
 

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

 

Доброго! 
Сижу и туплю, гадаю, - почему мне в оповещение на почту не пришло уведомление о вашем сообщении на форуме, - забыл подписаться в личном кабинете на обновления

Ладно, к делу! Скажу прямо, если вы не разработчкик, - мой ответ врядли вам чем-то поможет, но тем не менее, постараюсь кратко ответить.
Идея даже не плагина, а вообще имено необходимость дробления таблиц БД на "блохеры и подписчики" (реляционная модель) лежит на стыке ряда нестандартных задач, с которыми, крайне сомнительно, вообще какой-то движок сайта или супер-пупер дорогая 1000 раз взломанная CMS могла бы справиться настолько просто и безболезненно, а именно:

1. Сайт на Котонти, используются все штатные основные модули (статьи, форум, опросы, личные сообщения) + модуль витрины товаров - нужно вывести кастомизированные заголовки и описание в браузер, что бы скормить их поисковикам. Для этого пришлось выполнить: 
    а). отдельный header.tpl если мы на странице товаров или в списках (внутри категории) (дифференциация пользовательских шаблонов)
    б). снова мета-описание и заголовок, но уже переведеный на язык товара - модифицировали плагин "i18n", но конкретно под товары, 
    в). переведенные "штатно" заголовки и мета-описания по размеру и содержанию, не подходят для вывода на странице товара пользователю и браузеру в исходный код. Если товар называется "Автомагнитола бабинная «Электроника-308» с батарейками" то согласитесь, выводить на странице, пользователю "Купить автомагнитолу в Сингапуре за восемь баксов, цена со скидкой" - немного тупо, поэтому для плагина мультиязычности реализовали экстраполя, куда размещаем эти кастомизированные, уже переведенные строки с призывом к действию и выводим уже затем в свой отдельный header.tpl. 
    г). Дифференциация: названия товара, заголовка в браузере и заголовка на странице товара — что решает «специализация».



       - Название товара - основной его текстовый "идентификатор" - он краткий в списках товаров (не выступает в огород к соседу и сам не ложится на три строки в своем);
           например:

 Автомагнитола бабинная «Электроника-308» с батарейками

           - Мета-заголовок товара - первая строка в списке искомого обьекта в поисковиках. Он же в названии вкладки браузера. и по правилам должен быть кратким (примерно 50-55 символов), но осмысленным, можно добавлять призыв к действию "Купить", "Получите скидку на .." и т.д.
           например:

Купить «Электроника-308» Автомагнитола со скидкой 20% 

       - Заголовок товара на собственно своей странице товара - тут уже можете его разогнать и обойти ограничения, которые ложатся на SEO-заголовок или название товара в списке, - (Расширенное название)
           например:

 Автомагнитола «Электроника-308» на бабинах 12 дюймов, в подарок пачка батареек и три колонки с бензозаправки.

    

    д). все дифференцированные заголовки мы нашли как положить в локализированные версии (переводы) - в экстраполя модифицированного под товары плагина "i18n", и под расширенный заголовок создали экстраполе в модуле товаров, но в дополнение к расширенному заголовку, нам понадобилась куча дополнительных полей, которые также требуют своих переводов на другой язык (для туристов и приезжих работать): 
       - цена в долларах;
       - наличие;
       - Бренд/производитель;
       - Период акции;
       - Размер скидки;
       - стикеры;
       - и еще штук 15 минимум...
Забегая наперед, скажу, что даже встречал, когда в таблицу товаров пихали эмейлы в одну колонку и телефоны в другую, всех, кто купил товар.

Ну как? лупить это всё в одну таблицу товаров - это норм??? - физически то можно, но управлять такой организацией структуры таблицы БД - будет крайне не приятно, - "ломаются" не только глаза, но и вы порой уже забудете, что конкретно искали. И товары это всегда тысячи строк в БД.

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

att_1119.webp


Показываю на пальцах:
1. Создали товар - объект с уникальным идентификатором. (мать)

2. Объект имеет наследуемые характеристики и свойства (условно, - 4 дочки, по 7, 9, 11 и 12 лет с разным характером и размером одежды, да еще и в разных школах)

3. Мать же не таскает их везде с собой, - на работу, к подругам, в ванную, туалет или еще с десяток мест? - Правильно, все собираются по какому-то условию или событию - семейный ужин, генеральная уборка или поездка на отдых. Нет смысла, вот везде всем быть в одном месте - катастрофа неизбежна. 
Точно также с нашим "Объектом" - он может иметь свои 20-ть "детей" - поля с информацией о цене поставщика, наличие, период скидки и еще 15 штук свойств и характеристик, которые нет смысла всюду, всегда и везде таскать с собой, а собирать вместе по конкретному условию и событию, и заметьте, - всегда сохраняется отношение, то есть принадлежность - соседские дети на отдых с нашей мамой не поедут.

4. Когда у нас уже есть 20-ть "детей", которые ссылаются на одну “маму” - мы строим новую структуру - для каждой дочки шьем костюм - переводы этих значений на другие языки, для реальных туристов или трудовых мигрантов, которые на своем родном языке, но в нашей стране ищут товар через поисковые системы.

Вот так и родилась идея плагина “Custom Extrafields” - у каждого объекта свои наследуемые поля, и вам не нужно под каждый тип данных (цена, время и дата, текст, выпадающий список, радио-кнопка и т.д.) писать снова новый плагин, и снова новый код - всё уже написано и довольно прекрасно реализовано в Cotonti средствами "API Extrafields". Для меня лично - да, создание плагина еще как оправданно, и скажите спасибо что он бесплатный.

И очень надеюсь, что ответил на ваш вопрос 

"чем же плагин такой особенный и какие сотни задач решает?".


       

This post was edited by webitproff (2026-04-30 06:55, 2 months ago)
1/1/0

losdriver
losdriver • 2026-04-25 15:22 #4

ну ты мужик и выдал базу! 

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

хотел спросить еще, а зачем так заморачиваться с заголовками?

webitproff
webitproff • 2026-04-25 20:05 #5

#513 losdriver: 
 

ну ты мужик и выдал базу! 

ну спасибо, такие слова вдохновляют.

добавил новый обработчик 

теперь сразу после установки плагина идем в свои экстраполя плагина 

https://cotonti.local/admin/extrafields?n=cot_xtradbrowpage

Управление сайтом => Прочее => Экстраполя => Таблица cot_xtradbrowpage - Кастомные экстраполя страниц

и у вас уже 15 штук всевозможных демонстрационных экстраполей в полностью работоспособном виде.

редактируйте их как угодно под свои нужды.

теперь не нужно бегать и искать примеры правильного заполнения формы при создании нужного вам экстраполя.

 

 

 

webitproff
webitproff • 2026-04-25 20:06 #6

насчет другого вопроса 

“а зачем так заморачиваться с заголовками?”

 - это писать в отдельной теме

🗿

🧙‍♂️ Well met, good traveler! Fate has guided your steps to our humble realm. Here, wise sages and masters of the coding craft ⚒️📜 gather to unravel the mysteries of the code ✨⚙️, share their knowledge, and add new chapters to our chronicles.
⬅️ To the left lie ancient scrolls 📚 filled with forgotten wisdom. ⬆️ Straight ahead, friendly folk offer counsel 💬 to those in need. ➡️ To the right, you may become a chronicler ✍️ yourself, sharing your craft and leaving words of wisdom for those yet to come.
📝 Delay no longer—tell us the name by which you are known, complete the rite of registration 🛡️, and join our fellowship!
🏰 Our brotherhood holds no secret initiation, yet many halls remain closed to wandering guests, for some knowledge 💎 is reserved for those who choose to walk this path beside us.