Иконка ресурса

Добавляем вкладки в настройки плагина

Hope

Premium
Сообщения
48,305
Решения
22
Реакции
71,871
Баллы
40,905
Пользователь Hope разместил новый ресурс:

Добавляем вкладки в настройки плагина - Добавляем вкладки в настройки плагина.

Для начала включаем режим отладки, добавив в файл /src/config.php следующую строку:
Код:
$config['debug'] = true;

Далее идём по пути: Панель управления - Разработка - Обработчики событий - И нажимаем сверху кнопку "Добавить новый обработчик события" - Заполняем поля так:
Обрабатывать событие: templater_macro_pre_render
Подсказка события: admin:option_macros:option_form_block
Выполнить обработчик: Your\Namespace\XenForo2\EventListener\MacroRender ::...

Узнать больше об этом ресурсе...
 
Hope Доброе время суток.
Рецепт сам по себе работает - шаблон подменяется, но выводит эту ошибку:
Код:
Template admin:option_list: Argument 4 passed to Test\XF\EventListener\MacroRender::preRender() must be of the type array, string given (src\addons\Test\XF\EventListener\MacroRender.php:7)
не передаётся четвёртый элемент - array &$arguments - и по этому не работает ограничение подмены шаблона только для этого плагина.

Пока писал пост пришла идея посмотреть в самом плагине откуда это =)
Правильные параметры:
Код:
public static function preRender(\XF\Template\Templater $templater, &$type, &$template, &$name, array &$arguments, array &$globalVars)
 
Мануал писался ещё под бету версию, а с тех пор уже были изменения, отсюда конечно нужны корректировки, а так же он был обновлён уже пару раз там.
 
  • Мне нравится
Реакции: Hope
Обновление мануала от 24 июня 2021 ?
Это руководство позволит вам создать единую группу параметров для всех ваших настроек, разделив их на разделы с вкладками.

1638465758854.png

1638465768621.png

Создаем обработчик событий.
Событие: templater_macro_pre_render
Подсказка события: admin:option_macros:option_form_block
Обработчик: Your\Namespace\Listener :: templaterMacroPreRender
PHP:
PHP:
<?php

namespace Your\Namespace;

class Listener
{
    public static function templaterMacroPreRender(\XF\Template\Templater $templater, &$type, &$template, &$name, array &$arguments, array &$globalVars)
    {
        if (!empty($arguments['group']) && $arguments['group']->group_id == 'your_group')
        {
            // Override template name
            $template = 'your_namespace_option_macros';
         
            // Or use 'option_form_block_tabs' for tabs
            $name = 'option_form_block';
         
            // Your block header configurations
            $arguments['headers'] = [
                'generalOptions'      => [
                    'label'           => \XF::phrase('general_options'),
                    'minDisplayOrder' => 0,
                    'maxDisplayOrder' => 2000,
                    'active'          => true // Only used for tabs, indicates default active tab
                ],
                'otherOptions'        => [
                    'label'           => \XF::phrase('other_options'),
                    'minDisplayOrder' => 2000,
                    'maxDisplayOrder' => 3000
                ],
                'evenMoreOptions'     => [
                    'label'           => \XF::phrase('even_more_options'),
                    'minDisplayOrder' => 3000,
                    'maxDisplayOrder' => -1 // This allows for any higher display order value
                ],
            ];
        }
    }
}

Шаблоны админки
Название шаблона: your_namespace_option_macros
Содержимое шаблона:
HTML:
<xf:macro name="option_form_block" arg-group="" arg-options="!" arg-containerBeforeHtml="" arg-headers="{{ [] }}">
    <xf:if is="$options is not empty">
        <xf:form action="{{ link('options/update') }}" ajax="true" class="block">
            {$containerBeforeHtml|raw}
            <div class="block-container">
             
                <xf:foreach loop="$headers" value="$header">
                    <xf:macro name="option_rows" arg-header="{$header.label}"
                              arg-group="{$group}" arg-options="{$options}"
                              arg-minDisplayOrder="{$header.minDisplayOrder}" arg-maxDisplayOrder="{$header.maxDisplayOrder}" />
                </xf:foreach>

                <xf:submitrow sticky="true" icon="save" />
            </div>
        </xf:form>
    </xf:if>
</xf:macro>

<xf:macro name="option_form_block_tabs" arg-group="" arg-options="!" arg-containerBeforeHtml="" arg-headers="{{ [] }}">
    <xf:if is="$options is not empty">
        <xf:form action="{{ link('options/update') }}" ajax="true" class="block">
            {$containerBeforeHtml|raw}
            <div class="block-container">
                <h2 class="block-tabHeader tabs" data-xf-init="tabs" role="tablist">
                    <xf:foreach loop="$headers" key="$key" value="$header">
                        <a class="tabs-tab{{ $header.active ? ' is-active' : '' }}" role="tab" tabindex="0" aria-controls="{$key}">{$header.label}</a>
                    </xf:foreach>
                </h2>
                <ul class="tabPanes">
                    <xf:foreach loop="$headers" key="$key" value="$header">
                        <li class="{{ $header.active ? 'is-active' : '' }}" role="tabpanel" id="{$key}">
                            <xf:macro name="option_rows"
                                      arg-group="{$group}" arg-options="{$options}"
                                      arg-minDisplayOrder="{$header.minDisplayOrder}" arg-maxDisplayOrder="{$header.maxDisplayOrder}" />
                        </li>
                    </xf:foreach>
                </ul>
                <xf:submitrow sticky="true" icon="save" />
            </div>
        </xf:form>
    </xf:if>
</xf:macro>

<xf:macro name="option_rows" arg-header="" arg-group="!" arg-options="!" arg-minDisplayOrder="{{ 0 }}" arg-maxDisplayOrder="!">
    <xf:set var="$hundred" value="0" />

    <xf:if is="$header">
        <h3 class="block-formSectionHeader">{$header}</h3>
    </xf:if>

    <div class="block-body">
        <xf:foreach loop="$options" value="$option">
            <xf:if is="{$option.Relations.{$group.group_id}.display_order} >= $minDisplayOrder AND ({$option.Relations.{$group.group_id}.display_order} < $maxDisplayOrder OR $maxDisplayOrder == -1)">
                <xf:if is="$group">
                    <xf:set var="$curHundred" value="{{ floor($option.Relations.{$group.group_id}.display_order / 100) }}" />
                    <xf:if is="{{ $curHundred > $hundred }}">
                        <xf:set var="$hundred" value="{$curHundred}" />
                        <hr class="formRowSep" />
                    </xf:if>
                </xf:if>

                <xf:macro template="option_macros" name="option_row"
                          arg-group="{$group}" arg-option="{$option}" />
            </xf:if>
        </xf:foreach>
    </div>
</xf:macro>

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

Так-же не забудьте:
  • Заменить все экземпляры your_group с идентификатором группы опций, на тот, который вы использовали.
  • Заменить все экземпляры Your\Namespace или your_namespace на соответствующее пространством имен, которое вы используете.
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу