frootbox / jobs
Jobs for the Frootbox CMS: open positions with kind, start, salary and drafts, a list filtered by category, kind and location, an address for each job, structured data and the application through a form
Requires
- php: >=8.5
- frootbox/core: ^0.1
- frootbox/database: ^0.1
- frootbox/people: ^0.1
- frootbox/rich-text: ^0.1
- psr/http-message: ^2.0
- psr/http-server-handler: ^1.0
Requires (Dev)
None
Suggests
- frootbox/backend: The screen for the jobs
- frootbox/forms: Applications with files through a form on each job
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-04 22:33:32 UTC
README
Jobs for the Frootbox CMS: open positions with drafts, versions and
planned publishing, the kind of job, start, workplace, salary, a location
and a contact from frootbox/people, categories, tags and two blocks
for any theme.
- Jobs (
frootbox/jobs/JobList) is the view of the plugin: a page that shows a space of the jobs lists its open jobs atplugin(), the newest first, filtered by category (?category=<slug>, with the categories below it), kind (?type=part-time) and location (?location=<slug of its name>) and tag (?tag=<slug>) without a script. Each published job gets an address below that page, e.g./jobs/barista; there the view shows the job with its contact, structured dataJobPostingand the application form chosen in its options (form, fromfrootbox/forms). Each entry of that form keeps the job it is about. - Newest jobs (
frootbox/jobs/JobTeaser) shows the newest few of all spaces or of one, optionally only those with a tag, with a link to the list.
Jobs have no tables: drafts and published versions live in revisions.
When a job goes offline by itself (unpublishAt), search engines learn
the day as validThrough.
Kinds of jobs
full-time, part-time, mini-job, apprenticeship, dual-study,
internship, freelance; a job may have several. The workplace is
on-site, hybrid or remote; a salary is
{"min": 2800, "max": 3200, "per": "month", "currency": "EUR"}.
Actions and queries
Everything goes through actions, also from the REST API and the AI:
frootbox/jobs/job.create, .update, .publish, .unpublish,
.schedule, .discard, .delete and the queries
frootbox/jobs/job.list and .show. Categories are the ones of the
core in the group frootbox/jobs/categories; the
actions take categories as a list of their ids. Tags are the common
stock of the core: the actions take tags as ids, keys
or labels, and new words become tags unless config/tags.yaml closes
the list for frootbox/jobs/job or the space. The role "editor"
gets frootbox/jobs/* on installation.
Further fields: a view of the theme declares them under
object: fields: in its header, e.g. an override of JobList, and
the actions take them as fields; object.fields with the type
frootbox/jobs/job lists them. The form in the backend shows them under
"More fields". In the editing mode editors change them right on the page
(object.update-field), and the editor bar publishes the job with the page.
In a template
<a href="{{ url('frootbox/jobs/job:' ~ id) }}">…</a> {{ object_field(job, 'subtitle') }} {# a further field, job as the view gets it #}
Backend
With frootbox/backend installed, the screen "Jobs" appears in the
sidebar at /cms/vacancies.
Source and issues
This package is developed in the Frootbox monorepo and mirrored here read-only. Questions, bugs and ideas go there, see the documentation.
License
MIT