Статьи, форумы, интернет-магазин, комментарии и теги нашего плагина.
Прописание тегов и сборка "составов поездов" по предыдущему модулю, - модулю пользователей 'users', как по мне это было простенько.
Разумеется это субъективный взгляд, и новичкам везде тяжело, пока не освоятся.
Поэтому я и прибегаю к разного рода самым известным аналогиям, что бы вам, как новичку было проще сопоставить то, что вам уже известно с тем, что представлено в шпаргалке. Прибегая к такого рода "познанию в сравнении" вы по большей части не будете создавать новые знания, а будете пользоваться вашими текущими, еще с детства.
Вы точно забудете, имена шаблонов, полей, что и где прописывать, но вы никогда не забудете про "паровозик с вагонами", который нужно собрать. Уверен также не забудете, что "официанту" нужно назвать корректное имя того, что желаете от него получить, и тут вспомните, что имя, - это уже собранный "железнодорожный состав", со своим локомотивом, собственными вагонами пассажирскими, грузовыми, багажными, почтовыми и т.д.
Но если "внутри" модуля 'users' нам было достаточно "официанту сказать", - «дай мне в шаблоне здесь {КАРТОШКА_ЖАРЕННАЯ}, {КЕТЧУП_ОСТРЫЙ}», то в расширениях за пределами шаблонов модуля 'users' (простите за тавтологию, но тут лучше так), мы будем вынужденны говорить, указывая явное "географическое" происхождение.
Например, - {ЕГИПЕТСКАЯ_КАРТОШКА_ЖАРЕННАЯ}, {АМЕРИКАНКСАЯ_КАРТОШКА_ЖАРЕННАЯ}, {ЧИЛИЙСКИЙ_КЕТЧУП_ОСТРЫЙ} и.д.
И так, чутку забегая вперед, покажу, как мы будем говорить, а точнее называть официанту (шаблонизатору XTemplate) имена "составов с географическим признаком":
В статьях на странице полной новости:
{PAGE_OWNER_XTRA_X200_RESUME_FILE}
{PAGE_OWNER_XTRA_X200_RESUME_FILE_TITLE}
{PAGE_OWNER_XTRA_X200_RESIDENCE_COUNTRY_TITLE}
{PAGE_OWNER_XTRA_X200_RESIDENCE_COUNTRY}
{PAGE_OWNER_XTRA_X200_RESIDENCE_COUNTRY_NAME}
На форуме, в списках постов (ответов в теме):
{FORUMS_POSTS_ROW_USER_XTRA_X200_RESUME_FILE}
{FORUMS_POSTS_ROW_USER_XTRA_X200_RESUME_FILE_TITLE}
{FORUMS_POSTS_ROW_USER_XTRA_X200_RESIDENCE_COUNTRY_TITLE}
{FORUMS_POSTS_ROW_USER_XTRA_X200_RESIDENCE_COUNTRY}
{FORUMS_POSTS_ROW_USER_XTRA_X200_RESIDENCE_COUNTRY_NAME}
В товарах, на странице карточки товара, в блоке информации о продавце:
{MARKET_OWNER_XTRA_X200_RESUME_FILE}
{MARKET_OWNER_XTRA_X200_RESUME_FILE_TITLE}
{MARKET_OWNER_XTRA_X200_RESIDENCE_COUNTRY_TITLE}
{MARKET_OWNER_XTRA_X200_RESIDENCE_COUNTRY}
{MARKET_OWNER_XTRA_X200_RESIDENCE_COUNTRY_NAME}
В комментариях, на странице статьи полной новости, в блоке списка комментариев и информации о авторе комментария:
{COMMENTS_ROW_AUTHOR_XTRA_X200_RESUME_FILE}
{COMMENTS_ROW_AUTHOR_XTRA_X200_RESUME_FILE_TITLE}
{COMMENTS_ROW_AUTHOR_XTRA_X200_RESIDENCE_COUNTRY_TITLE}
{COMMENTS_ROW_AUTHOR_XTRA_X200_RESIDENCE_COUNTRY}
{COMMENTS_ROW_AUTHOR_XTRA_X200_RESIDENCE_COUNTRY_NAME}
На первый взгляд, здесь тоже все очень просто и оно действительно так, но есть ньюанс, если раньше, с модулем пользователей, наш плагин сам указывал "локомотив", главный, ключевой тягач всех вагонов, то здесь, с расширения за пределами модуля пользователей, плагин заранее не знает его.
В дебри лезть не будем, здесь давайте усвоим одно, что как и у модуля 'users', у остальных модулей и плагинов используются такие же, но свои тягачи, со своими именами. Паровоз, тепловоз, электровоз, дизелевоз, автомотриса - в общем смысле назначение одно, - тянуть за собой состав вагонов, из которых мы составляем правильные имена, что бы их потом назвать официанту.
Так как же составлять правильно имена тегов?
1. Правило первое.
К "локомотиву" цепляемся в последнюю очередь, сразу собираем состав вагонов.
2. Правило второе.
Состав вагонов, за пределами модуля пользователей, всегда начинается с "вагона обслуживания", а именно с постпрефикса "XTRA_".
К "вагону обслуги" цепляем "первый ключевой" вагон, а это имя вашего поля, которое всегда видете в админке плагина, на вкладке "Статистика", в колонке "Имя поля".
К "первому ключевому", с характерным звуком, пристыковываем замыкающий суффиксный вагон атрибутов, в виде "_TITLE", "_NAME" или "_VALUE", взамисимости от характера "груза", но об этом позже.
3. Правило третье.
Если "поехал" один собранный поезд из вагона обслуги и первого ключевого, - поедут все остальные.
Собираем состав:
- "XTRA_" - вагон обслуги, для дальних поездок, за пределами модуля 'users';
- "X011_TG_VENDOR_ORDERS" - ключевой вагон, с именем нашего поля, в данном случае, для перевозки данных поля "телеграм"Стыкуем эти два вагона
"XTRA_" + "X011_TG_VENDOR_ORDERS" = XTRA_X011_TG_VENDOR_ORDERS
Всё! у нас есть основа поезда, это основа нашего состава.
Теперь, можно цепляться к любому локомотиву, который тягает другие поезда в нужном "географическом" направлении.
Выше о них уже я писал, это:
- "PAGE_OWNER_" - тягач, всего, что связано с пользователем, владельцем статьи, на ее полной странице, по собственной ссылке.
- "FORUMS_POSTS_ROW_USER_" - тягач, всего, что связано с пользователем, владельцем/автором поста/ответа в любой теме форума.
- "COMMENTS_ROW_AUTHOR_" - тягач, всего, что связано с пользователем, автором комментария, в списке комментариев к кокнретной статье.
- "MARKET_OWNER_" - тягач, всего, что связано с пользователем, владельцем товара, в карточке его полной страницы.
Стыкуем локомотив и основу поезда для статьи, что бы вывести в шаблоне page.tpl, он же page.news.tpl или page.usersblog.tpl - это просто вариации одного шаблона.
"PAGE_OWNER_" + "XTRA_X011_TG_VENDOR_ORDERS" = "PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS"
Вот и получили наш поезд в сборе, он почти готов к отправке.
Осталось нам, обратиться к "официанту", который обслуживает наши шаблоны, а сейчас это page.tpl (полная статья) и правильно сказать, обернув составленное имя в фигурные скобки:
{PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS}
Для нас это звучит примерно так:
Принеси мне в статью, "служебный вагон" плагина 'xtradbrowusers' и прикрепленный к нему, "ключевой вагон", я надеюсь там есть нужные мне данные поля телеграм этого пользователя.
Мы проверяем, и в нужном месте появились данные, которые мы попросили у официанта.
Но нам этого мало, и мы хотим получить название этого поля.
Не путать с "имя поля".
Зайдите в админку, таблица "Параметры экстраполей" вы наглядно увидите разницу.
Название поля, - это описательная пояснительная записка к каждому полю, что бы мы понимали, что это за данные. Например, можно вывести дату, а это дата чего именно? Вот для этого и существуют названия полей, которые мы получаем, стыкуя с нашим составом, суффиксный вагон атрибута "_TITLE".
Для предельной простоты, рекомендую запомнить, что бы не путаться, увидели атрибут "_TITLE" в составе экстраполя - это этикетка, лейба, лейбл, стикер того, что лежит в ОСНОВНОМ СОСТАВЕ из служебного и ключевого вагонов.
И по аналогии, с тем, что мы уже знаем, берем наш основной поезд, уже с локомотивом и дополнительно стыкуем:
"PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS" + "_TITLE" = "PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS_TITLE"
Заворачиваем в обертку из фигурных скобок, и передаем официанту новый поезд и в новом составе, вот в таком виде:
{PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS_TITLE}И если он уже приносил {PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS}, то на ваш новый запрос, ответит "мм-гу" и тут же покажет {PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS_TITLE}.
Оформим это разметкой HTML-кода, и в нужном месте, где-то после никнейма пользователя (владельца статьи) добавим:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<!-- IF {PAGE_OWNER_XTRA_X020_ABOUT_VENDOR_TEXT} -->
<div class="d-flex mb-3">
<div class="contact-icon about me-3">
<i class="fa-solid fa-circle-info fa-xl"></i>
</div>
<div>
<div class="contact-label">{PAGE_OWNER_XTRA_X020_ABOUT_VENDOR_TEXT_TITLE}</div>
<div class="contact-value">{PAGE_OWNER_XTRA_X020_ABOUT_VENDOR_TEXT}</div>
</div>
</div>
<!-- ENDIF -->
<!-- IF {PAGE_OWNER_XTRA_X010_PHONE_VENDOR_ORDERS_VALUE} -->
<div class="d-flex align-items-center mb-3">
<div class="contact-icon phone me-3">
<i class="fa-solid fa-phone fa-xl"></i>
</div>
<div>
<div class="contact-label">{PAGE_OWNER_XTRA_X010_PHONE_VENDOR_ORDERS_TITLE}</div>
<div class="d-flex align-items-center">
<span id="phone-{PAGE_OWNER_ID}" class="contact-value fs-3" style="letter-spacing:2px"></span>
<button type="button" class="btn btn-outline-primary btn-sm ms-2"
id="show-phone-btn-{PAGE_OWNER_ID}"
data-phone="{PAGE_OWNER_XTRA_X010_PHONE_VENDOR_ORDERS_VALUE}"
onclick="document.getElementById('phone-{PAGE_OWNER_ID}').textContent = this.dataset.phone; this.style.display='none';">
<i class="fa-solid fa-eye me-1"></i> {PHP.L.xtradbrowusers_details_tpl_show_hidden_content}
</button>
</div>
</div>
</div>
<!-- ENDIF -->
<!-- IF {PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS} -->
<div class="d-flex align-items-center mb-3">
<div class="contact-icon telegram me-3">
<i class="fa-brands fa-telegram fa-xl"></i>
</div>
<div>
<div class="contact-label">{PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS_TITLE}</div>
<a href="https://t.me/{PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS}" target="_blank" rel="noopener noreferrer" class="telegram-link">
@{PAGE_OWNER_XTRA_X011_TG_VENDOR_ORDERS}
</a>
</div>
</div>
<!-- ENDIF -->
<!-- IF {PAGE_OWNER_XTRA_X012_TG_CHANEL_VENDOR_VALUE} -->
<div class="d-flex align-items-center mb-3">
<div class="contact-icon telegram me-3">
<i class="fa-brands fa-telegram fa-xl"></i>
</div>
<div>
<div class="contact-label">{PAGE_OWNER_XTRA_X012_TG_CHANEL_VENDOR_TITLE}</div>
<a href="https://t.me/{PAGE_OWNER_XTRA_X012_TG_CHANEL_VENDOR_VALUE}" target="_blank" rel="noopener noreferrer" class="telegram-link">
@{PAGE_OWNER_XTRA_X012_TG_CHANEL_VENDOR_VALUE}
</a>
</div>
</div>
<!-- ENDIF -->
<!-- IF {PAGE_OWNER_XTRA_X200_RESUME_FILE} -->
<div class="d-flex align-items-center mb-3">
<div class="me-3">
<label>{PAGE_OWNER_XTRA_X200_RESUME_FILE_TITLE}:</label>
</div>
<div>
<a href="{PHP.cfg.mainurl}/datas/exflds/xtradbrowusers/{PAGE_OWNER_XTRA_X200_RESUME_FILE}"
class="btn btn-primary btn-sm"
target="_blank"
rel="noopener noreferrer">
<i class="fa-solid fa-download me-1"></i> {PHP.L.Download}
</a>
</div>
</div>
<!-- ENDIF -->
<!-- IF {PAGE_OWNER_XTRA_X200_LAST_PROMOTION} -->
<div class="d-flex align-items-center mb-3">
<div class="contact-icon calendar me-3">
<i class="fa-solid fa-calendar-alt fa-xl"></i>
</div>
<div>
<div class="contact-label">{PAGE_OWNER_XTRA_X200_LAST_PROMOTION_TITLE}</div>
<div class="contact-value">{PAGE_OWNER_XTRA_X200_LAST_PROMOTION}</div>
</div>
</div>
<!-- ENDIF -->
<!-- IF {PAGE_OWNER_XTRA_X200_DEPARTMENT} -->
<div class="d-flex align-items-center mb-3">
<div class="contact-icon building me-3">
<i class="fa-solid fa-building fa-xl"></i>
</div>
<div>
<div class="contact-label">{PAGE_OWNER_XTRA_X200_DEPARTMENT_TITLE}</div>
<div class="contact-value">{PAGE_OWNER_XTRA_X200_DEPARTMENT}</div>
</div>
</div>
<!-- ENDIF -->
<!-- IF {PAGE_OWNER_XTRA_X200_RESIDENCE_COUNTRY} -->
<div class="d-flex align-items-center mb-3">
<div class="contact-icon building me-3">
<i class="fa-solid fa-building fa-xl"></i>
</div>
<div>
<div class="contact-label">{PAGE_OWNER_XTRA_X200_RESIDENCE_COUNTRY_TITLE}</div>
<div class="contact-value">{PAGE_OWNER_XTRA_X200_RESIDENCE_COUNTRY} | {PAGE_OWNER_XTRA_X200_RESIDENCE_COUNTRY_NAME}</div>
</div>
</div>
<!-- ENDIF -->
<!-- ENDIF -->
Смотрите пояснительные скриншоты в статье с краткой шпаргалкой.