First 'develop' help site

This commit is contained in:
Philipp Holzer 2022-07-27 21:27:46 +02:00
commit 17801e9ae3
Signed by: nupplaPhil
GPG key ID: 24A7501396EB5432
573 changed files with 1440876 additions and 0 deletions

View file

@ -0,0 +1,3778 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/addon-storage-backend/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Addon Storage Backend - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#friendica-storage-backend-addon-development" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Addon Storage Backend
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/addon-storage-backend/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/addon-storage-backend/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" checked>
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Addon Storage Backend
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Addon Storage Backend
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-storage-backend-class" class="md-nav__link">
The Storage Backend Class
</a>
<nav class="md-nav" aria-label="The Storage Backend Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#icanwritetostorage" class="md-nav__link">
ICanWriteToStorage
</a>
</li>
<li class="md-nav__item">
<a href="#icanconfigurestorage" class="md-nav__link">
ICanConfigureStorage
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#register-a-storage-backend-class" class="md-nav__link">
Register a storage backend class
</a>
</li>
<li class="md-nav__item">
<a href="#adding-tests" class="md-nav__link">
Adding tests
</a>
</li>
<li class="md-nav__item">
<a href="#exception-handling" class="md-nav__link">
Exception handling
</a>
<nav class="md-nav" aria-label="Exception handling">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#referencestorageexecption" class="md-nav__link">
ReferenceStorageExecption
</a>
</li>
<li class="md-nav__item">
<a href="#storageexception" class="md-nav__link">
StorageException
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#example" class="md-nav__link">
Example
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-storage-backend-class" class="md-nav__link">
The Storage Backend Class
</a>
<nav class="md-nav" aria-label="The Storage Backend Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#icanwritetostorage" class="md-nav__link">
ICanWriteToStorage
</a>
</li>
<li class="md-nav__item">
<a href="#icanconfigurestorage" class="md-nav__link">
ICanConfigureStorage
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#register-a-storage-backend-class" class="md-nav__link">
Register a storage backend class
</a>
</li>
<li class="md-nav__item">
<a href="#adding-tests" class="md-nav__link">
Adding tests
</a>
</li>
<li class="md-nav__item">
<a href="#exception-handling" class="md-nav__link">
Exception handling
</a>
<nav class="md-nav" aria-label="Exception handling">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#referencestorageexecption" class="md-nav__link">
ReferenceStorageExecption
</a>
</li>
<li class="md-nav__item">
<a href="#storageexception" class="md-nav__link">
StorageException
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#example" class="md-nav__link">
Example
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/addon-storage-backend.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">addon</span>
<span class="md-tag">developer</span>
</nav>
<h1 id="friendica-storage-backend-addon-development">Friendica Storage Backend Addon development<a class="headerlink" href="#friendica-storage-backend-addon-development" title="Permanent link">#</a></h1>
<p>Storage backends can be added via addons.
A storage backend is implemented as a class, and the plugin register the class to make it available to the system.</p>
<h2 id="the-storage-backend-class">The Storage Backend Class<a class="headerlink" href="#the-storage-backend-class" title="Permanent link">#</a></h2>
<p>The class must live in <code>Friendica\Addon\youraddonname</code> namespace, where <code>youraddonname</code> the folder name of your addon.</p>
<p>There are two different interfaces you need to implement.</p>
<h3 id="icanwritetostorage"><code>ICanWriteToStorage</code><a class="headerlink" href="#icanwritetostorage" title="Permanent link">#</a></h3>
<p>The class must implement <code>Friendica\Core\Storage\Capability\ICanWriteToStorage</code> interface. All method in the interface must be implemented:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="k">namespace</span> <span class="nx">Friendica\Core\Storage\Capability\ICanWriteToStorage</span><span class="p">;</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="k">interface</span> <span class="nx">ICanWriteToStorage</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="p">{</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">get</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$reference</span><span class="p">);</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">put</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$data</span><span class="p">,</span> <span class="nx">string</span> <span class="nv">$reference</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">);</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">delete</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$reference</span><span class="p">);</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="k">public</span> <span class="k">function</span> <span class="fm">__toString</span><span class="p">();</span>
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">getName</span><span class="p">();</span>
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="p">}</span>
</code></pre></div>
<ul>
<li><code>get(string $reference)</code> returns data pointed by <code>$reference</code></li>
<li><code>put(string $data, string $reference)</code> saves data in <code>$data</code> to position <code>$reference</code>, or a new position if <code>$reference</code> is empty.</li>
<li><code>delete(string $reference)</code> delete data pointed by <code>$reference</code></li>
</ul>
<h3 id="icanconfigurestorage"><code>ICanConfigureStorage</code><a class="headerlink" href="#icanconfigurestorage" title="Permanent link">#</a></h3>
<p>Each storage backend can have options the admin can set in admin page.
To make the options possible, you need to implement the <code>Friendica\Core\Storage\Capability\ICanConfigureStorage</code> interface.</p>
<p>All methods in the interface must be implemented:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="k">namespace</span> <span class="nx">Friendica\Core\Storage\Capability\ICanConfigureStorage</span><span class="p">;</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="k">interface</span> <span class="nx">ICanConfigureStorage</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="p">{</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">getOptions</span><span class="p">();</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">saveOptions</span><span class="p">(</span><span class="k">array</span> <span class="nv">$data</span><span class="p">);</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="p">}</span>
</code></pre></div>
<ul>
<li><code>getOptions()</code> returns an array with details about each option to build the interface.</li>
<li><code>saveOptions(array $data)</code> get <code>$data</code> from admin page, validate it and save it.</li>
</ul>
<p>The array returned by <code>getOptions()</code> is defined as:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>[
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a> &#39;option1name&#39; =&gt; [ ..info.. ],
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> &#39;option2name&#39; =&gt; [ ..info.. ],
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> ...
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>]
</code></pre></div>
<p>An empty array can be returned if backend doesn't have any options.</p>
<p>The info array for each option is defined as:</p>
<div class="highlight"><pre><span></span><code>[
&#39;type&#39;,
</code></pre></div>
<p>define the field used in form, and the type of data.
one of 'checkbox', 'combobox', 'custom', 'datetime', 'input', 'intcheckbox', 'password', 'radio', 'richtext', 'select', 'select_raw', 'textarea'</p>
<div class="highlight"><pre><span></span><code> &#39;label&#39;,
</code></pre></div>
<p>Translatable label of the field. This label will be shown in admin page</p>
<div class="highlight"><pre><span></span><code> value,
</code></pre></div>
<p>Current value of the option</p>
<div class="highlight"><pre><span></span><code> &#39;help text&#39;,
</code></pre></div>
<p>Translatable description for the field. Will be shown in admin page</p>
<div class="highlight"><pre><span></span><code> extra data
</code></pre></div>
<p>Optional. Depends on which 'type' this option is:</p>
<ul>
<li>'select': array <code>[ value =&gt; label ]</code> of choices</li>
<li>'intcheckbox': value of input element</li>
<li>'select_raw': prebuild html string of <code>&lt;option &gt;</code> tags</li>
</ul>
<p>Each label should be translatable</p>
<div class="highlight"><pre><span></span><code>];
</code></pre></div>
<p>See doxygen documentation of <code>IWritableStorage</code> interface for details about each method.</p>
<h2 id="register-a-storage-backend-class">Register a storage backend class<a class="headerlink" href="#register-a-storage-backend-class" title="Permanent link">#</a></h2>
<p>Each backend must be registered in the system when the plugin is installed, to be aviable.</p>
<p><code>DI::facStorage()-&gt;register(string $class)</code> is used to register the backend class.</p>
<p>When the plugin is uninstalled, registered backends must be unregistered using
<code>DI::facStorage()-&gt;unregister(string $class)</code>.</p>
<p>You have to register a new hook in your addon, listening on <code>storage_instance(App $a, array $data)</code>.
In case <code>$data['name']</code> is your storage class name, you have to instance a new instance of your <code>Friendica\Core\Storage\Capability\ICanReadFromStorage</code> class.
Set the instance of your class as <code>$data['storage']</code> to pass it back to the backend.</p>
<p>This is necessary because it isn't always clear, if you need further construction arguments.</p>
<h2 id="adding-tests">Adding tests<a class="headerlink" href="#adding-tests" title="Permanent link">#</a></h2>
<p><strong>Currently testing is limited to core Friendica only, this shows theoretically how tests should work in the future</strong></p>
<p>Each new Storage class should be added to the test-environment at <a href="https://github.com/friendica/friendica/tree/develop/tests/src/Model/Storage/">Storage Tests</a>.</p>
<p>Add a new test class which's naming convention is <code>StorageClassTest</code>, which extend the <code>StorageTest</code> in the same directory.</p>
<p>Override the two necessary instances:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="x">use Friendica\Core\Storage\Capability\ICanWriteToStorage;</span>
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="x">abstract class StorageTest </span>
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="x">{</span>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="x"> // returns an instance of your newly created storage class</span>
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="x"> abstract protected function getInstance();</span>
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a>
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="x"> // Assertion for the option array you return for your new StorageClass</span>
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="x"> abstract protected function assertOption(ICanWriteToStorage $storage);</span>
<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="x">} </span>
</code></pre></div>
<h2 id="exception-handling">Exception handling<a class="headerlink" href="#exception-handling" title="Permanent link">#</a></h2>
<p>There are two intended types of exceptions for storages</p>
<h3 id="referencestorageexecption"><code>ReferenceStorageExecption</code><a class="headerlink" href="#referencestorageexecption" title="Permanent link">#</a></h3>
<p>This storage exception should be used in case the caller tries to use an invalid references.
This could happen in case the caller tries to delete or update an unknown reference.
The implementation of the storage backend must not ignore invalid references.</p>
<p>Avoid throwing the common <code>StorageExecption</code> instead of the <code>ReferenceStorageException</code> at this particular situation!</p>
<h3 id="storageexception"><code>StorageException</code><a class="headerlink" href="#storageexception" title="Permanent link">#</a></h3>
<p>This is the common exception in case unexpected errors happen using the storage backend.
If there's a predecessor to this exception (e.g. you caught an exception and are throwing this execption), you should add the predecessor for transparency reasons.</p>
<p>Example:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="x">use Friendica\Core\Storage\Capability\ICanWriteToStorage;</span>
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="x">class ExampleStorage implements ICanWriteToStorage </span>
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="x">{</span>
<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="x"> public function get(string $reference) : string</span>
<a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="x"> {</span>
<a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="x"> try {</span>
<a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="x"> throw new Exception(&#39;a real bad exception&#39;);</span>
<a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="x"> } catch (Exception $exception) {</span>
<a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="x"> throw new \Friendica\Core\Storage\Exception\StorageException(sprintf(&#39;The Example Storage throws an exception for reference %s&#39;, $reference), 500, $exception);</span>
<a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="x"> }</span>
<a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a><span class="x"> }</span>
<a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a><span class="x">} </span>
</code></pre></div>
<h2 id="example">Example<a class="headerlink" href="#example" title="Permanent link">#</a></h2>
<p>Here is a hypothetical addon which register a useless storage backend.
Let's call it <code>samplestorage</code>.</p>
<p>This backend will discard all data we try to save and will return always the same image when we ask for some data.
The image returned can be set by the administrator in admin page.</p>
<p>First, the backend class.
The file will be <code>addon/samplestorage/SampleStorageBackend.php</code>:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="k">namespace</span> <span class="nx">Friendica\Addon\samplestorage</span><span class="p">;</span>
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="k">use</span> <span class="nx">Friendica\Core\Storage\Capability\ICanWriteToStorage</span><span class="p">;</span>
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a>
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a><span class="k">use</span> <span class="nx">Friendica\Core\Config\Capability\IManageConfigValues</span><span class="p">;</span>
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="k">use</span> <span class="nx">Friendica\Core\L10n</span><span class="p">;</span>
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a>
<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a><span class="k">class</span> <span class="nc">SampleStorageBackend</span> <span class="k">implements</span> <span class="nx">ICanWriteToStorage</span>
<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a><span class="p">{</span>
<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a> <span class="k">const</span> <span class="no">NAME</span> <span class="o">=</span> <span class="s1">&#39;Sample Storage&#39;</span><span class="p">;</span>
<a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a>
<a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a> <span class="sd">/** @var string */</span>
<a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a> <span class="k">private</span> <span class="nv">$filename</span><span class="p">;</span>
<a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a>
<a id="__codelineno-5-16" name="__codelineno-5-16" href="#__codelineno-5-16"></a> <span class="sd">/**</span>
<a id="__codelineno-5-17" name="__codelineno-5-17" href="#__codelineno-5-17"></a><span class="sd"> * SampleStorageBackend constructor.</span>
<a id="__codelineno-5-18" name="__codelineno-5-18" href="#__codelineno-5-18"></a><span class="sd"> * </span>
<a id="__codelineno-5-19" name="__codelineno-5-19" href="#__codelineno-5-19"></a><span class="sd"> * You can add here every dynamic class as dependency you like and add them to a private field</span>
<a id="__codelineno-5-20" name="__codelineno-5-20" href="#__codelineno-5-20"></a><span class="sd"> * Friendica automatically creates these classes and passes them as argument to the constructor </span>
<a id="__codelineno-5-21" name="__codelineno-5-21" href="#__codelineno-5-21"></a><span class="sd"> */</span>
<a id="__codelineno-5-22" name="__codelineno-5-22" href="#__codelineno-5-22"></a> <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$filename</span><span class="p">)</span>
<a id="__codelineno-5-23" name="__codelineno-5-23" href="#__codelineno-5-23"></a> <span class="p">{</span>
<a id="__codelineno-5-24" name="__codelineno-5-24" href="#__codelineno-5-24"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">filename</span> <span class="o">=</span> <span class="nv">$filename</span><span class="p">;</span>
<a id="__codelineno-5-25" name="__codelineno-5-25" href="#__codelineno-5-25"></a> <span class="p">}</span>
<a id="__codelineno-5-26" name="__codelineno-5-26" href="#__codelineno-5-26"></a>
<a id="__codelineno-5-27" name="__codelineno-5-27" href="#__codelineno-5-27"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">get</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$reference</span><span class="p">)</span>
<a id="__codelineno-5-28" name="__codelineno-5-28" href="#__codelineno-5-28"></a> <span class="p">{</span>
<a id="__codelineno-5-29" name="__codelineno-5-29" href="#__codelineno-5-29"></a> <span class="c1">// we return always the same image data. Which file we load is defined by</span>
<a id="__codelineno-5-30" name="__codelineno-5-30" href="#__codelineno-5-30"></a> <span class="c1">// a config key</span>
<a id="__codelineno-5-31" name="__codelineno-5-31" href="#__codelineno-5-31"></a> <span class="k">return</span> <span class="nb">file_get_contents</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">filename</span><span class="p">);</span>
<a id="__codelineno-5-32" name="__codelineno-5-32" href="#__codelineno-5-32"></a> <span class="p">}</span>
<a id="__codelineno-5-33" name="__codelineno-5-33" href="#__codelineno-5-33"></a>
<a id="__codelineno-5-34" name="__codelineno-5-34" href="#__codelineno-5-34"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">put</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$data</span><span class="p">,</span> <span class="nx">string</span> <span class="nv">$reference</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<a id="__codelineno-5-35" name="__codelineno-5-35" href="#__codelineno-5-35"></a> <span class="p">{</span>
<a id="__codelineno-5-36" name="__codelineno-5-36" href="#__codelineno-5-36"></a> <span class="k">if</span> <span class="p">(</span><span class="nv">$reference</span> <span class="o">===</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-5-37" name="__codelineno-5-37" href="#__codelineno-5-37"></a> <span class="nv">$reference</span> <span class="o">=</span> <span class="s1">&#39;sample&#39;</span><span class="p">;</span>
<a id="__codelineno-5-38" name="__codelineno-5-38" href="#__codelineno-5-38"></a> <span class="p">}</span>
<a id="__codelineno-5-39" name="__codelineno-5-39" href="#__codelineno-5-39"></a> <span class="c1">// we don&#39;t save $data !</span>
<a id="__codelineno-5-40" name="__codelineno-5-40" href="#__codelineno-5-40"></a> <span class="k">return</span> <span class="nv">$reference</span><span class="p">;</span>
<a id="__codelineno-5-41" name="__codelineno-5-41" href="#__codelineno-5-41"></a> <span class="p">}</span>
<a id="__codelineno-5-42" name="__codelineno-5-42" href="#__codelineno-5-42"></a>
<a id="__codelineno-5-43" name="__codelineno-5-43" href="#__codelineno-5-43"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">delete</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$reference</span><span class="p">)</span>
<a id="__codelineno-5-44" name="__codelineno-5-44" href="#__codelineno-5-44"></a> <span class="p">{</span>
<a id="__codelineno-5-45" name="__codelineno-5-45" href="#__codelineno-5-45"></a> <span class="c1">// we pretend to delete the data</span>
<a id="__codelineno-5-46" name="__codelineno-5-46" href="#__codelineno-5-46"></a> <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
<a id="__codelineno-5-47" name="__codelineno-5-47" href="#__codelineno-5-47"></a> <span class="p">}</span>
<a id="__codelineno-5-48" name="__codelineno-5-48" href="#__codelineno-5-48"></a>
<a id="__codelineno-5-49" name="__codelineno-5-49" href="#__codelineno-5-49"></a> <span class="k">public</span> <span class="k">function</span> <span class="fm">__toString</span><span class="p">()</span>
<a id="__codelineno-5-50" name="__codelineno-5-50" href="#__codelineno-5-50"></a> <span class="p">{</span>
<a id="__codelineno-5-51" name="__codelineno-5-51" href="#__codelineno-5-51"></a> <span class="k">return</span> <span class="nx">self</span><span class="o">::</span><span class="na">NAME</span><span class="p">;</span>
<a id="__codelineno-5-52" name="__codelineno-5-52" href="#__codelineno-5-52"></a> <span class="p">}</span>
<a id="__codelineno-5-53" name="__codelineno-5-53" href="#__codelineno-5-53"></a>
<a id="__codelineno-5-54" name="__codelineno-5-54" href="#__codelineno-5-54"></a> <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">getName</span><span class="p">()</span>
<a id="__codelineno-5-55" name="__codelineno-5-55" href="#__codelineno-5-55"></a> <span class="p">{</span>
<a id="__codelineno-5-56" name="__codelineno-5-56" href="#__codelineno-5-56"></a> <span class="k">return</span> <span class="nx">self</span><span class="o">::</span><span class="na">NAME</span><span class="p">;</span>
<a id="__codelineno-5-57" name="__codelineno-5-57" href="#__codelineno-5-57"></a> <span class="p">}</span>
<a id="__codelineno-5-58" name="__codelineno-5-58" href="#__codelineno-5-58"></a><span class="p">}</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="k">namespace</span> <span class="nx">Friendica\Addon\samplestorage</span><span class="p">;</span>
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="k">use</span> <span class="nx">Friendica\Core\Storage\Capability\ICanConfigureStorage</span><span class="p">;</span>
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a>
<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="k">use</span> <span class="nx">Friendica\Core\Config\Capability\IManageConfigValues</span><span class="p">;</span>
<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="k">use</span> <span class="nx">Friendica\Core\L10n</span><span class="p">;</span>
<a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a>
<a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="k">class</span> <span class="nc">SampleStorageBackendConfig</span> <span class="k">implements</span> <span class="nx">ICanConfigureStorage</span>
<a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a><span class="p">{</span>
<a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a> <span class="sd">/** @var \Friendica\Core\Config\Capability\IManageConfigValues */</span>
<a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a> <span class="k">private</span> <span class="nv">$config</span><span class="p">;</span>
<a id="__codelineno-6-13" name="__codelineno-6-13" href="#__codelineno-6-13"></a> <span class="sd">/** @var L10n */</span>
<a id="__codelineno-6-14" name="__codelineno-6-14" href="#__codelineno-6-14"></a> <span class="k">private</span> <span class="nv">$l10n</span><span class="p">;</span>
<a id="__codelineno-6-15" name="__codelineno-6-15" href="#__codelineno-6-15"></a>
<a id="__codelineno-6-16" name="__codelineno-6-16" href="#__codelineno-6-16"></a> <span class="sd">/**</span>
<a id="__codelineno-6-17" name="__codelineno-6-17" href="#__codelineno-6-17"></a><span class="sd"> * SampleStorageBackendConfig constructor.</span>
<a id="__codelineno-6-18" name="__codelineno-6-18" href="#__codelineno-6-18"></a><span class="sd"> * </span>
<a id="__codelineno-6-19" name="__codelineno-6-19" href="#__codelineno-6-19"></a><span class="sd"> * You can add here every dynamic class as dependency you like and add them to a private field</span>
<a id="__codelineno-6-20" name="__codelineno-6-20" href="#__codelineno-6-20"></a><span class="sd"> * Friendica automatically creates these classes and passes them as argument to the constructor </span>
<a id="__codelineno-6-21" name="__codelineno-6-21" href="#__codelineno-6-21"></a><span class="sd"> */</span>
<a id="__codelineno-6-22" name="__codelineno-6-22" href="#__codelineno-6-22"></a> <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nx">IManageConfigValues</span> <span class="nv">$config</span><span class="p">,</span> <span class="nx">L10n</span> <span class="nv">$l10n</span><span class="p">)</span>
<a id="__codelineno-6-23" name="__codelineno-6-23" href="#__codelineno-6-23"></a> <span class="p">{</span>
<a id="__codelineno-6-24" name="__codelineno-6-24" href="#__codelineno-6-24"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">config</span> <span class="o">=</span> <span class="nv">$config</span><span class="p">;</span>
<a id="__codelineno-6-25" name="__codelineno-6-25" href="#__codelineno-6-25"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">l10n</span> <span class="o">=</span> <span class="nv">$l10n</span><span class="p">;</span>
<a id="__codelineno-6-26" name="__codelineno-6-26" href="#__codelineno-6-26"></a> <span class="p">}</span>
<a id="__codelineno-6-27" name="__codelineno-6-27" href="#__codelineno-6-27"></a>
<a id="__codelineno-6-28" name="__codelineno-6-28" href="#__codelineno-6-28"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">getFileName</span><span class="p">()</span><span class="o">:</span> <span class="nx">string</span>
<a id="__codelineno-6-29" name="__codelineno-6-29" href="#__codelineno-6-29"></a> <span class="p">{</span>
<a id="__codelineno-6-30" name="__codelineno-6-30" href="#__codelineno-6-30"></a> <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">config</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="s1">&#39;storage&#39;</span><span class="p">,</span> <span class="s1">&#39;samplestorage&#39;</span><span class="p">,</span> <span class="s1">&#39;sample.jpg&#39;</span><span class="p">);</span>
<a id="__codelineno-6-31" name="__codelineno-6-31" href="#__codelineno-6-31"></a> <span class="p">}</span>
<a id="__codelineno-6-32" name="__codelineno-6-32" href="#__codelineno-6-32"></a>
<a id="__codelineno-6-33" name="__codelineno-6-33" href="#__codelineno-6-33"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">getOptions</span><span class="p">()</span>
<a id="__codelineno-6-34" name="__codelineno-6-34" href="#__codelineno-6-34"></a> <span class="p">{</span>
<a id="__codelineno-6-35" name="__codelineno-6-35" href="#__codelineno-6-35"></a> <span class="nv">$filename</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">config</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="s1">&#39;storage&#39;</span><span class="p">,</span> <span class="s1">&#39;samplestorage&#39;</span><span class="p">,</span> <span class="s1">&#39;sample.jpg&#39;</span><span class="p">);</span>
<a id="__codelineno-6-36" name="__codelineno-6-36" href="#__codelineno-6-36"></a> <span class="k">return</span> <span class="p">[</span>
<a id="__codelineno-6-37" name="__codelineno-6-37" href="#__codelineno-6-37"></a> <span class="s1">&#39;filename&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
<a id="__codelineno-6-38" name="__codelineno-6-38" href="#__codelineno-6-38"></a> <span class="s1">&#39;input&#39;</span><span class="p">,</span> <span class="c1">// will use a simple text input</span>
<a id="__codelineno-6-39" name="__codelineno-6-39" href="#__codelineno-6-39"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">l10n</span><span class="o">-&gt;</span><span class="na">t</span><span class="p">(</span><span class="s1">&#39;The file to return&#39;</span><span class="p">),</span> <span class="c1">// the label</span>
<a id="__codelineno-6-40" name="__codelineno-6-40" href="#__codelineno-6-40"></a> <span class="nv">$filename</span><span class="p">,</span> <span class="c1">// the current value</span>
<a id="__codelineno-6-41" name="__codelineno-6-41" href="#__codelineno-6-41"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">l10n</span><span class="o">-&gt;</span><span class="na">t</span><span class="p">(</span><span class="s1">&#39;Enter the path to a file&#39;</span><span class="p">),</span> <span class="c1">// the help text</span>
<a id="__codelineno-6-42" name="__codelineno-6-42" href="#__codelineno-6-42"></a> <span class="c1">// no extra data for &#39;input&#39; type..</span>
<a id="__codelineno-6-43" name="__codelineno-6-43" href="#__codelineno-6-43"></a> <span class="p">],</span>
<a id="__codelineno-6-44" name="__codelineno-6-44" href="#__codelineno-6-44"></a> <span class="p">];</span>
<a id="__codelineno-6-45" name="__codelineno-6-45" href="#__codelineno-6-45"></a> <span class="p">}</span>
<a id="__codelineno-6-46" name="__codelineno-6-46" href="#__codelineno-6-46"></a>
<a id="__codelineno-6-47" name="__codelineno-6-47" href="#__codelineno-6-47"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">saveOptions</span><span class="p">(</span><span class="k">array</span> <span class="nv">$data</span><span class="p">)</span>
<a id="__codelineno-6-48" name="__codelineno-6-48" href="#__codelineno-6-48"></a> <span class="p">{</span>
<a id="__codelineno-6-49" name="__codelineno-6-49" href="#__codelineno-6-49"></a> <span class="c1">// the keys in $data are the same keys we defined in getOptions()</span>
<a id="__codelineno-6-50" name="__codelineno-6-50" href="#__codelineno-6-50"></a> <span class="nv">$newfilename</span> <span class="o">=</span> <span class="nb">trim</span><span class="p">(</span><span class="nv">$data</span><span class="p">[</span><span class="s1">&#39;filename&#39;</span><span class="p">]);</span>
<a id="__codelineno-6-51" name="__codelineno-6-51" href="#__codelineno-6-51"></a>
<a id="__codelineno-6-52" name="__codelineno-6-52" href="#__codelineno-6-52"></a> <span class="c1">// this function should always validate the data.</span>
<a id="__codelineno-6-53" name="__codelineno-6-53" href="#__codelineno-6-53"></a> <span class="c1">// in this example we check if file exists</span>
<a id="__codelineno-6-54" name="__codelineno-6-54" href="#__codelineno-6-54"></a> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">file_exists</span><span class="p">(</span><span class="nv">$newfilename</span><span class="p">))</span> <span class="p">{</span>
<a id="__codelineno-6-55" name="__codelineno-6-55" href="#__codelineno-6-55"></a> <span class="c1">// in case of error we return an array with</span>
<a id="__codelineno-6-56" name="__codelineno-6-56" href="#__codelineno-6-56"></a> <span class="c1">// [&#39;optionname&#39; =&gt; &#39;error message&#39;]</span>
<a id="__codelineno-6-57" name="__codelineno-6-57" href="#__codelineno-6-57"></a> <span class="k">return</span> <span class="p">[</span><span class="s1">&#39;filename&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;The file doesn\&#39;t exists&#39;</span><span class="p">];</span>
<a id="__codelineno-6-58" name="__codelineno-6-58" href="#__codelineno-6-58"></a> <span class="p">}</span>
<a id="__codelineno-6-59" name="__codelineno-6-59" href="#__codelineno-6-59"></a>
<a id="__codelineno-6-60" name="__codelineno-6-60" href="#__codelineno-6-60"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">config</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;storage&#39;</span><span class="p">,</span> <span class="s1">&#39;samplestorage&#39;</span><span class="p">,</span> <span class="nv">$newfilename</span><span class="p">);</span>
<a id="__codelineno-6-61" name="__codelineno-6-61" href="#__codelineno-6-61"></a>
<a id="__codelineno-6-62" name="__codelineno-6-62" href="#__codelineno-6-62"></a> <span class="c1">// no errors, return empty array</span>
<a id="__codelineno-6-63" name="__codelineno-6-63" href="#__codelineno-6-63"></a> <span class="k">return</span> <span class="p">[];</span>
<a id="__codelineno-6-64" name="__codelineno-6-64" href="#__codelineno-6-64"></a> <span class="p">}</span>
<a id="__codelineno-6-65" name="__codelineno-6-65" href="#__codelineno-6-65"></a>
<a id="__codelineno-6-66" name="__codelineno-6-66" href="#__codelineno-6-66"></a><span class="p">}</span>
</code></pre></div>
<p>Now the plugin main file. Here we register and unregister the backend class.</p>
<p>The file is <code>addon/samplestorage/samplestorage.php</code></p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a><span class="sd">/**</span>
<a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="sd"> * Name: Sample Storage Addon</span>
<a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a><span class="sd"> * Description: A sample addon which implements an unusefull storage backend</span>
<a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a><span class="sd"> * Version: 1.0.0</span>
<a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a><span class="sd"> * Author: Alice &lt;https://alice.social/~alice&gt;</span>
<a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a><span class="sd"> */</span>
<a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a>
<a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a><span class="k">use</span> <span class="nx">Friendica\Addon\samplestorage\SampleStorageBackend</span><span class="p">;</span>
<a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a><span class="k">use</span> <span class="nx">Friendica\Addon\samplestorage\SampleStorageBackendConfig</span><span class="p">;</span>
<a id="__codelineno-7-11" name="__codelineno-7-11" href="#__codelineno-7-11"></a><span class="k">use</span> <span class="nx">Friendica\DI</span><span class="p">;</span>
<a id="__codelineno-7-12" name="__codelineno-7-12" href="#__codelineno-7-12"></a>
<a id="__codelineno-7-13" name="__codelineno-7-13" href="#__codelineno-7-13"></a><span class="k">function</span> <span class="nf">samplestorage_install</span><span class="p">()</span>
<a id="__codelineno-7-14" name="__codelineno-7-14" href="#__codelineno-7-14"></a><span class="p">{</span>
<a id="__codelineno-7-15" name="__codelineno-7-15" href="#__codelineno-7-15"></a> <span class="nx">Hook</span><span class="o">::</span><span class="na">register</span><span class="p">(</span><span class="s1">&#39;storage_instance&#39;</span> <span class="p">,</span> <span class="no">__FILE__</span><span class="p">,</span> <span class="s1">&#39;samplestorage_storage_instance&#39;</span><span class="p">);</span>
<a id="__codelineno-7-16" name="__codelineno-7-16" href="#__codelineno-7-16"></a> <span class="nx">Hook</span><span class="o">::</span><span class="na">register</span><span class="p">(</span><span class="s1">&#39;storage_config&#39;</span> <span class="p">,</span> <span class="no">__FILE__</span><span class="p">,</span> <span class="s1">&#39;samplestorage_storage_config&#39;</span><span class="p">);</span>
<a id="__codelineno-7-17" name="__codelineno-7-17" href="#__codelineno-7-17"></a> <span class="nx">DI</span><span class="o">::</span><span class="na">storageManager</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">register</span><span class="p">(</span><span class="nx">SampleStorageBackend</span><span class="o">::</span><span class="na">class</span><span class="p">);</span>
<a id="__codelineno-7-18" name="__codelineno-7-18" href="#__codelineno-7-18"></a><span class="p">}</span>
<a id="__codelineno-7-19" name="__codelineno-7-19" href="#__codelineno-7-19"></a>
<a id="__codelineno-7-20" name="__codelineno-7-20" href="#__codelineno-7-20"></a><span class="k">function</span> <span class="nf">samplestorage_storage_uninstall</span><span class="p">()</span>
<a id="__codelineno-7-21" name="__codelineno-7-21" href="#__codelineno-7-21"></a><span class="p">{</span>
<a id="__codelineno-7-22" name="__codelineno-7-22" href="#__codelineno-7-22"></a> <span class="nx">DI</span><span class="o">::</span><span class="na">storageManager</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">unregister</span><span class="p">(</span><span class="nx">SampleStorageBackend</span><span class="o">::</span><span class="na">class</span><span class="p">);</span>
<a id="__codelineno-7-23" name="__codelineno-7-23" href="#__codelineno-7-23"></a><span class="p">}</span>
<a id="__codelineno-7-24" name="__codelineno-7-24" href="#__codelineno-7-24"></a>
<a id="__codelineno-7-25" name="__codelineno-7-25" href="#__codelineno-7-25"></a><span class="k">function</span> <span class="nf">samplestorage_storage_instance</span><span class="p">(</span><span class="nx">App</span> <span class="nv">$a</span><span class="p">,</span> <span class="k">array</span> <span class="o">&amp;</span><span class="nv">$data</span><span class="p">)</span>
<a id="__codelineno-7-26" name="__codelineno-7-26" href="#__codelineno-7-26"></a><span class="p">{</span>
<a id="__codelineno-7-27" name="__codelineno-7-27" href="#__codelineno-7-27"></a> <span class="nv">$config</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SampleStorageBackendConfig</span><span class="p">(</span><span class="nx">DI</span><span class="o">::</span><span class="na">l10n</span><span class="p">(),</span> <span class="nx">DI</span><span class="o">::</span><span class="na">config</span><span class="p">());</span>
<a id="__codelineno-7-28" name="__codelineno-7-28" href="#__codelineno-7-28"></a> <span class="nv">$data</span><span class="p">[</span><span class="s1">&#39;storage&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SampleStorageBackendConfig</span><span class="p">(</span><span class="nv">$config</span><span class="o">-&gt;</span><span class="na">getFileName</span><span class="p">());</span>
<a id="__codelineno-7-29" name="__codelineno-7-29" href="#__codelineno-7-29"></a><span class="p">}</span>
<a id="__codelineno-7-30" name="__codelineno-7-30" href="#__codelineno-7-30"></a>
<a id="__codelineno-7-31" name="__codelineno-7-31" href="#__codelineno-7-31"></a><span class="k">function</span> <span class="nf">samplestorage_storage_config</span><span class="p">(</span><span class="nx">App</span> <span class="nv">$a</span><span class="p">,</span> <span class="k">array</span> <span class="o">&amp;</span><span class="nv">$data</span><span class="p">)</span>
<a id="__codelineno-7-32" name="__codelineno-7-32" href="#__codelineno-7-32"></a><span class="p">{</span>
<a id="__codelineno-7-33" name="__codelineno-7-33" href="#__codelineno-7-33"></a> <span class="nv">$data</span><span class="p">[</span><span class="s1">&#39;storage_config&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SampleStorageBackendConfig</span><span class="p">(</span><span class="nx">DI</span><span class="o">::</span><span class="na">l10n</span><span class="p">(),</span> <span class="nx">DI</span><span class="o">::</span><span class="na">config</span><span class="p">());</span>
<a id="__codelineno-7-34" name="__codelineno-7-34" href="#__codelineno-7-34"></a><span class="p">}</span>
</code></pre></div>
<p>**Theoretically - until tests for Addons are enabled too - create a test class with the name <code>addon/tests/SampleStorageTest.php</code>:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="x">use Friendica\Core\Storage\Capability\ICanWriteToStorage;</span>
<a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="x">use Friendica\Test\src\Core\Storage\StorageTest;</span>
<a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a>
<a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a><span class="x">class SampleStorageTest extends StorageTest </span>
<a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a><span class="x">{</span>
<a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a><span class="x"> // returns an instance of your newly created storage class</span>
<a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a><span class="x"> protected function getInstance()</span>
<a id="__codelineno-8-8" name="__codelineno-8-8" href="#__codelineno-8-8"></a><span class="x"> {</span>
<a id="__codelineno-8-9" name="__codelineno-8-9" href="#__codelineno-8-9"></a><span class="x"> // create a new SampleStorageBackend instance with all it&#39;s dependencies</span>
<a id="__codelineno-8-10" name="__codelineno-8-10" href="#__codelineno-8-10"></a><span class="x"> // Have a look at DatabaseStorageTest or FilesystemStorageTest for further insights</span>
<a id="__codelineno-8-11" name="__codelineno-8-11" href="#__codelineno-8-11"></a><span class="x"> return new SampleStorageBackend();</span>
<a id="__codelineno-8-12" name="__codelineno-8-12" href="#__codelineno-8-12"></a><span class="x"> }</span>
<a id="__codelineno-8-13" name="__codelineno-8-13" href="#__codelineno-8-13"></a>
<a id="__codelineno-8-14" name="__codelineno-8-14" href="#__codelineno-8-14"></a><span class="x"> // Assertion for the option array you return for your new StorageClass</span>
<a id="__codelineno-8-15" name="__codelineno-8-15" href="#__codelineno-8-15"></a><span class="x"> protected function assertOption(ICanWriteToStorage $storage)</span>
<a id="__codelineno-8-16" name="__codelineno-8-16" href="#__codelineno-8-16"></a><span class="x"> {</span>
<a id="__codelineno-8-17" name="__codelineno-8-17" href="#__codelineno-8-17"></a><span class="x"> $this-&gt;assertEquals([</span>
<a id="__codelineno-8-18" name="__codelineno-8-18" href="#__codelineno-8-18"></a><span class="x"> &#39;filename&#39; =&gt; [</span>
<a id="__codelineno-8-19" name="__codelineno-8-19" href="#__codelineno-8-19"></a><span class="x"> &#39;input&#39;,</span>
<a id="__codelineno-8-20" name="__codelineno-8-20" href="#__codelineno-8-20"></a><span class="x"> &#39;The file to return&#39;,</span>
<a id="__codelineno-8-21" name="__codelineno-8-21" href="#__codelineno-8-21"></a><span class="x"> &#39;sample.jpg&#39;,</span>
<a id="__codelineno-8-22" name="__codelineno-8-22" href="#__codelineno-8-22"></a><span class="x"> &#39;Enter the path to a file&#39;</span>
<a id="__codelineno-8-23" name="__codelineno-8-23" href="#__codelineno-8-23"></a><span class="x"> ],</span>
<a id="__codelineno-8-24" name="__codelineno-8-24" href="#__codelineno-8-24"></a><span class="x"> ], $storage-&gt;getOptions());</span>
<a id="__codelineno-8-25" name="__codelineno-8-25" href="#__codelineno-8-25"></a><span class="x"> }</span>
<a id="__codelineno-8-26" name="__codelineno-8-26" href="#__codelineno-8-26"></a><span class="x">} </span>
</code></pre></div>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../smarty3-templates/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Smarty3" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Smarty3
</div>
</div>
</a>
<a href="../translations/" class="md-footer__link md-footer__link--next" aria-label="Next: Translations" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Translations
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,6278 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/addons/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Addons - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#friendica-addon-development" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Addons
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/addons/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/addons/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" checked>
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Addons
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Addons
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#naming" class="md-nav__link">
Naming
</a>
</li>
<li class="md-nav__item">
<a href="#metadata" class="md-nav__link">
Metadata
</a>
</li>
<li class="md-nav__item">
<a href="#installuninstall" class="md-nav__link">
Install/Uninstall
</a>
</li>
<li class="md-nav__item">
<a href="#php-addon-hooks" class="md-nav__link">
PHP addon hooks
</a>
<nav class="md-nav" aria-label="PHP addon hooks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#arguments" class="md-nav__link">
Arguments
</a>
<nav class="md-nav" aria-label="Arguments">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#a" class="md-nav__link">
$a
</a>
</li>
<li class="md-nav__item">
<a href="#b" class="md-nav__link">
$b
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#admin-settings" class="md-nav__link">
Admin settings
</a>
</li>
<li class="md-nav__item">
<a href="#global-stylesheets" class="md-nav__link">
Global stylesheets
</a>
</li>
<li class="md-nav__item">
<a href="#javascript" class="md-nav__link">
JavaScript
</a>
<nav class="md-nav" aria-label="JavaScript">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#global-scripts" class="md-nav__link">
Global scripts
</a>
</li>
<li class="md-nav__item">
<a href="#javascript-hooks" class="md-nav__link">
JavaScript hooks
</a>
<nav class="md-nav" aria-label="JavaScript hooks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#current-javascript-hooks" class="md-nav__link">
Current JavaScript hooks
</a>
<nav class="md-nav" aria-label="Current JavaScript hooks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#postprocess_liveupdate" class="md-nav__link">
postprocess_liveupdate
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#modules" class="md-nav__link">
Modules
</a>
</li>
<li class="md-nav__item">
<a href="#templates" class="md-nav__link">
Templates
</a>
</li>
<li class="md-nav__item">
<a href="#current-php-hooks" class="md-nav__link">
Current PHP hooks
</a>
<nav class="md-nav" aria-label="Current PHP hooks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#authenticate" class="md-nav__link">
authenticate
</a>
</li>
<li class="md-nav__item">
<a href="#logged_in" class="md-nav__link">
logged_in
</a>
</li>
<li class="md-nav__item">
<a href="#display_item" class="md-nav__link">
display_item
</a>
</li>
<li class="md-nav__item">
<a href="#post_local" class="md-nav__link">
post_local
</a>
</li>
<li class="md-nav__item">
<a href="#post_local_end" class="md-nav__link">
post_local_end
</a>
</li>
<li class="md-nav__item">
<a href="#post_remote" class="md-nav__link">
post_remote
</a>
</li>
<li class="md-nav__item">
<a href="#addon_settings" class="md-nav__link">
addon_settings
</a>
<nav class="md-nav" aria-label="addon_settings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#examples" class="md-nav__link">
Examples
</a>
<nav class="md-nav" aria-label="Examples">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#with-link" class="md-nav__link">
With link
</a>
</li>
<li class="md-nav__item">
<a href="#with-default-submit-button" class="md-nav__link">
With default submit button
</a>
</li>
<li class="md-nav__item">
<a href="#with-no-html-just-a-submit-button" class="md-nav__link">
With no HTML, just a submit button
</a>
</li>
<li class="md-nav__item">
<a href="#with-multiple-submit-buttons" class="md-nav__link">
With multiple submit buttons
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#addon_settings_post" class="md-nav__link">
addon_settings_post
</a>
</li>
<li class="md-nav__item">
<a href="#connector_settings" class="md-nav__link">
connector_settings
</a>
<nav class="md-nav" aria-label="connector_settings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#examples_1" class="md-nav__link">
Examples
</a>
<nav class="md-nav" aria-label="Examples">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#with-default-submit-button_1" class="md-nav__link">
With default submit button
</a>
</li>
<li class="md-nav__item">
<a href="#with-custom-submit-button-label-and-no-logo-dim" class="md-nav__link">
With custom submit button label and no logo dim
</a>
</li>
<li class="md-nav__item">
<a href="#with-conditional-submit-buttons" class="md-nav__link">
With conditional submit buttons
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#profile_post" class="md-nav__link">
profile_post
</a>
</li>
<li class="md-nav__item">
<a href="#profile_edit" class="md-nav__link">
profile_edit
</a>
</li>
<li class="md-nav__item">
<a href="#profile_advanced" class="md-nav__link">
profile_advanced
</a>
</li>
<li class="md-nav__item">
<a href="#directory_item" class="md-nav__link">
directory_item
</a>
</li>
<li class="md-nav__item">
<a href="#profile_sidebar_enter" class="md-nav__link">
profile_sidebar_enter
</a>
</li>
<li class="md-nav__item">
<a href="#profile_sidebar" class="md-nav__link">
profile_sidebar
</a>
</li>
<li class="md-nav__item">
<a href="#contact_block_end" class="md-nav__link">
contact_block_end
</a>
</li>
<li class="md-nav__item">
<a href="#bbcode" class="md-nav__link">
bbcode
</a>
</li>
<li class="md-nav__item">
<a href="#html2bbcode" class="md-nav__link">
html2bbcode
</a>
</li>
<li class="md-nav__item">
<a href="#head" class="md-nav__link">
head
</a>
</li>
<li class="md-nav__item">
<a href="#page_header" class="md-nav__link">
page_header
</a>
</li>
<li class="md-nav__item">
<a href="#personal_xrd" class="md-nav__link">
personal_xrd
</a>
</li>
<li class="md-nav__item">
<a href="#home_content" class="md-nav__link">
home_content
</a>
</li>
<li class="md-nav__item">
<a href="#contact_edit" class="md-nav__link">
contact_edit
</a>
</li>
<li class="md-nav__item">
<a href="#contact_edit_post" class="md-nav__link">
contact_edit_post
</a>
</li>
<li class="md-nav__item">
<a href="#init_1" class="md-nav__link">
init_1
</a>
</li>
<li class="md-nav__item">
<a href="#page_end" class="md-nav__link">
page_end
</a>
</li>
<li class="md-nav__item">
<a href="#footer" class="md-nav__link">
footer
</a>
</li>
<li class="md-nav__item">
<a href="#avatar_lookup" class="md-nav__link">
avatar_lookup
</a>
</li>
<li class="md-nav__item">
<a href="#emailer_send_prepare" class="md-nav__link">
emailer_send_prepare
</a>
</li>
<li class="md-nav__item">
<a href="#emailer_send" class="md-nav__link">
emailer_send
</a>
</li>
<li class="md-nav__item">
<a href="#load_config" class="md-nav__link">
load_config
</a>
</li>
<li class="md-nav__item">
<a href="#nav_info" class="md-nav__link">
nav_info
</a>
</li>
<li class="md-nav__item">
<a href="#template_vars" class="md-nav__link">
template_vars
</a>
</li>
<li class="md-nav__item">
<a href="#acl_lookup_end" class="md-nav__link">
acl_lookup_end
</a>
</li>
<li class="md-nav__item">
<a href="#prepare_body_init" class="md-nav__link">
prepare_body_init
</a>
</li>
<li class="md-nav__item">
<a href="#prepare_body_content_filter" class="md-nav__link">
prepare_body_content_filter
</a>
</li>
<li class="md-nav__item">
<a href="#prepare_body" class="md-nav__link">
prepare_body
</a>
</li>
<li class="md-nav__item">
<a href="#prepare_body_final" class="md-nav__link">
prepare_body_final
</a>
</li>
<li class="md-nav__item">
<a href="#put_item_in_cache" class="md-nav__link">
put_item_in_cache
</a>
</li>
<li class="md-nav__item">
<a href="#magic_auth_success" class="md-nav__link">
magic_auth_success
</a>
</li>
<li class="md-nav__item">
<a href="#jot_networks" class="md-nav__link">
jot_networks
</a>
</li>
<li class="md-nav__item">
<a href="#route_collection" class="md-nav__link">
route_collection
</a>
</li>
<li class="md-nav__item">
<a href="#probe_detect" class="md-nav__link">
probe_detect
</a>
</li>
<li class="md-nav__item">
<a href="#item_by_link" class="md-nav__link">
item_by_link
</a>
</li>
<li class="md-nav__item">
<a href="#support_follow" class="md-nav__link">
support_follow
</a>
</li>
<li class="md-nav__item">
<a href="#support_revoke_follow" class="md-nav__link">
support_revoke_follow
</a>
</li>
<li class="md-nav__item">
<a href="#follow" class="md-nav__link">
follow
</a>
</li>
<li class="md-nav__item">
<a href="#unfollow" class="md-nav__link">
unfollow
</a>
</li>
<li class="md-nav__item">
<a href="#revoke_follow" class="md-nav__link">
revoke_follow
</a>
</li>
<li class="md-nav__item">
<a href="#block" class="md-nav__link">
block
</a>
</li>
<li class="md-nav__item">
<a href="#unblock" class="md-nav__link">
unblock
</a>
</li>
<li class="md-nav__item">
<a href="#storage_instance" class="md-nav__link">
storage_instance
</a>
</li>
<li class="md-nav__item">
<a href="#storage_config" class="md-nav__link">
storage_config
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#complete-list-of-hook-callbacks" class="md-nav__link">
Complete list of hook callbacks
</a>
<nav class="md-nav" aria-label="Complete list of hook callbacks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#indexphp" class="md-nav__link">
index.php
</a>
</li>
<li class="md-nav__item">
<a href="#includeapiphp" class="md-nav__link">
include/api.php
</a>
</li>
<li class="md-nav__item">
<a href="#includeenotifyphp" class="md-nav__link">
include/enotify.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentconversationphp" class="md-nav__link">
src/Content/Conversation.php
</a>
</li>
<li class="md-nav__item">
<a href="#moddirectoryphp" class="md-nav__link">
mod/directory.php
</a>
</li>
<li class="md-nav__item">
<a href="#modxrdphp" class="md-nav__link">
mod/xrd.php
</a>
</li>
<li class="md-nav__item">
<a href="#modparse_urlphp" class="md-nav__link">
mod/parse_url.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmoduledelegationphp" class="md-nav__link">
src/Module/Delegation.php
</a>
</li>
<li class="md-nav__item">
<a href="#modaclphp" class="md-nav__link">
mod/acl.php
</a>
</li>
<li class="md-nav__item">
<a href="#modnetworkphp" class="md-nav__link">
mod/network.php
</a>
</li>
<li class="md-nav__item">
<a href="#modfriendicaphp" class="md-nav__link">
mod/friendica.php
</a>
</li>
<li class="md-nav__item">
<a href="#modprofilesphp" class="md-nav__link">
mod/profiles.php
</a>
</li>
<li class="md-nav__item">
<a href="#modsettingsphp" class="md-nav__link">
mod/settings.php
</a>
</li>
<li class="md-nav__item">
<a href="#modphotosphp" class="md-nav__link">
mod/photos.php
</a>
</li>
<li class="md-nav__item">
<a href="#modprofilephp" class="md-nav__link">
mod/profile.php
</a>
</li>
<li class="md-nav__item">
<a href="#modhomephp" class="md-nav__link">
mod/home.php
</a>
</li>
<li class="md-nav__item">
<a href="#modpokephp" class="md-nav__link">
mod/poke.php
</a>
</li>
<li class="md-nav__item">
<a href="#modcontactsphp" class="md-nav__link">
mod/contacts.php
</a>
</li>
<li class="md-nav__item">
<a href="#modtaggerphp" class="md-nav__link">
mod/tagger.php
</a>
</li>
<li class="md-nav__item">
<a href="#moduexportphp" class="md-nav__link">
mod/uexport.php
</a>
</li>
<li class="md-nav__item">
<a href="#modregisterphp" class="md-nav__link">
mod/register.php
</a>
</li>
<li class="md-nav__item">
<a href="#moditemphp" class="md-nav__link">
mod/item.php
</a>
</li>
<li class="md-nav__item">
<a href="#modeditpostphp" class="md-nav__link">
mod/editpost.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcrenderfriendicasmartyenginephp" class="md-nav__link">
src/Render/FriendicaSmartyEngine.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcappphp" class="md-nav__link">
src/App.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodelitemphp" class="md-nav__link">
src/Model/Item.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodelcontactphp" class="md-nav__link">
src/Model/Contact.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodelprofilephp" class="md-nav__link">
src/Model/Profile.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodeleventphp" class="md-nav__link">
src/Model/Event.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodelregisterphp" class="md-nav__link">
src/Model/Register.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodeluserphp" class="md-nav__link">
src/Model/User.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulenotificationspingphp" class="md-nav__link">
src/Module/Notifications/Ping.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulepermissiontooltipphp" class="md-nav__link">
src/Module/PermissionTooltip.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulesettingsdelegationphp" class="md-nav__link">
src/Module/Settings/Delegation.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulesettingstwofactorindexphp" class="md-nav__link">
src/Module/Settings/TwoFactor/Index.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcsecurityauthenticatephp" class="md-nav__link">
src/Security/Authenticate.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcsecurityexauthphp" class="md-nav__link">
src/Security/ExAuth.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentcontactblockphp" class="md-nav__link">
src/Content/ContactBlock.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontenttextbbcodephp" class="md-nav__link">
src/Content/Text/BBCode.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontenttexthtmlphp" class="md-nav__link">
src/Content/Text/HTML.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentsmiliesphp" class="md-nav__link">
src/Content/Smilies.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentfeaturephp" class="md-nav__link">
src/Content/Feature.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentcontactselectorphp" class="md-nav__link">
src/Content/ContactSelector.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentoembedphp" class="md-nav__link">
src/Content/OEmbed.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentnavphp" class="md-nav__link">
src/Content/Nav.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreauthenticationphp" class="md-nav__link">
src/Core/Authentication.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreprotocolphp" class="md-nav__link">
src/Core/Protocol.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccorestoragemanager" class="md-nav__link">
src/Core/StorageManager
</a>
</li>
<li class="md-nav__item">
<a href="#srcworkerdirectoryphp" class="md-nav__link">
src/Worker/Directory.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcworkernotifierphp" class="md-nav__link">
src/Worker/Notifier.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmoduleloginphp" class="md-nav__link">
src/Module/Login.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulelogoutphp" class="md-nav__link">
src/Module/Logout.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcobjectpostphp" class="md-nav__link">
src/Object/Post.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreaclphp" class="md-nav__link">
src/Core/ACL.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreauthenticationphp_1" class="md-nav__link">
src/Core/Authentication.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccorehookphp" class="md-nav__link">
src/Core/Hook.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccorel10nl10nphp" class="md-nav__link">
src/Core/L10n/L10n.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreworkerphp" class="md-nav__link">
src/Core/Worker.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcutilemailerphp" class="md-nav__link">
src/Util/Emailer.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcutilmapphp" class="md-nav__link">
src/Util/Map.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcutilnetworkphp" class="md-nav__link">
src/Util/Network.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcutilparseurlphp" class="md-nav__link">
src/Util/ParseUrl.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcprotocoldfrnphp" class="md-nav__link">
src/Protocol/DFRN.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcprotocolemailphp" class="md-nav__link">
src/Protocol/Email.php
</a>
</li>
<li class="md-nav__item">
<a href="#viewjsmainjs" class="md-nav__link">
view/js/main.js
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#naming" class="md-nav__link">
Naming
</a>
</li>
<li class="md-nav__item">
<a href="#metadata" class="md-nav__link">
Metadata
</a>
</li>
<li class="md-nav__item">
<a href="#installuninstall" class="md-nav__link">
Install/Uninstall
</a>
</li>
<li class="md-nav__item">
<a href="#php-addon-hooks" class="md-nav__link">
PHP addon hooks
</a>
<nav class="md-nav" aria-label="PHP addon hooks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#arguments" class="md-nav__link">
Arguments
</a>
<nav class="md-nav" aria-label="Arguments">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#a" class="md-nav__link">
$a
</a>
</li>
<li class="md-nav__item">
<a href="#b" class="md-nav__link">
$b
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#admin-settings" class="md-nav__link">
Admin settings
</a>
</li>
<li class="md-nav__item">
<a href="#global-stylesheets" class="md-nav__link">
Global stylesheets
</a>
</li>
<li class="md-nav__item">
<a href="#javascript" class="md-nav__link">
JavaScript
</a>
<nav class="md-nav" aria-label="JavaScript">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#global-scripts" class="md-nav__link">
Global scripts
</a>
</li>
<li class="md-nav__item">
<a href="#javascript-hooks" class="md-nav__link">
JavaScript hooks
</a>
<nav class="md-nav" aria-label="JavaScript hooks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#current-javascript-hooks" class="md-nav__link">
Current JavaScript hooks
</a>
<nav class="md-nav" aria-label="Current JavaScript hooks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#postprocess_liveupdate" class="md-nav__link">
postprocess_liveupdate
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#modules" class="md-nav__link">
Modules
</a>
</li>
<li class="md-nav__item">
<a href="#templates" class="md-nav__link">
Templates
</a>
</li>
<li class="md-nav__item">
<a href="#current-php-hooks" class="md-nav__link">
Current PHP hooks
</a>
<nav class="md-nav" aria-label="Current PHP hooks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#authenticate" class="md-nav__link">
authenticate
</a>
</li>
<li class="md-nav__item">
<a href="#logged_in" class="md-nav__link">
logged_in
</a>
</li>
<li class="md-nav__item">
<a href="#display_item" class="md-nav__link">
display_item
</a>
</li>
<li class="md-nav__item">
<a href="#post_local" class="md-nav__link">
post_local
</a>
</li>
<li class="md-nav__item">
<a href="#post_local_end" class="md-nav__link">
post_local_end
</a>
</li>
<li class="md-nav__item">
<a href="#post_remote" class="md-nav__link">
post_remote
</a>
</li>
<li class="md-nav__item">
<a href="#addon_settings" class="md-nav__link">
addon_settings
</a>
<nav class="md-nav" aria-label="addon_settings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#examples" class="md-nav__link">
Examples
</a>
<nav class="md-nav" aria-label="Examples">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#with-link" class="md-nav__link">
With link
</a>
</li>
<li class="md-nav__item">
<a href="#with-default-submit-button" class="md-nav__link">
With default submit button
</a>
</li>
<li class="md-nav__item">
<a href="#with-no-html-just-a-submit-button" class="md-nav__link">
With no HTML, just a submit button
</a>
</li>
<li class="md-nav__item">
<a href="#with-multiple-submit-buttons" class="md-nav__link">
With multiple submit buttons
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#addon_settings_post" class="md-nav__link">
addon_settings_post
</a>
</li>
<li class="md-nav__item">
<a href="#connector_settings" class="md-nav__link">
connector_settings
</a>
<nav class="md-nav" aria-label="connector_settings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#examples_1" class="md-nav__link">
Examples
</a>
<nav class="md-nav" aria-label="Examples">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#with-default-submit-button_1" class="md-nav__link">
With default submit button
</a>
</li>
<li class="md-nav__item">
<a href="#with-custom-submit-button-label-and-no-logo-dim" class="md-nav__link">
With custom submit button label and no logo dim
</a>
</li>
<li class="md-nav__item">
<a href="#with-conditional-submit-buttons" class="md-nav__link">
With conditional submit buttons
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#profile_post" class="md-nav__link">
profile_post
</a>
</li>
<li class="md-nav__item">
<a href="#profile_edit" class="md-nav__link">
profile_edit
</a>
</li>
<li class="md-nav__item">
<a href="#profile_advanced" class="md-nav__link">
profile_advanced
</a>
</li>
<li class="md-nav__item">
<a href="#directory_item" class="md-nav__link">
directory_item
</a>
</li>
<li class="md-nav__item">
<a href="#profile_sidebar_enter" class="md-nav__link">
profile_sidebar_enter
</a>
</li>
<li class="md-nav__item">
<a href="#profile_sidebar" class="md-nav__link">
profile_sidebar
</a>
</li>
<li class="md-nav__item">
<a href="#contact_block_end" class="md-nav__link">
contact_block_end
</a>
</li>
<li class="md-nav__item">
<a href="#bbcode" class="md-nav__link">
bbcode
</a>
</li>
<li class="md-nav__item">
<a href="#html2bbcode" class="md-nav__link">
html2bbcode
</a>
</li>
<li class="md-nav__item">
<a href="#head" class="md-nav__link">
head
</a>
</li>
<li class="md-nav__item">
<a href="#page_header" class="md-nav__link">
page_header
</a>
</li>
<li class="md-nav__item">
<a href="#personal_xrd" class="md-nav__link">
personal_xrd
</a>
</li>
<li class="md-nav__item">
<a href="#home_content" class="md-nav__link">
home_content
</a>
</li>
<li class="md-nav__item">
<a href="#contact_edit" class="md-nav__link">
contact_edit
</a>
</li>
<li class="md-nav__item">
<a href="#contact_edit_post" class="md-nav__link">
contact_edit_post
</a>
</li>
<li class="md-nav__item">
<a href="#init_1" class="md-nav__link">
init_1
</a>
</li>
<li class="md-nav__item">
<a href="#page_end" class="md-nav__link">
page_end
</a>
</li>
<li class="md-nav__item">
<a href="#footer" class="md-nav__link">
footer
</a>
</li>
<li class="md-nav__item">
<a href="#avatar_lookup" class="md-nav__link">
avatar_lookup
</a>
</li>
<li class="md-nav__item">
<a href="#emailer_send_prepare" class="md-nav__link">
emailer_send_prepare
</a>
</li>
<li class="md-nav__item">
<a href="#emailer_send" class="md-nav__link">
emailer_send
</a>
</li>
<li class="md-nav__item">
<a href="#load_config" class="md-nav__link">
load_config
</a>
</li>
<li class="md-nav__item">
<a href="#nav_info" class="md-nav__link">
nav_info
</a>
</li>
<li class="md-nav__item">
<a href="#template_vars" class="md-nav__link">
template_vars
</a>
</li>
<li class="md-nav__item">
<a href="#acl_lookup_end" class="md-nav__link">
acl_lookup_end
</a>
</li>
<li class="md-nav__item">
<a href="#prepare_body_init" class="md-nav__link">
prepare_body_init
</a>
</li>
<li class="md-nav__item">
<a href="#prepare_body_content_filter" class="md-nav__link">
prepare_body_content_filter
</a>
</li>
<li class="md-nav__item">
<a href="#prepare_body" class="md-nav__link">
prepare_body
</a>
</li>
<li class="md-nav__item">
<a href="#prepare_body_final" class="md-nav__link">
prepare_body_final
</a>
</li>
<li class="md-nav__item">
<a href="#put_item_in_cache" class="md-nav__link">
put_item_in_cache
</a>
</li>
<li class="md-nav__item">
<a href="#magic_auth_success" class="md-nav__link">
magic_auth_success
</a>
</li>
<li class="md-nav__item">
<a href="#jot_networks" class="md-nav__link">
jot_networks
</a>
</li>
<li class="md-nav__item">
<a href="#route_collection" class="md-nav__link">
route_collection
</a>
</li>
<li class="md-nav__item">
<a href="#probe_detect" class="md-nav__link">
probe_detect
</a>
</li>
<li class="md-nav__item">
<a href="#item_by_link" class="md-nav__link">
item_by_link
</a>
</li>
<li class="md-nav__item">
<a href="#support_follow" class="md-nav__link">
support_follow
</a>
</li>
<li class="md-nav__item">
<a href="#support_revoke_follow" class="md-nav__link">
support_revoke_follow
</a>
</li>
<li class="md-nav__item">
<a href="#follow" class="md-nav__link">
follow
</a>
</li>
<li class="md-nav__item">
<a href="#unfollow" class="md-nav__link">
unfollow
</a>
</li>
<li class="md-nav__item">
<a href="#revoke_follow" class="md-nav__link">
revoke_follow
</a>
</li>
<li class="md-nav__item">
<a href="#block" class="md-nav__link">
block
</a>
</li>
<li class="md-nav__item">
<a href="#unblock" class="md-nav__link">
unblock
</a>
</li>
<li class="md-nav__item">
<a href="#storage_instance" class="md-nav__link">
storage_instance
</a>
</li>
<li class="md-nav__item">
<a href="#storage_config" class="md-nav__link">
storage_config
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#complete-list-of-hook-callbacks" class="md-nav__link">
Complete list of hook callbacks
</a>
<nav class="md-nav" aria-label="Complete list of hook callbacks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#indexphp" class="md-nav__link">
index.php
</a>
</li>
<li class="md-nav__item">
<a href="#includeapiphp" class="md-nav__link">
include/api.php
</a>
</li>
<li class="md-nav__item">
<a href="#includeenotifyphp" class="md-nav__link">
include/enotify.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentconversationphp" class="md-nav__link">
src/Content/Conversation.php
</a>
</li>
<li class="md-nav__item">
<a href="#moddirectoryphp" class="md-nav__link">
mod/directory.php
</a>
</li>
<li class="md-nav__item">
<a href="#modxrdphp" class="md-nav__link">
mod/xrd.php
</a>
</li>
<li class="md-nav__item">
<a href="#modparse_urlphp" class="md-nav__link">
mod/parse_url.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmoduledelegationphp" class="md-nav__link">
src/Module/Delegation.php
</a>
</li>
<li class="md-nav__item">
<a href="#modaclphp" class="md-nav__link">
mod/acl.php
</a>
</li>
<li class="md-nav__item">
<a href="#modnetworkphp" class="md-nav__link">
mod/network.php
</a>
</li>
<li class="md-nav__item">
<a href="#modfriendicaphp" class="md-nav__link">
mod/friendica.php
</a>
</li>
<li class="md-nav__item">
<a href="#modprofilesphp" class="md-nav__link">
mod/profiles.php
</a>
</li>
<li class="md-nav__item">
<a href="#modsettingsphp" class="md-nav__link">
mod/settings.php
</a>
</li>
<li class="md-nav__item">
<a href="#modphotosphp" class="md-nav__link">
mod/photos.php
</a>
</li>
<li class="md-nav__item">
<a href="#modprofilephp" class="md-nav__link">
mod/profile.php
</a>
</li>
<li class="md-nav__item">
<a href="#modhomephp" class="md-nav__link">
mod/home.php
</a>
</li>
<li class="md-nav__item">
<a href="#modpokephp" class="md-nav__link">
mod/poke.php
</a>
</li>
<li class="md-nav__item">
<a href="#modcontactsphp" class="md-nav__link">
mod/contacts.php
</a>
</li>
<li class="md-nav__item">
<a href="#modtaggerphp" class="md-nav__link">
mod/tagger.php
</a>
</li>
<li class="md-nav__item">
<a href="#moduexportphp" class="md-nav__link">
mod/uexport.php
</a>
</li>
<li class="md-nav__item">
<a href="#modregisterphp" class="md-nav__link">
mod/register.php
</a>
</li>
<li class="md-nav__item">
<a href="#moditemphp" class="md-nav__link">
mod/item.php
</a>
</li>
<li class="md-nav__item">
<a href="#modeditpostphp" class="md-nav__link">
mod/editpost.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcrenderfriendicasmartyenginephp" class="md-nav__link">
src/Render/FriendicaSmartyEngine.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcappphp" class="md-nav__link">
src/App.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodelitemphp" class="md-nav__link">
src/Model/Item.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodelcontactphp" class="md-nav__link">
src/Model/Contact.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodelprofilephp" class="md-nav__link">
src/Model/Profile.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodeleventphp" class="md-nav__link">
src/Model/Event.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodelregisterphp" class="md-nav__link">
src/Model/Register.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodeluserphp" class="md-nav__link">
src/Model/User.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulenotificationspingphp" class="md-nav__link">
src/Module/Notifications/Ping.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulepermissiontooltipphp" class="md-nav__link">
src/Module/PermissionTooltip.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulesettingsdelegationphp" class="md-nav__link">
src/Module/Settings/Delegation.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulesettingstwofactorindexphp" class="md-nav__link">
src/Module/Settings/TwoFactor/Index.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcsecurityauthenticatephp" class="md-nav__link">
src/Security/Authenticate.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcsecurityexauthphp" class="md-nav__link">
src/Security/ExAuth.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentcontactblockphp" class="md-nav__link">
src/Content/ContactBlock.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontenttextbbcodephp" class="md-nav__link">
src/Content/Text/BBCode.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontenttexthtmlphp" class="md-nav__link">
src/Content/Text/HTML.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentsmiliesphp" class="md-nav__link">
src/Content/Smilies.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentfeaturephp" class="md-nav__link">
src/Content/Feature.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentcontactselectorphp" class="md-nav__link">
src/Content/ContactSelector.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentoembedphp" class="md-nav__link">
src/Content/OEmbed.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccontentnavphp" class="md-nav__link">
src/Content/Nav.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreauthenticationphp" class="md-nav__link">
src/Core/Authentication.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreprotocolphp" class="md-nav__link">
src/Core/Protocol.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccorestoragemanager" class="md-nav__link">
src/Core/StorageManager
</a>
</li>
<li class="md-nav__item">
<a href="#srcworkerdirectoryphp" class="md-nav__link">
src/Worker/Directory.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcworkernotifierphp" class="md-nav__link">
src/Worker/Notifier.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmoduleloginphp" class="md-nav__link">
src/Module/Login.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcmodulelogoutphp" class="md-nav__link">
src/Module/Logout.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcobjectpostphp" class="md-nav__link">
src/Object/Post.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreaclphp" class="md-nav__link">
src/Core/ACL.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreauthenticationphp_1" class="md-nav__link">
src/Core/Authentication.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccorehookphp" class="md-nav__link">
src/Core/Hook.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccorel10nl10nphp" class="md-nav__link">
src/Core/L10n/L10n.php
</a>
</li>
<li class="md-nav__item">
<a href="#srccoreworkerphp" class="md-nav__link">
src/Core/Worker.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcutilemailerphp" class="md-nav__link">
src/Util/Emailer.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcutilmapphp" class="md-nav__link">
src/Util/Map.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcutilnetworkphp" class="md-nav__link">
src/Util/Network.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcutilparseurlphp" class="md-nav__link">
src/Util/ParseUrl.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcprotocoldfrnphp" class="md-nav__link">
src/Protocol/DFRN.php
</a>
</li>
<li class="md-nav__item">
<a href="#srcprotocolemailphp" class="md-nav__link">
src/Protocol/Email.php
</a>
</li>
<li class="md-nav__item">
<a href="#viewjsmainjs" class="md-nav__link">
view/js/main.js
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/en/developer/addons.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
</nav>
<h1 id="friendica-addon-development">Friendica Addon development<a class="headerlink" href="#friendica-addon-development" title="Permanent link">#</a></h1>
<p>Please see the sample addon 'randplace' for a working example of using some of these features.
Addons work by intercepting event hooks - which must be registered.
Modules work by intercepting specific page requests (by URL path).</p>
<h2 id="naming">Naming<a class="headerlink" href="#naming" title="Permanent link">#</a></h2>
<p>Addon names are used in file paths and functions names, and as such:
- Can't contain spaces or punctuation.
- Can't start with a number.</p>
<h2 id="metadata">Metadata<a class="headerlink" href="#metadata" title="Permanent link">#</a></h2>
<p>You can provide human-readable information about your addon in the first multi-line comment of your addon file.</p>
<p>Here's the structure:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="x">/**</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="x"> * Name: {Human-readable name}</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="x"> * Description: {Short description}</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="x"> * Version: 1.0</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="x"> * Author: {Author1 Name}</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="x"> * Author: {Author2 Name} &lt;{Author profile link}&gt;</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="x"> * Maintainer: {Maintainer1 Name}</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="x"> * Maintainer: {Maintainer2 Name} &lt;{Maintainer profile link}&gt;</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="x"> * Status: {Unsupported|Arbitrary status}</span>
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="x"> */</span>
</code></pre></div>
<p>You can also provide a longer documentation in a <code>README</code> or <code>README.md</code> file.
The latter will be converted from Markdown to HTML in the addon detail page.</p>
<h2 id="installuninstall">Install/Uninstall<a class="headerlink" href="#installuninstall" title="Permanent link">#</a></h2>
<p>If your addon uses hooks, they have to be registered in a <code>&lt;addon&gt;_install()</code> function.
This function also allows to perform arbitrary actions your addon needs to function properly.</p>
<p>Uninstalling an addon automatically unregisters any hook it registered, but if you need to provide specific uninstallation steps, you can add them in a <code>&lt;addon&gt;_uninstall()</code> function.</p>
<p>The installation and uninstallation functions will be called (i.e. re-installed) if the addon changes after installation.
Therefore, your uninstall should not destroy data and install should consider that data may already exist.
Future extensions may provide for "setup" amd "remove".</p>
<h2 id="php-addon-hooks">PHP addon hooks<a class="headerlink" href="#php-addon-hooks" title="Permanent link">#</a></h2>
<p>Register your addon hooks during installation.</p>
<div class="highlight"><pre><span></span><code>\Friendica\Core\Hook::register($hookname, $file, $function);
</code></pre></div>
<p><code>$hookname</code> is a string and corresponds to a known Friendica PHP hook.</p>
<p><code>$file</code> is a pathname relative to the top-level Friendica directory.
This <em>should</em> be 'addon/<em>addon_name</em>/<em>addon_name</em>.php' in most cases and can be shortened to <code>__FILE__</code>.</p>
<p><code>$function</code> is a string and is the name of the function which will be executed when the hook is called.</p>
<h3 id="arguments">Arguments<a class="headerlink" href="#arguments" title="Permanent link">#</a></h3>
<p>Your hook callback functions will be called with at least one and possibly two arguments</p>
<div class="highlight"><pre><span></span><code>function &lt;addon&gt;_&lt;hookname&gt;(App $a, &amp;$b) {
}
</code></pre></div>
<p>If you wish to make changes to the calling data, you must declare them as reference variables (with <code>&amp;</code>) during function declaration.</p>
<h4 id="a">$a<a class="headerlink" href="#a" title="Permanent link">#</a></h4>
<p>$a is the Friendica <code>App</code> class.
It contains a wealth of information about the current state of Friendica:</p>
<ul>
<li>which module has been called,</li>
<li>configuration information,</li>
<li>the page contents at the point the hook was invoked,</li>
<li>profile and user information, etc.</li>
</ul>
<p>It is recommended you call this <code>$a</code> to match its usage elsewhere.</p>
<h4 id="b">$b<a class="headerlink" href="#b" title="Permanent link">#</a></h4>
<p>$b can be called anything you like.
This is information specific to the hook currently being processed, and generally contains information that is being immediately processed or acted on that you can use, display, or alter.
Remember to declare it with <code>&amp;</code> if you wish to alter it.</p>
<h2 id="admin-settings">Admin settings<a class="headerlink" href="#admin-settings" title="Permanent link">#</a></h2>
<p>Your addon can provide user-specific settings via the <code>addon_settings</code> PHP hook, but it can also provide node-wide settings in the administration page of your addon.</p>
<p>Simply declare a <code>&lt;addon&gt;_addon_admin(App $a)</code> function to display the form and a <code>&lt;addon&gt;_addon_admin_post(App $a)</code> function to process the data from the form.</p>
<h2 id="global-stylesheets">Global stylesheets<a class="headerlink" href="#global-stylesheets" title="Permanent link">#</a></h2>
<p>If your addon requires adding a stylesheet on all pages of Friendica, add the following hook:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="x">function &lt;addon&gt;_install()</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="x">{</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="x"> \Friendica\Core\Hook::register(&#39;head&#39;, __FILE__, &#39;&lt;addon&gt;_head&#39;);</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="x"> ...</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="x">}</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="x">function &lt;addon&gt;_head(App $a)</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="x">{</span>
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="x"> \Friendica\DI::page()-&gt;registerStylesheet(__DIR__ . &#39;/relative/path/to/addon/stylesheet.css&#39;);</span>
<a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a><span class="x">}</span>
</code></pre></div>
<p><code>__DIR__</code> is the folder path of your addon.</p>
<h2 id="javascript">JavaScript<a class="headerlink" href="#javascript" title="Permanent link">#</a></h2>
<h3 id="global-scripts">Global scripts<a class="headerlink" href="#global-scripts" title="Permanent link">#</a></h3>
<p>If your addon requires adding a script on all pages of Friendica, add the following hook:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="x">function &lt;addon&gt;_install()</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="x">{</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="x"> \Friendica\Core\Hook::register(&#39;footer&#39;, __FILE__, &#39;&lt;addon&gt;_footer&#39;);</span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="x"> ...</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="x">}</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="x">function &lt;addon&gt;_footer(App $a)</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="x">{</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="x"> \Friendica\DI::page()-&gt;registerFooterScript(__DIR__ . &#39;/relative/path/to/addon/script.js&#39;);</span>
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a><span class="x">}</span>
</code></pre></div>
<p><code>__DIR__</code> is the folder path of your addon.</p>
<h3 id="javascript-hooks">JavaScript hooks<a class="headerlink" href="#javascript-hooks" title="Permanent link">#</a></h3>
<p>The main Friendica script provides hooks via events dispatched on the <code>document</code> property.
In your Javascript file included as described above, add your event listener like this:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="nb">document</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span><span class="w"> </span><span class="nx">callback</span><span class="p">);</span><span class="w"></span>
</code></pre></div>
<ul>
<li><em>name</em> is the name of the hook and corresponds to a known Friendica JavaScript hook.</li>
<li><em>callback</em> is a JavaScript anonymous function to execute.</li>
</ul>
<p>More info about Javascript event listeners: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener</p>
<h4 id="current-javascript-hooks">Current JavaScript hooks<a class="headerlink" href="#current-javascript-hooks" title="Permanent link">#</a></h4>
<h5 id="postprocess_liveupdate">postprocess_liveupdate<a class="headerlink" href="#postprocess_liveupdate" title="Permanent link">#</a></h5>
<p>Called at the end of the live update process (XmlHttpRequest) and on a post preview.
No additional data is provided.</p>
<h2 id="modules">Modules<a class="headerlink" href="#modules" title="Permanent link">#</a></h2>
<p>Addons may also act as "modules" and intercept all page requests for a given URL path.
In order for an addon to act as a module it needs to declare an empty function <code>&lt;addon&gt;_module()</code>.</p>
<p>If this function exists, you will now receive all page requests for <code>https://my.web.site/&lt;addon&gt;</code> - with any number of URL components as additional arguments.
These are parsed into the <code>App\Arguments</code> object.
So <code>https://my.web.site/addon/arg1/arg2</code> would give this:
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="x">DI::args()-&gt;getArgc(); // = 3</span>
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="x">DI::args()-&gt;get(0); // = &#39;addon&#39;</span>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="x">DI::args()-&gt;get(1); // = &#39;arg1&#39;</span>
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="x">DI::args()-&gt;get(2); // = &#39;arg2&#39;</span>
</code></pre></div></p>
<p>To display a module page, you need to declare the function <code>&lt;addon&gt;_content(App $a)</code>, which defines and returns the page body content.
They may also contain <code>&lt;addon&gt;_post(App $a)</code> which is called before the <code>&lt;addon&gt;_content</code> function and typically handles the results of POST forms.
You may also have <code>&lt;addon&gt;_init(App $a)</code> which is called before <code>&lt;addon&gt;_content</code> and should include common logic to your module.</p>
<h2 id="templates">Templates<a class="headerlink" href="#templates" title="Permanent link">#</a></h2>
<p>If your addon needs some template, you can use the Friendica template system.
Friendica uses <a href="http://www.smarty.net/">smarty3</a> as a template engine.</p>
<p>Put your tpl files in the <em>templates/</em> sub-folder of your addon.</p>
<p>In your code, like in the function addon_name_content(), load the template file and execute it passing needed values:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="x">use Friendica\Core\Renderer;</span>
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="x"># load template file. first argument is the template name,</span>
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="x"># second is the addon path relative to friendica top folder</span>
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="x">$tpl = Renderer::getMarkupTemplate(&#39;mytemplate.tpl&#39;, __DIR__);</span>
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="x"># apply template. first argument is the loaded template,</span>
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="x"># second an array of &#39;name&#39; =&gt; &#39;values&#39; to pass to template</span>
<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a><span class="x">$output = Renderer::replaceMacros($tpl, array(</span>
<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a><span class="x"> &#39;title&#39; =&gt; &#39;My beautiful addon&#39;,</span>
<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a><span class="x">));</span>
</code></pre></div>
<p>See also the wiki page <a href="https://github.com/friendica/friendica/wiki/Quick-Template-Guide">Quick Template Guide</a>.</p>
<h2 id="current-php-hooks">Current PHP hooks<a class="headerlink" href="#current-php-hooks" title="Permanent link">#</a></h2>
<h3 id="authenticate">authenticate<a class="headerlink" href="#authenticate" title="Permanent link">#</a></h3>
<p>Called when a user attempts to login.
<code>$b</code> is an array containing:</p>
<ul>
<li><strong>username</strong>: the supplied username</li>
<li><strong>password</strong>: the supplied password</li>
<li><strong>authenticated</strong>: set this to non-zero to authenticate the user.</li>
<li><strong>user_record</strong>: successful authentication must also return a valid user record from the database</li>
</ul>
<h3 id="logged_in">logged_in<a class="headerlink" href="#logged_in" title="Permanent link">#</a></h3>
<p>Called after a user has successfully logged in.
<code>$b</code> contains the <code>$a-&gt;user</code> array.</p>
<h3 id="display_item">display_item<a class="headerlink" href="#display_item" title="Permanent link">#</a></h3>
<p>Called when formatting a post for display.
$b is an array:</p>
<ul>
<li><strong>item</strong>: The item (array) details pulled from the database</li>
<li><strong>output</strong>: the (string) HTML representation of this item prior to adding it to the page</li>
</ul>
<h3 id="post_local">post_local<a class="headerlink" href="#post_local" title="Permanent link">#</a></h3>
<p>Called when a status post or comment is entered on the local system.
<code>$b</code> is the item array of the information to be stored in the database.
Please note: body contents are bbcode - not HTML.</p>
<h3 id="post_local_end">post_local_end<a class="headerlink" href="#post_local_end" title="Permanent link">#</a></h3>
<p>Called when a local status post or comment has been stored on the local system.
<code>$b</code> is the item array of the information which has just been stored in the database.
Please note: body contents are bbcode - not HTML</p>
<h3 id="post_remote">post_remote<a class="headerlink" href="#post_remote" title="Permanent link">#</a></h3>
<p>Called when receiving a post from another source. This may also be used to post local activity or system generated messages.
<code>$b</code> is the item array of information to be stored in the database and the item body is bbcode.</p>
<h3 id="addon_settings">addon_settings<a class="headerlink" href="#addon_settings" title="Permanent link">#</a></h3>
<p>Called when generating the HTML for the addon settings page.
<code>$data</code> is an array containing:</p>
<ul>
<li><strong>addon</strong> (output): Required. The addon folder name.</li>
<li><strong>title</strong> (output): Required. The addon settings panel title.</li>
<li><strong>href</strong> (output): Optional. If set, will reduce the panel to a link pointing to this URL, can be relative. Incompatible with the following keys.</li>
<li><strong>html</strong> (output): Optional. Raw HTML of the addon form elements. Both the <code>&lt;form&gt;</code> tags and the submit buttons are taken care of elsewhere.</li>
<li><strong>submit</strong> (output): Optional. If unset, a default submit button with <code>name="&lt;addon name&gt;-submit"</code> will be generated.
Can take different value types:</li>
<li><strong>string</strong>: The label to replace the default one.</li>
<li><strong>associative array</strong>: A list of submit button, the key is the value of the <code>name</code> attribute, the value is the displayed label.
The first submit button in this list is considered the main one and themes might emphasize its display.</li>
</ul>
<h4 id="examples">Examples<a class="headerlink" href="#examples" title="Permanent link">#</a></h4>
<h5 id="with-link">With link<a class="headerlink" href="#with-link" title="Permanent link">#</a></h5>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="x">$data = [</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="x"> &#39;addon&#39; =&gt; &#39;advancedcontentfilter&#39;,</span>
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="x"> &#39;title&#39; =&gt; DI::l10n()-&gt;t(&#39;Advanced Content Filter&#39;),</span>
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="x"> &#39;href&#39; =&gt; &#39;advancedcontentfilter&#39;,</span>
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="x">];</span>
</code></pre></div>
<h5 id="with-default-submit-button">With default submit button<a class="headerlink" href="#with-default-submit-button" title="Permanent link">#</a></h5>
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="x">$data = [</span>
<a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a><span class="x"> &#39;addon&#39; =&gt; &#39;fromapp&#39;,</span>
<a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="x"> &#39;title&#39; =&gt; DI::l10n()-&gt;t(&#39;FromApp Settings&#39;),</span>
<a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a><span class="x"> &#39;html&#39; =&gt; $html,</span>
<a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a><span class="x">];</span>
</code></pre></div>
<h5 id="with-no-html-just-a-submit-button">With no HTML, just a submit button<a class="headerlink" href="#with-no-html-just-a-submit-button" title="Permanent link">#</a></h5>
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="x">$data = [</span>
<a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="x"> &#39;addon&#39; =&gt; &#39;opmlexport&#39;,</span>
<a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="x"> &#39;title&#39; =&gt; DI::l10n()-&gt;t(&#39;OPML Export&#39;),</span>
<a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a><span class="x"> &#39;submit&#39; =&gt; DI::l10n()-&gt;t(&#39;Export RSS/Atom contacts&#39;),</span>
<a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a><span class="x">];</span>
</code></pre></div>
<h5 id="with-multiple-submit-buttons">With multiple submit buttons<a class="headerlink" href="#with-multiple-submit-buttons" title="Permanent link">#</a></h5>
<div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="x">$data = [</span>
<a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="x"> &#39;addon&#39; =&gt; &#39;catavar&#39;,</span>
<a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a><span class="x"> &#39;title&#39; =&gt; DI::l10n()-&gt;t(&#39;Cat Avatar Settings&#39;),</span>
<a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="x"> &#39;html&#39; =&gt; $html,</span>
<a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="x"> &#39;submit&#39; =&gt; [</span>
<a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a><span class="x"> &#39;catavatar-usecat&#39; =&gt; DI::l10n()-&gt;t(&#39;Use Cat as Avatar&#39;),</span>
<a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a><span class="x"> &#39;catavatar-morecat&#39; =&gt; DI::l10n()-&gt;t(&#39;Another random Cat!&#39;),</span>
<a id="__codelineno-9-8" name="__codelineno-9-8" href="#__codelineno-9-8"></a><span class="x"> &#39;catavatar-emailcat&#39; =&gt; DI::pConfig()-&gt;get(local_user(), &#39;catavatar&#39;, &#39;seed&#39;, false) ? DI::l10n()-&gt;t(&#39;Reset to email Cat&#39;) : null,</span>
<a id="__codelineno-9-9" name="__codelineno-9-9" href="#__codelineno-9-9"></a><span class="x"> ],</span>
<a id="__codelineno-9-10" name="__codelineno-9-10" href="#__codelineno-9-10"></a><span class="x">];</span>
</code></pre></div>
<h3 id="addon_settings_post">addon_settings_post<a class="headerlink" href="#addon_settings_post" title="Permanent link">#</a></h3>
<p>Called when the Addon Settings pages are submitted.
<code>$b</code> is the $_POST array.</p>
<h3 id="connector_settings">connector_settings<a class="headerlink" href="#connector_settings" title="Permanent link">#</a></h3>
<p>Called when generating the HTML for a connector addon settings page.
<code>$data</code> is an array containing:</p>
<ul>
<li><strong>connector</strong> (output): Required. The addon folder name.</li>
<li><strong>title</strong> (output): Required. The addon settings panel title.</li>
<li><strong>image</strong> (output): Required. The relative path of the logo image of the platform/protocol this addon is connecting to, max size 48x48px.</li>
<li><strong>enabled</strong> (output): Optional. If set to a falsy value, the connector image will be dimmed.</li>
<li><strong>html</strong> (output): Optional. Raw HTML of the addon form elements. Both the <code>&lt;form&gt;</code> tags and the submit buttons are taken care of elsewhere.</li>
<li><strong>submit</strong> (output): Optional. If unset, a default submit button with <code>name="&lt;addon name&gt;-submit"</code> will be generated.
Can take different value types:<ul>
<li><strong>string</strong>: The label to replace the default one.</li>
<li><strong>associative array</strong>: A list of submit button, the key is the value of the <code>name</code> attribute, the value is the displayed label.
The first submit button in this list is considered the main one and themes might emphasize its display.</li>
</ul>
</li>
</ul>
<h4 id="examples_1">Examples<a class="headerlink" href="#examples_1" title="Permanent link">#</a></h4>
<h5 id="with-default-submit-button_1">With default submit button<a class="headerlink" href="#with-default-submit-button_1" title="Permanent link">#</a></h5>
<div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="x">$data = [</span>
<a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="x"> &#39;connector&#39; =&gt; &#39;diaspora&#39;,</span>
<a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a><span class="x"> &#39;title&#39; =&gt; DI::l10n()-&gt;t(&#39;Diaspora Export&#39;),</span>
<a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a><span class="x"> &#39;image&#39; =&gt; &#39;images/diaspora-logo.png&#39;,</span>
<a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a><span class="x"> &#39;enabled&#39; =&gt; $enabled,</span>
<a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="x"> &#39;html&#39; =&gt; $html,</span>
<a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a><span class="x">];</span>
</code></pre></div>
<h5 id="with-custom-submit-button-label-and-no-logo-dim">With custom submit button label and no logo dim<a class="headerlink" href="#with-custom-submit-button-label-and-no-logo-dim" title="Permanent link">#</a></h5>
<div class="highlight"><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="x">$data = [</span>
<a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="x"> &#39;connector&#39; =&gt; &#39;ifttt&#39;,</span>
<a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a><span class="x"> &#39;title&#39; =&gt; DI::l10n()-&gt;t(&#39;IFTTT Mirror&#39;),</span>
<a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a><span class="x"> &#39;image&#39; =&gt; &#39;addon/ifttt/ifttt.png&#39;,</span>
<a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a><span class="x"> &#39;html&#39; =&gt; $html,</span>
<a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a><span class="x"> &#39;submit&#39; =&gt; DI::l10n()-&gt;t(&#39;Generate new key&#39;),</span>
<a id="__codelineno-11-7" name="__codelineno-11-7" href="#__codelineno-11-7"></a><span class="x">];</span>
</code></pre></div>
<h5 id="with-conditional-submit-buttons">With conditional submit buttons<a class="headerlink" href="#with-conditional-submit-buttons" title="Permanent link">#</a></h5>
<div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="x">$submit = [&#39;pumpio-submit&#39; =&gt; DI::l10n()-&gt;t(&#39;Save Settings&#39;)];</span>
<a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a><span class="x">if ($oauth_token &amp;&amp; $oauth_token_secret) {</span>
<a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a><span class="x"> $submit[&#39;pumpio-delete&#39;] = DI::l10n()-&gt;t(&#39;Delete this preset&#39;);</span>
<a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a><span class="x">}</span>
<a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a>
<a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a><span class="x">$data = [</span>
<a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a><span class="x"> &#39;connector&#39; =&gt; &#39;pumpio&#39;,</span>
<a id="__codelineno-12-8" name="__codelineno-12-8" href="#__codelineno-12-8"></a><span class="x"> &#39;title&#39; =&gt; DI::l10n()-&gt;t(&#39;Pump.io Import/Export/Mirror&#39;),</span>
<a id="__codelineno-12-9" name="__codelineno-12-9" href="#__codelineno-12-9"></a><span class="x"> &#39;image&#39; =&gt; &#39;images/pumpio.png&#39;,</span>
<a id="__codelineno-12-10" name="__codelineno-12-10" href="#__codelineno-12-10"></a><span class="x"> &#39;enabled&#39; =&gt; $enabled,</span>
<a id="__codelineno-12-11" name="__codelineno-12-11" href="#__codelineno-12-11"></a><span class="x"> &#39;html&#39; =&gt; $html,</span>
<a id="__codelineno-12-12" name="__codelineno-12-12" href="#__codelineno-12-12"></a><span class="x"> &#39;submit&#39; =&gt; $submit,</span>
<a id="__codelineno-12-13" name="__codelineno-12-13" href="#__codelineno-12-13"></a><span class="x">];</span>
</code></pre></div>
<h3 id="profile_post">profile_post<a class="headerlink" href="#profile_post" title="Permanent link">#</a></h3>
<p>Called when posting a profile page.
<code>$b</code> is the $_POST array.</p>
<h3 id="profile_edit">profile_edit<a class="headerlink" href="#profile_edit" title="Permanent link">#</a></h3>
<p>Called prior to output of profile edit page.
<code>$b</code> is an array containing:</p>
<ul>
<li><strong>profile</strong>: profile (array) record from the database</li>
<li><strong>entry</strong>: the (string) HTML of the generated entry</li>
</ul>
<h3 id="profile_advanced">profile_advanced<a class="headerlink" href="#profile_advanced" title="Permanent link">#</a></h3>
<p>Called when the HTML is generated for the Advanced profile, corresponding to the Profile tab within a person's profile page.
<code>$b</code> is the HTML string representation of the generated profile.
The profile array details are in <code>$a-&gt;profile</code>.</p>
<h3 id="directory_item">directory_item<a class="headerlink" href="#directory_item" title="Permanent link">#</a></h3>
<p>Called from the Directory page when formatting an item for display.
<code>$b</code> is an array:</p>
<ul>
<li><strong>contact</strong>: contact record array for the person from the database</li>
<li><strong>entry</strong>: the HTML string of the generated entry</li>
</ul>
<h3 id="profile_sidebar_enter">profile_sidebar_enter<a class="headerlink" href="#profile_sidebar_enter" title="Permanent link">#</a></h3>
<p>Called prior to generating the sidebar "short" profile for a page.
<code>$b</code> is the person's profile array</p>
<h3 id="profile_sidebar">profile_sidebar<a class="headerlink" href="#profile_sidebar" title="Permanent link">#</a></h3>
<p>Called when generating the sidebar "short" profile for a page.
<code>$b</code> is an array:</p>
<ul>
<li><strong>profile</strong>: profile record array for the person from the database</li>
<li><strong>entry</strong>: the HTML string of the generated entry</li>
</ul>
<h3 id="contact_block_end">contact_block_end<a class="headerlink" href="#contact_block_end" title="Permanent link">#</a></h3>
<p>Called when formatting the block of contacts/friends on a profile sidebar has completed.
<code>$b</code> is an array:</p>
<ul>
<li><strong>contacts</strong>: array of contacts</li>
<li><strong>output</strong>: the generated HTML string of the contact block</li>
</ul>
<h3 id="bbcode">bbcode<a class="headerlink" href="#bbcode" title="Permanent link">#</a></h3>
<p>Called after conversion of bbcode to HTML.
<code>$b</code> is an HTML string converted text.</p>
<h3 id="html2bbcode">html2bbcode<a class="headerlink" href="#html2bbcode" title="Permanent link">#</a></h3>
<p>Called after tag conversion of HTML to bbcode (e.g. remote message posting)
<code>$b</code> is a string converted text</p>
<h3 id="head">head<a class="headerlink" href="#head" title="Permanent link">#</a></h3>
<p>Called when building the <code>&lt;head&gt;</code> sections.
Stylesheets should be registered using this hook.
<code>$b</code> is an HTML string of the <code>&lt;head&gt;</code> tag.</p>
<h3 id="page_header">page_header<a class="headerlink" href="#page_header" title="Permanent link">#</a></h3>
<p>Called after building the page navigation section.
<code>$b</code> is a string HTML of nav region.</p>
<h3 id="personal_xrd">personal_xrd<a class="headerlink" href="#personal_xrd" title="Permanent link">#</a></h3>
<p>Called prior to output of personal XRD file.
<code>$b</code> is an array:</p>
<ul>
<li><strong>user</strong>: the user record array for the person</li>
<li><strong>xml</strong>: the complete XML string to be output</li>
</ul>
<h3 id="home_content">home_content<a class="headerlink" href="#home_content" title="Permanent link">#</a></h3>
<p>Called prior to output home page content, shown to unlogged users.
<code>$b</code> is the HTML string of section region.</p>
<h3 id="contact_edit">contact_edit<a class="headerlink" href="#contact_edit" title="Permanent link">#</a></h3>
<p>Called when editing contact details on an individual from the Contacts page.
$b is an array:</p>
<ul>
<li><strong>contact</strong>: contact record (array) of target contact</li>
<li><strong>output</strong>: the (string) generated HTML of the contact edit page</li>
</ul>
<h3 id="contact_edit_post">contact_edit_post<a class="headerlink" href="#contact_edit_post" title="Permanent link">#</a></h3>
<p>Called when posting the contact edit page.
<code>$b</code> is the <code>$_POST</code> array</p>
<h3 id="init_1">init_1<a class="headerlink" href="#init_1" title="Permanent link">#</a></h3>
<p>Called just after DB has been opened and before session start.
No hook data.</p>
<h3 id="page_end">page_end<a class="headerlink" href="#page_end" title="Permanent link">#</a></h3>
<p>Called after HTML content functions have completed.
<code>$b</code> is (string) HTML of content div.</p>
<h3 id="footer">footer<a class="headerlink" href="#footer" title="Permanent link">#</a></h3>
<p>Called after HTML content functions have completed.
Deferred Javascript files should be registered using this hook.
<code>$b</code> is (string) HTML of footer div/element.</p>
<h3 id="avatar_lookup">avatar_lookup<a class="headerlink" href="#avatar_lookup" title="Permanent link">#</a></h3>
<p>Called when looking up the avatar. <code>$b</code> is an array:</p>
<ul>
<li><strong>size</strong>: the size of the avatar that will be looked up</li>
<li><strong>email</strong>: email to look up the avatar for</li>
<li><strong>url</strong>: the (string) generated URL of the avatar</li>
</ul>
<h3 id="emailer_send_prepare">emailer_send_prepare<a class="headerlink" href="#emailer_send_prepare" title="Permanent link">#</a></h3>
<p>Called from <code>Emailer::send()</code> before building the mime message.
<code>$b</code> is an array of params to <code>Emailer::send()</code>.</p>
<ul>
<li><strong>fromName</strong>: name of the sender</li>
<li><strong>fromEmail</strong>: email fo the sender</li>
<li><strong>replyTo</strong>: replyTo address to direct responses</li>
<li><strong>toEmail</strong>: destination email address</li>
<li><strong>messageSubject</strong>: subject of the message</li>
<li><strong>htmlVersion</strong>: html version of the message</li>
<li><strong>textVersion</strong>: text only version of the message</li>
<li><strong>additionalMailHeader</strong>: additions to the smtp mail header</li>
<li><strong>sent</strong>: default false, if set to true in the hook, the default mailer will be skipped.</li>
</ul>
<h3 id="emailer_send">emailer_send<a class="headerlink" href="#emailer_send" title="Permanent link">#</a></h3>
<p>Called before calling PHP's <code>mail()</code>.
<code>$b</code> is an array of params to <code>mail()</code>.</p>
<ul>
<li><strong>to</strong></li>
<li><strong>subject</strong></li>
<li><strong>body</strong></li>
<li><strong>headers</strong></li>
<li><strong>sent</strong>: default false, if set to true in the hook, the default mailer will be skipped.</li>
</ul>
<h3 id="load_config">load_config<a class="headerlink" href="#load_config" title="Permanent link">#</a></h3>
<p>Called during <code>App</code> initialization to allow addons to load their own configuration file(s) with <code>App::loadConfigFile()</code>.</p>
<h3 id="nav_info">nav_info<a class="headerlink" href="#nav_info" title="Permanent link">#</a></h3>
<p>Called after the navigational menu is build in <code>include/nav.php</code>.
<code>$b</code> is an array containing <code>$nav</code> from <code>include/nav.php</code>.</p>
<h3 id="template_vars">template_vars<a class="headerlink" href="#template_vars" title="Permanent link">#</a></h3>
<p>Called before vars are passed to the template engine to render the page.
The registered function can add,change or remove variables passed to template.
<code>$b</code> is an array with:</p>
<ul>
<li><strong>template</strong>: filename of template</li>
<li><strong>vars</strong>: array of vars passed to the template</li>
</ul>
<h3 id="acl_lookup_end">acl_lookup_end<a class="headerlink" href="#acl_lookup_end" title="Permanent link">#</a></h3>
<p>Called after the other queries have passed.
The registered function can add, change or remove the <code>acl_lookup()</code> variables.</p>
<ul>
<li><strong>results</strong>: array of the acl_lookup() vars</li>
</ul>
<h3 id="prepare_body_init">prepare_body_init<a class="headerlink" href="#prepare_body_init" title="Permanent link">#</a></h3>
<p>Called at the start of prepare_body
Hook data:</p>
<ul>
<li><strong>item</strong> (input/output): item array</li>
</ul>
<h3 id="prepare_body_content_filter">prepare_body_content_filter<a class="headerlink" href="#prepare_body_content_filter" title="Permanent link">#</a></h3>
<p>Called before the HTML conversion in prepare_body. If the item matches a content filter rule set by an addon, it should
just add the reason to the filter_reasons element of the hook data.
Hook data:</p>
<ul>
<li><strong>item</strong>: item array (input)</li>
<li><strong>filter_reasons</strong> (input/output): reasons array</li>
</ul>
<h3 id="prepare_body">prepare_body<a class="headerlink" href="#prepare_body" title="Permanent link">#</a></h3>
<p>Called after the HTML conversion in <code>prepare_body()</code>.
Hook data:</p>
<ul>
<li><strong>item</strong> (input): item array</li>
<li><strong>html</strong> (input/output): converted item body</li>
<li><strong>is_preview</strong> (input): post preview flag</li>
<li><strong>filter_reasons</strong> (input): reasons array</li>
</ul>
<h3 id="prepare_body_final">prepare_body_final<a class="headerlink" href="#prepare_body_final" title="Permanent link">#</a></h3>
<p>Called at the end of <code>prepare_body()</code>.
Hook data:</p>
<ul>
<li><strong>item</strong>: item array (input)</li>
<li><strong>html</strong>: converted item body (input/output)</li>
</ul>
<h3 id="put_item_in_cache">put_item_in_cache<a class="headerlink" href="#put_item_in_cache" title="Permanent link">#</a></h3>
<p>Called after <code>prepare_text()</code> in <code>put_item_in_cache()</code>.
Hook data:</p>
<ul>
<li><strong>item</strong> (input): item array</li>
<li><strong>rendered-html</strong> (input/output): final item body HTML</li>
<li><strong>rendered-hash</strong> (input/output): original item body hash</li>
</ul>
<h3 id="magic_auth_success">magic_auth_success<a class="headerlink" href="#magic_auth_success" title="Permanent link">#</a></h3>
<p>Called when a magic-auth was successful.
Hook data:</p>
<div class="highlight"><pre><span></span><code>visitor =&gt; array with the contact record of the visitor
url =&gt; the query string
</code></pre></div>
<h3 id="jot_networks">jot_networks<a class="headerlink" href="#jot_networks" title="Permanent link">#</a></h3>
<p>Called when displaying the post permission screen.
Hook data is a list of form fields that need to be displayed along the ACL.
Form field array structure is:</p>
<ul>
<li><strong>type</strong>: <code>checkbox</code> or <code>select</code>.</li>
<li><strong>field</strong>: Standard field data structure to be used by <code>field_checkbox.tpl</code> and <code>field_select.tpl</code>.</li>
</ul>
<p>For <code>checkbox</code>, <strong>field</strong> is:
- [0] (String): Form field name; Mandatory.
- [1]: (String): Form field label; Optional, default is none.
- [2]: (Boolean): Whether the checkbox should be checked by default; Optional, default is false.
- [3]: (String): Additional help text; Optional, default is none.
- [4]: (String): Additional HTML attributes; Optional, default is none.</p>
<p>For <code>select</code>, <strong>field</strong> is:
- [0] (String): Form field name; Mandatory.
- [1] (String): Form field label; Optional, default is none.
- [2] (Boolean): Default value to be selected by default; Optional, default is none.
- [3] (String): Additional help text; Optional, default is none.
- [4] (Array): Associative array of options. Item key is option value, item value is option label; Mandatory.</p>
<h3 id="route_collection">route_collection<a class="headerlink" href="#route_collection" title="Permanent link">#</a></h3>
<p>Called just before dispatching the router.
Hook data is a <code>\FastRoute\RouterCollector</code> object that should be used to add addon routes pointing to classes.</p>
<p><strong>Notice</strong>: The class whose name is provided in the route handler must be reachable via autoloader.</p>
<h3 id="probe_detect">probe_detect<a class="headerlink" href="#probe_detect" title="Permanent link">#</a></h3>
<p>Called before trying to detect the target network of a URL.
If any registered hook function sets the <code>result</code> key of the hook data array, it will be returned immediately.
Hook functions should also return immediately if the hook data contains an existing result.</p>
<p>Hook data:</p>
<ul>
<li><strong>uri</strong> (input): the profile URI.</li>
<li><strong>network</strong> (input): the target network (can be empty for auto-detection).</li>
<li><strong>uid</strong> (input): the user to return the contact data for (can be empty for public contacts).</li>
<li><strong>result</strong> (output): Leave null if address isn't relevant to the connector, set to contact array if probe is successful, false otherwise.</li>
</ul>
<h3 id="item_by_link">item_by_link<a class="headerlink" href="#item_by_link" title="Permanent link">#</a></h3>
<p>Called when trying to probe an item from a given URI.
If any registered hook function sets the <code>item_id</code> key of the hook data array, it will be returned immediately.
Hook functions should also return immediately if the hook data contains an existing <code>item_id</code>.</p>
<p>Hook data:
- <strong>uri</strong> (input): the item URI.
- <strong>uid</strong> (input): the user to return the item data for (can be empty for public contacts).
- <strong>item_id</strong> (output): Leave null if URI isn't relevant to the connector, set to created item array if probe is successful, false otherwise.</p>
<h3 id="support_follow">support_follow<a class="headerlink" href="#support_follow" title="Permanent link">#</a></h3>
<p>Called to assert whether a connector addon provides follow capabilities.</p>
<p>Hook data:
- <strong>protocol</strong> (input): shorthand for the protocol. List of values is available in <code>src/Core/Protocol.php</code>.
- <strong>result</strong> (output): should be true if the connector provides follow capabilities, left alone otherwise.</p>
<h3 id="support_revoke_follow">support_revoke_follow<a class="headerlink" href="#support_revoke_follow" title="Permanent link">#</a></h3>
<p>Called to assert whether a connector addon provides follow revocation capabilities.</p>
<p>Hook data:
- <strong>protocol</strong> (input): shorthand for the protocol. List of values is available in <code>src/Core/Protocol.php</code>.
- <strong>result</strong> (output): should be true if the connector provides follow revocation capabilities, left alone otherwise.</p>
<h3 id="follow">follow<a class="headerlink" href="#follow" title="Permanent link">#</a></h3>
<p>Called before adding a new contact for a user to handle non-native network remote contact (like Twitter).</p>
<p>Hook data:</p>
<ul>
<li><strong>url</strong> (input): URL of the remote contact.</li>
<li><strong>contact</strong> (output): should be filled with the contact (with uid = user creating the contact) array if follow was successful.</li>
</ul>
<h3 id="unfollow">unfollow<a class="headerlink" href="#unfollow" title="Permanent link">#</a></h3>
<p>Called when unfollowing a remote contact on a non-native network (like Twitter)</p>
<p>Hook data:
- <strong>contact</strong> (input): the target public contact (uid = 0) array.
- <strong>uid</strong> (input): the id of the source local user.
- <strong>result</strong> (output): whether the unfollowing is successful or not.</p>
<h3 id="revoke_follow">revoke_follow<a class="headerlink" href="#revoke_follow" title="Permanent link">#</a></h3>
<p>Called when making a remote contact on a non-native network (like Twitter) unfollow you.</p>
<p>Hook data:
- <strong>contact</strong> (input): the target public contact (uid = 0) array.
- <strong>uid</strong> (input): the id of the source local user.
- <strong>result</strong> (output): a boolean value indicating whether the operation was successful or not.</p>
<h3 id="block">block<a class="headerlink" href="#block" title="Permanent link">#</a></h3>
<p>Called when blocking a remote contact on a non-native network (like Twitter).</p>
<p>Hook data:
- <strong>contact</strong> (input): the remote contact (uid = 0) array.
- <strong>uid</strong> (input): the user id to issue the block for.
- <strong>result</strong> (output): a boolean value indicating whether the operation was successful or not.</p>
<h3 id="unblock">unblock<a class="headerlink" href="#unblock" title="Permanent link">#</a></h3>
<p>Called when unblocking a remote contact on a non-native network (like Twitter).</p>
<p>Hook data:
- <strong>contact</strong> (input): the remote contact (uid = 0) array.
- <strong>uid</strong> (input): the user id to revoke the block for.
- <strong>result</strong> (output): a boolean value indicating whether the operation was successful or not.</p>
<h3 id="storage_instance">storage_instance<a class="headerlink" href="#storage_instance" title="Permanent link">#</a></h3>
<p>Called when a custom storage is used (e.g. webdav_storage)</p>
<p>Hook data:
- <strong>name</strong> (input): the name of the used storage backend
- <strong>data['storage']</strong> (output): the storage instance to use (<strong>must</strong> implement <code>\Friendica\Core\Storage\IWritableStorage</code>) </p>
<h3 id="storage_config">storage_config<a class="headerlink" href="#storage_config" title="Permanent link">#</a></h3>
<p>Called when the admin of the node wants to configure a custom storage (e.g. webdav_storage)</p>
<p>Hook data:
- <strong>name</strong> (input): the name of the used storage backend
- <strong>data['storage_config']</strong> (output): the storage configuration instance to use (<strong>must</strong> implement <code>\Friendica\Core\Storage\Capability\IConfigureStorage</code>)</p>
<h2 id="complete-list-of-hook-callbacks">Complete list of hook callbacks<a class="headerlink" href="#complete-list-of-hook-callbacks" title="Permanent link">#</a></h2>
<p>Here is a complete list of all hook callbacks with file locations (as of 24-Sep-2018). Please see the source for details of any hooks not documented above.</p>
<h3 id="indexphp">index.php<a class="headerlink" href="#indexphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;init_1&#39;);
Hook::callAll(&#39;app_menu&#39;, $arr);
Hook::callAll(&#39;page_content_top&#39;, DI::page()[&#39;content&#39;]);
Hook::callAll($a-&gt;module.&#39;_mod_init&#39;, $placeholder);
Hook::callAll($a-&gt;module.&#39;_mod_init&#39;, $placeholder);
Hook::callAll($a-&gt;module.&#39;_mod_post&#39;, $_POST);
Hook::callAll($a-&gt;module.&#39;_mod_content&#39;, $arr);
Hook::callAll($a-&gt;module.&#39;_mod_aftercontent&#39;, $arr);
Hook::callAll(&#39;page_end&#39;, DI::page()[&#39;content&#39;]);
</code></pre></div>
<h3 id="includeapiphp">include/api.php<a class="headerlink" href="#includeapiphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;logged_in&#39;, $a-&gt;user);
Hook::callAll(&#39;authenticate&#39;, $addon_auth);
Hook::callAll(&#39;logged_in&#39;, $a-&gt;user);
</code></pre></div>
<h3 id="includeenotifyphp">include/enotify.php<a class="headerlink" href="#includeenotifyphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;enotify&#39;, $h);
Hook::callAll(&#39;enotify_store&#39;, $datarray);
Hook::callAll(&#39;enotify_mail&#39;, $datarray);
Hook::callAll(&#39;check_item_notification&#39;, $notification_data);
</code></pre></div>
<h3 id="srccontentconversationphp">src/Content/Conversation.php<a class="headerlink" href="#srccontentconversationphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;conversation_start&#39;, $cb);
Hook::callAll(&#39;render_location&#39;, $locate);
Hook::callAll(&#39;display_item&#39;, $arr);
Hook::callAll(&#39;display_item&#39;, $arr);
Hook::callAll(&#39;item_photo_menu&#39;, $args);
Hook::callAll(&#39;jot_tool&#39;, $jotplugins);
</code></pre></div>
<h3 id="moddirectoryphp">mod/directory.php<a class="headerlink" href="#moddirectoryphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;directory_item&#39;, $arr);
</code></pre></div>
<h3 id="modxrdphp">mod/xrd.php<a class="headerlink" href="#modxrdphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;personal_xrd&#39;, $arr);
</code></pre></div>
<h3 id="modparse_urlphp">mod/parse_url.php<a class="headerlink" href="#modparse_urlphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&quot;parse_link&quot;, $arr);
</code></pre></div>
<h3 id="srcmoduledelegationphp">src/Module/Delegation.php<a class="headerlink" href="#srcmoduledelegationphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;home_init&#39;, $ret);
</code></pre></div>
<h3 id="modaclphp">mod/acl.php<a class="headerlink" href="#modaclphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;acl_lookup_end&#39;, $results);
</code></pre></div>
<h3 id="modnetworkphp">mod/network.php<a class="headerlink" href="#modnetworkphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;network_content_init&#39;, $arr);
Hook::callAll(&#39;network_tabs&#39;, $arr);
</code></pre></div>
<h3 id="modfriendicaphp">mod/friendica.php<a class="headerlink" href="#modfriendicaphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;about_hook&#39;, $o);
</code></pre></div>
<h3 id="modprofilesphp">mod/profiles.php<a class="headerlink" href="#modprofilesphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;profile_post&#39;, $_POST);
Hook::callAll(&#39;profile_edit&#39;, $arr);
</code></pre></div>
<h3 id="modsettingsphp">mod/settings.php<a class="headerlink" href="#modsettingsphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;addon_settings_post&#39;, $_POST);
Hook::callAll(&#39;connector_settings_post&#39;, $_POST);
Hook::callAll(&#39;display_settings_post&#39;, $_POST);
Hook::callAll(&#39;addon_settings&#39;, $settings_addons);
Hook::callAll(&#39;connector_settings&#39;, $settings_connectors);
Hook::callAll(&#39;display_settings&#39;, $o);
</code></pre></div>
<h3 id="modphotosphp">mod/photos.php<a class="headerlink" href="#modphotosphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;photo_post_init&#39;, $_POST);
Hook::callAll(&#39;photo_post_file&#39;, $ret);
Hook::callAll(&#39;photo_post_end&#39;, $foo);
Hook::callAll(&#39;photo_post_end&#39;, $foo);
Hook::callAll(&#39;photo_post_end&#39;, $foo);
Hook::callAll(&#39;photo_post_end&#39;, $foo);
Hook::callAll(&#39;photo_post_end&#39;, intval($item_id));
Hook::callAll(&#39;photo_upload_form&#39;, $ret);
</code></pre></div>
<h3 id="modprofilephp">mod/profile.php<a class="headerlink" href="#modprofilephp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;profile_advanced&#39;, $o);
</code></pre></div>
<h3 id="modhomephp">mod/home.php<a class="headerlink" href="#modhomephp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;home_init&#39;, $ret);
Hook::callAll(&quot;home_content&quot;, $content);
</code></pre></div>
<h3 id="modpokephp">mod/poke.php<a class="headerlink" href="#modpokephp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;post_local_end&#39;, $arr);
</code></pre></div>
<h3 id="modcontactsphp">mod/contacts.php<a class="headerlink" href="#modcontactsphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;contact_edit_post&#39;, $_POST);
Hook::callAll(&#39;contact_edit&#39;, $arr);
</code></pre></div>
<h3 id="modtaggerphp">mod/tagger.php<a class="headerlink" href="#modtaggerphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;post_local_end&#39;, $arr);
</code></pre></div>
<h3 id="moduexportphp">mod/uexport.php<a class="headerlink" href="#moduexportphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;uexport_options&#39;, $options);
</code></pre></div>
<h3 id="modregisterphp">mod/register.php<a class="headerlink" href="#modregisterphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;register_post&#39;, $arr);
Hook::callAll(&#39;register_form&#39;, $arr);
</code></pre></div>
<h3 id="moditemphp">mod/item.php<a class="headerlink" href="#moditemphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;post_local_start&#39;, $_REQUEST);
Hook::callAll(&#39;post_local&#39;, $datarray);
Hook::callAll(&#39;post_local_end&#39;, $datarray);
</code></pre></div>
<h3 id="modeditpostphp">mod/editpost.php<a class="headerlink" href="#modeditpostphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;jot_tool&#39;, $jotplugins);
</code></pre></div>
<h3 id="srcrenderfriendicasmartyenginephp">src/Render/FriendicaSmartyEngine.php<a class="headerlink" href="#srcrenderfriendicasmartyenginephp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&quot;template_vars&quot;, $arr);
</code></pre></div>
<h3 id="srcappphp">src/App.php<a class="headerlink" href="#srcappphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;load_config&#39;);
Hook::callAll(&#39;head&#39;);
Hook::callAll(&#39;footer&#39;);
Hook::callAll(&#39;route_collection&#39;);
</code></pre></div>
<h3 id="srcmodelitemphp">src/Model/Item.php<a class="headerlink" href="#srcmodelitemphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;post_local&#39;, $item);
Hook::callAll(&#39;post_remote&#39;, $item);
Hook::callAll(&#39;post_local_end&#39;, $posted_item);
Hook::callAll(&#39;post_remote_end&#39;, $posted_item);
Hook::callAll(&#39;tagged&#39;, $arr);
Hook::callAll(&#39;post_local_end&#39;, $new_item);
Hook::callAll(&#39;put_item_in_cache&#39;, $hook_data);
Hook::callAll(&#39;prepare_body_init&#39;, $item);
Hook::callAll(&#39;prepare_body_content_filter&#39;, $hook_data);
Hook::callAll(&#39;prepare_body&#39;, $hook_data);
Hook::callAll(&#39;prepare_body_final&#39;, $hook_data);
</code></pre></div>
<h3 id="srcmodelcontactphp">src/Model/Contact.php<a class="headerlink" href="#srcmodelcontactphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;contact_photo_menu&#39;, $args);
Hook::callAll(&#39;follow&#39;, $arr);
</code></pre></div>
<h3 id="srcmodelprofilephp">src/Model/Profile.php<a class="headerlink" href="#srcmodelprofilephp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;profile_sidebar_enter&#39;, $profile);
Hook::callAll(&#39;profile_sidebar&#39;, $arr);
Hook::callAll(&#39;profile_tabs&#39;, $arr);
Hook::callAll(&#39;zrl_init&#39;, $arr);
Hook::callAll(&#39;magic_auth_success&#39;, $arr);
</code></pre></div>
<h3 id="srcmodeleventphp">src/Model/Event.php<a class="headerlink" href="#srcmodeleventphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;event_updated&#39;, $event[&#39;id&#39;]);
Hook::callAll(&quot;event_created&quot;, $event[&#39;id&#39;]);
</code></pre></div>
<h3 id="srcmodelregisterphp">src/Model/Register.php<a class="headerlink" href="#srcmodelregisterphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;authenticate&#39;, $addon_auth);
</code></pre></div>
<h3 id="srcmodeluserphp">src/Model/User.php<a class="headerlink" href="#srcmodeluserphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;authenticate&#39;, $addon_auth);
Hook::callAll(&#39;register_account&#39;, $uid);
Hook::callAll(&#39;remove_user&#39;, $user);
</code></pre></div>
<h3 id="srcmodulenotificationspingphp">src/Module/Notifications/Ping.php<a class="headerlink" href="#srcmodulenotificationspingphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;network_ping&#39;, $arr);
</code></pre></div>
<h3 id="srcmodulepermissiontooltipphp">src/Module/PermissionTooltip.php<a class="headerlink" href="#srcmodulepermissiontooltipphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;lockview_content&#39;, $item);
</code></pre></div>
<h3 id="srcmodulesettingsdelegationphp">src/Module/Settings/Delegation.php<a class="headerlink" href="#srcmodulesettingsdelegationphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;authenticate&#39;, $addon_auth);
</code></pre></div>
<h3 id="srcmodulesettingstwofactorindexphp">src/Module/Settings/TwoFactor/Index.php<a class="headerlink" href="#srcmodulesettingstwofactorindexphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;authenticate&#39;, $addon_auth);
</code></pre></div>
<h3 id="srcsecurityauthenticatephp">src/Security/Authenticate.php<a class="headerlink" href="#srcsecurityauthenticatephp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;authenticate&#39;, $addon_auth);
</code></pre></div>
<h3 id="srcsecurityexauthphp">src/Security/ExAuth.php<a class="headerlink" href="#srcsecurityexauthphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;authenticate&#39;, $addon_auth);
</code></pre></div>
<h3 id="srccontentcontactblockphp">src/Content/ContactBlock.php<a class="headerlink" href="#srccontentcontactblockphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;contact_block_end&#39;, $arr);
</code></pre></div>
<h3 id="srccontenttextbbcodephp">src/Content/Text/BBCode.php<a class="headerlink" href="#srccontenttextbbcodephp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;bbcode&#39;, $text);
Hook::callAll(&#39;bb2diaspora&#39;, $text);
</code></pre></div>
<h3 id="srccontenttexthtmlphp">src/Content/Text/HTML.php<a class="headerlink" href="#srccontenttexthtmlphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;html2bbcode&#39;, $message);
</code></pre></div>
<h3 id="srccontentsmiliesphp">src/Content/Smilies.php<a class="headerlink" href="#srccontentsmiliesphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;smilie&#39;, $params);
</code></pre></div>
<h3 id="srccontentfeaturephp">src/Content/Feature.php<a class="headerlink" href="#srccontentfeaturephp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;isEnabled&#39;, $arr);
Hook::callAll(&#39;get&#39;, $arr);
</code></pre></div>
<h3 id="srccontentcontactselectorphp">src/Content/ContactSelector.php<a class="headerlink" href="#srccontentcontactselectorphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;network_to_name&#39;, $nets);
</code></pre></div>
<h3 id="srccontentoembedphp">src/Content/OEmbed.php<a class="headerlink" href="#srccontentoembedphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;oembed_fetch_url&#39;, $embedurl, $j);
</code></pre></div>
<h3 id="srccontentnavphp">src/Content/Nav.php<a class="headerlink" href="#srccontentnavphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;page_header&#39;, DI::page()[&#39;nav&#39;]);
Hook::callAll(&#39;nav_info&#39;, $nav);
</code></pre></div>
<h3 id="srccoreauthenticationphp">src/Core/Authentication.php<a class="headerlink" href="#srccoreauthenticationphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;logged_in&#39;, $a-&gt;user);
</code></pre></div>
<h3 id="srccoreprotocolphp">src/Core/Protocol.php<a class="headerlink" href="#srccoreprotocolphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;support_follow&#39;, $hook_data);
Hook::callAll(&#39;support_revoke_follow&#39;, $hook_data);
Hook::callAll(&#39;unfollow&#39;, $hook_data);
Hook::callAll(&#39;revoke_follow&#39;, $hook_data);
Hook::callAll(&#39;block&#39;, $hook_data);
Hook::callAll(&#39;unblock&#39;, $hook_data);
</code></pre></div>
<h3 id="srccorestoragemanager">src/Core/StorageManager<a class="headerlink" href="#srccorestoragemanager" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;storage_instance&#39;, $data);
Hook::callAll(&#39;storage_config&#39;, $data);
</code></pre></div>
<h3 id="srcworkerdirectoryphp">src/Worker/Directory.php<a class="headerlink" href="#srcworkerdirectoryphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;globaldir_update&#39;, $arr);
</code></pre></div>
<h3 id="srcworkernotifierphp">src/Worker/Notifier.php<a class="headerlink" href="#srcworkernotifierphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;notifier_end&#39;, $target_item);
</code></pre></div>
<h3 id="srcmoduleloginphp">src/Module/Login.php<a class="headerlink" href="#srcmoduleloginphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;login_hook&#39;, $o);
</code></pre></div>
<h3 id="srcmodulelogoutphp">src/Module/Logout.php<a class="headerlink" href="#srcmodulelogoutphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&quot;logging_out&quot;);
</code></pre></div>
<h3 id="srcobjectpostphp">src/Object/Post.php<a class="headerlink" href="#srcobjectpostphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;render_location&#39;, $locate);
Hook::callAll(&#39;display_item&#39;, $arr);
</code></pre></div>
<h3 id="srccoreaclphp">src/Core/ACL.php<a class="headerlink" href="#srccoreaclphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;contact_select_options&#39;, $x);
Hook::callAll($a-&gt;module.&#39;_pre_&#39;.$selname, $arr);
Hook::callAll($a-&gt;module.&#39;_post_&#39;.$selname, $o);
Hook::callAll($a-&gt;module.&#39;_pre_&#39;.$selname, $arr);
Hook::callAll($a-&gt;module.&#39;_post_&#39;.$selname, $o);
Hook::callAll(&#39;jot_networks&#39;, $jotnets);
</code></pre></div>
<h3 id="srccoreauthenticationphp_1">src/Core/Authentication.php<a class="headerlink" href="#srccoreauthenticationphp_1" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;logged_in&#39;, $a-&gt;user);
Hook::callAll(&#39;authenticate&#39;, $addon_auth);
</code></pre></div>
<h3 id="srccorehookphp">src/Core/Hook.php<a class="headerlink" href="#srccorehookphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>self::callSingle(self::getApp(), &#39;hook_fork&#39;, $fork_hook, $hookdata);
</code></pre></div>
<h3 id="srccorel10nl10nphp">src/Core/L10n/L10n.php<a class="headerlink" href="#srccorel10nl10nphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;poke_verbs&#39;, $arr);
</code></pre></div>
<h3 id="srccoreworkerphp">src/Core/Worker.php<a class="headerlink" href="#srccoreworkerphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&quot;proc_run&quot;, $arr);
</code></pre></div>
<h3 id="srcutilemailerphp">src/Util/Emailer.php<a class="headerlink" href="#srcutilemailerphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;emailer_send_prepare&#39;, $params);
Hook::callAll(&quot;emailer_send&quot;, $hookdata);
</code></pre></div>
<h3 id="srcutilmapphp">src/Util/Map.php<a class="headerlink" href="#srcutilmapphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;generate_map&#39;, $arr);
Hook::callAll(&#39;generate_named_map&#39;, $arr);
Hook::callAll(&#39;Map::getCoordinates&#39;, $arr);
</code></pre></div>
<h3 id="srcutilnetworkphp">src/Util/Network.php<a class="headerlink" href="#srcutilnetworkphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;avatar_lookup&#39;, $avatar);
</code></pre></div>
<h3 id="srcutilparseurlphp">src/Util/ParseUrl.php<a class="headerlink" href="#srcutilparseurlphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&quot;getsiteinfo&quot;, $siteinfo);
</code></pre></div>
<h3 id="srcprotocoldfrnphp">src/Protocol/DFRN.php<a class="headerlink" href="#srcprotocoldfrnphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;atom_feed_end&#39;, $atom);
Hook::callAll(&#39;atom_feed_end&#39;, $atom);
</code></pre></div>
<h3 id="srcprotocolemailphp">src/Protocol/Email.php<a class="headerlink" href="#srcprotocolemailphp" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>Hook::callAll(&#39;email_getmessage&#39;, $message);
Hook::callAll(&#39;email_getmessage_end&#39;, $ret);
</code></pre></div>
<h3 id="viewjsmainjs">view/js/main.js<a class="headerlink" href="#viewjsmainjs" title="Permanent link">#</a></h3>
<div class="highlight"><pre><span></span><code>document.dispatchEvent(new Event(&#39;postprocess_liveupdate&#39;));
</code></pre></div>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../domain-driven-design/" class="md-footer__link md-footer__link--prev" aria-label="Previous: DDD" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
DDD
</div>
</div>
</a>
<a href="../themes/" class="md-footer__link md-footer__link--next" aria-label="Next: Themes" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Themes
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3513 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/autoloader/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Autoloader - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#autoloader-with-composer" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Autoloader
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/autoloader/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/autoloader/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" checked>
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Autoloader
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Autoloader
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#a-quick-introduction-to-class-auto-loading" class="md-nav__link">
A quick introduction to class auto-loading
</a>
<nav class="md-nav" aria-label="A quick introduction to class auto-loading">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#example" class="md-nav__link">
Example
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#related" class="md-nav__link">
Related
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#a-quick-introduction-to-class-auto-loading" class="md-nav__link">
A quick introduction to class auto-loading
</a>
<nav class="md-nav" aria-label="A quick introduction to class auto-loading">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#example" class="md-nav__link">
Example
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#related" class="md-nav__link">
Related
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/autoloader.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">composer</span>
</nav>
<h1 id="autoloader-with-composer">Autoloader with Composer<a class="headerlink" href="#autoloader-with-composer" title="Permanent link">#</a></h1>
<p>Friendica uses <a href="https://getcomposer.org">Composer</a> to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes.</p>
<p>It's a command-line tool that downloads required libraries into the <code>vendor</code> folder and makes any namespaced class in <code>src</code> available through the whole application through <code>boot.php</code>.</p>
<ul>
<li><a href="../composer/">Using Composer</a></li>
</ul>
<h2 id="a-quick-introduction-to-class-auto-loading">A quick introduction to class auto-loading<a class="headerlink" href="#a-quick-introduction-to-class-auto-loading" title="Permanent link">#</a></h2>
<p>The autoloader dynamically includes the file defining a class when it is first referenced, either by instantiating an object or simply making sure that it is available, without the need to explicitly use "require_once".</p>
<p>Once it is set up you don't have to directly use it, you can directly use any class that is covered by the autoloader (currently <code>vendor</code> and <code>src</code>)</p>
<p>Under the hood, Composer registers a callback with <a href="http://php.net/manual/en/function.spl-autoload-register.php"><code>spl_autoload_register()</code></a> that receives a class name as an argument and includes the corresponding class definition file.
For more info about PHP autoloading, please refer to the <a href="http://php.net/manual/en/language.oop5.autoload.php">official PHP documentation</a>.</p>
<h3 id="example">Example<a class="headerlink" href="#example" title="Permanent link">#</a></h3>
<p>Let's say you have a PHP file in <code>src/</code> that define a very useful class:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="x">// src/ItemsManager.php</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="k">namespace</span> <span class="nx">Friendica</span><span class="p">;</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="k">class</span> <span class="nc">ItemsManager</span> <span class="p">{</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">getAll</span><span class="p">()</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">getByID</span><span class="p">(</span><span class="nv">$id</span><span class="p">)</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="p">}</span>
</code></pre></div>
<p>The class <code>ItemsManager</code> has been declared in the <code>Friendica</code> namespace.
Namespaces are useful to keep classes separated and avoid names conflicts (could be that a library you want to use also defines a class named <code>ItemsManager</code>, but as long as it is in another namespace, you don't have any problem)</p>
<p>Let's say now that you need to load some items in a view, maybe in a fictional <code>mod/network.php</code>.
In order for the Composer autoloader to work, it must first be included.
In Friendica this is already done at the top of <code>boot.php</code>, with <code>require_once('vendor/autoload.php');</code>.</p>
<p>The code will be something like:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="x">// mod/network.php</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="k">use</span> <span class="nx">Friendica\App</span><span class="p">;</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="k">function</span> <span class="nf">network_content</span><span class="p">(</span><span class="nx">App</span> <span class="nv">$a</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> <span class="nv">$itemsmanager</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\Friendica\ItemsManager</span><span class="p">();</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a> <span class="nv">$items</span> <span class="o">=</span> <span class="nv">$itemsmanager</span><span class="o">-&gt;</span><span class="na">getAll</span><span class="p">();</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a>
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a> <span class="c1">// pass $items to template</span>
<a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a> <span class="c1">// return result</span>
<a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="p">}</span>
</code></pre></div>
<p>That's a quite simple example, but look: no <code>require()</code>!
If you need to use a class, you can simply use it, and you don't need to do anything else.</p>
<p>Going further: now we have a bunch of <code>*Manager</code> classes that cause some code duplication.
Let's define a <code>BaseManager</code> class, where we move all common code between all managers:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="x">// src/BaseManager.php</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="k">namespace</span> <span class="nx">Friendica</span><span class="p">;</span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="k">class</span> <span class="nc">BaseManager</span> <span class="p">{</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">thatFunctionEveryManagerUses</span><span class="p">()</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="p">}</span>
</code></pre></div>
<p>and then let's change the ItemsManager class to use this code</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="x">// src/ItemsManager.php</span>
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="k">namespace</span> <span class="nx">Friendica</span><span class="p">;</span>
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="k">class</span> <span class="nc">ItemsManager</span> <span class="k">extends</span> <span class="nx">BaseManager</span> <span class="p">{</span>
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">getAll</span><span class="p">()</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span>
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">getByID</span><span class="p">(</span><span class="nv">$id</span><span class="p">)</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span>
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="p">}</span>
</code></pre></div>
<p>Even though we didn't explicitly include the <code>src/BaseManager.php</code> file, the autoloader will when this class is first defined, because it is referenced as a parent class.
It works with the "BaseManager" example here, and it works when we need to call static methods:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="x">// src/Dfrn.php</span>
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="k">namespace</span> <span class="nx">Friendica</span><span class="p">;</span>
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a>
<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="k">class</span> <span class="nc">Dfrn</span> <span class="p">{</span>
<a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a> <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">mail</span><span class="p">(</span><span class="nv">$item</span><span class="p">,</span> <span class="nv">$owner</span><span class="p">)</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span>
<a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="p">}</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="x">// mod/mail.php</span>
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="nx">mail_post</span><span class="p">(</span><span class="nv">$a</span><span class="p">){</span>
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a> <span class="o">...</span>
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a> <span class="nx">Friendica\Protocol\DFRN</span><span class="o">::</span><span class="na">mail</span><span class="p">(</span><span class="nv">$item</span><span class="p">,</span> <span class="nv">$owner</span><span class="p">);</span>
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a> <span class="o">...</span>
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="p">}</span>
</code></pre></div>
<p>If your code is in same namespace as the class you need, you don't need to prepend it:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="x">// include/delivery.php</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="k">namespace</span> <span class="nx">Friendica</span><span class="p">;</span>
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a>
<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="k">use</span> <span class="nx">Friendica\Protocol\DFRN</span><span class="p">;</span>
<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a>
<a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a><span class="c1">// this is the same content of current include/delivery.php,</span>
<a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="c1">// but has been declared to be in &quot;Friendica&quot; namespace</span>
<a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a>
<a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a><span class="p">[</span><span class="o">...</span><span class="p">]</span>
<a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a><span class="k">switch</span><span class="p">(</span><span class="nv">$contact</span><span class="p">[</span><span class="s1">&#39;network&#39;</span><span class="p">])</span> <span class="p">{</span>
<a id="__codelineno-6-13" name="__codelineno-6-13" href="#__codelineno-6-13"></a> <span class="k">case</span> <span class="nx">NETWORK_DFRN</span><span class="o">:</span>
<a id="__codelineno-6-14" name="__codelineno-6-14" href="#__codelineno-6-14"></a> <span class="k">if</span> <span class="p">(</span><span class="nv">$mail</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-6-15" name="__codelineno-6-15" href="#__codelineno-6-15"></a> <span class="nv">$item</span><span class="p">[</span><span class="s1">&#39;body&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="o">...</span>
<a id="__codelineno-6-16" name="__codelineno-6-16" href="#__codelineno-6-16"></a> <span class="nv">$atom</span> <span class="o">=</span> <span class="nx">DFRN</span><span class="o">::</span><span class="na">mail</span><span class="p">(</span><span class="nv">$item</span><span class="p">,</span> <span class="nv">$owner</span><span class="p">);</span>
<a id="__codelineno-6-17" name="__codelineno-6-17" href="#__codelineno-6-17"></a> <span class="p">}</span> <span class="k">elseif</span> <span class="p">(</span><span class="nv">$fsuggest</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-6-18" name="__codelineno-6-18" href="#__codelineno-6-18"></a> <span class="nv">$atom</span> <span class="o">=</span> <span class="nx">DFRN</span><span class="o">::</span><span class="na">fsuggest</span><span class="p">(</span><span class="nv">$item</span><span class="p">,</span> <span class="nv">$owner</span><span class="p">);</span>
<a id="__codelineno-6-19" name="__codelineno-6-19" href="#__codelineno-6-19"></a> <span class="nx">q</span><span class="p">(</span><span class="s2">&quot;DELETE FROM `fsuggest` WHERE `id` = %d LIMIT 1&quot;</span><span class="p">,</span> <span class="nb">intval</span><span class="p">(</span><span class="nv">$item</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]));</span>
<a id="__codelineno-6-20" name="__codelineno-6-20" href="#__codelineno-6-20"></a> <span class="p">}</span> <span class="k">elseif</span> <span class="p">(</span><span class="nv">$relocate</span><span class="p">)</span>
<a id="__codelineno-6-21" name="__codelineno-6-21" href="#__codelineno-6-21"></a> <span class="nv">$atom</span> <span class="o">=</span> <span class="nx">DFRN</span><span class="o">::</span><span class="na">relocate</span><span class="p">(</span><span class="nv">$owner</span><span class="p">,</span> <span class="nv">$uid</span><span class="p">);</span>
<a id="__codelineno-6-22" name="__codelineno-6-22" href="#__codelineno-6-22"></a><span class="p">[</span><span class="o">...</span><span class="p">]</span>
</code></pre></div>
<p>This is the current code of <code>include/delivery.php</code>, and since the code is declared to be in the "Friendica" namespace, you don't need to write it when you need to use the "Dfrn" class.
But if you want to use classes from another library, you need to use the full namespace, e.g.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="x">// src/Diaspora.php</span>
<a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a>
<a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a><span class="k">namespace</span> <span class="nx">Friendica</span><span class="p">;</span>
<a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a>
<a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a><span class="k">class</span> <span class="nc">Diaspora</span> <span class="p">{</span>
<a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">md2bbcode</span><span class="p">()</span> <span class="p">{</span>
<a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a> <span class="nv">$html</span> <span class="o">=</span> <span class="nx">\Michelf\MarkdownExtra</span><span class="o">::</span><span class="na">defaultTransform</span><span class="p">(</span><span class="nv">$text</span><span class="p">);</span>
<a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a> <span class="p">}</span>
<a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a><span class="p">}</span>
</code></pre></div>
<p>if you use that class in many places of the code, and you don't want to write the full path to the class every time, you can use the "use" PHP keyword</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="x">// src/Diaspora.php</span>
<a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="k">namespace</span> <span class="nx">Friendica</span><span class="p">;</span>
<a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a>
<a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a><span class="k">use</span> <span class="nx">\Michelf\MarkdownExtra</span><span class="p">;</span>
<a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a>
<a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a><span class="k">class</span> <span class="nc">Diaspora</span> <span class="p">{</span>
<a id="__codelineno-8-8" name="__codelineno-8-8" href="#__codelineno-8-8"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">md2bbcode</span><span class="p">()</span> <span class="p">{</span>
<a id="__codelineno-8-9" name="__codelineno-8-9" href="#__codelineno-8-9"></a> <span class="nv">$html</span> <span class="o">=</span> <span class="nx">MarkdownExtra</span><span class="o">::</span><span class="na">defaultTransform</span><span class="p">(</span><span class="nv">$text</span><span class="p">);</span>
<a id="__codelineno-8-10" name="__codelineno-8-10" href="#__codelineno-8-10"></a> <span class="p">}</span>
<a id="__codelineno-8-11" name="__codelineno-8-11" href="#__codelineno-8-11"></a><span class="p">}</span>
</code></pre></div>
<p>Note that namespaces are like paths in filesystem, separated by "\", with the first "\" being the global scope.
You can go deeper if you want to, like:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="x">// src/Network/Dfrn.php</span>
<a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a><span class="k">namespace</span> <span class="nx">Friendica\Network</span><span class="p">;</span>
<a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a>
<a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="k">class</span> <span class="nc">Dfrn</span> <span class="p">{</span>
<a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a><span class="p">}</span>
</code></pre></div>
<p>Please note that the location of the file defining the class must be placed in the appropriate sub-folders of <code>src</code> if the namespace isn't plain <code>Friendica</code>.</p>
<p>or</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="x">// src/Dba/Mysql</span>
<a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a><span class="k">namespace</span> <span class="nx">Friendica\Dba</span><span class="p">;</span>
<a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a>
<a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a><span class="k">class</span> <span class="nc">Mysql</span> <span class="p">{</span>
<a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="p">}</span>
</code></pre></div>
<p>So you can think of namespaces as folders in a Unix file system, with global scope as the root ("\").</p>
<h2 id="related">Related<a class="headerlink" href="#related" title="Permanent link">#</a></h2>
<ul>
<li><a href="../composer/">Using Composer</a></li>
<li><a href="../how-to-move-classes-to-src/">How To Move Classes to <code>src</code></a></li>
</ul>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../tests/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Tests" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Tests
</div>
</div>
</a>
<a href="../../spec/api/" class="md-footer__link md-footer__link--next" aria-label="Next: Usage" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Usage
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3599 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/composer/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Composer - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#using-composer" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Composer
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/composer/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/composer/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" checked>
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Composer
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Composer
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#how-to-use-composer" class="md-nav__link">
How to use Composer
</a>
<nav class="md-nav" aria-label="How to use Composer">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#installingupdating-friendica" class="md-nav__link">
Installing/Updating Friendica
</a>
<nav class="md-nav" aria-label="Installing/Updating Friendica">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#from-archive" class="md-nav__link">
From Archive
</a>
</li>
<li class="md-nav__item">
<a href="#installing-with-git" class="md-nav__link">
Installing with Git
</a>
</li>
<li class="md-nav__item">
<a href="#updating-with-git" class="md-nav__link">
Updating with Git
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#developing-friendica" class="md-nav__link">
Developing Friendica
</a>
<nav class="md-nav" aria-label="Developing Friendica">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#adding-a-third-party-library-to-friendica" class="md-nav__link">
Adding a third-party library to Friendica
</a>
</li>
<li class="md-nav__item">
<a href="#updating-an-existing-dependency" class="md-nav__link">
Updating an existing dependency
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#composer-faq" class="md-nav__link">
Composer FAQ
</a>
<nav class="md-nav" aria-label="Composer FAQ">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#i-used-the-composer-command-and-got-a-warning-about-not-to-run-it-as-root" class="md-nav__link">
I used the composer command and got a warning about not to run it as root.
</a>
</li>
<li class="md-nav__item">
<a href="#running-composer-with-sudo-complains-about-not-being-able-to-create-the-composer-cache-directory-in-rootcomposer" class="md-nav__link">
Running Composer with sudo complains about not being able to create the composer cache directory in /root/.composer
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#related" class="md-nav__link">
Related
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#how-to-use-composer" class="md-nav__link">
How to use Composer
</a>
<nav class="md-nav" aria-label="How to use Composer">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#installingupdating-friendica" class="md-nav__link">
Installing/Updating Friendica
</a>
<nav class="md-nav" aria-label="Installing/Updating Friendica">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#from-archive" class="md-nav__link">
From Archive
</a>
</li>
<li class="md-nav__item">
<a href="#installing-with-git" class="md-nav__link">
Installing with Git
</a>
</li>
<li class="md-nav__item">
<a href="#updating-with-git" class="md-nav__link">
Updating with Git
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#developing-friendica" class="md-nav__link">
Developing Friendica
</a>
<nav class="md-nav" aria-label="Developing Friendica">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#adding-a-third-party-library-to-friendica" class="md-nav__link">
Adding a third-party library to Friendica
</a>
</li>
<li class="md-nav__item">
<a href="#updating-an-existing-dependency" class="md-nav__link">
Updating an existing dependency
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#composer-faq" class="md-nav__link">
Composer FAQ
</a>
<nav class="md-nav" aria-label="Composer FAQ">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#i-used-the-composer-command-and-got-a-warning-about-not-to-run-it-as-root" class="md-nav__link">
I used the composer command and got a warning about not to run it as root.
</a>
</li>
<li class="md-nav__item">
<a href="#running-composer-with-sudo-complains-about-not-being-able-to-create-the-composer-cache-directory-in-rootcomposer" class="md-nav__link">
Running Composer with sudo complains about not being able to create the composer cache directory in /root/.composer
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#related" class="md-nav__link">
Related
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/composer.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">composer</span>
</nav>
<h1 id="using-composer">Using Composer<a class="headerlink" href="#using-composer" title="Permanent link">#</a></h1>
<p>Friendica uses <a href="https://getcomposer.org">Composer</a> to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes.</p>
<p>It's a command-line tool that downloads required libraries into the <code>vendor</code> folder and makes any namespaced class in <code>src</code> available through the whole application through <code>boot.php</code>.</p>
<ul>
<li><a href="../autoloader/">Class autoloading</a></li>
</ul>
<h2 id="how-to-use-composer">How to use Composer<a class="headerlink" href="#how-to-use-composer" title="Permanent link">#</a></h2>
<p>If you don't have Composer installed on your system, Friendica ships with a copy of it at <code>bin/composer.phar</code>.
For the purpose of this help, all examples will use this path to run Composer commands, however feel free to replace them with your own way of calling Composer.
Composer requires PHP CLI and the following examples assume it's available system-wide.</p>
<h3 id="installingupdating-friendica">Installing/Updating Friendica<a class="headerlink" href="#installingupdating-friendica" title="Permanent link">#</a></h3>
<h4 id="from-archive">From Archive<a class="headerlink" href="#from-archive" title="Permanent link">#</a></h4>
<p>If you just unpacked a Friendica release archive, you don't have to use Composer at all, all the required libraries are already bundled in the archive.</p>
<h4 id="installing-with-git">Installing with Git<a class="headerlink" href="#installing-with-git" title="Permanent link">#</a></h4>
<p>If you prefer to use <code>git</code>, you will have to run Composer to fetch the required libraries and build the autoloader before you can run Friendica.
Here are the typical commands you will have to run to do so:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>~&gt; git clone https://github.com/friendica/friendica.git friendica
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>~/friendica&gt; <span class="nb">cd</span> friendica
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>~/friendica&gt; bin/composer.phar install
</code></pre></div>
<p>That's it! Composer will take care of fetching all the required libraries in the <code>vendor</code> folder and build the autoloader to make those libraries available to Friendica.</p>
<h4 id="updating-with-git">Updating with Git<a class="headerlink" href="#updating-with-git" title="Permanent link">#</a></h4>
<p>Updating Friendica to the current stable or the latest develop version is easy with Git, just remember to run Composer after every branch pull.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>~&gt; <span class="nb">cd</span> friendica
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>~/friendica&gt; git pull
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>~/friendica&gt; bin/composer.phar install
</code></pre></div>
<p>And that's it. If any library used by Friendica has been upgraded, Composer will fetch the version currently used by Friendica and refresh the autoloader to ensure the best performances.</p>
<h3 id="developing-friendica">Developing Friendica<a class="headerlink" href="#developing-friendica" title="Permanent link">#</a></h3>
<p>First, thanks for contributing to Friendica!
Composer is meant to be used by developers to maintain third-party libraries required by Friendica.
If you don't need to use any third-party library, then you don't need to use Composer beyond what is above to install/update Friendica.</p>
<h4 id="adding-a-third-party-library-to-friendica">Adding a third-party library to Friendica<a class="headerlink" href="#adding-a-third-party-library-to-friendica" title="Permanent link">#</a></h4>
<p>Does your shiny new <a href="../addons/">Addon</a> need to rely on a third-party library not required by Friendica yet?
First, this library should be available on <a href="https://packagist.org">Packagist</a> so that Composer knows how to fetch it directly just by mentioning its name in <code>composer.json</code>.</p>
<p>This file is the configuration of Friendica for Composer. It lists details about the Friendica project, but also a list of required dependencies and their target version.
Here's a simplified version of the one we currently use on Friendica:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="p">{</span><span class="w"></span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;friendica/friendica&quot;</span><span class="p">,</span><span class="w"></span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;A decentralized social network part of The Federation&quot;</span><span class="p">,</span><span class="w"></span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;project&quot;</span><span class="p">,</span><span class="w"></span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="w"> </span><span class="p">[</span><span class="err">...</span><span class="p">]</span><span class="w"></span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span><span class="nt">&quot;require&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="w"> </span><span class="nt">&quot;ezyang/htmlpurifier&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;~4.7.0&quot;</span><span class="p">,</span><span class="w"></span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="w"> </span><span class="nt">&quot;mobiledetect/mobiledetectlib&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;2.8.*&quot;</span><span class="w"></span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a><span class="w"> </span><span class="p">[</span><span class="err">...</span><span class="p">]</span><span class="w"></span>
<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>The important part is under the <code>require</code> key, this is a list of all the libraries Friendica may need to run.
As you can see, at the moment we only require two, HTMLPurifier and MobileDetect.
Each library has a different target version, and <a href="https://getcomposer.org/doc/articles/versions.md#writing-basic-version-constraints">per Composer documentation about version constraints</a>, this means that:</p>
<ul>
<li>We will update HTMLPurifier up to version 4.8.0 excluded</li>
<li>We will update MobileDetect up to version 2.9.0 excluded</li>
</ul>
<p>There are other operators you can use to allow Composer to update the package up to the next major version excluded.
Or you can specify the exact version of the library if you code requires it, and Composer will never update it, although it isn't recommended.</p>
<p>To add a library, just add its Packagist identifier to the <code>require</code> list and set a target version string.</p>
<p>Then you should run <code>bin/composer.phar update</code> to add it to your local <code>vendor</code> folder and update the <code>composer.lock</code> file that specifies the current versions of the dependencies.</p>
<h4 id="updating-an-existing-dependency">Updating an existing dependency<a class="headerlink" href="#updating-an-existing-dependency" title="Permanent link">#</a></h4>
<p>If a package needs to be updated, whether to the next minor version or to the next major version provided you changed the adequate code in Friendica, simply edit <code>composer.json</code> to update the target version string of the relevant library.</p>
<p>Then you should run <code>bin/composer.phar update</code> to update it in your local <code>vendor</code> folder and update the <code>composer.lock</code> file that specifies the current versions of the dependencies.</p>
<p>Please note that you should commit both <code>composer.json</code> and <code>composer.lock</code> with your work every time you make a change to the former.</p>
<h2 id="composer-faq">Composer FAQ<a class="headerlink" href="#composer-faq" title="Permanent link">#</a></h2>
<h3 id="i-used-the-composer-command-and-got-a-warning-about-not-to-run-it-as-root">I used the <code>composer</code> command and got a warning about not to run it as root.<a class="headerlink" href="#i-used-the-composer-command-and-got-a-warning-about-not-to-run-it-as-root" title="Permanent link">#</a></h3>
<p>See <a href="">https://getcomposer.org/root</a>.
Composer should be run as the web server user, usually <code>www-data</code> with Apache or <code>http</code> with nginx.
If you can't switch to the web server user using <code>su - [web user]</code>, you can directly run the Composer command with <code>sudo -u [web user]</code>.</p>
<h3 id="running-composer-with-sudo-complains-about-not-being-able-to-create-the-composer-cache-directory-in-rootcomposer">Running Composer with <code>sudo</code> complains about not being able to create the composer cache directory in <code>/root/.composer</code><a class="headerlink" href="#running-composer-with-sudo-complains-about-not-being-able-to-create-the-composer-cache-directory-in-rootcomposer" title="Permanent link">#</a></h3>
<p>This is because <code>sudo</code> doesn't always change the <code>HOME</code> environment variable, which means that the command is run as the web server user but the system still uses <code>root</code> home directory.
However, you can temporarily change environment variable for the execution of a single command.
For Composer, this would be:
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>$&gt; <span class="nv">COMPOSER_HOME</span><span class="o">=</span>/var/tmp/composer sudo -u <span class="o">[</span>web user<span class="o">]</span> bin/composer.phar <span class="o">[</span>mode<span class="o">]</span>
</code></pre></div></p>
<h2 id="related">Related<a class="headerlink" href="#related" title="Permanent link">#</a></h2>
<ul>
<li><a href="../autoloader/">Class autoloading</a></li>
<li><a href="../how-to-move-classes-to-src/">How To Move Classes to <code>src</code></a></li>
</ul>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../translations/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Translations" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Translations
</div>
</div>
</a>
<a href="../how-to-move-classes-to-src/" class="md-footer__link md-footer__link--next" aria-label="Next: src Migration" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
src Migration
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3619 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/domain-driven-design/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>DDD - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#domain-driven-design" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
DDD
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/domain-driven-design/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/domain-driven-design/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" checked>
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
DDD
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
DDD
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#inspiration" class="md-nav__link">
Inspiration
</a>
</li>
<li class="md-nav__item">
<a href="#core-concepts" class="md-nav__link">
Core concepts
</a>
<nav class="md-nav" aria-label="Core concepts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#models-and-collections" class="md-nav__link">
Models and Collections
</a>
</li>
<li class="md-nav__item">
<a href="#dependency-injection" class="md-nav__link">
Dependency Injection
</a>
</li>
<li class="md-nav__item">
<a href="#factories" class="md-nav__link">
Factories
</a>
</li>
<li class="md-nav__item">
<a href="#repositories" class="md-nav__link">
Repositories
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#inspiration" class="md-nav__link">
Inspiration
</a>
</li>
<li class="md-nav__item">
<a href="#core-concepts" class="md-nav__link">
Core concepts
</a>
<nav class="md-nav" aria-label="Core concepts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#models-and-collections" class="md-nav__link">
Models and Collections
</a>
</li>
<li class="md-nav__item">
<a href="#dependency-injection" class="md-nav__link">
Dependency Injection
</a>
</li>
<li class="md-nav__item">
<a href="#factories" class="md-nav__link">
Factories
</a>
</li>
<li class="md-nav__item">
<a href="#repositories" class="md-nav__link">
Repositories
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/domain-driven-design.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">pattern</span>
</nav>
<h1 id="domain-driven-design">Domain-Driven-Design<a class="headerlink" href="#domain-driven-design" title="Permanent link">#</a></h1>
<p>Friendica uses class structures inspired by Domain-Driven-Design programming patterns.
This page is meant to explain what it means in practical terms for Friendica development.</p>
<h2 id="inspiration">Inspiration<a class="headerlink" href="#inspiration" title="Permanent link">#</a></h2>
<ul>
<li>https://designpatternsphp.readthedocs.io/en/latest/Structural/DependencyInjection/README.html</li>
<li>https://designpatternsphp.readthedocs.io/en/latest/Creational/SimpleFactory/README.html</li>
<li>https://designpatternsphp.readthedocs.io/en/latest/More/Repository/README.html</li>
<li>https://designpatternsphp.readthedocs.io/en/latest/Creational/FactoryMethod/README.html</li>
<li>https://designpatternsphp.readthedocs.io/en/latest/Creational/Prototype/README.html</li>
</ul>
<h2 id="core-concepts">Core concepts<a class="headerlink" href="#core-concepts" title="Permanent link">#</a></h2>
<h3 id="models-and-collections">Models and Collections<a class="headerlink" href="#models-and-collections" title="Permanent link">#</a></h3>
<p>Instead of anonymous arrays of database field values, we have Models and collections to take full advantage of PHP type hints.</p>
<p>Before:
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="k">function</span> <span class="nf">doSomething</span><span class="p">(</span><span class="k">array</span> <span class="nv">$intros</span><span class="p">)</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="p">{</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="k">foreach</span> <span class="p">(</span><span class="nv">$intros</span> <span class="k">as</span> <span class="nv">$intro</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="nv">$introId</span> <span class="o">=</span> <span class="nv">$intro</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">];</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="p">}</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="p">}</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="nv">$intros</span> <span class="o">=</span> <span class="nx">\Friendica\Database\DBA</span><span class="o">::</span><span class="na">selectToArray</span><span class="p">(</span><span class="s1">&#39;intros&#39;</span><span class="p">,</span> <span class="p">[],</span> <span class="p">[</span><span class="s1">&#39;uid&#39;</span> <span class="o">=&gt;</span> <span class="nx">local_user</span><span class="p">()]);</span>
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a>
<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a><span class="nx">doSomething</span><span class="p">(</span><span class="nv">$intros</span><span class="p">);</span>
</code></pre></div></p>
<p>After:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="k">function</span> <span class="nf">doSomething</span><span class="p">(</span><span class="nx">\Friendica\Contact\Introductions\Collection\Introductions</span> <span class="nv">$intros</span><span class="p">)</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="p">{</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> <span class="k">foreach</span> <span class="p">(</span><span class="nv">$intros</span> <span class="k">as</span> <span class="nv">$intro</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> <span class="sd">/** @var $intro \Friendica\Contact\Introductions\Entity\Introduction */</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> <span class="nv">$introId</span> <span class="o">=</span> <span class="nv">$intro</span><span class="o">-&gt;</span><span class="na">id</span><span class="p">;</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a> <span class="p">}</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="p">}</span>
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a>
<a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a><span class="sd">/** @var $intros \Friendica\Contact\Introductions\Collection\Introductions */</span>
<a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="nv">$intros</span> <span class="o">=</span> <span class="nx">\Friendica\DI</span><span class="o">::</span><span class="na">intro</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">selecForUser</span><span class="p">(</span><span class="nx">local_user</span><span class="p">());</span>
<a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a>
<a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="nx">doSomething</span><span class="p">(</span><span class="nv">$intros</span><span class="p">);</span>
</code></pre></div>
<h3 id="dependency-injection">Dependency Injection<a class="headerlink" href="#dependency-injection" title="Permanent link">#</a></h3>
<p>Under this concept, we want class objects to carry with them the dependencies they will use.
Instead of calling global/static function/methods, objects use their own class members.</p>
<p>Before:
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="k">class</span> <span class="nc">Model</span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="p">{</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> <span class="k">public</span> <span class="nv">$id</span><span class="p">;</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> <span class="k">function</span> <span class="nf">save</span><span class="p">()</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> <span class="p">{</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a> <span class="k">return</span> <span class="nx">\Friendica\Database\DBA</span><span class="o">::</span><span class="na">update</span><span class="p">(</span><span class="s1">&#39;table&#39;</span><span class="p">,</span> <span class="nb">get_object_vars</span><span class="p">(</span><span class="nv">$this</span><span class="p">),</span> <span class="p">[</span><span class="s1">&#39;id&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">id</span><span class="p">]);</span>
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> <span class="p">}</span>
<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="p">}</span>
</code></pre></div></p>
<p>After:
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="k">class</span> <span class="nc">Model</span>
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="p">{</span>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a> <span class="sd">/**</span>
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="sd"> * @var \Friendica\Database\Database</span>
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="sd"> */</span>
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a> <span class="k">protected</span> <span class="nv">$dba</span><span class="p">;</span>
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a>
<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a> <span class="k">public</span> <span class="nv">$id</span><span class="p">;</span>
<a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a>
<a id="__codelineno-3-12" name="__codelineno-3-12" href="#__codelineno-3-12"></a> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nx">\Friendica\Database\Database</span> <span class="nv">$dba</span><span class="p">)</span>
<a id="__codelineno-3-13" name="__codelineno-3-13" href="#__codelineno-3-13"></a> <span class="p">{</span>
<a id="__codelineno-3-14" name="__codelineno-3-14" href="#__codelineno-3-14"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span> <span class="o">=</span> <span class="nv">$dba</span><span class="p">;</span>
<a id="__codelineno-3-15" name="__codelineno-3-15" href="#__codelineno-3-15"></a> <span class="p">}</span>
<a id="__codelineno-3-16" name="__codelineno-3-16" href="#__codelineno-3-16"></a>
<a id="__codelineno-3-17" name="__codelineno-3-17" href="#__codelineno-3-17"></a> <span class="k">function</span> <span class="nf">save</span><span class="p">()</span>
<a id="__codelineno-3-18" name="__codelineno-3-18" href="#__codelineno-3-18"></a> <span class="p">{</span>
<a id="__codelineno-3-19" name="__codelineno-3-19" href="#__codelineno-3-19"></a> <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span><span class="o">-&gt;</span><span class="na">update</span><span class="p">(</span><span class="s1">&#39;table&#39;</span><span class="p">,</span> <span class="nb">get_object_vars</span><span class="p">(</span><span class="nv">$this</span><span class="p">),</span> <span class="p">[</span><span class="s1">&#39;id&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">id</span><span class="p">]);</span>
<a id="__codelineno-3-20" name="__codelineno-3-20" href="#__codelineno-3-20"></a> <span class="p">}</span>
<a id="__codelineno-3-21" name="__codelineno-3-21" href="#__codelineno-3-21"></a><span class="p">}</span>
</code></pre></div></p>
<p>The main advantage is testability.
Another one is avoiding dependency circles and avoid implicit initializing.
In the first example the method <code>save()</code> has to be tested with the <code>DBA::update()</code> method, which may or may not have dependencies itself.</p>
<p>In the second example we can mock <code>\Friendica\Database\Database</code>, e.g. overload the class by replacing its methods by placeholders, which allows us to test only <code>Model::save()</code> and nothing else implicitly.</p>
<p>The main drawback is lengthy constructors for dependency-heavy classes.
To alleviate this issue we are using <a href="https://r.je/dice">DiCe</a> to simplify the instantiation of the higher level objects Friendica uses.</p>
<p>We also added a convenience factory named <code>\Friendica\DI</code> that creates some of the most common objects used in modules.</p>
<h3 id="factories">Factories<a class="headerlink" href="#factories" title="Permanent link">#</a></h3>
<p>Since we added a bunch of parameters to class constructors, instantiating objects has become cumbersome.
To keep it simple, we are using Factories.
Factories are classes used to generate other objects, centralizing the dependencies required in their constructor.
Factories encapsulate more or less complex creation of objects and create them redundancy free.</p>
<p>Before:
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="nv">$model</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Model</span><span class="p">(</span><span class="nx">\Friendica\DI</span><span class="o">::</span><span class="na">dba</span><span class="p">());</span>
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">id</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">key</span> <span class="o">=</span> <span class="s1">&#39;value&#39;</span><span class="p">;</span>
<a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a>
<a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">save</span><span class="p">();</span>
</code></pre></div></p>
<p>After:
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="k">class</span> <span class="nc">Factory</span>
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="p">{</span>
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a> <span class="sd">/**</span>
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a><span class="sd"> * @var \Friendica\Database\Database</span>
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="sd"> */</span>
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a> <span class="k">protected</span> <span class="nv">$dba</span><span class="p">;</span>
<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a>
<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nx">\Friendica\Database\Database</span> <span class="nv">$dba</span><span class="p">)</span>
<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a> <span class="p">{</span>
<a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span><span class="p">;</span>
<a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a> <span class="p">}</span>
<a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a>
<a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">create</span><span class="p">()</span>
<a id="__codelineno-5-16" name="__codelineno-5-16" href="#__codelineno-5-16"></a> <span class="p">{</span>
<a id="__codelineno-5-17" name="__codelineno-5-17" href="#__codelineno-5-17"></a> <span class="k">return</span> <span class="k">new</span> <span class="nx">Model</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span><span class="p">);</span>
<a id="__codelineno-5-18" name="__codelineno-5-18" href="#__codelineno-5-18"></a> <span class="p">}</span>
<a id="__codelineno-5-19" name="__codelineno-5-19" href="#__codelineno-5-19"></a><span class="p">}</span>
<a id="__codelineno-5-20" name="__codelineno-5-20" href="#__codelineno-5-20"></a>
<a id="__codelineno-5-21" name="__codelineno-5-21" href="#__codelineno-5-21"></a><span class="nv">$model</span> <span class="o">=</span> <span class="nx">\Friendica\DI</span><span class="o">::</span><span class="na">factory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">create</span><span class="p">();</span>
<a id="__codelineno-5-22" name="__codelineno-5-22" href="#__codelineno-5-22"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">id</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-5-23" name="__codelineno-5-23" href="#__codelineno-5-23"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">key</span> <span class="o">=</span> <span class="s1">&#39;value&#39;</span><span class="p">;</span>
<a id="__codelineno-5-24" name="__codelineno-5-24" href="#__codelineno-5-24"></a>
<a id="__codelineno-5-25" name="__codelineno-5-25" href="#__codelineno-5-25"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">save</span><span class="p">();</span>
</code></pre></div></p>
<p>Here, <code>DI::factory()</code> returns an instance of <code>Factory</code> that can then be used to create a <code>Model</code> object without having to care about its dependencies.</p>
<h3 id="repositories">Repositories<a class="headerlink" href="#repositories" title="Permanent link">#</a></h3>
<p>Last building block of our code architecture, repositories are meant as the interface between models and how they are stored.
In Friendica they are stored in a relational database but repositories allow models not to have to care about it.
Repositories also act as factories for the Model they are managing.</p>
<p>Before:
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="k">class</span> <span class="nc">Model</span>
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="p">{</span>
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a> <span class="sd">/**</span>
<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="sd"> * @var \Friendica\Database\Database</span>
<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="sd"> */</span>
<a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a> <span class="k">protected</span> <span class="nv">$dba</span><span class="p">;</span>
<a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a>
<a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a> <span class="k">public</span> <span class="nv">$id</span><span class="p">;</span>
<a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a>
<a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nx">\Friendica\Database\Database</span> <span class="nv">$dba</span><span class="p">)</span>
<a id="__codelineno-6-13" name="__codelineno-6-13" href="#__codelineno-6-13"></a> <span class="p">{</span>
<a id="__codelineno-6-14" name="__codelineno-6-14" href="#__codelineno-6-14"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span> <span class="o">=</span> <span class="nv">$dba</span><span class="p">;</span>
<a id="__codelineno-6-15" name="__codelineno-6-15" href="#__codelineno-6-15"></a> <span class="p">}</span>
<a id="__codelineno-6-16" name="__codelineno-6-16" href="#__codelineno-6-16"></a>
<a id="__codelineno-6-17" name="__codelineno-6-17" href="#__codelineno-6-17"></a> <span class="k">function</span> <span class="nf">save</span><span class="p">()</span>
<a id="__codelineno-6-18" name="__codelineno-6-18" href="#__codelineno-6-18"></a> <span class="p">{</span>
<a id="__codelineno-6-19" name="__codelineno-6-19" href="#__codelineno-6-19"></a> <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span><span class="o">-&gt;</span><span class="na">update</span><span class="p">(</span><span class="s1">&#39;table&#39;</span><span class="p">,</span> <span class="nb">get_object_vars</span><span class="p">(</span><span class="nv">$this</span><span class="p">),</span> <span class="p">[</span><span class="s1">&#39;id&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">id</span><span class="p">]);</span>
<a id="__codelineno-6-20" name="__codelineno-6-20" href="#__codelineno-6-20"></a> <span class="p">}</span>
<a id="__codelineno-6-21" name="__codelineno-6-21" href="#__codelineno-6-21"></a><span class="p">}</span>
<a id="__codelineno-6-22" name="__codelineno-6-22" href="#__codelineno-6-22"></a>
<a id="__codelineno-6-23" name="__codelineno-6-23" href="#__codelineno-6-23"></a><span class="k">class</span> <span class="nc">Factory</span>
<a id="__codelineno-6-24" name="__codelineno-6-24" href="#__codelineno-6-24"></a><span class="p">{</span>
<a id="__codelineno-6-25" name="__codelineno-6-25" href="#__codelineno-6-25"></a> <span class="sd">/**</span>
<a id="__codelineno-6-26" name="__codelineno-6-26" href="#__codelineno-6-26"></a><span class="sd"> * @var \Friendica\Database\Database</span>
<a id="__codelineno-6-27" name="__codelineno-6-27" href="#__codelineno-6-27"></a><span class="sd"> */</span>
<a id="__codelineno-6-28" name="__codelineno-6-28" href="#__codelineno-6-28"></a> <span class="k">protected</span> <span class="nv">$dba</span><span class="p">;</span>
<a id="__codelineno-6-29" name="__codelineno-6-29" href="#__codelineno-6-29"></a>
<a id="__codelineno-6-30" name="__codelineno-6-30" href="#__codelineno-6-30"></a> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nx">\Friendica\Database\Database</span> <span class="nv">$dba</span><span class="p">)</span>
<a id="__codelineno-6-31" name="__codelineno-6-31" href="#__codelineno-6-31"></a> <span class="p">{</span>
<a id="__codelineno-6-32" name="__codelineno-6-32" href="#__codelineno-6-32"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span><span class="p">;</span>
<a id="__codelineno-6-33" name="__codelineno-6-33" href="#__codelineno-6-33"></a> <span class="p">}</span>
<a id="__codelineno-6-34" name="__codelineno-6-34" href="#__codelineno-6-34"></a>
<a id="__codelineno-6-35" name="__codelineno-6-35" href="#__codelineno-6-35"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">create</span><span class="p">()</span>
<a id="__codelineno-6-36" name="__codelineno-6-36" href="#__codelineno-6-36"></a> <span class="p">{</span>
<a id="__codelineno-6-37" name="__codelineno-6-37" href="#__codelineno-6-37"></a> <span class="k">return</span> <span class="k">new</span> <span class="nx">Model</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span><span class="p">);</span>
<a id="__codelineno-6-38" name="__codelineno-6-38" href="#__codelineno-6-38"></a> <span class="p">}</span>
<a id="__codelineno-6-39" name="__codelineno-6-39" href="#__codelineno-6-39"></a><span class="p">}</span>
<a id="__codelineno-6-40" name="__codelineno-6-40" href="#__codelineno-6-40"></a>
<a id="__codelineno-6-41" name="__codelineno-6-41" href="#__codelineno-6-41"></a>
<a id="__codelineno-6-42" name="__codelineno-6-42" href="#__codelineno-6-42"></a><span class="nv">$model</span> <span class="o">=</span> <span class="nx">\Friendica\DI</span><span class="o">::</span><span class="na">factory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">create</span><span class="p">();</span>
<a id="__codelineno-6-43" name="__codelineno-6-43" href="#__codelineno-6-43"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">id</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-6-44" name="__codelineno-6-44" href="#__codelineno-6-44"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">key</span> <span class="o">=</span> <span class="s1">&#39;value&#39;</span><span class="p">;</span>
<a id="__codelineno-6-45" name="__codelineno-6-45" href="#__codelineno-6-45"></a>
<a id="__codelineno-6-46" name="__codelineno-6-46" href="#__codelineno-6-46"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">save</span><span class="p">();</span>
</code></pre></div></p>
<p>After:
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a>
<a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="k">class</span> <span class="nc">Model</span> <span class="p">{</span>
<a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a> <span class="k">public</span> <span class="nv">$id</span><span class="p">;</span>
<a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a><span class="p">}</span>
<a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a>
<a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a><span class="k">class</span> <span class="nc">Repository</span> <span class="k">extends</span> <span class="nx">Factory</span>
<a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a><span class="p">{</span>
<a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a> <span class="sd">/**</span>
<a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a><span class="sd"> * @var \Friendica\Database\Database</span>
<a id="__codelineno-7-11" name="__codelineno-7-11" href="#__codelineno-7-11"></a><span class="sd"> */</span>
<a id="__codelineno-7-12" name="__codelineno-7-12" href="#__codelineno-7-12"></a> <span class="k">protected</span> <span class="nv">$dba</span><span class="p">;</span>
<a id="__codelineno-7-13" name="__codelineno-7-13" href="#__codelineno-7-13"></a>
<a id="__codelineno-7-14" name="__codelineno-7-14" href="#__codelineno-7-14"></a> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nx">\Friendica\Database\Database</span> <span class="nv">$dba</span><span class="p">)</span>
<a id="__codelineno-7-15" name="__codelineno-7-15" href="#__codelineno-7-15"></a> <span class="p">{</span>
<a id="__codelineno-7-16" name="__codelineno-7-16" href="#__codelineno-7-16"></a> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span><span class="p">;</span>
<a id="__codelineno-7-17" name="__codelineno-7-17" href="#__codelineno-7-17"></a> <span class="p">}</span>
<a id="__codelineno-7-18" name="__codelineno-7-18" href="#__codelineno-7-18"></a>
<a id="__codelineno-7-19" name="__codelineno-7-19" href="#__codelineno-7-19"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">create</span><span class="p">()</span>
<a id="__codelineno-7-20" name="__codelineno-7-20" href="#__codelineno-7-20"></a> <span class="p">{</span>
<a id="__codelineno-7-21" name="__codelineno-7-21" href="#__codelineno-7-21"></a> <span class="k">return</span> <span class="k">new</span> <span class="nx">Model</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span><span class="p">);</span>
<a id="__codelineno-7-22" name="__codelineno-7-22" href="#__codelineno-7-22"></a> <span class="p">}</span>
<a id="__codelineno-7-23" name="__codelineno-7-23" href="#__codelineno-7-23"></a>
<a id="__codelineno-7-24" name="__codelineno-7-24" href="#__codelineno-7-24"></a> <span class="k">public</span> <span class="k">function</span> <span class="nf">save</span><span class="p">(</span><span class="nx">Model</span> <span class="nv">$model</span><span class="p">)</span>
<a id="__codelineno-7-25" name="__codelineno-7-25" href="#__codelineno-7-25"></a> <span class="p">{</span>
<a id="__codelineno-7-26" name="__codelineno-7-26" href="#__codelineno-7-26"></a> <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dba</span><span class="o">-&gt;</span><span class="na">update</span><span class="p">(</span><span class="s1">&#39;table&#39;</span><span class="p">,</span> <span class="nb">get_object_vars</span><span class="p">(</span><span class="nv">$model</span><span class="p">),</span> <span class="p">[</span><span class="s1">&#39;id&#39;</span> <span class="o">=&gt;</span> <span class="nv">$model</span><span class="o">-&gt;</span><span class="na">id</span><span class="p">]);</span>
<a id="__codelineno-7-27" name="__codelineno-7-27" href="#__codelineno-7-27"></a> <span class="p">}</span>
<a id="__codelineno-7-28" name="__codelineno-7-28" href="#__codelineno-7-28"></a><span class="p">}</span>
<a id="__codelineno-7-29" name="__codelineno-7-29" href="#__codelineno-7-29"></a>
<a id="__codelineno-7-30" name="__codelineno-7-30" href="#__codelineno-7-30"></a><span class="nv">$model</span> <span class="o">=</span> <span class="nx">\Friendica\DI</span><span class="o">::</span><span class="na">repository</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">create</span><span class="p">();</span>
<a id="__codelineno-7-31" name="__codelineno-7-31" href="#__codelineno-7-31"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">id</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-7-32" name="__codelineno-7-32" href="#__codelineno-7-32"></a><span class="nv">$model</span><span class="o">-&gt;</span><span class="na">key</span> <span class="o">=</span> <span class="s1">&#39;value&#39;</span><span class="p">;</span>
<a id="__codelineno-7-33" name="__codelineno-7-33" href="#__codelineno-7-33"></a>
<a id="__codelineno-7-34" name="__codelineno-7-34" href="#__codelineno-7-34"></a><span class="nx">\Friendica\DI</span><span class="o">::</span><span class="na">repository</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">save</span><span class="p">(</span><span class="nv">$model</span><span class="p">);</span>
</code></pre></div></p>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../vagrant/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Vagrant" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Vagrant
</div>
</div>
</a>
<a href="../addons/" class="md-footer__link md-footer__link--next" aria-label="Next: Addons" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Addons
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3441 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/github/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>GitHub - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#friendica-on-github" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
GitHub
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/github/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/github/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" checked>
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
GitHub
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
GitHub
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#introduction-to-the-workflow-with-our-github-repository" class="md-nav__link">
Introduction to the workflow with our GitHub repository
</a>
</li>
<li class="md-nav__item">
<a href="#our-git-branches" class="md-nav__link">
Our Git Branches
</a>
</li>
<li class="md-nav__item">
<a href="#fast-forwarding" class="md-nav__link">
Fast-forwarding
</a>
</li>
<li class="md-nav__item">
<a href="#release-branches" class="md-nav__link">
Release branches
</a>
</li>
<li class="md-nav__item">
<a href="#some-important-reminders" class="md-nav__link">
Some important reminders
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#introduction-to-the-workflow-with-our-github-repository" class="md-nav__link">
Introduction to the workflow with our GitHub repository
</a>
</li>
<li class="md-nav__item">
<a href="#our-git-branches" class="md-nav__link">
Our Git Branches
</a>
</li>
<li class="md-nav__item">
<a href="#fast-forwarding" class="md-nav__link">
Fast-forwarding
</a>
</li>
<li class="md-nav__item">
<a href="#release-branches" class="md-nav__link">
Release branches
</a>
</li>
<li class="md-nav__item">
<a href="#some-important-reminders" class="md-nav__link">
Some important reminders
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/github.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">upstream</span>
<span class="md-tag">git</span>
</nav>
<h1 id="friendica-on-github">Friendica on GitHub<a class="headerlink" href="#friendica-on-github" title="Permanent link">#</a></h1>
<p>Here is how you can work on the code with us. If you have any questions please write to the Friendica developers' forum.</p>
<h2 id="introduction-to-the-workflow-with-our-github-repository">Introduction to the workflow with our GitHub repository<a class="headerlink" href="#introduction-to-the-workflow-with-our-github-repository" title="Permanent link">#</a></h2>
<ol>
<li>Install git on the system you will be developing on.</li>
<li>Create your own <a href="https://github.com">GitHub</a> account.</li>
<li>Fork the Friendica repository from <a href="https://github.com/friendica/friendica.git">https://github.com/friendica/friendica.git</a>.</li>
<li>Clone your fork from your GitHub account to your machine.
Follow the instructions provided here: <a href="http://help.github.com/fork-a-repo/">http://help.github.com/fork-a-repo/</a> to create and use your own tracking fork on GitHub</li>
<li>Run <code>bin/composer.phar install</code> in Friendica's folder.</li>
<li>Commit your changes to your fork.
Then go to your GitHub page and create a "Pull request" to notify us to merge your work.</li>
</ol>
<h2 id="our-git-branches">Our Git Branches<a class="headerlink" href="#our-git-branches" title="Permanent link">#</a></h2>
<p>There are two relevant branches in the main repo on GitHub:</p>
<ol>
<li>stable: This branch contains stable releases only.</li>
<li>develop: This branch contains the latest code.
This is what you want to work with.</li>
</ol>
<h2 id="fast-forwarding">Fast-forwarding<a class="headerlink" href="#fast-forwarding" title="Permanent link">#</a></h2>
<p>Fast forwarding is enabled by default in git.
When you merge with fast-forwarding it does not add a new commit to mark when you've performed the merge and how.
This means in your commit history you can't know exactly what happened in terms of merges.
<strong>It's best to turn off fast-forwarding.</strong>
This is done by running "git merge --no-ff".
<a href="https://stackoverflow.com/questions/5519007/how-do-i-make-git-merges-default-be-no-ff-no-commit">Here</a> is an explanation on how to configure git to turn off fast-forwarding by default.
You can find some more background reading <a href="http://nvie.com/posts/a-successful-git-branching-model/">here</a>.</p>
<h2 id="release-branches">Release branches<a class="headerlink" href="#release-branches" title="Permanent link">#</a></h2>
<p>A release branch is created when the develop branch contains all features it should have.
A release branch is used for a few things.</p>
<ol>
<li>It allows last-minute bug fixing before the release goes to stable branch.</li>
<li>It allows meta-data changes (README, CHANGELOG, etc.) for version bumps and documentation changes.</li>
<li>It makes sure the develop branch can receive new features that are <strong>not</strong> part of this release.</li>
</ol>
<p>That last point is important because...
<strong>The moment a release branch is created, develop is now intended for the version after this release</strong>.
So please don't ever merge develop into a release!
An example: If a release branch "release-3.4" is created, "develop" becomes either 3.5 or 4.0.
If you were to merge develop into release-3.4 at this point, features and bug-fixes intended for 3.5 or 4.0 might leak into this release branch.
This might introduce new bugs, too.
Which defeats the purpose of the release branch.</p>
<h2 id="some-important-reminders">Some important reminders<a class="headerlink" href="#some-important-reminders" title="Permanent link">#</a></h2>
<ol>
<li>
<p>Please pull in any changes from the project repository and merge them with your work <strong>before</strong> issuing a pull request.
We reserve the right to reject any patch which results in a large number of merge conflicts.
This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.</p>
</li>
<li>
<p><strong>Test your changes</strong>.
Don't assume that a simple fix won't break anything else.
If possible get an experienced Friendica developer to review the code.
Don't hesitate to ask us in case of doubt.</p>
</li>
<li>
<p>Check your code for typos.
There is a console command called <em>typo</em> for this.</p>
</li>
</ol>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>$&gt; php bin/console.php typo
</code></pre></div>
<p>Check out how to work with <a href="../vagrant/">our Vagrant</a> to save a lot of setup time!</p>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../" class="md-footer__link md-footer__link--prev" aria-label="Previous: Get Started" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Get Started
</div>
</div>
</a>
<a href="../vagrant/" class="md-footer__link md-footer__link--next" aria-label="Next: Vagrant" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Vagrant
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3461 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/how-to-move-classes-to-src/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>src Migration - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#how-to-move-classes-to-src" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
src Migration
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/how-to-move-classes-to-src/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/how-to-move-classes-to-src/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" checked>
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
src Migration
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
src Migration
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#decide-the-namespace" class="md-nav__link">
Decide the namespace
</a>
</li>
<li class="md-nav__item">
<a href="#use-the-namespace" class="md-nav__link">
Use the namespace
</a>
</li>
<li class="md-nav__item">
<a href="#escape-non-namespace-classes" class="md-nav__link">
Escape non-namespace classes
</a>
</li>
<li class="md-nav__item">
<a href="#remove-any-useless-require" class="md-nav__link">
Remove any useless require
</a>
</li>
<li class="md-nav__item">
<a href="#miscellaneous-tips" class="md-nav__link">
Miscellaneous tips
</a>
</li>
<li class="md-nav__item">
<a href="#related" class="md-nav__link">
Related
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#decide-the-namespace" class="md-nav__link">
Decide the namespace
</a>
</li>
<li class="md-nav__item">
<a href="#use-the-namespace" class="md-nav__link">
Use the namespace
</a>
</li>
<li class="md-nav__item">
<a href="#escape-non-namespace-classes" class="md-nav__link">
Escape non-namespace classes
</a>
</li>
<li class="md-nav__item">
<a href="#remove-any-useless-require" class="md-nav__link">
Remove any useless require
</a>
</li>
<li class="md-nav__item">
<a href="#miscellaneous-tips" class="md-nav__link">
Miscellaneous tips
</a>
</li>
<li class="md-nav__item">
<a href="#related" class="md-nav__link">
Related
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/how-to-move-classes-to-src.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">refactoring</span>
</nav>
<h1 id="how-to-move-classes-to-src">How To Move Classes to <code>src</code><a class="headerlink" href="#how-to-move-classes-to-src" title="Permanent link">#</a></h1>
<p>Friendica uses <a href="../composer/">Composer</a> to manage autoloading.
This means that all the PHP class files moved to the <code>src</code> folder will be <a href="../autoloader/">automatically included</a> when the class it defines is first used in the flow.
This is an improvement over the current <code>require</code> usage since files will be included on an actual usage basis instead of the presence of a <code>require</code> call.</p>
<p>However, there are a significant number of items to check when moving a class file from the <code>include</code> folder to the <code>src</code> folder, and this page is there to list them.</p>
<h2 id="decide-the-namespace">Decide the namespace<a class="headerlink" href="#decide-the-namespace" title="Permanent link">#</a></h2>
<p>This isn't the most technical decision of them all, but it has long-lasting consequences as it will be the name that will be used to refer to this class from now on.
There is <a href="https://ethercalc.org/friendica_classes">a shared Ethercalc sheet</a> to suggest namespace/class names that lists all the already moved class files for inspiration.</p>
<p>A few pointers though:
* <code>Friendica</code> is the base namespace for all classes in the <code>src</code> folder
* Namespaces match the directory structure, with <code>Friendica</code> namespace being the base <code>src</code> directory. The <code>Config</code> class set in the <code>Friendica\Core</code> namespace is expected to be found at <code>src/Core/Config.php</code>.
* Namespaces can help group classes with a similar purpose or relevant to a particular feature</p>
<p>When you're done deciding the namespace, it's time to use it.
Let's say we choose <code>Friendica\Core</code> for the <code>Config</code> class.</p>
<h2 id="use-the-namespace">Use the namespace<a class="headerlink" href="#use-the-namespace" title="Permanent link">#</a></h2>
<p>To declare the namespace, the file <code>src/Core/Config.php</code> must start with the following statement:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="x">namespace Friendica\Core;</span>
</code></pre></div>
<p>From now on, the <code>Config</code> class can be referred to as <code>Friendica\Core\Config</code>, however it isn't very practical, especially when the class was previously used as <code>Config</code>.
Thankfully, PHP provides namespace shortcuts through <code>use</code>.</p>
<p>This language construct just provides a different naming scheme for a namespace or a class, but doesn't trigger the autoload-mechanism on its own.
Here are the different ways you can use <code>use</code>:</p>
<p><div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="x">// No use</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="x">$config = new Friendica\Core\Config();</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="x">// Namespace shortcut</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="x">use Friendica\Core;</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="x">$config = new Core\Config();</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="x">// Class name shortcut</span>
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="x">use Friendica\Core\Config;</span>
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="x">$config = new Config();</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="x">// Aliasing</span>
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="x">use Friendica\Core\Config as Cfg;</span>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="x">$config = new Cfg();</span>
</code></pre></div></p>
<p>Whatever the style chosen, a repository-wide search has to be done to find all the class name usage and either use the fully-qualified class name (including the namespace) or add a <code>use</code> statement at the start of each relevant file.</p>
<h2 id="escape-non-namespace-classes">Escape non-namespace classes<a class="headerlink" href="#escape-non-namespace-classes" title="Permanent link">#</a></h2>
<p>The class file you just moved is now in the <code>Friendica</code> namespace, but it probably isn't the case for all the classes referenced in this file.
Since we added a <code>namespace Friendica\Core;</code> to the file, all the class names still declared in <code>include</code> will be implicitly understood as <code>Friendica\Core\ClassName</code>, which is rarely what we expect.</p>
<p>To avoid <code>Class Friendica\Core\ClassName not found</code> errors, all the <code>include</code>-declared class names have to be prepended with a <code>\</code>, it tells the autoloader not to look for the class in the namespace but in the global space where non-namespaced classes are set.
If there are only a handful of references to a single non-namespaced class, just prepending <code>\</code> is enough. However, if there are many instance, we can use <code>use</code> again.</p>
<p><div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="x">namespace Friendica\Core;</span>
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="x">...</span>
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="x">if (\DBM::is_result($r)) {</span>
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="x"> ...</span>
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="x">}</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="x">namespace Friendica\Core;</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="x">use Friendica\Database\DBM;</span>
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a>
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="x">if (DBM::is_result($r)) {</span>
<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="x"> ...</span>
<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="x">}</span>
</code></pre></div></p>
<h2 id="remove-any-useless-require">Remove any useless <code>require</code><a class="headerlink" href="#remove-any-useless-require" title="Permanent link">#</a></h2>
<p>Now that you successfully moved your class to the autoloaded <code>src</code> folder, there's no need to include this file anywhere in the app ever again.
Please remove all the <code>require_once</code> mentions of the former file, as they will provoke a Fatal Error even if the class isn't used.</p>
<h2 id="miscellaneous-tips">Miscellaneous tips<a class="headerlink" href="#miscellaneous-tips" title="Permanent link">#</a></h2>
<p>When you are done with moving the class, please run <code>php bin/console.php typo</code> from the Friendica base directory to check for obvious mistakes.
However, this tool isn't bullet-proof, and a staging install of Friendica is recommended to test your class move without impairing your production server if you host one.</p>
<p>Most of Friendica processes are run in the background, so make sure to turn on your debug log to check for errors that wouldn't show up while simply browsing Friendica.</p>
<p>Check the class file for any magic constant <code>__FILE__</code> or <code>__DIR__</code>, as their value changed since you moved the class in the file tree.
Most of the time it's used for debugging purposes but there can be instances where it's used to create cache folders for example.</p>
<h2 id="related">Related<a class="headerlink" href="#related" title="Permanent link">#</a></h2>
<ul>
<li><a href="../autoloader/">Class autoloading</a></li>
<li><a href="../composer/">Using Composer</a></li>
</ul>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../composer/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Composer" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Composer
</div>
</div>
</a>
<a href="../tests/" class="md-footer__link md-footer__link--next" aria-label="Next: Tests" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Tests
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3632 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/">
<link rel="icon" href="../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Get Started - Friendica documentation</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#where-to-get-started-to-help-improve-friendica" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Get Started
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../developer/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../de/developer/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="./" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Get Started
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Get Started
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#contact-us" class="md-nav__link">
Contact us
</a>
</li>
<li class="md-nav__item">
<a href="#help-other-users" class="md-nav__link">
Help other users
</a>
</li>
<li class="md-nav__item">
<a href="#translation" class="md-nav__link">
Translation
</a>
</li>
<li class="md-nav__item">
<a href="#design" class="md-nav__link">
Design
</a>
</li>
<li class="md-nav__item">
<a href="#programming" class="md-nav__link">
Programming
</a>
<nav class="md-nav" aria-label="Programming">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#composer" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="#coding-standards" class="md-nav__link">
Coding standards
</a>
<nav class="md-nav" aria-label="Coding standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#check-with-php-code-sniffer" class="md-nav__link">
Check with PHP Code Sniffer
</a>
</li>
<li class="md-nav__item">
<a href="#fix-with-php-code-beautifier-and-fixer-phpbcf-included-in-php-code-sniffer" class="md-nav__link">
Fix with PHP Code Beautifier and Fixer (phpbcf) included in PHP Code Sniffer
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#code-documentation" class="md-nav__link">
Code documentation
</a>
</li>
<li class="md-nav__item">
<a href="#issues" class="md-nav__link">
Issues
</a>
</li>
<li class="md-nav__item">
<a href="#web-interface" class="md-nav__link">
Web interface
</a>
</li>
<li class="md-nav__item">
<a href="#client-software" class="md-nav__link">
Client software
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#contact-us" class="md-nav__link">
Contact us
</a>
</li>
<li class="md-nav__item">
<a href="#help-other-users" class="md-nav__link">
Help other users
</a>
</li>
<li class="md-nav__item">
<a href="#translation" class="md-nav__link">
Translation
</a>
</li>
<li class="md-nav__item">
<a href="#design" class="md-nav__link">
Design
</a>
</li>
<li class="md-nav__item">
<a href="#programming" class="md-nav__link">
Programming
</a>
<nav class="md-nav" aria-label="Programming">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#composer" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="#coding-standards" class="md-nav__link">
Coding standards
</a>
<nav class="md-nav" aria-label="Coding standards">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#check-with-php-code-sniffer" class="md-nav__link">
Check with PHP Code Sniffer
</a>
</li>
<li class="md-nav__item">
<a href="#fix-with-php-code-beautifier-and-fixer-phpbcf-included-in-php-code-sniffer" class="md-nav__link">
Fix with PHP Code Beautifier and Fixer (phpbcf) included in PHP Code Sniffer
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#code-documentation" class="md-nav__link">
Code documentation
</a>
</li>
<li class="md-nav__item">
<a href="#issues" class="md-nav__link">
Issues
</a>
</li>
<li class="md-nav__item">
<a href="#web-interface" class="md-nav__link">
Web interface
</a>
</li>
<li class="md-nav__item">
<a href="#client-software" class="md-nav__link">
Client software
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/en/developer/index.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">Developer</span>
<span class="md-tag">Intro</span>
</nav>
<h1 id="where-to-get-started-to-help-improve-friendica">Where to get started to help improve Friendica<a class="headerlink" href="#where-to-get-started-to-help-improve-friendica" title="Permanent link">#</a></h1>
<p>Do you want to help us improve Friendica?
Here we have compiled some hints on how to get started and some tasks to help you choose.
A project like Friendica is the sum of many contributions.
<strong>Very different skills are required to make good software, not all of them involve coding!</strong>
We are looking for helpers in all areas, whether you write text or code, whether you spread the word to convince people or design new icons.
Whether you feel like an expert or like a newbie - join us with your ideas!</p>
<h2 id="contact-us">Contact us<a class="headerlink" href="#contact-us" title="Permanent link">#</a></h2>
<p>The discussion of Friendica development takes place in the following Friendica forums:</p>
<ul>
<li>The main <a href="https://forum.friendi.ca/profile/developers">forum for Friendica development</a></li>
</ul>
<h2 id="help-other-users">Help other users<a class="headerlink" href="#help-other-users" title="Permanent link">#</a></h2>
<p>Remember the questions you had when you first tried Friendica?
A good place to start can be to help new people find their way around Friendica in the <a href="https://forum.friendi.ca/profile/helpers">general support forum</a>.
Welcome them, answer their questions, point them to documentation or ping other helpers directly if you can't help but think you know who can.</p>
<h2 id="translation">Translation<a class="headerlink" href="#translation" title="Permanent link">#</a></h2>
<p>The documentation contains help on how to translate Friendica <a href="translations/">at Transifex</a> where the UI is translated.
If you don't want to translate the UI, or it is already done to your satisfaction, you might want to work on the translation of the /help files?</p>
<h2 id="design">Design<a class="headerlink" href="#design" title="Permanent link">#</a></h2>
<p>Are you good at designing things?
If you have seen Friendica you probably have ideas to improve it, haven't you?</p>
<ul>
<li>If you would like to work with us on enhancing the user interface, please join the <a href="https://forum.friendi.ca/profile/developers">forum for Friendica development</a>.</li>
<li>Make plans for a better Friendica interface design and share them with us.</li>
<li>Tell us if you are able to realize your ideas or what kind of help you need.
We can't promise we have the right skills in the group, but we'll try.</li>
<li>Choose a thing to start with, e.g. work on the icon set of your favorite theme</li>
</ul>
<h2 id="programming">Programming<a class="headerlink" href="#programming" title="Permanent link">#</a></h2>
<p>Friendica uses an implementation of <a href="domain-driven-design/">Domain-Driven-Design</a>, please make sure to check out the provided links for hints at the expected code architecture.</p>
<h3 id="composer">Composer<a class="headerlink" href="#composer" title="Permanent link">#</a></h3>
<p>Friendica uses <a href="https://getcomposer.org">Composer</a> to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes.</p>
<p>It's a command-line tool that downloads required libraries into the <code>vendor</code> folder and makes any namespaced class in <code>src</code> available through the whole application through <code>boot.php</code>.</p>
<p>If you want to have git automatically update the dependencies with composer, you can use the <code>post-merge</code> <a href="https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks">git-hook</a> with a script similar to this one:</p>
<div class="highlight"><pre><span></span><code>#!/usr/bin/env bash
# MIT © Sindre Sorhus - sindresorhus.com
# forked by Gianluca Guarini
# phponly by Ivo Bathke ;)
# modified for Friendica by Tobias Diekershoff
changed_files=&quot;$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)&quot;
check_run() {
echo &quot;$changed_files&quot; | grep --quiet &quot;$1&quot; &amp;&amp; eval &quot;$2&quot;
}
# `composer install` if the `composer.lock` file gets changed
# to update all the php dependencies
check_run composer.lock &quot;bin/composer.phar install --no-dev&quot;
</code></pre></div>
<p>just place it into <code>.git/hooks/post-merge</code> and make it executable.</p>
<ul>
<li><a href="autoloader/">Class autoloading</a></li>
<li><a href="composer/">Using Composer</a></li>
<li><a href="how-to-move-classes-to-src/">How To Move Classes to <code>src</code></a></li>
</ul>
<h3 id="coding-standards">Coding standards<a class="headerlink" href="#coding-standards" title="Permanent link">#</a></h3>
<p>For the sake of consistency between contribution and general code readability, Friendica follows the widespread <a href="http://www.php-fig.org/psr/psr-2/">PSR-2 coding standards</a> to the exception to a few rules.
Here's a few primers if you are new to Friendica or to the PSR-2 coding standards:</p>
<ul>
<li>Indentation is tabs, period (not PSR-2).</li>
<li>By default, strings are enclosed in single quotes, but feel free to use double quotes if it makes more sense (SQL queries, adding tabs and line feeds).</li>
<li>Operators are wrapped by spaces, e.g. <code>$var === true</code>, <code>$var = 1 + 2</code> and <code>'string' . $concat . 'enation'</code></li>
<li>Braces are mandatory in conditions</li>
<li>Boolean operators are <code>&amp;&amp;</code> and <code>||</code> for PHP conditions, <code>AND</code> and <code>OR</code> for SQL queries</li>
<li>No closing PHP tag</li>
<li>No trailing spaces</li>
<li>Array declarations use the new square brackets syntax</li>
<li>Quoting style is single quotes by default, except for needed string interpolation, SQL query strings by convention and comments that should stay in natural language.</li>
</ul>
<p>Don't worry, you don't have to know by heart the PSR-2 coding standards to start contributing to Friendica.
There are a few tools you can use to check or fix your files before you commit.</p>
<p>For documentation, we use the standard of <em>one sentence per line</em> for the <code>md</code> files in the <code>/doc</code> and <code>/doc/$lng</code> subdirectories.</p>
<h4 id="check-with-php-code-sniffer">Check with <a href="https://github.com/squizlabs/PHP_CodeSniffer">PHP Code Sniffer</a><a class="headerlink" href="#check-with-php-code-sniffer" title="Permanent link">#</a></h4>
<p>This tool checks your files against a variety of coding standards, including PSR-2, and outputs a report of all the standard violations.
You can simply install it through PEAR: <code>pear install PHP_CodeSniffer</code>
Once it is installed and available in your PATH, here's the command to run before committing your work:</p>
<div class="highlight"><pre><span></span><code>$&gt; phpcs --standard=ruleset.xml &lt;file or directory&gt;
</code></pre></div>
<p>The output is a list of all the coding standards violations that you should fix before committing your work.
Additionally, <code>phpcs</code> integrates with a few IDEs (Eclipse, Netbeans, PHPStorm...) so that you don't have to fiddle with the command line.</p>
<h4 id="fix-with-php-code-beautifier-and-fixer-phpbcf-included-in-php-code-sniffer">Fix with PHP Code Beautifier and Fixer (phpbcf) included in PHP Code Sniffer<a class="headerlink" href="#fix-with-php-code-beautifier-and-fixer-phpbcf-included-in-php-code-sniffer" title="Permanent link">#</a></h4>
<p>If you're getting a massive list of standards violations when running <code>phpcs</code>, it can be annoying to fix all the violations by hand.
Thankfully, PHP Code Sniffer is shipped with an automatic code fixer that can take care of the tedious task for you.
Here's the command to automatically fix the files you created/modified:</p>
<div class="highlight"><pre><span></span><code>$&gt; phpcbf --standard=ruleset.xml &lt;file or directory&gt;
</code></pre></div>
<p>If the command-line tools <code>diff</code> and <code>patch</code> are unavailable for you, <code>phpcbf</code> can use slightly slower PHP equivalents by using the <code>--no-patch</code> argument.</p>
<h3 id="code-documentation">Code documentation<a class="headerlink" href="#code-documentation" title="Permanent link">#</a></h3>
<p>If you are interested in having the documentation of the Friendica code outside the code files, you can use <a href="http://doxygen.org">Doxygen</a> to generate it.
The configuration file for Doxygen is located in the base directory of the project sources.
Run</p>
<div class="highlight"><pre><span></span><code>$&gt; doxygen Doxyfile
</code></pre></div>
<p>to generate the files which will be located in the <code>doc/html</code> subdirectory in the Friendica directory.
You can browse these files with any browser.</p>
<p>If you find missing documentation, don't hesitate to contact us and write it down to enhance the code documentation.</p>
<h3 id="issues">Issues<a class="headerlink" href="#issues" title="Permanent link">#</a></h3>
<p>Have a look at our <a href="https://github.com/friendica/friendica">issue tracker</a> on GitHub!</p>
<ul>
<li>Try to reproduce a bug that needs more inquiries and write down what you find out.</li>
<li>If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed.</li>
<li>Fix a bug if you can. Please make the pull request against the <em>develop</em> branch of the repository.</li>
<li>There is a <em><a href="https://github.com/friendica/friendica/issues?q=is%3Aopen+is%3Aissue+label%3A" title="Junior+Jobs">Junior Job</a></em> label for issues we think might be a good point to start with.
But you don't have to limit yourself to those issues.</li>
</ul>
<h3 id="web-interface">Web interface<a class="headerlink" href="#web-interface" title="Permanent link">#</a></h3>
<p>The thing many people want most is a better interface, preferably a responsive Friendica theme.
This is a piece of work!
If you want to get involved here:</p>
<ul>
<li>Look at the first steps that were made (e.g. the clean theme).
Ask us to find out whom to talk to about their experiences.</li>
<li>Talk to design people if you know any.</li>
<li>Let us know about your plans <a href="https://forum.friendi.ca/profile/developers">in the dev forum</a>
Do not worry about cross-posting.</li>
</ul>
<h3 id="client-software">Client software<a class="headerlink" href="#client-software" title="Permanent link">#</a></h3>
<p>As Friendica is using a <a href="../spec/api/">Twitter/GNU Social compatible API</a> any of the clients for those platforms should work with Friendica as well.
Furthermore, there are several client projects, especially for use with Friendica.
If you are interested in improving those clients, please contact the developers of the clients directly.</p>
<ul>
<li>Android / LinageOS: <strong>Friendiqa</strong> <a href="https://git.friendi.ca/lubuwest/Friendiqa">src</a>/<a href="https://play.google.com/store/apps/details?id=org.qtproject.friendiqa">Google Play</a> developed by <a href="https://freunde.ma-nic.de/profile/marco">Marco R</a></li>
<li>iOS: <em>currently no client</em></li>
<li>SailfishOS: <strong>Friendiy</strong> <a href="https://kirgroup.com/projects/fabrixxm/harbour-friendly">src</a> - developed by <a href="https://kirgroup.com/profile/fabrixxm/profile">Fabio</a></li>
<li>Windows: <strong>Friendica Mobile</strong> for Windows versions <a href="http://windowsphone.com/s?appid=e3257730-c9cf-4935-9620-5261e3505c67">before 8.1</a> and <a href="https://www.microsoft.com/store/apps/9nblggh0fhmn">Windows 10</a> - developed by <a href="http://mozartweg.dyndns.org/friendica/profile/gerhard/profile">Gerhard Seeber</a></li>
</ul>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../admin/faq/" class="md-footer__link md-footer__link--prev" aria-label="Previous: FAQ" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
FAQ
</div>
</div>
</a>
<a href="github/" class="md-footer__link md-footer__link--next" aria-label="Next: GitHub" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
GitHub
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3652 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/smarty3-templates/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Smarty3 - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#friendica-templating-documentation" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Smarty3
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/smarty3-templates/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/smarty3-templates/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" checked>
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Smarty3
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Smarty3
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#form-templates" class="md-nav__link">
Form Templates
</a>
<nav class="md-nav" aria-label="Form Templates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#field_checkboxtpl" class="md-nav__link">
field_checkbox.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_comboboxtpl" class="md-nav__link">
field_combobox.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_customtpl" class="md-nav__link">
field_custom.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_inputtpl" class="md-nav__link">
field_input.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_intcheckboxtpl" class="md-nav__link">
field_intcheckbox.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_openidtpl" class="md-nav__link">
field_openid.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_passwordtpl" class="md-nav__link">
field_password.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_radiotpl" class="md-nav__link">
field_radio.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_richtexttpl" class="md-nav__link">
field_richtext.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_selecttpl" class="md-nav__link">
field_select.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_select_rawtpl" class="md-nav__link">
field_select_raw.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_textareatpl" class="md-nav__link">
field_textarea.tpl
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#form-templates" class="md-nav__link">
Form Templates
</a>
<nav class="md-nav" aria-label="Form Templates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#field_checkboxtpl" class="md-nav__link">
field_checkbox.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_comboboxtpl" class="md-nav__link">
field_combobox.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_customtpl" class="md-nav__link">
field_custom.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_inputtpl" class="md-nav__link">
field_input.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_intcheckboxtpl" class="md-nav__link">
field_intcheckbox.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_openidtpl" class="md-nav__link">
field_openid.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_passwordtpl" class="md-nav__link">
field_password.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_radiotpl" class="md-nav__link">
field_radio.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_richtexttpl" class="md-nav__link">
field_richtext.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_selecttpl" class="md-nav__link">
field_select.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_select_rawtpl" class="md-nav__link">
field_select_raw.tpl
</a>
</li>
<li class="md-nav__item">
<a href="#field_textareatpl" class="md-nav__link">
field_textarea.tpl
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/smarty3-templates.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">templates</span>
<span class="md-tag">themes</span>
</nav>
<h1 id="friendica-templating-documentation">Friendica Templating Documentation<a class="headerlink" href="#friendica-templating-documentation" title="Permanent link">#</a></h1>
<p>Friendica uses <a href="http://www.smarty.net/">Smarty 3</a> as PHP templating engine.
The main templates are found in</p>
<div class="highlight"><pre><span></span><code> /view/templates
</code></pre></div>
<p>theme authors may overwrite the default templates by putting a files with the same name into the</p>
<div class="highlight"><pre><span></span><code> /view/themes/$themename/templates
</code></pre></div>
<p>directory.</p>
<p>Templates that are only used by addons shall be placed in the</p>
<div class="highlight"><pre><span></span><code> /addon/$addonname/templates
</code></pre></div>
<p>directory.</p>
<p>To render a template use the function <em>getMarkupTemplate</em> to load the template and <em>replaceMacros</em> to replace the macros/variables in the just loaded template file.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="x">$tpl = Renderer::getMarkupTemplate(&#39;install_settings.tpl&#39;);</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="x">$o .= Renderer::replaceMacros($tpl, array( ... ));</span>
</code></pre></div>
<p>the array consists of an association of an identifier and the value for that identifier, i.e.</p>
<div class="highlight"><pre><span></span><code> &#39;$title&#39; =&gt; $install_title,
</code></pre></div>
<p>where the value may as well be an array by its own.</p>
<h2 id="form-templates">Form Templates<a class="headerlink" href="#form-templates" title="Permanent link">#</a></h2>
<p>To guarantee a consistent look and feel for input forms, i.e. in the settings sections, there are templates for the basic form fields.
They are initialized with an array of data, depending on the style of the field.</p>
<p>All of these take an array holding the values, e.g. for a one line text input field, which is required and should be used to type email addresses use something along the lines of:</p>
<div class="highlight"><pre><span></span><code> &#39;$adminmail&#39; =&gt; array(&#39;adminmail&#39;, DI::l10n()-&gt;t(&#39;Site administrator email address&#39;), $adminmail, DI::l10n()-&gt;t(&#39;Your account email address must match this in order to use the web admin panel.&#39;), &#39;required&#39;, &#39;&#39;, &#39;email&#39;),
</code></pre></div>
<p>To evaluate the input value, you can then use the $_POST array, more precisely the $_POST['adminemail'] variable.</p>
<p>Listed below are the template file names, the general purpose of the template and their field parameters.</p>
<h3 id="field_checkboxtpl">field_checkbox.tpl<a class="headerlink" href="#field_checkboxtpl" title="Permanent link">#</a></h3>
<p>A checkbox.
If the checkbox is checked its value is <strong>1</strong>.
Field parameter:</p>
<ol>
<li>Name of the checkbox,</li>
<li>Label for the checkbox,</li>
<li>State checked? if true then the checkbox will be marked as checked,</li>
<li>Help text for the checkbox.</li>
</ol>
<h3 id="field_comboboxtpl">field_combobox.tpl<a class="headerlink" href="#field_comboboxtpl" title="Permanent link">#</a></h3>
<p>A combobox, combining a pull down selection and a textual input field.
Field parameter:</p>
<ol>
<li>Name of the combobox,</li>
<li>Label for the combobox,</li>
<li>Current value of the variable,</li>
<li>Help text for the combobox,</li>
<li>Array holding the possible values for the textual input,</li>
<li>Array holding the possible values for the pull down selection.</li>
</ol>
<h3 id="field_customtpl">field_custom.tpl<a class="headerlink" href="#field_customtpl" title="Permanent link">#</a></h3>
<p>A customizable template to include a custom element in the form with the usual surroundings,
Field parameter:</p>
<ol>
<li>Name of the field,</li>
<li>Label for the field,</li>
<li>the field,</li>
<li>Help text for the field.</li>
</ol>
<h3 id="field_inputtpl">field_input.tpl<a class="headerlink" href="#field_inputtpl" title="Permanent link">#</a></h3>
<p>A single line input field for any type of input.
Field parameter:</p>
<ol>
<li>Name of the field,</li>
<li>Label for the input box,</li>
<li>Current value of the variable,</li>
<li>Help text for the input box,</li>
<li>Should be set to the translation of "Required" to mark this field as required,</li>
<li>if set to "autofocus" modern browser will put the cursor into this box once the page is loaded,</li>
<li>if set, it will be used for the input type, default is <code>text</code> (possible types: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#%3Cinput%3E_types).</li>
</ol>
<h3 id="field_intcheckboxtpl">field_intcheckbox.tpl<a class="headerlink" href="#field_intcheckboxtpl" title="Permanent link">#</a></h3>
<p>A checkbox (see above) but you can define the value of it.
Field parameter:</p>
<ol>
<li>Name of the checkbox,</li>
<li>Label for the checkbox,</li>
<li>State checked? if true then the checkbox will be marked as checked,</li>
<li>Value of the checkbox,</li>
<li>Help text for the checkbox.</li>
</ol>
<h3 id="field_openidtpl">field_openid.tpl<a class="headerlink" href="#field_openidtpl" title="Permanent link">#</a></h3>
<p>An input box (see above) but prepared for special CSS styling for openID input.
Field parameter:</p>
<ol>
<li>Name of the field,</li>
<li>Label for the input box,</li>
<li>Current value of the variable,</li>
<li>Help text for the input field.</li>
</ol>
<h3 id="field_passwordtpl">field_password.tpl<a class="headerlink" href="#field_passwordtpl" title="Permanent link">#</a></h3>
<p>A single line input field (see above) for textual input.
The characters typed in will not be shown by the browser.
Field parameter:</p>
<ol>
<li>Name of the field,</li>
<li>Label for the field,</li>
<li>Value for the field, e.g. the old password,</li>
<li>Help text for the input field,</li>
<li>Should be set to the translation of "Required" to mark this field as required,</li>
<li>if set to "autofocus" modern browser will put the cursor automatically into this input field.</li>
</ol>
<h3 id="field_radiotpl">field_radio.tpl<a class="headerlink" href="#field_radiotpl" title="Permanent link">#</a></h3>
<p>A radio button.
Field parameter:</p>
<ol>
<li>Name of the radio button,</li>
<li>Label for the radio button,</li>
<li>Current value of the variable,</li>
<li>Help text for the button,</li>
<li>if set, the radio button will be checked.</li>
</ol>
<h3 id="field_richtexttpl">field_richtext.tpl<a class="headerlink" href="#field_richtexttpl" title="Permanent link">#</a></h3>
<p>A multi-line input field for <em>rich</em> textual content.
Field parameter:</p>
<ol>
<li>Name of the input field,</li>
<li>Label for the input box,</li>
<li>Current text for the box,</li>
<li>Help text for the input box.</li>
</ol>
<h3 id="field_selecttpl">field_select.tpl<a class="headerlink" href="#field_selecttpl" title="Permanent link">#</a></h3>
<p>A drop-down selection box.
Field parameter:</p>
<ol>
<li>Name of the field,</li>
<li>Label of the selection box,</li>
<li>Current selected value,</li>
<li>Help text for the selection box,</li>
<li>Array holding the possible values of the selection drop-down.</li>
</ol>
<h3 id="field_select_rawtpl">field_select_raw.tpl<a class="headerlink" href="#field_select_rawtpl" title="Permanent link">#</a></h3>
<p>A drop-down selection box (see above) but you have to prepare the values yourself.
Field parameter:</p>
<ol>
<li>Name of the field,</li>
<li>Label of the selection box,</li>
<li>Current selected value,</li>
<li>Help text for the selection box,</li>
<li>Possible values of the selection drop-down.</li>
</ol>
<h3 id="field_textareatpl">field_textarea.tpl<a class="headerlink" href="#field_textareatpl" title="Permanent link">#</a></h3>
<p>A multi-line input field for (plain) textual content.
Field parameter:</p>
<ol>
<li>Name of the input field,</li>
<li>Label for the input box,</li>
<li>Current text for the box,</li>
<li>Help text for the input box,</li>
<li>Should be set to the translation of "Required" to mark this field as required.</li>
</ol>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../themes/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Themes" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Themes
</div>
</div>
</a>
<a href="../addon-storage-backend/" class="md-footer__link md-footer__link--next" aria-label="Next: Addon Storage Backend" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Addon Storage Backend
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3280 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/tests/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Tests - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#tests" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Tests
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/tests/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/tests/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" checked>
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/tests.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">testing</span>
</nav>
<h1 id="tests">Tests<a class="headerlink" href="#tests" title="Permanent link">#</a></h1>
<p>You can run unit tests with <a href="https://phpunit.de/">PHPUnit</a>:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>phpunit
</code></pre></div>
<p>Some tests require access to a MySQL database.
You can specify the database credentials in environment variables:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="nv">USER</span><span class="o">=</span>database_user <span class="nv">PASS</span><span class="o">=</span>database_password <span class="nv">DB</span><span class="o">=</span>database_name phpunit
</code></pre></div>
<p><strong>Warning</strong>: This will empty all the tables! Never use this on a production database.</p>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../how-to-move-classes-to-src/" class="md-footer__link md-footer__link--prev" aria-label="Previous: src Migration" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
src Migration
</div>
</div>
</a>
<a href="../autoloader/" class="md-footer__link md-footer__link--next" aria-label="Next: Autoloader" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Autoloader
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3757 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/themes/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Themes - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#themes" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Themes
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/themes/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/themes/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" checked>
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Themes
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Themes
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#styling" class="md-nav__link">
Styling
</a>
</li>
<li class="md-nav__item">
<a href="#templates" class="md-nav__link">
Templates
</a>
</li>
<li class="md-nav__item">
<a href="#javascript" class="md-nav__link">
Javascript
</a>
</li>
<li class="md-nav__item">
<a href="#expand-an-existing-theme" class="md-nav__link">
Expand an existing Theme
</a>
<nav class="md-nav" aria-label="Expand an existing Theme">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#theme-variations" class="md-nav__link">
Theme Variations
</a>
</li>
<li class="md-nav__item">
<a href="#inheritance" class="md-nav__link">
Inheritance
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#creating-a-theme-from-scratch" class="md-nav__link">
Creating a Theme from Scratch
</a>
</li>
<li class="md-nav__item">
<a href="#special-files" class="md-nav__link">
Special Files
</a>
<nav class="md-nav" aria-label="Special Files">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unsupported" class="md-nav__link">
unsupported
</a>
</li>
<li class="md-nav__item">
<a href="#readmemd" class="md-nav__link">
README(.md)
</a>
</li>
<li class="md-nav__item">
<a href="#screenshotpngjpg" class="md-nav__link">
screenshot.[png|jpg]
</a>
</li>
<li class="md-nav__item">
<a href="#themephp" class="md-nav__link">
theme.php
</a>
</li>
<li class="md-nav__item">
<a href="#defaultphp" class="md-nav__link">
default.php
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#styling" class="md-nav__link">
Styling
</a>
</li>
<li class="md-nav__item">
<a href="#templates" class="md-nav__link">
Templates
</a>
</li>
<li class="md-nav__item">
<a href="#javascript" class="md-nav__link">
Javascript
</a>
</li>
<li class="md-nav__item">
<a href="#expand-an-existing-theme" class="md-nav__link">
Expand an existing Theme
</a>
<nav class="md-nav" aria-label="Expand an existing Theme">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#theme-variations" class="md-nav__link">
Theme Variations
</a>
</li>
<li class="md-nav__item">
<a href="#inheritance" class="md-nav__link">
Inheritance
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#creating-a-theme-from-scratch" class="md-nav__link">
Creating a Theme from Scratch
</a>
</li>
<li class="md-nav__item">
<a href="#special-files" class="md-nav__link">
Special Files
</a>
<nav class="md-nav" aria-label="Special Files">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unsupported" class="md-nav__link">
unsupported
</a>
</li>
<li class="md-nav__item">
<a href="#readmemd" class="md-nav__link">
README(.md)
</a>
</li>
<li class="md-nav__item">
<a href="#screenshotpngjpg" class="md-nav__link">
screenshot.[png|jpg]
</a>
</li>
<li class="md-nav__item">
<a href="#themephp" class="md-nav__link">
theme.php
</a>
</li>
<li class="md-nav__item">
<a href="#defaultphp" class="md-nav__link">
default.php
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/themes.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">themes</span>
<span class="md-tag">templates</span>
</nav>
<h1 id="themes">Themes<a class="headerlink" href="#themes" title="Permanent link">#</a></h1>
<p>To change the look of friendica you have to touch the themes.
The current default theme is <a href="https://github.com/friendica/friendica/tree/stable/view/theme/vier">Vier</a> but there are numerous others.
Have a look at <a href="https://github.com/bkil/friendica-themes">github.com/bkil/friendica-themes</a> for an overview of the existing themes.
In case none of them suits your needs, there are several ways to change a theme.</p>
<p>So, how to work on the UI of friendica.</p>
<p>You can either directly edit an existing theme.
But you might lose your changes when the theme is updated by the friendica team.</p>
<p>If you are almost happy with an existing theme, the easiest way to cover your needs is to create a new theme, inheritance most of the properties of the parent theme and change just minor stuff.
The below for a more detailed description of theme heritage.</p>
<p>Some themes also allow users to select <em>variants</em> of the theme.
Those theme variants most often contain an additional <a href="https://en.wikipedia.org/wiki/CSS">CSS</a> file to override some styling of the default theme values.
From the themes in the main repository <em>duepunto zero</em> and <em>vier</em> are using these methods for variations.
Quattro is using a slightly different approach.</p>
<p>Third you can start your theme from scratch.
Which is the most complex way to change friendicas look.
But it leaves you the most freedom.
So below for a <em>detailed</em> description and the meaning of some special files.</p>
<h2 id="styling">Styling<a class="headerlink" href="#styling" title="Permanent link">#</a></h2>
<p>If you want to change the styling of a theme, have a look at the themes CSS file.
In most cases, you can find these in</p>
<div class="highlight"><pre><span></span><code>/view/theme/**your-theme-name**/style.css
</code></pre></div>
<p>sometimes, there is also a file called style.php in the theme directory.
This is only needed if the theme allows the user to change certain things of the theme dynamically.
Say the font size or set a background image.</p>
<h2 id="templates">Templates<a class="headerlink" href="#templates" title="Permanent link">#</a></h2>
<p>If you want to change the structure of the theme, you need to change the templates used by the theme.
Friendica themes are using <a href="http://www.smarty.net/">SMARTY3</a> for templating.
The default template can be found in</p>
<div class="highlight"><pre><span></span><code>/view/templates
</code></pre></div>
<p>if you want to override any template within your theme create your version of the template in</p>
<div class="highlight"><pre><span></span><code>/view/theme/**your-theme-name**/templates
</code></pre></div>
<p>any template that exists there will be used instead of the default one.</p>
<h2 id="javascript">Javascript<a class="headerlink" href="#javascript" title="Permanent link">#</a></h2>
<p>The same rule applies to the JavaScript files found in</p>
<div class="highlight"><pre><span></span><code>/js
</code></pre></div>
<p>they will be overwritten by files in</p>
<div class="highlight"><pre><span></span><code>/view/theme/**your-theme-name**/js.
</code></pre></div>
<h2 id="expand-an-existing-theme">Expand an existing Theme<a class="headerlink" href="#expand-an-existing-theme" title="Permanent link">#</a></h2>
<h3 id="theme-variations">Theme Variations<a class="headerlink" href="#theme-variations" title="Permanent link">#</a></h3>
<p>Many themes are more <em>theme families</em> than only one theme.
<em>duepunto zero</em> and <em>vier</em> allow easily to add new theme variation.
We will go through the process of creating a new variation for <em>duepunto zero</em>.
The same (well almost, some names change) procedure applies to the <em>vier</em> theme.
And similar steps are needed for <em>quattro</em> but this theme is using <a href="http://lesscss.org/#docs">lesscss</a> to maintain the CSS files.</p>
<p>In</p>
<div class="highlight"><pre><span></span><code>/view/theme/duepuntozero/deriv
</code></pre></div>
<p>you find a couple of CSS files that define color derivations from the duepunto theme.
These resemble some now as unsupported marked themes, that were inherited by the duepunto theme.
Darkzero and Easter Bunny for example.</p>
<p>The selection of the colorset is done in a combination of a template for a new form in the settings and some functions in the theme.php file.
The template (theme_settings.tpl)</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>{{ &#39;{{include file=&quot;field_select.tpl&quot; field=$colorset}}&#39; }}
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;settings-submit-wrapper&quot;</span><span class="p">&gt;</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> {{ &#39;<span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;submit&quot;</span> <span class="na">value</span><span class="o">=</span><span class="s">&quot;{{$submit}}&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;settings-submit&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;duepuntozero-settings-submit&quot;</span> <span class="p">/&gt;</span>&#39; }}
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</code></pre></div>
<p>defines a formular consisting of a <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select">select</a> pull-down which contains all available variants and s submit button.
See the documentation about <a href="../smarty3-templates/">SMARTY3 templates</a> for a summary of friendica specific blocks other than the select element.
But we don't really need to change anything at the template itself.</p>
<p>The template alone won't work though.
You make friendica aware of its existence and tell it how to use the template file, by defining a config.php file.
It needs to define at least the following functions</p>
<ul>
<li>theme_content</li>
<li>theme_post</li>
</ul>
<p>and may also define functions for the admin interface</p>
<ul>
<li>theme_admin</li>
<li>theme_admin_post.</li>
</ul>
<p>theme_content and theme_admin are used to make the form available in the settings, respectively the admin panel.
The _post functions handle the processing of the send-form, in this case they save to selected variant in friendicas database.</p>
<p>To make your own variation appear in the menu, all you need to do is to create a new CSS file in the deriv-directory and include it in the array in the config.php:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="x">$colorset = array(</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="x"> &#39;default&#39;=&gt;DI::l10n()-&gt;t(&#39;default&#39;),</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="x"> &#39;greenzero&#39;=&gt;DI::l10n()-&gt;t(&#39;greenzero&#39;),</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="x"> &#39;purplezero&#39;=&gt;DI::l10n()-&gt;t(&#39;purplezero&#39;),</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="x"> &#39;easterbunny&#39;=&gt;DI::l10n()-&gt;t(&#39;easterbunny&#39;),</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="x"> &#39;darkzero&#39;=&gt;DI::l10n()-&gt;t(&#39;darkzero&#39;),</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="x"> &#39;comix&#39;=&gt;DI::l10n()-&gt;t(&#39;comix&#39;),</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="x"> &#39;slackr&#39;=&gt;DI::l10n()-&gt;t(&#39;slackr&#39;),</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="x">);</span>
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="x"> ```</span>
<a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a>
<a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="x">the 1st part of the line is the name of the CSS file (without the .css) the 2nd part is the common name of the variant.</span>
<a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="x">Calling the DI::l10n()-&gt;t() function with the common name makes the string translatable.</span>
<a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="x">The selected 1st part will be saved in the database by the theme_post function.</span>
<a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a>
<a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a><span class="x">```php</span>
<a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a><span class="k">function</span> <span class="nf">theme_post</span><span class="p">(</span><span class="nx">App</span> <span class="nv">$a</span><span class="p">){</span>
<a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a> <span class="c1">// non-local users shall not pass</span>
<a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a> <span class="k">if</span> <span class="p">(</span><span class="o">!</span> <span class="nx">local_user</span><span class="p">())</span> <span class="p">{</span>
<a id="__codelineno-1-21" name="__codelineno-1-21" href="#__codelineno-1-21"></a> <span class="k">return</span><span class="p">;</span>
<a id="__codelineno-1-22" name="__codelineno-1-22" href="#__codelineno-1-22"></a> <span class="p">}</span>
<a id="__codelineno-1-23" name="__codelineno-1-23" href="#__codelineno-1-23"></a> <span class="c1">// if the one specific submit button was pressed then proceed</span>
<a id="__codelineno-1-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a> <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;duepuntozero-settings-submit&#39;</span><span class="p">])){</span>
<a id="__codelineno-1-25" name="__codelineno-1-25" href="#__codelineno-1-25"></a> <span class="c1">// and save the selection key into the personal config of the user</span>
<a id="__codelineno-1-26" name="__codelineno-1-26" href="#__codelineno-1-26"></a> <span class="nx">DI</span><span class="o">::</span><span class="na">pConfig</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="nx">local_user</span><span class="p">(),</span> <span class="s1">&#39;duepuntozero&#39;</span><span class="p">,</span> <span class="s1">&#39;colorset&#39;</span><span class="p">,</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;duepuntozero_colorset&#39;</span><span class="p">]);</span>
<a id="__codelineno-1-27" name="__codelineno-1-27" href="#__codelineno-1-27"></a> <span class="p">}</span>
<a id="__codelineno-1-28" name="__codelineno-1-28" href="#__codelineno-1-28"></a><span class="p">}</span>
</code></pre></div>
<p>Now that this information is set in the database, what should friendica do with it?
For this, have a look at the theme.php file of the <em>duepunto zero</em>.
There you'll find something alike</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="nv">$colorset</span> <span class="o">=</span> <span class="nx">DI</span><span class="o">::</span><span class="na">pConfig</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span> <span class="nx">local_user</span><span class="p">(),</span> <span class="s1">&#39;duepuntozero&#39;</span><span class="p">,</span><span class="s1">&#39;colorset&#39;</span><span class="p">);</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$colorset</span><span class="p">)</span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="nv">$colorset</span> <span class="o">=</span> <span class="nx">DI</span><span class="o">::</span><span class="na">config</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="s1">&#39;duepuntozero&#39;</span><span class="p">,</span> <span class="s1">&#39;colorset&#39;</span><span class="p">);</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="k">if</span> <span class="p">(</span><span class="nv">$colorset</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="k">if</span> <span class="p">(</span><span class="nv">$colorset</span> <span class="o">==</span> <span class="s1">&#39;greenzero&#39;</span><span class="p">)</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> <span class="nx">DI</span><span class="o">::</span><span class="na">page</span><span class="p">()[</span><span class="s1">&#39;htmlhead&#39;</span><span class="p">]</span> <span class="o">.=</span> <span class="s1">&#39;&lt;link rel=&quot;stylesheet&quot; href=&quot;view/theme/duepuntozero/deriv/greenzero.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;&#39;</span><span class="o">.</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">;</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> <span class="cm">/* some more variants */</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="p">}</span>
</code></pre></div>
<p>which tells friendica to get the personal config of a user.
Check if it is set and if not look for the global config.
And finally if a config for the colorset was found, apply it by adding a link to the CSS file into the HTML header of the page.
So you'll just need to add an if selection, fitting your variant keyword and link to the CSS file of it.</p>
<p>Done.
Now you can use the variant on your system.
But remember once the theme.php or the config.php you have to re-add your variant to them.
If you think your color variation could be beneficial for other friendica users as well, feel free to generate a pull request at GitHub, so we can include your work into the repository.</p>
<h3 id="inheritance">Inheritance<a class="headerlink" href="#inheritance" title="Permanent link">#</a></h3>
<p>Say, you like the duepuntozero, but you want to have the content of the outer columns left and right exchanged.
That would be not a color variation as shown above.
Instead, we will create a new theme, duepuntozero_lr, inherit the properties of duepuntozero and make small changes to the underlying php files.</p>
<p>So create a directory called duepunto_lr and create a file called theme.php with your favorite text editor.
The content of this file should be something like</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="cm">/* meta information for the theme, see below */</span>
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="k">use</span> <span class="nx">Friendica\App</span><span class="p">;</span>
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="k">function</span> <span class="nf">duepuntozero_lr_init</span><span class="p">(</span><span class="nx">App</span> <span class="nv">$a</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a> <span class="nv">$a</span><span class="o">-&gt;</span><span class="na">setThemeInfoValue</span><span class="p">(</span><span class="s1">&#39;extends&#39;</span><span class="p">,</span> <span class="s1">&#39;duepuntozero&#39;</span><span class="p">);</span>
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a>
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a> <span class="nv">$a</span><span class="o">-&gt;</span><span class="na">set_template_engine</span><span class="p">(</span><span class="s1">&#39;smarty3&#39;</span><span class="p">);</span>
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a> <span class="cm">/* and more stuff e.g. the JavaScript function for the header */</span>
<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="p">}</span>
</code></pre></div>
<p>Next take the default.php file found in the /view directory and exchange the aside and right_aside elements.
So the central part of the file now looks like this:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a> <span class="cp">&lt;?php if(!empty($page[&#39;nav&#39;])) echo $page[&#39;nav&#39;]; ?&gt;</span>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a> <span class="p">&lt;</span><span class="nt">aside</span><span class="p">&gt;</span><span class="cp">&lt;?php if(!empty($page[&#39;right_aside&#39;])) echo $page[&#39;right_aside&#39;]; ?&gt;</span><span class="p">&lt;/</span><span class="nt">aside</span><span class="p">&gt;</span>
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a> <span class="p">&lt;</span><span class="nt">section</span><span class="p">&gt;</span><span class="cp">&lt;?php if(!empty($page[&#39;content&#39;])) echo $page[&#39;content&#39;]; ?&gt;</span>
<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;page-footer&quot;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
<a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a> <span class="p">&lt;/</span><span class="nt">section</span><span class="p">&gt;</span>
<a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a> <span class="p">&lt;</span><span class="nt">right_aside</span><span class="p">&gt;</span><span class="cp">&lt;?php if(!empty($page[&#39;aside&#39;])) echo $page[&#39;aside&#39;]; ?&gt;</span><span class="p">&lt;/</span><span class="nt">right_aside</span><span class="p">&gt;</span>
<a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a> <span class="p">&lt;</span><span class="nt">footer</span><span class="p">&gt;</span><span class="cp">&lt;?php if(!empty($page[&#39;footer&#39;])) echo $page[&#39;footer&#39;]; ?&gt;</span><span class="p">&lt;/</span><span class="nt">footer</span><span class="p">&gt;</span>
<a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</code></pre></div>
<p>Finally, we need a style.css file, inheriting the definitions from the parent theme and containing out changes for the new theme.
<strong><em>Note</em></strong>:You need to create the style.css and at lest import the base CSS file from the parent theme.</p>
<div class="highlight"><pre><span></span><code>@import url(&#39;../duepuntozero/style.css&#39;);
</code></pre></div>
<p>Done.
But I agree it is not really useful at this state.
Nevertheless, to use it, you just need to activate in the admin panel.
That done, you can select it in the settings like any other activated theme.</p>
<h2 id="creating-a-theme-from-scratch">Creating a Theme from Scratch<a class="headerlink" href="#creating-a-theme-from-scratch" title="Permanent link">#</a></h2>
<p>Keep patient.
Basically what you have to do is identify which template you have to change, so it looks more like what you want.
Adopt the CSS of the theme accordingly.
And iterate the process until you have the theme the way you want it.</p>
<p><em>Use the source Luke.</em> and don't hesitate to ask in @<a href="https://forum.friendi.ca/profile/developers">developers</a> or @<a href="https://forum.friendi.ca/profile/helpers">helpers</a>.</p>
<h2 id="special-files">Special Files<a class="headerlink" href="#special-files" title="Permanent link">#</a></h2>
<h3 id="unsupported">unsupported<a class="headerlink" href="#unsupported" title="Permanent link">#</a></h3>
<p>If a file with this name (which might be empty) exists in the theme directory, the theme is marked as <em>unsupported</em>.
An unsupported theme may not be selected by a user in the settings.
Users who are already using it won't notice anything.</p>
<h3 id="readmemd">README(.md)<a class="headerlink" href="#readmemd" title="Permanent link">#</a></h3>
<p>The contents of this file, with or without the .md which indicates <a href="https://daringfireball.net/projects/markdown/">Markdown</a> syntax, will be displayed at most repository hosting services and in the theme page within the admin panel of friendica.</p>
<p>This file should contain information you want to let others know about your theme.</p>
<h3 id="screenshotpngjpg">screenshot.[png|jpg]<a class="headerlink" href="#screenshotpngjpg" title="Permanent link">#</a></h3>
<p>If you want to have a preview image of your theme displayed in the settings you should take a screenshot and save it with this name.
Supported formats are PNG and JPEG.</p>
<h3 id="themephp">theme.php<a class="headerlink" href="#themephp" title="Permanent link">#</a></h3>
<p>This is the main definition file of the theme.
In the header of that file, some meta information is stored.
For example, have a look at the theme.php of the <em>quattro</em> theme:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="sd">/**</span>
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="sd"> * Name: Quattro</span>
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="sd"> * Version: 0.6</span>
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="sd"> * Author: Fabio &lt;https://kirgroup.com/profile/fabrixxm&gt;</span>
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a><span class="sd"> * Maintainer: Fabio &lt;https://kirgroup.com/profile/fabrixxm&gt;</span>
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="sd"> * Maintainer: Tobias &lt;https://f.diekershoff.de/profile/tobias&gt;</span>
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="sd"> */</span>
<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a> <span class="sb">```</span>
<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a>
<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a><span class="sb">You see the definition of the theme&#39;s name, it&#39;s version and the initial author of the theme.</span>
<a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a><span class="sb">These three pieces of information should be listed.</span>
<a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a><span class="sb">If the original author is no longer working on the theme, but a maintainer has taken over, the maintainer should be listed as well.</span>
<a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a><span class="sb">The information from the theme header will be displayed in the admin panel.</span>
<a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a>
<a id="__codelineno-5-16" name="__codelineno-5-16" href="#__codelineno-5-16"></a><span class="sb">The first thing in file is to import the `</span><span class="nx">App</span><span class="sb">` class from `</span><span class="nx">\Friendica\</span><span class="sb">` namespace.</span>
<a id="__codelineno-5-17" name="__codelineno-5-17" href="#__codelineno-5-17"></a>
<a id="__codelineno-5-18" name="__codelineno-5-18" href="#__codelineno-5-18"></a><span class="sb">```</span><span class="nx">php</span>
<a id="__codelineno-5-19" name="__codelineno-5-19" href="#__codelineno-5-19"></a><span class="k">use</span> <span class="nx">Friendica\App</span><span class="p">;</span>
</code></pre></div>
<p>This will make our job a little easier, as we don't have to specify the full name every time we need to use the <code>App</code> class.</p>
<p>The next crucial part of the theme.php file is a definition of an init function.
The name of the function is <theme-name>_init.
So in the case of quattro it is</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="cp">&lt;?php</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="k">function</span> <span class="nf">quattro_init</span><span class="p">(</span><span class="nx">App</span> <span class="nv">$a</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a> <span class="nv">$a</span><span class="o">-&gt;</span><span class="na">theme_info</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a> <span class="nv">$a</span><span class="o">-&gt;</span><span class="na">set_template_engine</span><span class="p">(</span><span class="s1">&#39;smarty3&#39;</span><span class="p">);</span>
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="p">}</span>
</code></pre></div>
<p>Here we have set the basic theme information, in this case they are empty.
But the array needs to be set.
And we have set the template engine that should be used by friendica for this theme.
At the moment you should use the <em>smarty3</em> engine.
There once was a friendica specific templating engine as well but that is not used anymore.
If you like to use another templating engine, please implement it.</p>
<p>When you want to inherit stuff from another theme you have to <em>announce</em> this in the theme_info:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="x">$a-&gt;setThemeInfoValue(&#39;extends&#39;, &#39;duepuntozero&#39;);</span>
</code></pre></div>
<p>which declares <em>duepuntozero</em> as parent of the theme.</p>
<p>If you want to add something to the HTML header of the theme, one way to do so is by adding it to the theme.php file.
To do so, add something alike</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="x">DI::page()[&#39;htmlhead&#39;] .= &lt;&lt;&lt; EOT</span>
<a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="x">/* stuff you want to add to the header */</span>
<a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="x">EOT;</span>
</code></pre></div>
<p>The $a variable holds the friendica application.
So you can access the properties of this friendica session from the theme.php file as well.</p>
<h3 id="defaultphp">default.php<a class="headerlink" href="#defaultphp" title="Permanent link">#</a></h3>
<p>This file covers the structure of the underlying HTML layout.
The default file is in</p>
<div class="highlight"><pre><span></span><code>/view/default.php
</code></pre></div>
<p>if you want to change it, say adding a 4th column for banners of your favourite FLOSS projects, place a new default.php file in your theme directory.
As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.</p>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../addons/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Addons" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Addons
</div>
</div>
</a>
<a href="../smarty3-templates/" class="md-footer__link md-footer__link--next" aria-label="Next: Smarty3" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Smarty3
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3540 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/translations/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Translations - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#friendica-translations" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Translations
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/translations/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/translations/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item">
<a href="../vagrant/" class="md-nav__link">
Vagrant
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" checked>
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Translations
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Translations
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="#translate-friendica-in-your-favorite-language" class="md-nav__link">
Translate Friendica in your favorite language
</a>
</li>
<li class="md-nav__item">
<a href="#add-new-translation-strings" class="md-nav__link">
Add new translation strings
</a>
<nav class="md-nav" aria-label="Add new translation strings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#core" class="md-nav__link">
Core
</a>
</li>
<li class="md-nav__item">
<a href="#addon" class="md-nav__link">
Addon
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#update-translations-from-transifex" class="md-nav__link">
Update translations from Transifex
</a>
<nav class="md-nav" aria-label="Update translations from Transifex">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#using-the-transifex-client" class="md-nav__link">
Using the Transifex client
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#translation-functions-usage" class="md-nav__link">
Translation functions usage
</a>
<nav class="md-nav" aria-label="Translation functions usage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#basic-usage" class="md-nav__link">
Basic usage
</a>
</li>
<li class="md-nav__item">
<a href="#plural" class="md-nav__link">
Plural
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="#translate-friendica-in-your-favorite-language" class="md-nav__link">
Translate Friendica in your favorite language
</a>
</li>
<li class="md-nav__item">
<a href="#add-new-translation-strings" class="md-nav__link">
Add new translation strings
</a>
<nav class="md-nav" aria-label="Add new translation strings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#core" class="md-nav__link">
Core
</a>
</li>
<li class="md-nav__item">
<a href="#addon" class="md-nav__link">
Addon
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#update-translations-from-transifex" class="md-nav__link">
Update translations from Transifex
</a>
<nav class="md-nav" aria-label="Update translations from Transifex">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#using-the-transifex-client" class="md-nav__link">
Using the Transifex client
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#translation-functions-usage" class="md-nav__link">
Translation functions usage
</a>
<nav class="md-nav" aria-label="Translation functions usage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#basic-usage" class="md-nav__link">
Basic usage
</a>
</li>
<li class="md-nav__item">
<a href="#plural" class="md-nav__link">
Plural
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/translations.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">translations</span>
</nav>
<h1 id="friendica-translations">Friendica translations<a class="headerlink" href="#friendica-translations" title="Permanent link">#</a></h1>
<h2 id="overview">Overview<a class="headerlink" href="#overview" title="Permanent link">#</a></h2>
<p>The Friendica translation process is based on <code>gettext</code> PO files.</p>
<p>Basic workflow:
1. <code>xgettext</code> is used to collect translation strings across the project in the authoritative PO file located in <code>view/lang/C/messages.po</code>.
2. This file makes translations strings available at <a href="https://www.transifex.com/Friendica/friendica/dashboard/">the Transifex Friendica page</a>.
3. The translation itself is done at Transifex by volunteers.
4. The resulting PO files by languages are manually updated in <code>view/lang/&lt;language&gt;/messages.po</code>.
5. PO files are converted to PHP arrays in <code>view/lang/&lt;language&gt;/strings.php</code> that are ultimately used by Friendica to display the translations.</p>
<h2 id="translate-friendica-in-your-favorite-language">Translate Friendica in your favorite language<a class="headerlink" href="#translate-friendica-in-your-favorite-language" title="Permanent link">#</a></h2>
<p>Thank you for your interest in improving Friendica's translation!
Please register a free Transifex account and ask over at <a href="https://www.transifex.com/Friendica/friendica/dashboard/">the Transifex Friendica page</a> to join the translation team for your favorite language.</p>
<p>As a rule of thumb, we add support for a language in Friendica when at least 50% of the strings have been translated to avoid a scattered experience.
For addons, we add support for a language when if we already support the language in Friendica.</p>
<h2 id="add-new-translation-strings">Add new translation strings<a class="headerlink" href="#add-new-translation-strings" title="Permanent link">#</a></h2>
<h3 id="core">Core<a class="headerlink" href="#core" title="Permanent link">#</a></h3>
<p>Once you have added new translation strings in your code changes, please run <code>bin/run_xgettext.sh</code> from the base Friendica directory and commit the updated <code>view/lang/C/messages.po</code> to your branch.</p>
<h3 id="addon">Addon<a class="headerlink" href="#addon" title="Permanent link">#</a></h3>
<p>If you have the <code>friendica-addons</code> repository in the <code>addon</code> directory of your Friendica cloned repository, just run <code>bin/run_xgettext.sh -a &lt;addon_name&gt;</code> from the base Friendica directory.</p>
<p>Otherwise:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nb">cd</span> /path/to/friendica-addons/&lt;addon_name&gt;
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>/path/to/friendica/bin/run_xgettext.sh -s
</code></pre></div>
<p>In either case, you need to commit the updated <code>&lt;addon_name&gt;/lang/C/messages.po</code> to your working branch.</p>
<h2 id="update-translations-from-transifex">Update translations from Transifex<a class="headerlink" href="#update-translations-from-transifex" title="Permanent link">#</a></h2>
<p>Please download the Transifex file "for use" in <code>view/lang/&lt;language&gt;/messages.po</code>.</p>
<p>Then run <code>bin/console po2php view/lang/&lt;language&gt;/messages.po</code> to update the related <code>strings.php</code> file and commit both files to your working branch.</p>
<h3 id="using-the-transifex-client">Using the Transifex client<a class="headerlink" href="#using-the-transifex-client" title="Permanent link">#</a></h3>
<p>Transifex has a client program which allows you to sync files between your cloned Friendica repository and Transifex.
Help for the client can be found at the <a href="https://docs.transifex.com/client/introduction">Transifex Help Center</a>.
Here we will only cover basic usage.</p>
<p>After installation of the client, you should have a <code>tx</code> command available on your system.
To use it, first create a configuration file with your credentials.
On Linux this file should be placed into your home directory <code>~/.transifexrc</code>.
The content of the file should be something like the following:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="k">[https://www.transifex.com]</span><span class="w"></span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="na">username</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">user</span><span class="w"></span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="na">token</span><span class="w"> </span><span class="o">=</span><span class="w"></span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="na">password</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">p@ssw0rd</span><span class="w"></span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="na">hostname</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">https://www.transifex.com</span><span class="w"></span>
</code></pre></div>
<p>Since Friendica version 3.5.1 we ship configuration files for the Transifex client in the core repository and the addon repository in <code>.tx/config</code>.
To update the PO files after you have translated strings of e.g. Esperanto on the Transifex website you can use <code>tx</code> to download the updated PO-file in the right location.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>tx pull -l eo
</code></pre></div>
<p>Then run <code>bin/console po2php view/lang/&lt;language&gt;/messages.po</code> to update the related <code>strings.php</code> file and commit both files to your working branch.</p>
<h2 id="translation-functions-usage">Translation functions usage<a class="headerlink" href="#translation-functions-usage" title="Permanent link">#</a></h2>
<h3 id="basic-usage">Basic usage<a class="headerlink" href="#basic-usage" title="Permanent link">#</a></h3>
<ul>
<li><code>Friendica\DI::l10n()-&gt;t('Label')</code> =&gt; <code>Label</code></li>
<li><code>Friendica\DI::l10n()-&gt;t('Label %s', 'test')</code> =&gt; <code>Label test</code></li>
</ul>
<h3 id="plural">Plural<a class="headerlink" href="#plural" title="Permanent link">#</a></h3>
<ul>
<li><code>Friendica\DI::l10n()-&gt;tt('Label', 'Labels', 1)</code> =&gt; <code>Label</code></li>
<li><code>Friendica\DI::l10n()-&gt;tt('Label', 'Labels', 3)</code> =&gt; <code>Labels</code></li>
<li><code>Friendica\DI::l10n()-&gt;tt('%d Label', '%d Labels', 1)</code> =&gt; <code>1 Label</code></li>
<li><code>Friendica\DI::l10n()-&gt;tt('%d Label', '%d Labels', 3)</code> =&gt; <code>3 Labels</code></li>
<li><code>Friendica\DI::l10n()-&gt;tt('%d Label', 'Labels %2%s %3%s', 1, 'test', 'test2')</code> =&gt; <code>Label test test2</code></li>
<li><code>Friendica\DI::l10n()-&gt;tt('%d Label', 'Labels %2%s %3%s', 3, 'test', 'test2')</code> =&gt; <code>Labels test test2</code></li>
</ul>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../addon-storage-backend/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Addon Storage Backend" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Addon Storage Backend
</div>
</div>
</a>
<a href="../composer/" class="md-footer__link md-footer__link--next" aria-label="Next: Composer" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Composer
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>

View file

@ -0,0 +1,3396 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.">
<meta name="author" content="The Friendica project">
<link rel="canonical" href="https://friendi.ca/en/developer/vagrant/">
<link rel="icon" href="../../../assets/images/friendica-32.png">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.8">
<title>Vagrant - Friendica documentation</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.1d29e8d0.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/stylesheets/friendica.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#vagrant-for-friendica-developers" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://friendi.ca" title="Friendica documentation" class="md-header__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Friendica documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Vagrant
</span>
</div>
</div>
</div>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.52 17.52 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04M18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12m-2.62 7 1.62-4.33L19.12 17h-3.24Z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../developer/vagrant/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../de/developer/vagrant/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../user/account-basics/" class="md-tabs__link">
User
</a>
</li>
<li class="md-tabs__item">
<a href="../../admin/install/" class="md-tabs__link">
Admin
</a>
</li>
<li class="md-tabs__item">
<a href="../" class="md-tabs__link md-tabs__link--active">
Developer
</a>
</li>
<li class="md-tabs__item">
<a href="../../bugs-and-issues/" class="md-tabs__link">
Bugs and Issues
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://friendi.ca" title="Friendica documentation" class="md-nav__button md-logo" aria-label="Friendica documentation" data-md-component="logo">
<img src="../../../assets/images/friendica.svg" alt="logo">
</a>
Friendica documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/friendica/friendica" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
friendica/friendica
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2">
User
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1">
First Steps
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="First Steps" data-md-level="2">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
First Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/account-basics/" class="md-nav__link">
Account Basics
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1_2" type="checkbox" id="__nav_2_1_2" >
<label class="md-nav__link" for="__nav_2_1_2">
Quick Start
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Quick Start" data-md-level="3">
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Quick Start
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/quick-start/guide/" class="md-nav__link">
Start
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/network/" class="md-nav__link">
Network
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/groups-and-pages/" class="md-nav__link">
Groups & Pages
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/making-new-friends/" class="md-nav__link">
Making new friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/quick-start/finally/" class="md-nav__link">
Finally
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../user/text-editor/" class="md-nav__link">
Text editor
</a>
</li>
<li class="md-nav__item">
<a href="../../user/bbcode/" class="md-nav__link">
BBCode
</a>
</li>
<li class="md-nav__item">
<a href="../../user/text-comment/" class="md-nav__link">
Comments
</a>
</li>
<li class="md-nav__item">
<a href="../../user/accesskeys/" class="md-nav__link">
Accesskeys
</a>
</li>
<li class="md-nav__item">
<a href="../../user/events/" class="md-nav__link">
Events
</a>
</li>
<li class="md-nav__item">
<a href="../../user/keyboard-shortcuts/" class="md-nav__link">
Shortcuts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2">
You and other users
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="You and other users" data-md-level="2">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
You and other users
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../user/making-friends/" class="md-nav__link">
Making friends
</a>
</li>
<li class="md-nav__item">
<a href="../../user/groups-and-privacy/" class="md-nav__link">
Groups & Privacy
</a>
</li>
<li class="md-nav__item">
<a href="../../user/tags-and-mentions/" class="md-nav__link">
Tags & Mentions
</a>
</li>
<li class="md-nav__item">
<a href="../../user/forums/" class="md-nav__link">
Forums
</a>
</li>
<li class="md-nav__item">
<a href="../../user/chats/" class="md-nav__link">
Chats
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3">
Further information
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Further information" data-md-level="2">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Further information
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user/move-account/" class="md-nav__link">
Move account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/export-import-contacts/" class="md-nav__link">
Import / Export Contacts
</a>
</li>
<li class="md-nav__item">
<a href="../../user/remove-account/" class="md-nav__link">
Remove account
</a>
</li>
<li class="md-nav__item">
<a href="../../user/two-factor-authentication/" class="md-nav__link">
2FA
</a>
</li>
<li class="md-nav__item">
<a href="../../user/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Admin
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Admin" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Admin
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_1" type="checkbox" id="__nav_3_1" >
<label class="md-nav__link" for="__nav_3_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/install/" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/update/" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/migrate/" class="md-nav__link">
Migrate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_2" type="checkbox" id="__nav_3_2" >
<label class="md-nav__link" for="__nav_3_2">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="2">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/settings/" class="md-nav__link">
Settings
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/config/" class="md-nav__link">
Config Values
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/ssl/" class="md-nav__link">
SSL
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/improve-performance/" class="md-nav__link">
Improve Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/tools/" class="md-nav__link">
Tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3_3" type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3">
Third Party
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Third Party" data-md-level="2">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Third Party
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../admin/installing-connectors/" class="md-nav__link">
Connectors
</a>
</li>
<li class="md-nav__item">
<a href="../../admin/install-ejabberd/" class="md-nav__link">
Install ejabberd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../admin/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
Developer
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Get Started
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" checked>
<label class="md-nav__link" for="__nav_4_2">
Set Up
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Set Up" data-md-level="2">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Set Up
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../github/" class="md-nav__link">
GitHub
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Vagrant
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Vagrant
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#getting-started" class="md-nav__link">
Getting started
</a>
</li>
<li class="md-nav__item">
<a href="#default-user-accounts" class="md-nav__link">
Default User Accounts
</a>
</li>
<li class="md-nav__item">
<a href="#trouble-shooting" class="md-nav__link">
Trouble Shooting
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3">
Code structure
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Code structure" data-md-level="2">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Code structure
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../domain-driven-design/" class="md-nav__link">
DDD
</a>
</li>
<li class="md-nav__item">
<a href="../addons/" class="md-nav__link">
Addons
</a>
</li>
<li class="md-nav__item">
<a href="../themes/" class="md-nav__link">
Themes
</a>
</li>
<li class="md-nav__item">
<a href="../smarty3-templates/" class="md-nav__link">
Smarty3
</a>
</li>
<li class="md-nav__item">
<a href="../addon-storage-backend/" class="md-nav__link">
Addon Storage Backend
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4">
How To
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="How To" data-md-level="2">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
How To
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../translations/" class="md-nav__link">
Translations
</a>
</li>
<li class="md-nav__item">
<a href="../composer/" class="md-nav__link">
Composer
</a>
</li>
<li class="md-nav__item">
<a href="../how-to-move-classes-to-src/" class="md-nav__link">
src Migration
</a>
</li>
<li class="md-nav__item">
<a href="../tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../autoloader/" class="md-nav__link">
Autoloader
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5" type="checkbox" id="__nav_4_5" >
<label class="md-nav__link" for="__nav_4_5">
Specification
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Specification" data-md-level="2">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
Specification
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_1" type="checkbox" id="__nav_4_5_1" >
<label class="md-nav__link" for="__nav_4_5_1">
API
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_1">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/api/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/entities/" class="md-nav__link">
Entities
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/friendica/" class="md-nav__link">
Friendica
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/mastodon/" class="md-nav__link">
Mastodon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/twitter/" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/api/gnu-social/" class="md-nav__link">
GNU Social
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_2" type="checkbox" id="__nav_4_5_2" >
<label class="md-nav__link" for="__nav_4_5_2">
Database
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Database" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/database/" class="md-nav__link">
Database Tables
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_app_specific_password/" class="md-nav__link">
2fa_app_specific_password
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_recovery_codes/" class="md-nav__link">
2fa_recovery_codes
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_2fa_trusted_browser/" class="md-nav__link">
2fa_trusted_browser
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_addon/" class="md-nav__link">
addon
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_apcontact/" class="md-nav__link">
apcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application/" class="md-nav__link">
application
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-marker/" class="md-nav__link">
application-marker
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_application-token/" class="md-nav__link">
application-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_attach/" class="md-nav__link">
attach
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_cache/" class="md-nav__link">
cache
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_config/" class="md-nav__link">
config
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact/" class="md-nav__link">
contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_contact-relation/" class="md-nav__link">
contact-relation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conv/" class="md-nav__link">
conv
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_conversation/" class="md-nav__link">
conversation
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_delayed-post/" class="md-nav__link">
delayed-post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_diaspora-interaction/" class="md-nav__link">
diaspora-interaction
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_endpoint/" class="md-nav__link">
endpoint
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_event/" class="md-nav__link">
event
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fcontact/" class="md-nav__link">
fcontact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_fsuggest/" class="md-nav__link">
fsuggest
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group/" class="md-nav__link">
group
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_group_member/" class="md-nav__link">
group_member
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver/" class="md-nav__link">
gserver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_gserver-tag/" class="md-nav__link">
gserver-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_hook/" class="md-nav__link">
hook
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry/" class="md-nav__link">
inbox-entry
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-entry-receiver/" class="md-nav__link">
inbox-entry-receiver
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_inbox-status/" class="md-nav__link">
inbox-status
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_intro/" class="md-nav__link">
intro
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_item-uri/" class="md-nav__link">
item-uri
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_locks/" class="md-nav__link">
locks
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mail/" class="md-nav__link">
mail
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_mailacct/" class="md-nav__link">
mailacct
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_manage/" class="md-nav__link">
manage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notification/" class="md-nav__link">
notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify/" class="md-nav__link">
notify
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_notify-threads/" class="md-nav__link">
notify-threads
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_oembed/" class="md-nav__link">
oembed
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_openwebauth-token/" class="md-nav__link">
openwebauth-token
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_parsed_url/" class="md-nav__link">
parsed_url
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_pconfig/" class="md-nav__link">
pconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_permissionset/" class="md-nav__link">
permissionset
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_photo/" class="md-nav__link">
photo
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post/" class="md-nav__link">
post
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-category/" class="md-nav__link">
post-category
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-collection/" class="md-nav__link">
post-collection
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-content/" class="md-nav__link">
post-content
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery/" class="md-nav__link">
post-delivery
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-delivery-data/" class="md-nav__link">
post-delivery-data
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-history/" class="md-nav__link">
post-history
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-link/" class="md-nav__link">
post-link
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-media/" class="md-nav__link">
post-media
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question/" class="md-nav__link">
post-question
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-question-option/" class="md-nav__link">
post-question-option
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-tag/" class="md-nav__link">
post-tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread/" class="md-nav__link">
post-thread
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-thread-user/" class="md-nav__link">
post-thread-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user/" class="md-nav__link">
post-user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_post-user-notification/" class="md-nav__link">
post-user-notification
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_process/" class="md-nav__link">
process
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile/" class="md-nav__link">
profile
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_profile_field/" class="md-nav__link">
profile_field
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_push_subscriber/" class="md-nav__link">
push_subscriber
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_register/" class="md-nav__link">
register
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_search/" class="md-nav__link">
search
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_session/" class="md-nav__link">
session
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_storage/" class="md-nav__link">
storage
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_subscription/" class="md-nav__link">
subscription
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_tag/" class="md-nav__link">
tag
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user/" class="md-nav__link">
user
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_user-contact/" class="md-nav__link">
user-contact
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_userd/" class="md-nav__link">
userd
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_verb/" class="md-nav__link">
verb
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_worker-ipc/" class="md-nav__link">
worker-ipc
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/database/db_workerqueue/" class="md-nav__link">
workerqueue
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_5_3" type="checkbox" id="__nav_4_5_3" >
<label class="md-nav__link" for="__nav_4_5_3">
Protocol
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Protocol" data-md-level="3">
<label class="md-nav__title" for="__nav_4_5_3">
<span class="md-nav__icon md-icon"></span>
Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../spec/protocol/protocol/" class="md-nav__link">
Protocols
</a>
</li>
<li class="md-nav__item">
<a href="../../spec/protocol/message-flow/" class="md-nav__link">
Message Flow
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../bugs-and-issues/" class="md-nav__link">
Bugs and Issues
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#getting-started" class="md-nav__link">
Getting started
</a>
</li>
<li class="md-nav__item">
<a href="#default-user-accounts" class="md-nav__link">
Default User Accounts
</a>
</li>
<li class="md-nav__item">
<a href="#trouble-shooting" class="md-nav__link">
Trouble Shooting
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/friendica/friendica/edit/develop/doc/developer/vagrant.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<nav class="md-tags" >
<span class="md-tag">developer</span>
<span class="md-tag">testing</span>
</nav>
<h1 id="vagrant-for-friendica-developers">Vagrant for Friendica Developers<a class="headerlink" href="#vagrant-for-friendica-developers" title="Permanent link">#</a></h1>
<h2 id="getting-started">Getting started<a class="headerlink" href="#getting-started" title="Permanent link">#</a></h2>
<p><a href="https://www.vagrantup.com/">Vagrant</a> is a virtualization solution for developers.
No need to set up a webserver, database etc. before actually starting.
Vagrant creates a virtual machine for you that you can just run inside VirtualBox and start to work directly on Friendica.</p>
<p>It brings a Debian Bullseye with PHP 7.4 and MariaDB 10.5.11.</p>
<p>What you need to do:</p>
<ol>
<li>Install VirtualBox and vagrant.
Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html.</li>
<li>Git clone your Friendica repository.
Inside, you'll find a <code>Vagrantfile</code> and some scripts in the <code>bin/dev</code> folder.
Pull the PHP requirements with <code>bin/composer install</code>.</li>
<li>Run <code>vagrant up</code> from inside the friendica clone.
This will start the virtual machine.
Be patient: When it runs for the first time, it downloads a Debian Server image and installs Friendica.</li>
<li>Run <code>vagrant ssh</code> to log into the virtual machine to log in to the VM in case you need to debug something on the server.</li>
<li>Open you test installation in a browser.
Go to friendica.local (or 192.168.22.10).
friendica.local is using a self-signed TLS certificate, so you will need to add an exception to trust the certificate the first time you are visiting the page.
The mysql database is called "friendica", the mysql user and password both are "friendica".</li>
<li>Work on Friendica's code in your git clone on your machine (not in the VM).
Your local working directory is set up as a shared directory with the VM (/vagrant).</li>
<li>Check the changes in your browser in the VM.
Find the Friendica log file <code>/vagrant/logfile.out</code> on the VM or in the <code>logfile.out</code> in you local Friendica directory.</li>
<li>Commit and push your changes directly back to GitHub.</li>
</ol>
<p>If you want to stop vagrant after finishing your work, run the following command</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>vagrant halt
</code></pre></div>
<p>in the development directory.
This will not delete the virtual machine.
9. To ultimately delete the virtual machine run</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>vagrant destroy
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>rm /vagrant/config/local.config.php
</code></pre></div>
<p>to make sure that you can start from scratch with another "vagrant up".</p>
<h2 id="default-user-accounts">Default User Accounts<a class="headerlink" href="#default-user-accounts" title="Permanent link">#</a></h2>
<p>By default, the provision script will set up two user accounts.</p>
<ul>
<li>admin, password admin</li>
<li>friendica, password friendica</li>
</ul>
<h2 id="trouble-shooting">Trouble Shooting<a class="headerlink" href="#trouble-shooting" title="Permanent link">#</a></h2>
<p>If you see a version mismatch for the <em>VirtualBox Guest Additions</em> between host and guest during the initial setup of the Vagrant VM, you will need to install an addon to Vagrant (ref. <a href="https://stackoverflow.com/a/38010683">Stack Overflow</a>).
Stop the Vagrant VM and run the following command:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>vagrant plugin install vagrant-vbguest
</code></pre></div>
<p>On the next Vagrant up, the version problem should be fixed.</p>
<p>If <code>friendica.local</code> is not resolved, you may need to add an entry to the <code>/etc/hosts</code> file (or similar configuration depending on the OS you are using).</p>
<p>For further documentation of vagrant, please see <a href="https://docs.vagrantup.com/v2/">the vagrant<em>docs</em></a>.</p>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../github/" class="md-footer__link md-footer__link--prev" aria-label="Previous: GitHub" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
GitHub
</div>
</div>
</a>
<a href="../domain-driven-design/" class="md-footer__link md-footer__link--next" aria-label="Next: DDD" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
DDD
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2010-2022, the Friendica project
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.annotate", "content.tooltips", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.0238f547.min.js"></script>
</body>
</html>