1 (13.09.2009 06:48 отредактировано andrew)

Тема: HOWTO: Создание расширений.

* * * Что такое расширение и для чего это нужно? * * *

Итак, расширения - это механизм, который позволяет добавлять функционал форуму не внося изменений в исходный код. Преимущества и недостатки такого механизма:
Преимущества:
+ код, реализованный в виде расширения, прост в написании, установке и удалении. Не нужно помнить какие файлы редактировались для добавления новой функции.
+ Обновлять ядро(основной код) форума можно не опасаясь потерять важные изменения и дополнения.
+ Обновлять модули также становится гораздо проще.
Недостатки:
- пока не выявлено

Как видим преимуществ все-же больше чем недостатков, поэтому продолжим.
______________________________



* * * За счет чего работают расширения? * * *

Расширения для PunBB возможны благодаря так называемым хукам(hook - крюк, ловушка).
Хук - перехват обработки события. Служит этот механизм для внедрения кода в определенное место ядра.

Как работают хуки?
Для примера возьмем последние строки файла header.php:

unset($main_elements);
($hook = get_hook('hd_end')) ? eval($hook) : null;
if (!defined('FORUM_HEADER'))
    define('FORUM_HEADER', 1);

Здесь мы видим, что в переменную $hook загружается некий код:

$hook = get_hook('hd_end')

а затем выполняется:

eval($hook)

Параметр обработчика(в нашем случае это hd_end) принято называть идентификатором хука или хуком.

Т.е. использование хука hd_end равносильно замене строки

($hook = get_hook('hd_end')) ? eval($hook) : null;

Произвольным исходным кодом.
______________________________



* * * Структура расширения * * *

Все расширения должны находится в папке extesions. В этой папке необходимо создать свою папку, имя которой соответствует идентификатору расширения, например: my_extension, no_header, new_smilies и т.д. Категорически не рекомендую использовать префикс pun, например: pun_extension, pun_header, pun_smilies, потому как он "зарезервирован" для официальных(поддерживаемых командой разработчиков форума) расширений.

Для примера, я буду использовать идентификатор my_extension.

Папка расширения должна содержать файл manifest.xml в кодировке UTF-8. То есть относительный путь к файлу manifest.xml должен выглядеть следующим образом:
/extensions/my_extension/manifest.xml, где my_extension - идентификатор расширения.

Структура manifest.xml
Это пустая заготовка файла manifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE extension SYSTEM "ext-1.0.dtd">

<extension engine="1.0">
  <id>my_extension</id>
  <title>Мое расширение</title>
  <version>1.0</version>
  <description>Описание моего расширения</description>
  <author>Andrew</author>
  <minversion>1.3</minversion>
  <maxtestedon>1.3.4</maxtestedon>
  <hooks>
    Здесь находятся хуки, реализующие функционал расширения.
  </hooks>
</extension>

Пояснения:

• Идентификатор расширения. Должен быть таким-же, как и имя папки, в которой расположен файл manifest.xml

<id>my_extension</id>

• Имя расширения. Этим именем расширение будет подписано в админке форума.

<title>Мое расширение</title>

• Версия

<version>1.0</version>

• Описание

<description>Описание моего расширения.</description>

• Автор расширения

<author>Andrew</author>

• Минимальная версия ядра форума. Если версия форума будет ниже указанной, расширение не будет доступно для установки.

<minversion>1.3</minversion>

• Максимальная версия, для которой проводилась проверка совместимости. Если версия форума выше указанной, форум установит расширение но предупредит о том, что расширение не тестировалось на совместимость

<maxtestedon>1.3.4</maxtestedon>

Поделиться

2 (29.10.2010 14:28 отредактировано andrew)

Re: HOWTO: Создание расширений.

* * * Структура хука * * *

Пояснения приводятся на примере расширения, которое заменяет заголовок форума на графический логотип.

Хуки находятся в разделе:

<hooks>
</hooks>

файла manifest.xml.


Сам хук объявляется следующим образом:

<hook id="ЗДЕСЬ ПРОПИСЫВАЕТСЯ ИДЕНТИФИКАТОР ХУКА">

и закрывается тегом:

</hook>

______________________________



Для того, чтобы узнать какой идентификатор хука использовать делаем следующее:
1) Ищем файл, который генерирует интересующий нас контент. (header.php)
2) Находим блок кода в который нам нужно влезть.

...
// Forum Title
$gen_elements['<!-- forum_title -->'] = <-- Переменная заголовка форума, которую нам нужно изменить.
...
($hook = get_hook('hd_gen_elements')) ? eval($hook) : null; <-- Объявление хука, который поможет это сделать.
...

3) Видим идентификатор хука. (hd_gen_elements)

Таким образом объявление хука примет такой вид:

<hooks>
    <hook id="hd_gen_elements"><![CDATA[
        ИСХОДНЫЙ КОД НА PHP...
    ]]></hook>
</hooks>

Исходный код должен помещаться в CDATA. Что это такое: На википедии
______________________________



Для замены заголовка логотипом нужно выполнить следующий код:

$gen_elements['<!-- forum_title -->'] = '<div id="logo"> <a href="'.forum_link($forum_url['index']).'" title="'.forum_htmlencode($forum_config['o_board_title']).'"><img src="'.$base_url.'/style/'.$forum_user['style'].'/logo.png" alt="'.forum_htmlencode($forum_config['o_board_title']).'" /></a> </div>';

Который заменит текст заголовка на файл logo.png, который нужно положить в папку со стилем. (стадартный - /style/Oxygen)
______________________________



Итогом будет файл manifest.xml с таким содержанием:

<?xml version="1.0" encoding="utf-8"?>

<extension engine="1.0">
    <id>forum_logo</id>
    <title>Замена заголовка на логотип</title>
    <description>Замена заголовка на логотип.</description>
    <version>1.0</version>
    <author>andrew(punbb.ru)</author>
    <minversion>1.3.3</minversion>
    <maxtestedon>1.3.4</maxtestedon>
    <hooks>
        <hook id="hd_gen_elements"><![CDATA[
            $gen_elements['<!-- forum_title -->'] = '<div id="logo"> <a href="'.forum_link($forum_url['index']).'" title="'.forum_htmlencode($forum_config['o_board_title']).'"><img src="'.$base_url.'/style/'.$forum_user['style'].'/logo.png" alt="'.forum_htmlencode($forum_config['o_board_title']).'" /></a> </div>';
        ]]></hook>
    </hooks>
</extension>

Готовое расширение в аттаче.

Post's attachments

forum_logo.zip 657 b, 2 скачиваний с 2010-10-30 

You don't have the permssions to download the attachments of this post.
+ kvo

Поделиться

3

Re: HOWTO: Создание расширений.

andrew, хотелось бы ещё увидеть на примере простого расширения работу с кэшем, то есть как толкать в кэш свои данные или хуки, и работу с redirect'ом (пытался разобраться в коде расширения portal_by_daris - ничего не понял).
Тоже думаю было бы уместно показать тэги <dependencies></dependencies>, <install></install> и <uninstall></uninstall>

"The only thing neccesary for the triumph of evil is for good men to do nothing..." (c)

Поделиться

4

Re: HOWTO: Создание расширений.

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

Сайт hcs

Поделиться

5

Re: HOWTO: Создание расширений.

kvo пишет:

andrew, хотелось бы ещё увидеть на примере простого расширения работу с кэшем, то есть как толкать в кэш свои данные или хуки, и работу с redirect'ом (пытался разобраться в коде расширения portal_by_daris - ничего не понял).
Тоже думаю было бы уместно показать тэги <dependencies></dependencies>, <install></install> и <uninstall></uninstall>

ОК. Пожелание принято.

hcs пишет:

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

Согласен. Я бы так и делал сразу, если бы не склейка сообщений.

Продолжение откладывается до субботы, т.к. мне нужно уехать. Не скучайте smile

Поделиться

6

Re: HOWTO: Создание расширений.

andrew пишет:

Согласен. Я бы так и делал сразу, если бы не склейка сообщений.

Под окном ввода сообщения теперь стоит галочка "склеить сообщение"

Сайт hcs

Поделиться

7

Re: HOWTO: Создание расширений.

отличный топик, побольше бы таких. спсб

Ы!

Сайт sanders

Поделиться

8

Re: HOWTO: Создание расширений.

Эх не смог разобраться в этих расширениях sad пришлось прямо в ядре менять. Жду с нетерпением завершения статьи smile

Поделиться

9

Re: HOWTO: Создание расширений.

Чтобы не менять в ядре (за исключением клинических случаев, когда не предусмотрены хуки в ядре) есть расширение Anycode Tool, которое позволяет внедрять код в ядро используя механизм хуков.

Сайт hcs

Поделиться

10

Re: HOWTO: Создание расширений.

Приветствую!
Вопрос следующий.
Есть набор идентификаторов топиков, как отобразить страницу, содержащую эти топики? Например, визуально так же, как выводятся найденные.

Сайт KiRiK

Поделиться

11

Re: HOWTO: Создание расширений.

Как к некоторым топикам можно прикрепить индивидуальный текст, который будет показываться перед первым сообщением?

Сайт KiRiK

Поделиться

12 (11.05.2010 05:58 отредактировано peter911)

Re: HOWTO: Создание расширений.

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

Поделиться

13

Re: HOWTO: Создание расширений.

Продолжения так и не будет?
Структура HOOK хотелось очень почитать...

Поделиться

14

Re: HOWTO: Создание расширений.

Наконец я нашел в себе силы и время(как говорится, жизнь бьет ключом(гаечным  smile )) довести инструкцию до какого-либо логического завершения. Хоть она и не является полной, но я думаю поможет новичкам в освоении. Стартап как-бы есть, а в деталях дело за гуглом.

Поделиться

15

Re: HOWTO: Создание расширений.

andrew, в вики есть английский вариант http://punbb.informer.com/wiki/punbb13/ … evelopment
Может стоит перевести и объеденить со своим?

Сайт hcs

Поделиться

16

Re: HOWTO: Создание расширений.

Думаю, имеет смысл сделать примеры с описанием. Например, создание нового bb-тэга.

Сайт KiRiK

Поделиться

17

Re: HOWTO: Создание расширений.

Можно пример расширения, которое рядом с датой каждого сообщения (там, где ссылка непосредственно на сообщение) добавляет что-нибудь, содержащее все эту же ссылку на сообщение?

Сайт KiRiK

Поделиться

18

Re: HOWTO: Создание расширений.

Ёлки (не фильм), где я раньше был...оказывается всё так просто с расширениями, уже в ядре наисправлял всё чё можно и нельзя  yikes

Поделиться