1 (edited by PunBB 2017.04.21 22:51)

Topic: Как добавить свой хук в расширение

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

Итак поехали!  Default/bv  Давайте к примеру возьмем расширение Pan Smiles. Допустим нам понадобилось вывести для этого расширения, где нибудь внизу формы набора текста сообщения HTML код. Как нам это сделать. Ну давайте поэтапно.

Во первых, давайте определимся с местом вывода кода. Если это нижняя часть ввода текста сообщения, то открываем файл viewtopic.php.
Ищем блок TEXTAREA. Почти в конце файла вы найдете следующее содержимое:

<?php ($hook = get_hook('vt_quickpost_pre_fieldset')) ? eval($hook) : null; ?>
      <fieldset class="frm-group group1">
         <legend class="group-legend"><strong><?php echo $lang_common['Write message legend'] ?></strong></legend>
<?php ($hook = get_hook('vt_quickpost_pre_message_box')) ? eval($hook) : null; ?>
         <div class="txt-set set1">
            <div class="txt-box textarea required">
               <label for="fld1"><span><?php echo $lang_common['Write message'] ?></span></label>
               <div class="txt-input"><span class="fld-input"><textarea id="fld1" name="req_message" rows="7" cols="95" required spellcheck="true" ></textarea></span></div>
            </div>
         </div>
<?php ($hook = get_hook('vt_quickpost_pre_fieldset_end')) ? eval($hook) : null; ?>
      </fieldset>

Мы видим 3 хука. Нам нужен последний, его ID vt_quickpost_pre_fieldset_end.

Копируем ID хука и идем в manifest.xml

Откройте сам файл manifest.xml и проверьте не присутствует ли уже такой ID в манифесте. Проверяем, если нет, то создаем блок для его подключения. Добавляем между тегами

<hooks>
!!! Здесь ваш новый хук
</hooks>

следующее содержимое:

      <hook id="vt_quickpost_pre_fieldset_end"><![CDATA[
//здесь работает PHP, поэтому не забываем остановить его.
?>

<!-- Здесь будет находится ваш HTML код -->

<?php
// Затем вновь включаем обработку PHP
      ]]></hook>

После того как вы добавили новый хук, а также заполнили его область содержимым, а также после любых манипуляций с хуками расширений необходимо обновить хуки расширений, чтобы действия вступили в силу. Это можно сделать из под админки - Расширения - пункт Обновить хуки (для этого на форуме должно быть установлено расширение Pun Admin Manage Extensions Improved)

1

2 (edited by kisa 2017.04.22 11:30)

Re: Как добавить свой хук в расширение

Спасибо. Приведенный пример позволил (слегка напрягая кору и древесину головного мозга PunBB_INFO_ICQ/jokingly ) яснее разобраться в работе как раз этого расширения, и принципах хуков вообще.

Мне захотелось добавить кнопку-ссылку на сайт - смайлоколлекцию в блок смайлов. (решение, не везде приемлемое, но мне норм).
У меня включено расположение смайлов слева от поля ввода текста. Из вариантов расположения, оно обозначается == '3'

Разбирая manifest.xml, выяснил, что за отрисовку блока смайлов в моём варианте (слева, == '3')  отвечает хук vt_quickpost_pre_message (в этом расширении хуки вынесены в отдельную папку). В файле этого хука есть код

echo '<img onclick="P UNBB.pun_bbcode.insert_t ext(\' '.$smile_text.' \', \'\');" src="'.$ext_info['url'].'/pack/'.$smile_file.'" alt="'.$smile_text.'" />'."\n";
   }

Он выводит коллекцию смайлов, наполняя их блок  - повторяясь для каждой строчки файла hash_tags.php, отрисовывая каждый. После этого блок закрывается:

echo '</div>';

В конце блока, после отрисовки всех смайлов, я и захотел вывести свою ссылку.

Для этого, после отрисовки смайлов, останавливаем выпонение php

?> 

Вставляем наш код на HTML

<p><a href="http://блаблабла.ru/page1.html" target="_blank"><b>Сторонние смайлы</b></a></p>

Вновь запускаем php

<?

И  позволяем php закрыть блок смайлов.

echo '</div>';

Окончание модифицированного файла-хука выглядит примерно так:

else if ($forum_config['o_pan_smiles_location'] == '3')
{
   echo '< div id="bbcode_smilies">';
   foreach (array_unique($smilies_pack) as $smile_text => $smile_file)
   {
      echo '<img onclick="PU NBB.pun_bbcode.insert_text(\' '.$smile_text.' \', \'\');" src="'.$ext_info['url'].'/pack/'.$smile_file.'" alt="'.$smile_text.'" />'."\n";
   }
 ?> 
<p><a href="http://блаблабл а.ru/page1.html" target="_blank"><b>Сторонние смайлы</b></a></p>


<?   echo '</div>';
}

Результат его работы:

https://punbb.softplaza.net/uploads/images/2017/04/22/snimok_ekrana_iz_2017-04-22_183627.png

$matches[1]

А ещё я схитрил, и подставил (вручную)  ссылку, сгенерированную расширением Pan External Links .