survos / exhibit-bundle
Symfony integration for authoring and publishing Story Contract exhibit stories.
Package info
github.com/survos/exhibit-bundle
Type:symfony-bundle
pkg:composer/survos/exhibit-bundle
Fund package maintenance!
Requires
- php: >=8.4
- survos/data-contracts: ^2.36
- survos/folio-bundle: ^2.37
- survos/harvest-bundle: ^2.38
- survos/kit-bundle: ^2.5
- symfony/framework-bundle: ^6.4 || ^7.0 || ^8.0
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Symfony integration for authoring, resolving, previewing, and publishing Story Contract documents.
The portable story definition lives in tacman/story-contract. This bundle is
the PHP/Symfony layer around that contract:
- persistence for stories, blocks, bookmarks, saved searches, and projections
- authoring UI for OpenFoto/zm-backed source material
- YAML import/export for editorial review
- reference resolution and snapshot publishing
- Twig components for server-rendered story pages
- API endpoints that export normalized story JSON
- adapters for target projections such as Omeka S and TimelineJS
The bundle must not make Symfony entities the canonical interchange format. The canonical portable document is the Story Contract JSON document.
Status
Most of the above is still aspirational. Built so far: GET /stories and
GET /stories/{id} (StoryController/StoryFinder), plus /sites, publishing
the story core of every local folio that has one (currently Harvest's
Curatescape pipeline). StoryIndex learns which folios those are from
harvest-bundle's catalog (each artifact's published coreCounts), so no folio
is opened just to find out; requires survos/harvest-bundle. Read-only, no persistence,
authoring, or projection adapters yet. This is the first real consumer:
survos-sites/sos's rut app fetching the available tour list instead of a
hardcoded PHP source array (see survos-sites/sos#6).
Responsibilities
This bundle owns:
- Doctrine entities and repositories
- workflow states such as draft, review, published, archived
- security voters and ownership checks
- admin forms and UX authoring screens
- OpenFoto/zm bookmark and search integrations
- resolver services for
openfoto:*,zm:*, andomeka:*references - Twig rendering and hydration hooks
- export commands and controllers
This bundle does not own:
- the framework-neutral JSON schema
- npm/browser rendering packages
- Omeka S internal data models
- TimelineJS slide authoring as the source format
Target Contract
Stories exported by this bundle should validate against:
https://github.com/tacman/story-contract
The bundle may store normalized relational data internally, but export should produce:
{
"schema": "https://tacman.github.io/story-contract/schema/story.v1.schema.json",
"version": 1,
"id": "story:example",
"title": "Example story",
"bookmarks": [],
"queries": [],
"resources": {},
"blocks": [],
"connections": [],
"projections": {}
}
Documentation
docs/architecture.md- boundaries between contract, bundle, renderers, and adapters.docs/authoring-openfoto-zm.md- authoring model for bookmarks and saved searches.docs/yaml-workflow.md- YAML import/export for non-programmer story editing.docs/reference-resolution.md- reference expansion and snapshot publishing.docs/projections.md- Symfony services for Story, Omeka S, TimelineJS, and JSON-LD projections.