Differences
This shows you the differences between the selected revision and the current version of the page.
punbb13:extern_ed_pun_ext 2009/07/17 10:28 | punbb13:extern_ed_pun_ext 2020/02/06 11:04 current | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | Struct of PunBB development extensions | ||
====== General information ====== | ====== General information ====== | ||
+ | Система расширений позволяет создавать шибкую систему дополнений, позволяющие создавать дополнения без внесения изменений в ядро PunBB. | ||
+ | Управляя системой расширений вы можете определять уровень функциональности, дополняя сайт нужными для вас функциями. | ||
==== Names of variable, functions ==== | ==== Names of variable, functions ==== | ||
+ | Любые обозначения в коде PunBB имеют свое значение. Систематизация обозначений повышает уровень читаемости и наглядности кода. | ||
+ | Принципы обозначения: | ||
+ | * Любые константы форума пишутся заглавными буквами | ||
+ | * При указании переменных, содержащих несколько имен, используется в качастве разделителя символ "_" | ||
+ | <code php> | ||
+ | $str_name = 'My name is Jake'; | ||
+ | </code> | ||
+ | * При указании имен переменных, первым словом идет указание какой части форума она принадлежит | ||
+ | <code php>echo '<pre>'; | ||
+ | print_r($forum_config); | ||
+ | echo '</pre>'; | ||
+ | </code> | ||
+ | * Use common prefixes: | ||
+ | * **num** for entities that represent a count | ||
+ | * **cur** for entities that represent the current element when iterating through any type of collection (database result set, array etc) | ||
+ | * При указании имен переменных, касающихся конкертной страницы, используются сокращения. Например, название страницы viewtopic - vt. | ||
==== Code styles ==== | ==== Code styles ==== | ||
+ | Уровень читаемости и наглядности кода также придает определенный стиль кодирования, которого придерживаются все участники разработки на протяжении всего кода. | ||
+ | И желательно придерживаться того же стиля кодирования, что и на форуме. | ||
+ | * All line breaks should be LF only. | ||
+ | * Каждый функциональный блок, который на один уровень глубже, должен отделяться Табуляцией (<tab>): | ||
+ | <code php> | ||
+ | for (int $iter = 0; $iter < 10; $iter++) | ||
+ | { | ||
+ | <tab>if ($iter < 5) | ||
+ | <tab>{ | ||
+ | <tab><tab>. . . | ||
+ | <tab>} | ||
+ | } | ||
+ | </code> | ||
+ | * Математические знаки с двух сторон выделяются пробелами: | ||
+ | <code php> | ||
+ | $c = $a + $b; | ||
+ | </code> | ||
+ | * При перечислении параметров после символов ";", "," ставится пробел, но до символа - нет: | ||
+ | <code php> | ||
+ | $arr = array('green', 'blue', 'red', 'yellow'); | ||
+ | </code> | ||
+ | * Каждый функциональный блок отделяется дополнительным символом переноса строки | ||
+ | * Use common sense. If in doubt, look at similar sections in the PunBB source code. | ||
==== PHP specification ==== | ==== PHP specification ==== | ||
+ | При написании кода на РНР следует придерживаться нескольких основных моментов написания: | ||
+ | * Следует использовать <?php, а не укороченный вариант <? | ||
+ | * Use 'singlequotes' as opposed to "doublequotes" when working with strings | ||
+ | <code php> | ||
+ | |||
+ | $str = 'Users: '.$num_users; | ||
+ | |||
+ | </code> | ||
+ | |||
+ | //**NOT**// | ||
+ | |||
+ | <code php> | ||
+ | $str = "Users: $num_users"; | ||
+ | </code> | ||
+ | |||
+ | * Use CSRF token with GET/POST date: | ||
+ | * POST | ||
+ | * Add hidden csrf_token field to POST-forms | ||
+ | <code php> | ||
+ | <input type="hidden" name="csrf_token" value="<?php echo generate_form_token($form_action_link); ?>" /> | ||
+ | </code> | ||
+ | It is handled automatically in common.php (lines #139-#141) | ||
+ | * GET | ||
+ | * Put csrf_token to link to handle it on receiving GET queries | ||
+ | * Check if $_GET['csrf_token'] is correct on handling action | ||
+ | * Sample with logout link | ||
+ | * Generating link | ||
+ | <code php> | ||
+ | '<a href="'.pun_link($pun_url['logout'], array($pun_user['id'], generate_form_token('logout'.$pun_user['id']))).'"> | ||
+ | <span>'.$lang_common['Logout'].'</span></a>' | ||
+ | </code> | ||
+ | * Handling logout action | ||
+ | <code php> | ||
+ | if (!isset($_POST['csrf_token']) && (!isset($_GET['csrf_token']) || | ||
+ | $_GET['csrf_token'] !== generate_form_token('logout'.$pun_user['id']))) | ||
+ | csrf_confirm_form(); | ||
+ | </code> | ||
+ | * Do not use **$_REQUEST**. Use **$_POST** or **$_GET** | ||
+ | * Do **not** use **require_once** if __FILE__ may not (should not) be ever required (anywhere). Forcing error if __FILE__ was required | ||
+ | * **Leave one line of whitespace** above and below each block of markup, provided the block constitutes multiple lines of markup. I.e. one empty line above each ?> and below each <?php | ||
+ | * Define at page start | ||
+ | * FORUM_ROOT - relative path to PunBB root dir | ||
+ | * FORUM_PAGE - current page id | ||
==== SQL specification ==== | ==== SQL specification ==== | ||
+ | |||
+ | On ''include/common.php'' inclusion, the proper implementation of [[database layer]] class is being also included according to forum configuration. | ||
+ | An instance of this database layer named ''$forum_db'' is being created in global scope to provide [[database helpers]]. | ||
+ | |||
+ | == How to perform a query == | ||
+ | * Direct query. You can simply write an SQL-statement and execute it. | ||
+ | <code php> $result = $forum_db->query('SELECT * FROM topics WHERE id = 10');</code> | ||
+ | Be sure, that your SQL code is cross-compatible with all database engines supported by PunBB. | ||
+ | * Using [[query builder]]. You may transparently build database queries. All the specific of database engines and database structure will automatically be taken in account. Example of usage: | ||
+ | <code php>$query = array( | ||
+ | 'SELECT' => '*', | ||
+ | 'FROM' => 'topics', | ||
+ | 'WHERE' => 'id = 10' | ||
+ | ); | ||
+ | $result = $forum_db->query_build($query); | ||
+ | </code> | ||
+ | See [[query builder]] page for details. | ||
+ | ==== How to work with query results ==== | ||
+ | For example, we have this query: | ||
+ | <code php> | ||
+ | $query = array( | ||
+ | 'SELECT' => 't.id, t.poster, t.subject, t.posted', | ||
+ | 'FROM' => 'topics AS t', | ||
+ | 'WHERE' => 't.forum_id = 1' | ||
+ | ); | ||
+ | $result = $forum_db->query_build($query) or error(__FILE__, __LINE__); | ||
+ | </code> | ||
+ | * To know how many rows this query returns, use this: | ||
+ | <code php> | ||
+ | $forum_db->num_rows($result); | ||
+ | </code> | ||
+ | * To fetch the current row to associative array: | ||
+ | <code php> | ||
+ | $data = $forum_db->fetch_assoc($result); | ||
+ | //An example of getting topic_id | ||
+ | $topic_id = $data['id']; | ||
+ | </code> | ||
+ | * To fetch the current row to numeric array: | ||
+ | <code php> | ||
+ | $data = $forum_db->fetch_row($result); | ||
+ | //An example of getting topic_id | ||
+ | $topic_id = $data[0]; | ||
+ | </code> | ||
+ | * To fetch only some values from the current row: | ||
+ | <code php> | ||
+ | //This code will fetch only the topic id and the topic subject | ||
+ | list($id,, $subject,) = $forum_db->fetch_row($result); | ||
+ | </code> | ||
+ | * To process all rows in a set you can use this code: | ||
+ | <code php> | ||
+ | while ($cur_row = $forum_db->fetch_assoc($result)) | ||
+ | { | ||
+ | //Actions with $cur_row | ||
+ | } | ||
+ | </code> | ||
====== The manifest ====== | ====== The manifest ====== | ||
==== Manifest in general ==== | ==== Manifest in general ==== | ||
+ | |||
+ | Файл манифест представляет из себя основную часть расширения. В нем приписывается работа. | ||
+ | Обязательной частью расширения является файл manifest.xml. Он содержит основную идею расширения, реализованная в коде. Файл написан на скриптовом языке XML. | ||
+ | Вот пример файла manifest.xml | ||
+ | |||
+ | <code php> | ||
+ | <?xml version="1.0" encoding="utf-8"?> | ||
+ | |||
+ | <extension engine="1.0"> | ||
+ | <id>forum_ext_name</id> | ||
+ | <title>My best extension</title> | ||
+ | <version>1.0</version> | ||
+ | <description>Description of my best extension</description> | ||
+ | <author>I and I and not so I</author> | ||
+ | <minversion>1.1</minversion> | ||
+ | <maxtestedon>2.3.1</maxtestedon> | ||
+ | |||
+ | <note type="install" timing="pre">Примечания при установке, которые обязательны для выполнения. Иначе расширение не будет работать.</note> | ||
+ | <note type="uninstall" timing="pre">Примечения при удалении. Произойдут действия, которые могут удалить нужные данные.</note> | ||
+ | </code> | ||
+ | |||
+ | Как и в HTML, каждый объект, указанный в угловых скобках, называется тег. Они бывают двух видов: открывающие и закрывающие. | ||
+ | Теперь рассмотрим весь список обязательных тегов и каждый тег в отдельности со всеми его свойствами. | ||
==== Blocks of manifest ==== | ==== Blocks of manifest ==== | ||
== <extension> == | == <extension> == | ||
+ | |||
+ | Начальный тег, который объявляет, что начинается расширение и оно будет написано на определенной версии движка. | ||
+ | Его единственным параметром является параметр с именем "engine", обозначающий версию движка XML, на котором работает расширение. | ||
== <id> == | == <id> == | ||
+ | |||
+ | В теге id указывается краткое имя расширения. Краткое имя расширения должно совпадать с именем папки, из которой запускается расширение. | ||
+ | В противном случае будет выдаваться ошибка о несовпадании имен. | ||
+ | Все части краткого имени расширения в этом теге разделяются символом "_" и прописываются только в нижнем регистре. | ||
== <title> == | == <title> == | ||
+ | |||
+ | Тег title содержит полное, официальное имя расширения. | ||
+ | В данном теге имя расширения указывается полностью. Ограничения на регистр и тип разделителя не накладывается. | ||
== <version> == | == <version> == | ||
+ | |||
+ | В этом теге указывается текущая версия расширения. | ||
+ | Версия расширения указывается в зависимости от этапа создания. | ||
== <description> == | == <description> == | ||
+ | |||
+ | В теге description содержится краткое функциональное описание. К примеру, какие действия выполняет расширение и что показывает. | ||
+ | Не стоит полностью описывать функциональность расширения. Описывать нужно только главное. | ||
== <author> == | == <author> == | ||
+ | |||
+ | В теге author указывается имя автора расширения, либо группа авторов, либо команда разработчиков. | ||
== <minversion> == | == <minversion> == | ||
+ | |||
+ | Тег minversion указывает минимальную версию PunBB, на которой расширение работает стабильно и с полной функциональностью. | ||
== <maxtestedon> == | == <maxtestedon> == | ||
+ | |||
+ | Тег maxtestedon показывает последнюю версию PunBB, на которой проводилось тестирование расширения. | ||
+ | Если версия, указанная в теге, не совпадает с текущей версией PunBB, то работа расширения может быть нарушена. | ||
== <note> == | == <note> == | ||
- | == Install == | + | Тег note описывает возможные сложности при установке расширения. Либо описывает условия, при которых расширение будет работать корректно. |
- | == Uninstall == | + | Параметр //**Type**// - это параметр, указывающий примечания, которые следует выводить в конкретном случае. Существует только два значения, которые принимает параметр, - install и uninstall. Рассмотрим их: |
+ | |||
+ | * Install - значение параметра type, при котором примечания будут выводится при установке расширения. Следует указывать примечания, касающиеся только установки. | ||
- | == Type == | + | * Uninstall - значение параметра type, при котором примечания будут выводится при удалении расширения. Следует указывать примечания, касающиеся только удаления. |
== <dependencies> == | == <dependencies> == | ||
Line 73: | Line 258: | ||
* Create the idea of extension | * Create the idea of extension | ||
* Create the wiki article for the extension and write the general idea and the specification there. | * Create the wiki article for the extension and write the general idea and the specification there. | ||
- | * The page url must be http://punbb.informer.com/wiki/punbb13:<extension_id>, e.g. http://punbb.informer.com/wiki/punbb13:pun_pm. | + | * The page url must be https://punbb.informer.com/wiki/punbb13:<extension_id>, e.g. https://punbb.informer.com/wiki/punbb13:pun_pm. |
* You may also start the discussion in Forums to ask users to add their feature requests to the specification. | * You may also start the discussion in Forums to ask users to add their feature requests to the specification. | ||
* Add the ticket to the Trac (or just start a text file, if you have no Trac). List the main tasks to complete the extension. | * Add the ticket to the Trac (or just start a text file, if you have no Trac). List the main tasks to complete the extension. |