Search by

survos / exhibit-bundle

tacman1123

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!

kbond

Statistics

Installs: 9

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v0.2.0 2026-10-13 09:51 UTC

This package is auto-updated.

Last update: 2026-10-13 10:23:45 UTC


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:*, and omeka:* 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.