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, 33 скачиваний с 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, У меня предложение - делать отдельные вопросы отдельными сообщениями, чтобы во-первых не превысить максимальный размер сообщения, и чтобы иметь под рукой прямую ссылку.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

5

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

kvo пишет:

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

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

hcs пишет:

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

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

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

Поделиться

6

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

andrew пишет:

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

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

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

7

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

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

Поделиться

8

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

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

Поделиться

9

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

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

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

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
Может стоит перевести и объеденить со своим?

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

16

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

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

Сайт KiRiK

Поделиться

17

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

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

Сайт KiRiK

Поделиться

18

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

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

Использую: sql - php - yii - ajax - jq - js - css - bootstrap - less - html - knockout js - ruby on rails.
Интересно: css3, html5 -> appCache, workers, sockets и т.д.
Будущее: адаптивные сайты (они же и локальные приложения).

Поделиться

19 (07.03.2013 11:25 отредактировано prokop)

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

if (!$forum_user['is_guest'] && $cur_forum['last_post'] > $forum_user['last_visit'] && (empty($tracked_topics['forums'][$cur_forum['fid']]) || $cur_forum['last_post'] > $tracked_topics['forums'][$cur_forum['fid']]))
        {
...}

как добавить && array_key_exists ($cur_forum['fid'], $new_topics) ??? используя хук

Добавлено спустя 12 минут 46 секунд:

в if надо добавить еще одно условие.

Поделиться

20

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

Попобуйте подойти с другой стороны, используйте ближайший хук после этого условия, например in_normal_row_pre_item_title_merge
в этом хуке проверяйте ваше условие и обнуляйте  или меняйте результат работы того условия в которое вы желаете внедриться, например:

unset($forum_page['item_status']);
Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

21

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

hcs спасибо, прийдется так далать smile

Поделиться

22 (14.03.2015 23:00 отредактировано rahonip)

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

а покажите на примере как сделать что бы можно было расширением управлять созданного приложения настройки расширения в админке?

Сайт rahonip

Поделиться

23

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

rahonip, вопрос исправь, а то он несогласованный и расшифруй, что за приложение такое.

Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться

24

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

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

Сайт rahonip

Поделиться

25

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

rahonip, в файлах админки точно также присутствуют хуки, через них и добавляется нужное управление в виде форм и их обработки.

Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться