---
title: "Website"
description: "Strony i formularze. Każda aplikacja jest modułem na jednym modelu danych."
canonical: "https://obop.dev/pl/apps/website/"
lang: "pl"
---

# Website

## Do czego służy

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.

## Co pakiet robi, a czego nie robi

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.

## Modele

### `website_page`

A page of the website

Grupa odczytu: `website.user`. Grupa zapisu: `website.user`.

| Pole | Rodzaj | Klasa danych | Dane osobowe | Grupa | Agenci widzą | Opis |
|---|---|---|---|---|---|---|
| `title` | text | `none` | nie | `website.user` | jawnie | Page title |
| `slug` | text | `none` | nie | `website.user` | jawnie | URL 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 |
| `body` | longtext | `none` | nie | `website.user` | jawnie | Page content in Markdown (a safe subset: headings, lists, links, emphasis, code, quotes, tables) |
| `seo_title` | text | `none` | nie | `website.user` | jawnie | Title shown in search results; empty means the page title |
| `seo_description` | text | `none` | nie | `website.user` | jawnie | Description shown in search results |
| `published_on` | date | `none` | nie | `website.user` | jawnie | Day the page went public (YYYY-MM-DD) |
| `state` | select (draft, published, archived) | `none` | nie | `website.user` | jawnie | Page status: draft, published, archived |

### `website_menu_item`

An entry of the site navigation

Grupa odczytu: `website.user`. Grupa zapisu: `website.manager`.

| Pole | Rodzaj | Klasa danych | Dane osobowe | Grupa | Agenci widzą | Opis |
|---|---|---|---|---|---|---|
| `label` | text | `none` | nie | `website.user` | jawnie | Text shown in the menu |
| `url` | text | `none` | nie | `website.user` | jawnie | Where the entry leads: a page slug starting with a slash or a full address |
| `parent_id` | ref → website_menu_item | `none` | nie | `website.user` | jawnie | The entry this one is nested under; empty for a top-level entry |
| `sequence` | number | `none` | nie | `website.user` | jawnie | Order among its siblings, lowest first |
| `visible` | bool | `none` | nie | `website.user` | jawnie | Whether the entry is shown |
| `new_window` | bool | `none` | nie | `website.user` | jawnie | Whether the link opens in a new window |

### `website_blog_post`

A blog post

Grupa odczytu: `website.user`. Grupa zapisu: `website.user`.

| Pole | Rodzaj | Klasa danych | Dane osobowe | Grupa | Agenci widzą | Opis |
|---|---|---|---|---|---|---|
| `title` | text | `none` | nie | `website.user` | jawnie | Post title |
| `slug` | text | `none` | nie | `website.user` | jawnie | URL part of the post, lowercase with dashes |
| `author_name` | text | `public_directory` | tak | `website.user` | zamaskowane | Name of the author, for the team's own records |
| `byline` | text | `none` | nie | `website.user` | jawnie | Author line shown publicly, for example the team or brand name; use a name here only if the person agreed to it |
| `summary` | text | `none` | nie | `website.user` | jawnie | Teaser shown in listings |
| `body` | longtext | `none` | nie | `website.user` | jawnie | Post content in Markdown (a safe subset: headings, lists, links, emphasis, code, quotes, tables) |
| `tags` | text | `none` | nie | `website.user` | jawnie | Comma-separated tags, for example news,product |
| `published_on` | date | `none` | nie | `website.user` | jawnie | Day the post is dated (YYYY-MM-DD) |
| `state` | select (draft, published, archived) | `none` | nie | `website.user` | jawnie | Post status: draft, published, archived |

### `website_form_submission`

A message a visitor sent through a form on the site

Grupa odczytu: `website.user`. Grupa zapisu: `website.user`.

| Pole | Rodzaj | Klasa danych | Dane osobowe | Grupa | Agenci widzą | Opis |
|---|---|---|---|---|---|---|
| `form_name` | text | `none` | nie | `website.user` | jawnie | Which form it came from, for example contact |
| `sender_name` | text | `internal` | tak | `website.user` | zamaskowane | Name the visitor gave |
| `sender_email` | text | `internal` | tak | `website.user` | zamaskowane | Email address the visitor gave |
| `sender_phone` | text | `internal` | tak | `website.user` | zamaskowane | Phone number the visitor gave |
| `message` | longtext | `internal` | tak | `website.user` | zamaskowane | What the visitor wrote |
| `source_page` | text | `none` | nie | `website.user` | jawnie | Slug of the page the form was on |
| `submitted_on` | date | `none` | nie | `website.user` | jawnie | Day of the submission (YYYY-MM-DD) |
| `consent_given` | bool | `none` | nie | `website.user` | jawnie | Whether the visitor ticked the consent box for being contacted |
| `state` | select (new, handled, spam) | `none` | nie | `website.user` | jawnie | Handling status: new, handled, spam |

### `website_page_translation`

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

Grupa odczytu: `website.user`. Grupa zapisu: `website.user`.

| Pole | Rodzaj | Klasa danych | Dane osobowe | Grupa | Agenci widzą | Opis |
|---|---|---|---|---|---|---|
| `page_id` | ref → website_page | `none` | nie | `website.user` | jawnie | The page this translates |
| `lang` | select (en, de, fr, pl, fi, sv, es) | `none` | nie | `website.user` | jawnie | Language of the translation: en, de, fr, pl, fi, sv or es |
| `title` | text | `none` | nie | `website.user` | jawnie | Translated page title |
| `body` | longtext | `none` | nie | `website.user` | jawnie | Translated page content in Markdown |
| `seo_title` | text | `none` | nie | `website.user` | jawnie | Translated title shown in search results |
| `seo_description` | text | `none` | nie | `website.user` | jawnie | Translated description shown in search results |
| `published` | bool | `none` | nie | `website.user` | jawnie | Whether the translation is shown; it is only reachable while its page is published |

### `website_blog_post_translation`

A blog post translated into another language

Grupa odczytu: `website.user`. Grupa zapisu: `website.user`.

| Pole | Rodzaj | Klasa danych | Dane osobowe | Grupa | Agenci widzą | Opis |
|---|---|---|---|---|---|---|
| `post_id` | ref → website_blog_post | `none` | nie | `website.user` | jawnie | The post this translates |
| `lang` | select (en, de, fr, pl, fi, sv, es) | `none` | nie | `website.user` | jawnie | Language of the translation: en, de, fr, pl, fi, sv or es |
| `title` | text | `none` | nie | `website.user` | jawnie | Translated post title |
| `summary` | text | `none` | nie | `website.user` | jawnie | Translated teaser |
| `body` | longtext | `none` | nie | `website.user` | jawnie | Translated post content in Markdown |
| `published` | bool | `none` | nie | `website.user` | jawnie | Whether the translation is shown; it is only reachable while its post is published |

## Przepływy pracy

### `website_page`

| Akcja | Przenosi | Kto może uruchomić | Zatwierdzenie |
|---|---|---|---|
| `website_page.publish` | state: draft → published | `website.manager` | tak |
| `website_page.unpublish` | state: published → draft | `website.manager` | nie |
| `website_page.archive` | state: published → archived | `website.manager` | nie |

### `website_blog_post`

| Akcja | Przenosi | Kto może uruchomić | Zatwierdzenie |
|---|---|---|---|
| `website_blog_post.publish` | state: draft → published | `website.manager` | tak |
| `website_blog_post.unpublish` | state: published → draft | `website.manager` | nie |
| `website_blog_post.archive` | state: published → archived | `website.manager` | nie |

### `website_form_submission`

| Akcja | Przenosi | Kto może uruchomić | Zatwierdzenie |
|---|---|---|---|
| `website_form_submission.handle` | state: new → handled | `website.user` | nie |
| `website_form_submission.mark_spam` | state: new → spam | `website.user` | nie |

## Grupy uprawnień

Grupy używane przez tę aplikację:

- `website.manager`
- `website.user`

## Kroki zatwierdzania

Kroki, które agent może tylko zaproponować:

- `website_page.publish`
- `website_blog_post.publish`

## Co agenci mogą, a czego nie mogą

Agent może odczytywać, wyszukiwać, tworzyć i aktualizować rekordy tej aplikacji oraz uruchamiać akcje niewymagające zatwierdzenia, w ramach grup uprawnień swojego tokenu.

Te kroki może tylko zaproponować, a człowiek musi je zatwierdzić: `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`.

Dane osobowe są maskowane jako tokeny zastępcze: `website_blog_post.author_name`, `website_form_submission.sender_name`, `website_form_submission.sender_email`, `website_form_submission.sender_phone`, `website_form_submission.message`.

## Zależności

Brak.

## Instalacja

Zainstaluj ją w aplikacji Customize (Marketplace) lub z wiersza poleceń:

```bash
obop modules install-from website
```

Wymaga bazy danych i uprawnień administratora.

## Zbuduj własną

[Przewodnik po modułach pokazuje, jak pisze się takie aplikacje](/pl/docs/reference/module-manifest/)
