omnibase / classroom
A teacher's open classroom for omnibase: levels and subjects, learning sequences and their sessions, idea cards, resources to download (free, for members, or sold through omnibase/marketplace).
Package info
github.com/glitchr-studio/omnibase-classroom
Type:symfony-bundle
pkg:composer/omnibase/classroom
Requires
- php: ^8.2
- doctrine/orm: ^2.15|^3.0
- glitchr/omnibase: 3.0.*-dev
- omnibase/admin: dev-main
- phpoffice/phpspreadsheet: ^1.23|^2.0|^3.0|^4.0|^5.0
- symfony/config: ^6.0|^7.0|^8.0
- symfony/dependency-injection: ^6.0|^7.0|^8.0
- symfony/form: ^6.0|^7.0|^8.0
- symfony/http-kernel: ^6.0|^7.0|^8.0
- symfony/security-bundle: ^6.0|^7.0|^8.0
Requires (Dev)
None
Suggests
- omnibase/blog: Comments under a sequence.
- omnibase/marketplace: Sells resources: a ResourceOffer is a product, paid it entitles the buyer to the download.
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-10-03 22:58:32 UTC
README
A teacher's open classroom on omnibase: what a colleague passing by may pick up - the way the French teachers' sites (Lutin Bazar, Charivari, Orphée) organise things, built on omnibase's own Thread and Taxon instead of a blog engine.
| Entity | Is a | What |
|---|---|---|
Level |
Taxon |
a class level, in a tree of cycles: Cycle 2 › CP, CE1, CE2 |
Subject |
Taxon |
a discipline, with its sub-domains: Français › Lecture, Grammaire… |
Purpose |
Taxon |
"pour la classe": rituals, displays, autonomy, games, organisation |
Sequence |
Thread |
a learning sequence: its objectives, competences, period (P1…P5), material, cover, and its Sessions |
Session |
Thread (child of a Sequence) |
one session: its duration and its course (EditorJS) |
Card |
Thread |
an idea card: a picture, a few lines, one to three links - the fan of the home page |
Resource |
— | a file to download: PDF, document, spreadsheet, archive; free, for members, or paid |
Product\ResourceOffer |
marketplace Product |
a paid resource for sale; paying it writes an Entitlement |
Levels, subjects and purposes are the taxa of the threads, so a sequence
is "CP and CE1 · Allemand" (multi-level: several levels on one thread) and
every list filters by them. The text of a sequence, a session or a card is
EditorJS, autosaved; with the yjs relay configured (COLLAB_RELAY_WS_URL) it
is co-edited live.
Resources live outside public/ (the flysystem storage local.classroom,
which the host defines) and are served through signed, short-lived links -
by nginx (accel_prefix, X-Accel-Redirect) or by PHP. A spreadsheet (xlsx,
xls, csv) is previewed as a table (preview_rows rows) through PhpSpreadsheet;
an image through omnibase's thumbnails.
Install
composer require omnibase/classroom:dev-main
// config/bundles.php Base\Classroom\ClassroomBundle::class => ['all' => true],
# config/routes.yaml classroom_controller: resource: "@ClassroomBundle/src/Controller/Client" type: attribute prefix: / # config/packages/flysystem.yaml flysystem: storages: local.classroom: local: directory: '%kernel.project_dir%/var/storage/classroom' # config/packages/classroom.yaml (every key optional) classroom: accel_prefix: '' # nginx internal location, empty: PHP streams the file download_ttl: 600 # seconds a signed link lives preview_rows: 30 # rows of a spreadsheet shown in the preview members_role: ROLE_USER # who the MEMBERS resources are for per_page: 24
Then migrations and assets:install (public/css/classroom.css).
Routes
/classe/{level}, /classe/{level}/{subject}, /matiere/{subject},
/pour-la-classe/{purpose}, /sequences, /sequences/{slug}, /cartes,
/cartes/{slug}, /ressources, /ressources/{slug},
/ressources/{slug}/telecharger, /rechercher?q=. Twig:
classroom_levels(), classroom_subjects(), classroom_purposes(),
classroom_cards(limit), classroom_sequences(limit).
The back office gets a CRUD for each entity and the dashboard widget
classroom_overview (downloads of the month, drafts, resources).
The shop
/boutique (classroom_shop) lists the resources for sale, one card each,
and sells them with omnibase/marketplace's quick order: an e-mail
address, the payment, no account and no basket. The order's page - a signed
link, shown after the payment and mailed to the buyer
(classroom.from_email sets the sender) - lists the files, each behind a
signed download link. A signed-in member buys in their own name and finds
the file in their account as before.