XF 2.1 Дополнительные поля тем

Версия XenForo
v2.1.10 Patch 2

SKAJIbnEJIb

Проверенные
Сообщения
37
Реакции
-2
Баллы
303
Добрый день. Создаю дополнительные поля для тем
Нужно, чтобы текст введенный пользователем обрабатывался php функцией или в идеале BB кодом. Но тут можно только html использовать. И bb коды не работают к сожалению

1599202078360.png

Что можно сделать, чтоб работали bb коды? Или чтоб вывод обрабатывался php функцией(аналогично как я и создавал bb код)
 
Решение
Можно еще через модификацию шаблона post_macros вставить прямую проверку на наличие кастомного поля темы и зарендерить bb-код:

HTML:
<xf:if is="$post.isFirstPost()">
    <xf:macro template="custom_fields_macros" name="custom_fields_view"
              arg-type="threads"
              arg-group="after"
              arg-onlyInclude="{$thread.Forum.field_cache}"
              arg-set="{$thread.custom_fields}"
              arg-wrapperClass="message-fields message-fields--after" />

    <!-- Рендерим наше поле -->
    <xf:if is="$thread.custom_fields.IDПОЛЯ">
        {{ bb_code('[ ТВОЙBBКОД ]' . $thread.custom_fields.IDПОЛЯ . '[/ТВОЙBBКОД]', 'first arg', 'second arg') }}
    </xf:if>
    <!-- /Рендерим наше поле -->
</xf:if>

А...
там можно указать коллбэк для пхп шной функции.
да, действительно так можно, раньше не заметил & в $value, думал это только для проверки введенных значений
1599206124433.png
однако не все так хорошо. Если в функции изменять $value, то html код выводится в сообщение вот так
1599206263053.png
да к тому же, если нажать редактировать тему, то этот html код и все исправления будут в поле, и после сохранения, опять добавится код



Конкретный вопрос будет ? Или гадать будем, что вам надо ?
я вроде конкретно написал
Что можно сделать, чтоб работали bb коды? Или чтоб вывод обрабатывался php функцией(аналогично как я и создавал bb код)



Что за ббкод нужен хоть?
кастомный bb code, создавал сам с обработкой php. Конечный результат, это обработанный текст засунутый в спойлер

судя по всему поведению движка, нельзя изменять так значение $value, как это делал я, тут можно только обернуть в html код. Так вот, может все-таки можно заюзать php функцию или bb code чтоб работал?
 
с обработкой php
А что внутри PHP-кода?
Для спойлера достаточно воткнуть это в HTML-значение:
HTML:
<div class="bbWrapper">
    <div class="bbCodeSpoiler">
        <button type="button" class="bbCodeSpoiler-button button--longText button" data-xf-click="toggle" data-xf-init="tooltip" title="Нажмите для открытия или закрытия спойлера">
            <span class="button-text">
                <span>
                    Спойлер
                </span>
            </span>
        </button>

        <div class="bbCodeSpoiler-content">
            <div class="bbCodeBlock bbCodeBlock--spoiler">
                <div class="bbCodeBlock-content">{$value}</div>
            </div>
        </div>
    </div>
</div>

:
1599208391598.png

Единственный недостаток такого лобового способа - спойлер и тултип всегда будут на русском языке, как и прописано в "HTML для вывода значения". Можно что-то своё туда вставить.
 
Последнее редактирование:
Для спойлера достаточно воткнуть это в HTML-значение:
это знаю, тут проблем никаких нет

А что внутри PHP-кода?
специфический блок для форума моей тематики. Парсит значение, сверяет их с базой, подкрашивает нужные слова и ссылки на них ставит. BB код сделал без особых проблем, а вот тут неожиданная проблема
 
Всё, я понял, что Вам нужно.
Это - валидатор. Всё, что Вы делаете внутри с $value, возвращается в функцию, которая вызывает Вашу, и уже возвращённое значение - сохраняется в базу.

Сейчас в движке нет никакого механизма, который позволил бы снабдить рендер кастом поля - кастомной логикой сложнее оборачивания значения в HTML. Можете этим и воспользоваться, реализовав кастомный JS-скрипт, который бы бегал на Ваш скрипт (в идеале - контроллер внутри движка) с данными, которые нужно отрисовать, а потом уже на лету в браузере подменить тем, что вернул сервер. А если данные статичны - их можно вместе с JS-скриптом хранить, как "метаданные".
Будет что-то вроде:
JavaScript:
(function($, window, document, _undefined)
{
    XF.SKAJIbnEJIb = XF.SKAJIbnEJIb || {};
    XF.SKAJIbnEJIb.CustomFieldRenderer = XF.Element.newHandler({
        options: {}, // опции, которые можно передать через DOM (data-*)

        // тут можно любые переменные/функции добавить, необходимые для работы
        // это объект

        // при нахождении совпадающего элемента, на фронте запускается функция init
        init: function()
        {
            // элемент, который помечен data-xf-init="skajlbnejlb-customfieldrenderer" - this.$target
            // с ним и производите любые нужные махинации
        }
    });

    // Создать объект и объявить его логику - мало. Нужно зарегать его.
    XF.Element.register('skajlbnejlb-customfieldrenderer', 'XF.SKAJIbnEJIb.CustomFieldRenderer');
})();
Его подключаете на страницах (или на всех сразу), где это поле есть, и всё.
 
Можно еще через модификацию шаблона post_macros вставить прямую проверку на наличие кастомного поля темы и зарендерить bb-код:

HTML:
<xf:if is="$post.isFirstPost()">
    <xf:macro template="custom_fields_macros" name="custom_fields_view"
              arg-type="threads"
              arg-group="after"
              arg-onlyInclude="{$thread.Forum.field_cache}"
              arg-set="{$thread.custom_fields}"
              arg-wrapperClass="message-fields message-fields--after" />

    <!-- Рендерим наше поле -->
    <xf:if is="$thread.custom_fields.IDПОЛЯ">
        {{ bb_code('[ ТВОЙBBКОД ]' . $thread.custom_fields.IDПОЛЯ . '[/ТВОЙBBКОД]', 'first arg', 'second arg') }}
    </xf:if>
    <!-- /Рендерим наше поле -->
</xf:if>

А потом в шаблоне extra.less скрываем изначальное поле (то, которое без bb-кода).

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

Можно еще через модификацию шаблона post_macros вставить прямую проверку на наличие кастомного поля темы и зарендерить bb-код:

HTML:
<xf:if is="$post.isFirstPost()">
    <xf:macro template="custom_fields_macros" name="custom_fields_view"
              arg-type="threads"
              arg-group="after"
              arg-onlyInclude="{$thread.Forum.field_cache}"
              arg-set="{$thread.custom_fields}"
              arg-wrapperClass="message-fields message-fields--after" />

    <!-- Рендерим наше поле -->
    <xf:if is="$thread.custom_fields.IDПОЛЯ">
        {{ bb_code('[ ТВОЙBBКОД ]' . $thread.custom_fields.IDПОЛЯ . '[/ТВОЙBBКОД]', 'first arg', 'second arg') }}
    </xf:if>
    <!-- /Рендерим наше поле -->
</xf:if>

А потом в шаблоне extra.less скрываем изначальное поле (то, которое без bb-кода).

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

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


не могу найти, как правильно прописать условие, и как вообще называется этот язык разметки xf чтоб загуглить правильно. Если размер $thread.custom_fields.custom_form_test < 10, то не выводить ничего. Я пока сделал только != '-'
HTML:
$0

<xf:if is="$thread.custom_fields.custom_form_test AND $thread.custom_fields.custom_form_test != '-'">
    <style>#custom_form_test { display:none; }</style>
    {{ bb_code('[TEST]' . $thread.custom_fields.custom_form_test . '[/TEST]', '', '') }}
</xf:if>
 
Последнее редактирование модератором:
Единственный минус, что дублирует
А потом в шаблоне extra.less скрываем изначальное поле (то, которое без bb-кода).
Поле, которое вставляет XF по умолчанию имеет HTML атрибут, соответствующий ID поля. Поэтому, скрыть его можно так:
Less:
.message-fields [data-field="IDПОЛЯ"] { display: none; }


Если размер $thread.custom_fields.custom_form_test < 10, то не выводить ничего.
А что за поле то? Зачем нужна еще одна проверка (после AND)? Что за 10? Есть еще какие-то условия, когда поле не должно показываться?
 
Последнее редактирование:
  • Мне нравится
Реакции: Hope
CMTV, я хочу, чтобы это поле люди не забывали заполнять. В 90% оно нужно, но иногда не нужно, поэтому я поставил обязательное заполнение поля, чтоб юзер обратил внимание. Ну а если оно не нужно, он поставит прочерк, или еще чего ни будь. В самый раз будет, сделать проверку на кол-во символов в содержимом

Поле, которое вставляет XF по умолчанию имеет HTML атрибут, соответствующий ID поля. Поэтому, скрыть его можно так:
Less:
.message-fields [data-field="IDПОЛЯ"] { display: none; }
сделал так, но поле не скрылось. В коде не видно никаких data-field="IDПОЛЯ"
это что получается, можно в less указать display:none, и в коде страницы оно не выведется?
я же просто его скрыл обычным <style>, но разумеется в коде страницы текст остался
 
Последнее редактирование модератором:
Ну а если оно не нужно, он поставит прочерк, или еще чего ни будь.
Лучше и правильнее сразу определить тогда, какой символ является указателем отсутствия и требовать писать именно его (через описание к полю). В таком случае вариант через AND выше сгодится (только правильнее будет заменить != в условии на !==.
сделал так, но поле не скрылось. В коде не видно никаких data-field="IDПОЛЯ"
По идее то поле, которое по стандарту вставляет XF должно иметь этот атрибут. Даже на этой странице у поля "Версия XenForo" он есть:
1599221353151.png
я же просто его скрыл обычным <style>, но разумеется в коде страницы текст остался
Можно и так ?
 
Последнее редактирование:
  • Мне нравится
Реакции: Hope
не могу найти, как правильно прописать условие, и как вообще называется этот язык разметки xf чтоб загуглить правильно. Если размер $thread.custom_fields.custom_form_test < 10, то не выводить ничего. Я пока сделал только != '-'
нашел методом тыка просто... подскажите, как называется эта разметка? где о ней почитать
HTML:
<xf:if is="$thread.custom_fields.custom_form_test AND strlen($thread.custom_fields.custom_form_test) > 10">

По идее то поле, которое по стандарту вставляет XF должно иметь этот атрибут. Даже на этой странице у поля "Версия XenForo" он есть:
ну хз, нет его
 
Последнее редактирование модератором:
Это обычный HTML с вкраплениями доп. тегов XF и языковых конструкций PHP. Правда PHP сильно урезан и пользоваться можно только ограниченным набором функций и действий.
Еще можно посмотреть в файл src/XF/Template/Templater.php. Там приведены вообще все теги, функции и фильтры, которые можно использовать в разметке. Можно брать название и искать, как оно используется в уже существующих шаблонах.
 
Последнее редактирование:
Это обычный HTML с вкраплениями доп. тегов XF и языковых конструкций PHP. Правда PHP сильно урезан и пользоваться можно только ограниченным набором функций и действий.
Еще можно посмотреть в файл src/XF/Template/Templater.php. Там приведены вообще все теги, функции и фильтры, которые можно использовать в разметке. Можно брать название и искать, как оно используется уже в существующих шаблонах.
спасибо друг, то что нужно

все-таки один вопрос остался не ясным до конца. Зачем в less писать display:none, если он просто скроет код, по факту он же останется на странице, я правильно понимаю?
 
Можно и вообще его убрать, но это надо доп. модификации шаблона делать, да и не очень здорово ради одного поля городить кучу костылей по разным файлам. Проще именно скрыть. Да, в коде оно будет, но кому не пофиг. Если там не "Война и мир" по размеру внутри, то ничего плохого в этом нет.
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу