---
title: "Website"
description: "Sivut ja lomakkeet. Jokainen sovellus on moduuli samalla tietomallilla."
canonical: "https://obop-platform.sliplane.app/fi/apps/website/"
lang: "fi"
---

# Website

## Mihin se on tarkoitettu

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.

## Mitä paketti tekee ja mitä ei

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.

## Mallit

### `website_page`

A page of the website

Lukuryhmä: `website.user`. Kirjoitusryhmä: `website.user`.

| Kenttä | Tyyppi | Tietoluokka | Henkilötieto | Ryhmä | Agentit näkevät | Kuvaus |
|---|---|---|---|---|---|---|
| `title` | text | `none` | ei | `website.user` | selkoisena | Page title |
| `slug` | text | `none` | ei | `website.user` | selkoisena | 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` | ei | `website.user` | selkoisena | Page content in Markdown (a safe subset: headings, lists, links, emphasis, code, quotes, tables) |
| `seo_title` | text | `none` | ei | `website.user` | selkoisena | Title shown in search results; empty means the page title |
| `seo_description` | text | `none` | ei | `website.user` | selkoisena | Description shown in search results |
| `published_on` | date | `none` | ei | `website.user` | selkoisena | Day the page went public (YYYY-MM-DD) |
| `state` | select (draft, published, archived) | `none` | ei | `website.user` | selkoisena | Page status: draft, published, archived |

### `website_menu_item`

An entry of the site navigation

Lukuryhmä: `website.user`. Kirjoitusryhmä: `website.manager`.

| Kenttä | Tyyppi | Tietoluokka | Henkilötieto | Ryhmä | Agentit näkevät | Kuvaus |
|---|---|---|---|---|---|---|
| `label` | text | `none` | ei | `website.user` | selkoisena | Text shown in the menu |
| `url` | text | `none` | ei | `website.user` | selkoisena | Where the entry leads: a page slug starting with a slash or a full address |
| `parent_id` | ref → website_menu_item | `none` | ei | `website.user` | selkoisena | The entry this one is nested under; empty for a top-level entry |
| `sequence` | number | `none` | ei | `website.user` | selkoisena | Order among its siblings, lowest first |
| `visible` | bool | `none` | ei | `website.user` | selkoisena | Whether the entry is shown |
| `new_window` | bool | `none` | ei | `website.user` | selkoisena | Whether the link opens in a new window |

### `website_blog_post`

A blog post

Lukuryhmä: `website.user`. Kirjoitusryhmä: `website.user`.

| Kenttä | Tyyppi | Tietoluokka | Henkilötieto | Ryhmä | Agentit näkevät | Kuvaus |
|---|---|---|---|---|---|---|
| `title` | text | `none` | ei | `website.user` | selkoisena | Post title |
| `slug` | text | `none` | ei | `website.user` | selkoisena | URL part of the post, lowercase with dashes |
| `author_name` | text | `public_directory` | kyllä | `website.user` | maskattu | Name of the author, for the team's own records |
| `byline` | text | `none` | ei | `website.user` | selkoisena | 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` | ei | `website.user` | selkoisena | Teaser shown in listings |
| `body` | longtext | `none` | ei | `website.user` | selkoisena | Post content in Markdown (a safe subset: headings, lists, links, emphasis, code, quotes, tables) |
| `tags` | text | `none` | ei | `website.user` | selkoisena | Comma-separated tags, for example news,product |
| `published_on` | date | `none` | ei | `website.user` | selkoisena | Day the post is dated (YYYY-MM-DD) |
| `state` | select (draft, published, archived) | `none` | ei | `website.user` | selkoisena | Post status: draft, published, archived |

### `website_form_submission`

A message a visitor sent through a form on the site

Lukuryhmä: `website.user`. Kirjoitusryhmä: `website.user`.

| Kenttä | Tyyppi | Tietoluokka | Henkilötieto | Ryhmä | Agentit näkevät | Kuvaus |
|---|---|---|---|---|---|---|
| `form_name` | text | `none` | ei | `website.user` | selkoisena | Which form it came from, for example contact |
| `sender_name` | text | `internal` | kyllä | `website.user` | maskattu | Name the visitor gave |
| `sender_email` | text | `internal` | kyllä | `website.user` | maskattu | Email address the visitor gave |
| `sender_phone` | text | `internal` | kyllä | `website.user` | maskattu | Phone number the visitor gave |
| `message` | longtext | `internal` | kyllä | `website.user` | maskattu | What the visitor wrote |
| `source_page` | text | `none` | ei | `website.user` | selkoisena | Slug of the page the form was on |
| `submitted_on` | date | `none` | ei | `website.user` | selkoisena | Day of the submission (YYYY-MM-DD) |
| `consent_given` | bool | `none` | ei | `website.user` | selkoisena | Whether the visitor ticked the consent box for being contacted |
| `state` | select (new, handled, spam) | `none` | ei | `website.user` | selkoisena | 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

Lukuryhmä: `website.user`. Kirjoitusryhmä: `website.user`.

| Kenttä | Tyyppi | Tietoluokka | Henkilötieto | Ryhmä | Agentit näkevät | Kuvaus |
|---|---|---|---|---|---|---|
| `page_id` | ref → website_page | `none` | ei | `website.user` | selkoisena | The page this translates |
| `lang` | select (en, de, fr, pl, fi, sv, es) | `none` | ei | `website.user` | selkoisena | Language of the translation: en, de, fr, pl, fi, sv or es |
| `title` | text | `none` | ei | `website.user` | selkoisena | Translated page title |
| `body` | longtext | `none` | ei | `website.user` | selkoisena | Translated page content in Markdown |
| `seo_title` | text | `none` | ei | `website.user` | selkoisena | Translated title shown in search results |
| `seo_description` | text | `none` | ei | `website.user` | selkoisena | Translated description shown in search results |
| `published` | bool | `none` | ei | `website.user` | selkoisena | 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

Lukuryhmä: `website.user`. Kirjoitusryhmä: `website.user`.

| Kenttä | Tyyppi | Tietoluokka | Henkilötieto | Ryhmä | Agentit näkevät | Kuvaus |
|---|---|---|---|---|---|---|
| `post_id` | ref → website_blog_post | `none` | ei | `website.user` | selkoisena | The post this translates |
| `lang` | select (en, de, fr, pl, fi, sv, es) | `none` | ei | `website.user` | selkoisena | Language of the translation: en, de, fr, pl, fi, sv or es |
| `title` | text | `none` | ei | `website.user` | selkoisena | Translated post title |
| `summary` | text | `none` | ei | `website.user` | selkoisena | Translated teaser |
| `body` | longtext | `none` | ei | `website.user` | selkoisena | Translated post content in Markdown |
| `published` | bool | `none` | ei | `website.user` | selkoisena | Whether the translation is shown; it is only reachable while its post is published |

## Työnkulut

### `website_page`

| Toiminto | Siirtää | Kuka voi suorittaa | Hyväksyntä |
|---|---|---|---|
| `website_page.publish` | state: draft → published | `website.manager` | kyllä |
| `website_page.unpublish` | state: published → draft | `website.manager` | ei |
| `website_page.archive` | state: published → archived | `website.manager` | ei |

### `website_blog_post`

| Toiminto | Siirtää | Kuka voi suorittaa | Hyväksyntä |
|---|---|---|---|
| `website_blog_post.publish` | state: draft → published | `website.manager` | kyllä |
| `website_blog_post.unpublish` | state: published → draft | `website.manager` | ei |
| `website_blog_post.archive` | state: published → archived | `website.manager` | ei |

### `website_form_submission`

| Toiminto | Siirtää | Kuka voi suorittaa | Hyväksyntä |
|---|---|---|---|
| `website_form_submission.handle` | state: new → handled | `website.user` | ei |
| `website_form_submission.mark_spam` | state: new → spam | `website.user` | ei |

## Käyttöoikeusryhmät

Tämän sovelluksen käyttämät ryhmät:

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

## Hyväksyntävaiheet

Vaiheet, joita agentti voi vain ehdottaa:

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

## Mitä agentit voivat ja eivät voi tehdä

Agentti voi lukea, hakea, luoda ja päivittää tämän sovelluksen tietueita sekä suorittaa toiminnot, jotka eivät vaadi hyväksyntää, tunnisteensa käyttöoikeusryhmien rajoissa.

Se voi vain ehdottaa näitä vaiheita, ja ihmisen on hyväksyttävä ne: `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`.

Henkilötiedot maskataan paikkamerkeiksi: `website_blog_post.author_name`, `website_form_submission.sender_name`, `website_form_submission.sender_email`, `website_form_submission.sender_phone`, `website_form_submission.message`.

## Riippuvuudet

Ei ole.

## Asennus

Asenna se Customize-sovelluksesta (Marketplace) tai komentoriviltä:

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

Vaatii tietokannan ja ylläpitäjän oikeudet.

## Tee oma

[Moduulioppaassa näytetään, miten tällaiset sovellukset kirjoitetaan](/fi/docs/reference/module-manifest/)
