matomo-org / developer-documentation

Matomo Developer Website
https://developer.matomo.org
Other
54 stars 85 forks source link

Matomo Developer Documentation

Documentations

License

Copyright Matomo team. Do not republish, or copy, or distribute this code or content. Thank you!

Run locally

$ cd app/
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
$ composer install
$ mkdir tmp/cache
$ mkdir tmp/templates
$ cd public/
$ php -S 0.0.0.0:8000

After the initial composer installation, you should be able to test locally by simply running the following:

$ cd app/
$ composer serve

To disable caching and enable debugging, create a app/config/local.php file with the following:

<?php
define('CACHING_ENABLED', false);
define('DEBUG', true);

Without cache, the website might be slow because of the inclusion of remote files (through HTTP). You can disable that locally by adding this to your local.php:

define('DISABLE_INCLUDE', true);

Automatic documentation generation (API-Reference)

The first time

# Clone Matomo repository the first time
git clone git@github.com:matomo-org/piwik.git piwik
# Download the dependencies for our generator 
cd generator/
composer install
cd ../piwik/
# Now set up composer according to https://getcomposer.org/download/

Generate the API reference docs

or just execute ./generateAndPush.sh.

The documents will be generated into the docs/generated directory. It will always generate the documentation for the latest stable version.

How to add docs for a new Matomo version

How to manage docs for different Matomo versions

So far, docs can be put into docs/2.x, docs/3.x and directly under docs/. If eg a guide is requested for Piwik 2, we first look for docs in docs/2.x and if not found for docs in docs/. This allows us to have some pages always the same, eg "Support" page, "Matomo Core Development", etc. So far I have left all guides under docs/ as not many docs will actually change for Matomo 3. This way, when changing a document under docs/ it will be updated for Piwik 2 and Matomo 3.

As soon as something on a guide changes for Matomo 3, we should copy that article into docs/2.x and afterwards make adjustments on the content for Matomo 3.

If a guide will be removed for a newer Matomo version and does not exist in the latest Matomo version anymore we should setup a redirect in app/helpers/Redirects.php eg to redirect /guides/pages to /2.x/guides/pages. This can be optional as the 404 Error page would suggest to open that page.

When does an article need to be copied into a versioned docs folder?

How do we handle images for different Matomo versions?

Images are always stored in a versioned directory. Eg public/img/2.x/* and public/img/3.x/*. When there is a new Matomo version we need to copy all the images from the previous version and put them into a new Matomo directory. In guides you would still reference an image via /img/myimage.jpg and the Markdown parser will add the path for the currently selected Matomo version and turn it into either eg /img/2.x/myimage.jpg or /img/3.x/myimage.jpg. With a new Matomo version often the UI changes and this way it keeps things simple by having always different images and by not using the same image across different Matomo versions.

Writing guides

Just edit the docs/*.md files. Any change you make there should be available on the developer website within a minute.

Guides are written using Markdown. CommonMark and Markdown Extra are supported.

In addition:

Adding a new guide

Create a new Markdown file in docs/ and use YAML Front Matter to configure it:

---
category: Develop
---
# The title

Lorem ipsum…

YAML Front Matter is YAML embedded at the top of Markdown files. It is commonly used to define metadata, and we use it to define several items:

A guide must be either added to a category menu or set as a "sub-guide" of another guide. It cannot be both (else it will appear twice in the left sidebar).

To add a guide to a category (i.e. it will appear in the left sidebar) edit the PHP class for the category (in app/helpers/Content/Category).

Adding the new guide to a menu item

Some menu items need to be added by adding the markdown filename without the .md in one of these category classes.

Some submenu items need to be added as a subguide see for example this example.

It really depends submenu item which one you need to edit. If the parent menu item defines it's submenu items in a category class, then you need a new entry there. Otherwise you need to edit the markdown file for the parent menu item and add a new entry to subGuides.

Please note that also the category: in the beginning of your guide needs to match the name of the category this page should be in. The category name can be for example Develop, DevelopInDepth, Integrate or API Reference.

Supported inline tags in PHP comments

The following tags can be used in PHP docblocks so that they can be turned to links in the API reference.

{@hook Request.dispatch}                    // link to Request.dispatch hook
{@hook Request.dispatch description text}   // link to Request.dispatch hook with different link text
{@hook # description}                       // link to hooks page

Note: In contrast to @link we do not check whether a hook with the given name exists.

{@link Map}                  // class within this namespace
{@link Piwik\DataTable\Map}  // full classname
{@link \Exception}           // php internal class
{@link serialize()}          // php internal function
{@link getKeyName()}         // method within this class
{@link $myproperty}          // property within this class
{@link INDEX_NB_UNIQ_VISITORS}  // constant within this class, note: a link will be only generated if the constant has a long description
{@link Map::getKeyName()}    // method from any class
{@link Map::$myproperty}     // property from any class
{@link Piwik\Metrics::INDEX_NB_UNIQ_VISITORS}  // constant from any class, note: a link will be only generated if the constant has a long description
{@link http://matomo.org}    // http link
{@link https://matomo.org}   // https link
{@link mailto:test}          // mailto link

{@link Map Description Text}                  // class within this namespace
{@link Piwik\DataTable\Map Description Text}  // full classname
{@link \Exception Description Text}           // php internal class
{@link getKeyName() Description Text}         // method within this class
{@link $myproperty Description Text}          // property within this class
{@link Map::getKeyName() Description Text}    // method from any class
{@link Map::$myproperty Description Text}     // property from any class
{@link http://matomo.org Description Text}    // http link
{@link https://matomo.org Description Text}   // https link
{@link mailto:test Description Text}          // mailto link