Перейти к содержанию

Кнопки в редакторе сообщений

Этот материал научит вас создавать новые кнопки в редакторе сообщений SMF.

Также вы узнаете, как использовать хуки integrate_bbc_codes и integrate_bbc_buttons.

Возьмем в качестве примера интеграции веб-плеер Plyr.

Пример роликов Youtube и Vimeo вместе

Итак, создадим пару тегов — plyr-youtube и plyr-vimeo. И сделаем в редакторе сообщений кнопки для вставки этих тегов.

Подключение хуков⚓︎

Используемые функции опишем в файле Class-Plyr.php и реализуем подключение при установке мода.

Можете использовать Simple Mod Maker для генерации шаблона мода, либо творить вручную:

<?xml version="1.0"?>
<!DOCTYPE package-info SYSTEM "http://www.simplemachines.org/xml/package-info">
<package-info xmlns="http://www.simplemachines.org/xml/package-info" xmlns:smf="http://www.simplemachines.org/">
    <id>Bugo:Plyr</id>
    <name>Plyr</name>
    <version>0.1</version>
    <type>modification</type>

    <install for="2.1.*">
        <hook hook="integrate_pre_load" function="Bugo\Plyr::hooks#" file="$sourcedir/Class-Plyr.php"/>
        <require-file name="Sources/Class-Plyr.php" destination="$sourcedir">Adding main source file</require-file>
        <require-dir name="Themes/default" destination="$themes_dir">Adding languages and images</require-file>
    </install>

    <uninstall for="2.1.*">
        <hook hook="integrate_pre_load" function="Bugo\Plyr::hooks#" file="$sourcedir/Class-Plyr.php" reverse="true"/>
        <remove-file name="$sourcedir/Class-Plyr.php">Removing main source file</remove-file>
        <remove-file name="$imagesdir/bbc/plyr-yotube.png" />
        <remove-file name="$imagesdir/bbc/plyr-vimeo.png" />
        <remove-file name="$languagedir/Plyr.english.php" />
        <remove-file name="$languagedir/Plyr.russian.php" />
    </uninstall>
</package-info>

Сформируем метод hooks в нашем классе:

<?php

public function hooks(): void
{
    add_integration_function('integrate_load_theme', self::class . '::loadTheme#', false, __FILE__);
    add_integration_function('integrate_bbc_codes', self::class . '::bbcCodes#', false, __FILE__);
    add_integration_function('integrate_bbc_buttons', self::class . '::bbcButtons#', false, __FILE__);
}

Подключение скрипта⚓︎

Создадим метод loadTheme, для загрузки скрипта плеера:

<?php

public function loadTheme(): void
{
    // Подключаем внешний JS-файл
    loadJavaScriptFile('https://cdn.plyr.io/3.8.3/plyr.js', ['external' => true]);

    // Подключаем внешнюю таблицу стилей
    loadCSSFile('https://cdn.plyr.io/3.8.3/plyr.css', ['external' => true]);

    // Добавляем небольшой скрипт
    addInlineJavaScript('const players = Array.from(document.querySelectorAll(".plyr")).map((p) => new Plyr(p));', true);
}

Обработка тегов⚓︎

Содержимое элемента content берем со страницы плеера на GitHub. Только вместо ссылки на файл используем переменную $1 (то, что между тегами).

Вставляем это в метод bbcCodes, дописываем некоторые мелочи и получаем:

<?php

public function bbcCodes(array &$codes): void
{
    $codes[] = [
        'tag' => 'plyr-youtube',
        'type' => 'unparsed_content',
        'content' => '<div class="plyr" data-plyr-provider="youtube" data-plyr-embed-id="$1"></div>',
        'disabled_content' => '<a href="https://www.youtube.com/watch?v=$1" target="_blank" rel="noopener noreferrer">https://www.youtube.com/watch?v=$1</a>',
        'block_level' => true,
    ];

    $codes[] = [
        'tag' => 'plyr-vimeo',
        'type' => 'unparsed_content',
        'content' => '<div class="plyr" data-plyr-provider="vimeo" data-plyr-embed-id="$1"></div>',
        'disabled_content' => '<a href="https://vimeo.com/$1" target="_blank" rel="noopener noreferrer">https://vimeo.com/$1</a>',
        'block_level' => true,
    ];
}

Теперь теги audio и video обрабатываются. Но для удобства пользователей не хватает вставки этих тегов через редактор сообщений.

Кнопки в редакторе сообщений⚓︎

С помощью хука integrate_bbc_buttons подключаем функцию bbcCodes, в которой добавляем новые элементы в массив кнопок ($buttons):

<?php

public function bbcButtons(array &$buttons): void
{
    global $txt;

    // Языковой файл
    loadLanguage('Plyr');

    $buttons[] = [
        'image' => 'plyr-youtube',
        'code' => 'plyr-youtube',
        'before' => '[plyr-youtube]',
        'after' => '[/plyr-youtube]',
        'description' => $txt['plyr_youtube'],
    ];

    $buttons[] = [
        'image' => 'plyr-vimeo',
        'code' => 'plyr-vimeo',
        'before' => '[plyr-vimeo]',
        'after' => '[/plyr-vimeo]',
        'description' => $txt['plyr_vimeo'],
    ];
}

В этом массиве каждая кнопка хранится в виде следующих элементов:

  • image — название gif-изображения (без расширения) кнопки, которое хранится в директории bbc (внутри папки images)
  • code — тег, для вставки которого предназначена эта кнопка
  • before — открывающий тег, вставляемый в сообщение при нажатии на кнопку
  • after — закрывающий тег, вставляемый в сообщение при нажатии на кнопку
  • description — всплывающая подсказка, появляющаяся при наведении указателя мышки

Теперь вам нужно найти картинки для кнопочек, сохранить их под названием audio.png и video.png в директории Themes/default/images/bbc.

Также создайте языковой файл Themes/default/languages/Plyr.russian.php со следующим содержимым:

<?php

$txt['plyr_youtube'] = 'Ссылка на ролик Youtube';
$txt['plyr_vimeo'] = 'Ссылка на ролик Vimeo';

В настройках плеера (на официальном сайте), в разделе «Служебные», не забудьте включить опцию «Заменять стандартные теги на странице».

Осталось упаковать это всё в архив и установить через Менеджер пакетов.

Не понравился этот плеер? Можете попробовать прикрутить другие, их много. Например: