Website

Pages et formulaires

Place de marchéContenu et documentsVersion 0.2.0manifest

À quoi elle sert ​

Hold the content of a public website: pages, menus, blog posts and the form submissions visitors send. This app stores and organises content; something else renders it. Publishing needs approval.

Ce que fait et ne fait pas le paquet ​

Content for a public website: pages with a slug and a draft, published, archived flow, navigation menu items, blog posts with a byline and a publish date, translations of both, and the form submissions visitors send in. When the instance runs with the public site enabled it serves the published content to visitors as a server-rendered website with SEO and no login; only the fields marked public are ever visible to them. Publishing makes content public and needs a human approval, agents may only propose it. Senders are personal data and are never public.

Modèles ​

website_page ​

A page of the website

Groupe de lecture: website.user. Groupe d'écriture: website.user.

ChampTypeClasse de donnéesDonnées personnellesGroupeVu par les agentsDescription
titletextnonenonwebsite.useren clairPage title
slugtextnonenonwebsite.useren clairURL path of the page without slashes at the ends, lowercase with dashes, for example about-us. The page with slug home is the front page
bodylongtextnonenonwebsite.useren clairPage content in Markdown (a safe subset: headings, lists, links, emphasis, code, quotes, tables)
seo_titletextnonenonwebsite.useren clairTitle shown in search results; empty means the page title
seo_descriptiontextnonenonwebsite.useren clairDescription shown in search results
published_ondatenonenonwebsite.useren clairDay the page went public (YYYY-MM-DD)
stateselect (draft, published, archived)nonenonwebsite.useren clairPage status: draft, published, archived

website_menu_item ​

An entry of the site navigation

Groupe de lecture: website.user. Groupe d'écriture: website.manager.

ChampTypeClasse de donnéesDonnées personnellesGroupeVu par les agentsDescription
labeltextnonenonwebsite.useren clairText shown in the menu
urltextnonenonwebsite.useren clairWhere the entry leads: a page slug starting with a slash or a full address
parent_idref → website_menu_itemnonenonwebsite.useren clairThe entry this one is nested under; empty for a top-level entry
sequencenumbernonenonwebsite.useren clairOrder among its siblings, lowest first
visibleboolnonenonwebsite.useren clairWhether the entry is shown
new_windowboolnonenonwebsite.useren clairWhether the link opens in a new window

website_blog_post ​

A blog post

Groupe de lecture: website.user. Groupe d'écriture: website.user.

ChampTypeClasse de donnéesDonnées personnellesGroupeVu par les agentsDescription
titletextnonenonwebsite.useren clairPost title
slugtextnonenonwebsite.useren clairURL part of the post, lowercase with dashes
author_nametextpublic_directoryouiwebsite.usermasquéName of the author, for the team's own records
bylinetextnonenonwebsite.useren clairAuthor line shown publicly, for example the team or brand name; use a name here only if the person agreed to it
summarytextnonenonwebsite.useren clairTeaser shown in listings
bodylongtextnonenonwebsite.useren clairPost content in Markdown (a safe subset: headings, lists, links, emphasis, code, quotes, tables)
tagstextnonenonwebsite.useren clairComma-separated tags, for example news,product
published_ondatenonenonwebsite.useren clairDay the post is dated (YYYY-MM-DD)
stateselect (draft, published, archived)nonenonwebsite.useren clairPost status: draft, published, archived

website_form_submission ​

A message a visitor sent through a form on the site

Groupe de lecture: website.user. Groupe d'écriture: website.user.

ChampTypeClasse de donnéesDonnées personnellesGroupeVu par les agentsDescription
form_nametextnonenonwebsite.useren clairWhich form it came from, for example contact
sender_nametextinternalouiwebsite.usermasquéName the visitor gave
sender_emailtextinternalouiwebsite.usermasquéEmail address the visitor gave
sender_phonetextinternalouiwebsite.usermasquéPhone number the visitor gave
messagelongtextinternalouiwebsite.usermasquéWhat the visitor wrote
source_pagetextnonenonwebsite.useren clairSlug of the page the form was on
submitted_ondatenonenonwebsite.useren clairDay of the submission (YYYY-MM-DD)
consent_givenboolnonenonwebsite.useren clairWhether the visitor ticked the consent box for being contacted
stateselect (new, handled, spam)nonenonwebsite.useren clairHandling status: new, handled, spam

website_page_translation ​

A page translated into another language; the public site shows it to visitors who read that language

Groupe de lecture: website.user. Groupe d'écriture: website.user.

ChampTypeClasse de donnéesDonnées personnellesGroupeVu par les agentsDescription
page_idref → website_pagenonenonwebsite.useren clairThe page this translates
langselect (en, de, fr, pl, fi, sv, es)nonenonwebsite.useren clairLanguage of the translation: en, de, fr, pl, fi, sv or es
titletextnonenonwebsite.useren clairTranslated page title
bodylongtextnonenonwebsite.useren clairTranslated page content in Markdown
seo_titletextnonenonwebsite.useren clairTranslated title shown in search results
seo_descriptiontextnonenonwebsite.useren clairTranslated description shown in search results
publishedboolnonenonwebsite.useren clairWhether the translation is shown; it is only reachable while its page is published

website_blog_post_translation ​

A blog post translated into another language

Groupe de lecture: website.user. Groupe d'écriture: website.user.

ChampTypeClasse de donnéesDonnées personnellesGroupeVu par les agentsDescription
post_idref → website_blog_postnonenonwebsite.useren clairThe post this translates
langselect (en, de, fr, pl, fi, sv, es)nonenonwebsite.useren clairLanguage of the translation: en, de, fr, pl, fi, sv or es
titletextnonenonwebsite.useren clairTranslated post title
summarytextnonenonwebsite.useren clairTranslated teaser
bodylongtextnonenonwebsite.useren clairTranslated post content in Markdown
publishedboolnonenonwebsite.useren clairWhether the translation is shown; it is only reachable while its post is published

Flux de travail ​

website_page ​

ActionTransitionQui peut l'exécuterApprobation
website_page.publishstate: draft → publishedwebsite.manageroui
website_page.unpublishstate: published → draftwebsite.managernon
website_page.archivestate: published → archivedwebsite.managernon

website_blog_post ​

ActionTransitionQui peut l'exécuterApprobation
website_blog_post.publishstate: draft → publishedwebsite.manageroui
website_blog_post.unpublishstate: published → draftwebsite.managernon
website_blog_post.archivestate: published → archivedwebsite.managernon

website_form_submission ​

ActionTransitionQui peut l'exécuterApprobation
website_form_submission.handlestate: new → handledwebsite.usernon
website_form_submission.mark_spamstate: new → spamwebsite.usernon

Groupes de permissions ​

Groupes utilisés par cette application :

  • website.manager
  • website.user

Étapes d'approbation ​

Étapes qu'un agent ne peut que proposer :

  • website_page.publish
  • website_blog_post.publish

Ce que les agents peuvent et ne peuvent pas faire ​

Un agent peut lire, rechercher, créer et modifier les enregistrements de cette application, et exécuter les actions qui ne requièrent pas d'approbation, dans les limites des groupes de permissions de son jeton.

Il ne peut que proposer ces étapes, qu'une personne doit approuver : website_page.publish, website_blog_post.publish, website_page.delete, website_menu_item.delete, website_blog_post.delete, website_form_submission.delete, website_page_translation.delete, website_blog_post_translation.delete.

Les données personnelles sont masquées sous forme de jetons de substitution : website_blog_post.author_name, website_form_submission.sender_name, website_form_submission.sender_email, website_form_submission.sender_phone, website_form_submission.message.

Dépendances ​

Aucune.

Installation ​

Installez-la depuis l'application Customize (Place de marché), ou en ligne de commande :

bash
obop modules install-from website

Nécessite une base de données et des droits d'administrateur.

Créer la vôtre ​

Le guide des modules montre comment sont écrites les applications de ce type