diff --git a/doc/preferences.md b/doc/preferences.md index 0ac15034e..4ece5edf6 100644 --- a/doc/preferences.md +++ b/doc/preferences.md @@ -1,101 +1,53 @@ -# Preferences +# Preferences -Preferences are user based configuration for Icinga Web 2. For example max page -items, languages or date time settings can controlled by users. +Preferences are settings a user can set for his account only, for example his language and time zone. -# Architecture +**Choosing Where to Store Preferences** -Preferences are initially loaded from a provider (ini files or database) and -stored into session at login time. After this step preferences are only -persisted to the configured backend, but never reloaded from them. +Preferences can be stored either in INI files or in a MySQL or in a PostgreSQL database. By default, Icinga Web 2 stores +preferences in INI files beneath Icinga Web 2's configuration directory. -# Configuration +## Configuration -Preferences can be configured in config.ini in **preferences** section, default -settings are this: +Where to store preferences is defined in the INI file **config/config.ini** in the *preferences* section. - [preferences] - type=ini +### Store Preferences in INI Files -The ini provider uses the directory **config/preferences** to create one ini -file per user and persists the data into a single file. If you want to drop your -preferences just drop the file from disk and you'll start with a new profile. +If preferences are stored in INI Files, Icinga Web 2 automatically creates one file per user using the username as +file name for storing preferences. A INI file is created once a user saves changed preferences the first time. +The files are located beneath the `preferences` directory beneath Icinga Web 2's configuration directory. -## Database Provider +For storing preferences in INI files you have to add the following section to the INI file **config/config.ini**: -To be more flexible in distributed setups you can store preferences in a -database (pgsql or mysql), a typical configuration looks like the following -example: +``` +[preferences] +type = ini +```` - [preferences] - type=db - resource=icingaweb-pgsql +### Store Preferences in a Database -## Null Provider +In order to be more flexible in distributed setups you can store preferences in a MySQL or in a PostgreSQL database. +For storing preferences in a database, you have to define a [database resource](#resources-configuration-database) +which will be referenced as resource for the preferences storage. -The Null Provider discards all preferences and is mainly used as a fallback when no provider could be -created (due to permission errors, database outtakes, etc.). +Directive | Description +------------------------|------------ +**type** | `db` +**resource** | The name of the database resource defined in [resources.ini](resources). - [preferences] - type=null +**Example:** -If your preferences aren't stored it's best to take a look into the logfiles - errors during the preference setup -are displayed as warnings here. +``` +[preferences] +type = db +resource = icingaweb-mysql +``` -### Settings +#### Database Setup -* **resource**: A reference to a database declared in *resources.ini*. Please read the chapter about - resources for a detailed description about how to set up resources. +For storing preferences in a database, you have to import one of the following database schemas: -### Preparation +* **etc/schema/preferences.mysql.sql** (for **MySQL** database) +* **etc/schema/preferences.pgsql.sql** (for **PostgreSQL** databases) -To use this feature you need a running database environment. After creating a -database and a writable user you need to import the initial table file: - -* etc/schema/preferences.mysql.sql (for mysql database) -* etc/schema/preferemces.pgsql.sql (for postgres databases) - -#### Example for mysql - - # mysql -u root -p - mysql> create database icingaweb; - mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON icingaweb.* TO \ - 'icingaweb'@'localhost' IDENTIFIED BY 'icingaweb'; - mysql> exit - # mysql -u root -p icingaweb < /path/to/icingaweb/etc/schema/preferences.mysql.sql - -After following these steps above you can configure your preferences provider. - -## Coding API - -You can set, update or remove preferences using the Preference data object -which is bound to the user. Here are some simple examples how to work with -that: - - $preferences = $user->getPreferences(); - // Get language with en_US as fallback - $preferences->get('app.language', 'en_US'); - $preferences->set('app.language', 'de_DE'); - $preferences->remove('app.language'); - - // Using transactional mode - $preferences->startTransaction(); - $preferences->set('test.pref1', 'pref1'); - $preferences->set('test.pref2', 'pref2'); - $preferences->remove('test.pref3'); - $preferemces->commit(); // Stores 3 changes in one operation - -More information can be found in the api docs. - -## Namespaces and behaviour - -If you are using this API please obey the following rules: - -* Use dotted notation for preferences -* Namespaces starting with one context identifier - * **app** as global identified (e.g. app.language) - * **mymodule** for your module - * **monitoring** for the monitoring module -* Use preferences wisely (set only when needed and write small settings) -* Use only simple data types, e.g. strings or numbers - * If you need complex types you have to do it your self (e.g. serialization) +After that you have to define the [database resource](#resources-configuration-database).