Create a plugin manifest (paquet.xml) | references/paquet-xml.md |
| Understand the directory layout and file loading order | references/arborescence.md |
| Hook into SPIP events (content published, user logged in, etc.) | references/pipelines.md |
| Add a contact/subscription/edit form | ../spip-formulaires/references/cvt-formulaires.md |
Write a secured action script (action/) | references/actions.md |
| Check or grant permissions in PHP or squelettes | references/autorisations.md |
| Read or write database rows | references/sql-api.md |
| Create a new database table (not an objet éditorial) | references/declarer-table.md |
| Create a new objet éditorial (with statut, edition form, search) | references/declarer-objet.md |
Create public object URLs / custom #URL_* tags | references/urls-objets.md |
Define a custom #BALISE, |filtre, or {critère} | references/balises-filtres-criteres.md |
| Add translated strings to a plugin | references/i18n.md |
Write install/upgrade/uninstall logic (_administrations.php) | references/cycle-de-vie.md |
| Build or customise private-space templates (liste, infos, contenu, editer) | references/prive-objets.md |
Understand what ?exec=mon_objets / ?exec=mon_objet provides out-of-the-box | references/exec-generique.md |
| Apply SPIP coding standards (SCS1) | references/coding-standards.md |
| Configure composer.json, ecs.php or rector.php | references/coding-standards.md |
| Control page cache duration, disable caching, or trigger invalidation | references/cache.md |
| Write PHPUnit tests for my plugin (filtres, autorisations, squelettes) | invoke the spip-testing skill |
Support content in multiple languages (lang, id_trad, translation groups) | references/multilinguisme.md |
| Run work asynchronously (background jobs, scheduled tasks) | references/queue-jobs.md |
| Add chunked file upload (bigup) to a formulaire CVT | references/upload-bigup.md |
| Create a plugin configuration page and read/write settings | references/config.md |