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. Что это такое: (Please log in or register to see this URL)
______________________________



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

$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, 34 скачиваний с 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: Создание расширений.

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

(Please log in or register to see this URL), (Please log in or register to see this URL)

Сайт KiRiK

Поделиться

11

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

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

(Please log in or register to see this URL), (Please log in or register to see this URL)

Сайт KiRiK

Поделиться

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

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

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

Поделиться

13

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

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

Поделиться

14

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

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

Поделиться

15

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

andrew, в вики есть английский вариант (Please log in or register to see this URL)
Может стоит перевести и объеденить со своим?

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

Поделиться

16

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

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

(Please log in or register to see this URL), (Please log in or register to see this URL)

Сайт KiRiK

Поделиться

17

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

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

(Please log in or register to see this URL), (Please log in or register to see this URL)

Сайт 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, вопрос исправь, а то он несогласованный и расшифруй, что за приложение такое.

Моя (Please log in or register to see this URL) FluxBB 1.5, (Please log in or register to see this URL), (Please log in or register to see this URL).

Поделиться

24

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

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

Сайт rahonip

Поделиться

25

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

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

Моя (Please log in or register to see this URL) FluxBB 1.5, (Please log in or register to see this URL), (Please log in or register to see this URL).

Поделиться