Here is a short reference of some points in source code, which should help you to create XenForo 2 add-on. At first, I recommend you follow the official tutorial with an add-on sample.

You can find it here:
https://xenforo.com/xf2-docs/dev/lets-build-an-add-on/

Below you will find additional information I discovered during writing my add-on.

Prepare environment

I usually use Docker for such kind of app. I worked on an app with Memcached, so you will see it in the files below.

Here is the content of Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM php:7.2-apache

RUN apt-get update \
&& apt-get install -y \
zip \
zlib1g-dev \
libz-dev \
libmemcached-dev \
libpng-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
libgd-dev

RUN a2enmod rewrite \
&& pecl install memcache xdebug-2.6.1 \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd mysqli zip \
&& docker-php-ext-enable memcache xdebug \
&& echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_autostart=off" >> /usr/local/etc/php/conf.d/xdebug.ini

And the content of docker-compose.yml file:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: '3'

services:
php:
build: ./docker/php #path to
container_name: php_container
environment:
XDEBUG_CONFIG: "remote_host=172.17.0.1 remote_port=9000"
PHP_IDE_CONFIG: serverName=localhost
volumes:
- ./app:/var/www/html
ports:
- 80:80

mariadb:
image: mariadb:10.4
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: database_name
volumes:
- db:/var/lib/mysql
ports:
- 3306:3306

memcache:
image: memcached:alpine
ports:
- 11211:11211

volumes:
db:

If you want to use HTTPS locally read the tutorial How to get HTTPS working on localhost to know more.

XenForo 2 console commands

Enter a Docker container with command:

1
docker exec -it -u www-data php_container bash

Then you can list all commands and filter them:

1
$ php cmd.php | grep addon

Add-on commands located in src/XF/Cli/Command/AddOn folder.

Add-on data

All add-ons stored in src/addons folder and xf_addon table in the database.

Setup script

If you change tables with alters, use available data types from here: src/XF/Db/Schema/Column.php::type.
Change tables with SchemaManager. See available methods in src/XF/Db/SchemaManager.php, i.e. tableExists(), columnExists() etc.

Extend entity

The simplest way to extend an entity is to add it in the admin panel. See Development - Class extensions menu in the admin control panel.

It will write data to xf_class_extension table. Classes extensions will be processed here: src/XF/Extension.php::extendClass. XenForo extends with class_alias PHP function. As a parent class, you should specify a class name with “XFCP_” prefix, see how it works here: forum/src/XF/Extension.php:243 (resolveExtendedClassToRoot method).

Event listeners

XenForo 2 sends a lot of events through request processing. See the list of events and event listeners in Development - Code events and Code event listeners in the admin control panel. Data will be stored in database in tables xf_code_event and xf_code_event_listener.

In order to see all events, you could use Xdebug. Set a breakpoint in src/XF/Extension.php::fire function and see event names and hints which you could use.

Use composer packages

Here is a good tutorial on how to use it:
https://xenforo.com/community/resources/using-composer-packages-in-xenforo-2-0-addons-tutorial.6588/

Template functions

See the list of default functions you can use in templates in file src/XF/Template/Templater.php:152 (variable $defaultFunctions).