Paged Content

Paged content, books, periodicals, photographs with the front and back, etcetera, can use the members structure. (See the section describing resource node membership.) This involves creating a resource node for the root record (e.g. the book or the photograph) and child resource nodes for each sub-component (e.g. "Page 1" and "Page 2" or "recto" and "verso") with their corresponding media. Each "child" resource node contains a reference to their "parent" resource node using the field_member_of property.

Child v. Member

Islandora 8 uses the "child" and "member" descriptor for resource nodes that store a reference to another resource node in the "Member Of" field interchangeably. Administrators will more often see the "member" terminology more often while front-end users will usually see "child" terminology.

Similar to the collection view showing members of a collection, Islandora provides an Islandora Model terms, Paged Content and Page, that can be used to trigger paged content behaviors. Islandora Defaults provides a Context for Paged Content resource nodes to trigger displaying an OpenSeadragon viewer showing the child resource nodes' service files.

To enable this, use the Paged Content for the Islandora Model of the parent resource node and Page for the Islandora Model of the child resource node. After the child resource nodes have services file Media (either generated via the built-in derivative creation or added manually), they will be included in the OpenSeadragon paginated viewer displayed on the parent resource node's page. (See the IIIF Documentation for more details on controlling the viewer's behavior.)

Screenshot of a Paged Content resource node displaying the OpenSeadragon viewer with the first child resource node displayed.

However, repository managers can use any method they like, such as a view-based list of teasers, a gallery, or a slide-show to display child resource nodes.

By default child resource nodes are un-ordered. To order the sub-components of a paged content resource node, Islandora provides a Weight field to store a integer value on child resource nodes. Children resource nodes with smaller weight values will come before child resource nodes with larger weight values. This follows the usual ordering pattern of 1 (smaller) coming before 2 (larger).

Weight values do not need to be sequential, just ordered from smallest to largest. For example, the first child resource node can have a value of 10 and the next could have a value of 20 and they will be ordered accordingly. Should a new child be added with the weight value of 15 it will automatically be sorted after the child with the weight value 10 and before the child with the weight value 20.

Child resource nodes can be reordered using a drag-and-drop interface by clicking on the Re-order Children button on the Children tab of the parent resource node.

Re-order Children button

Re-ordering children resource nodes on this page and clicking Save will cause each child resource node's weight value to be updated using sequential values.

Re-order Children form

Why not Drupal's book or weight modules?

Drupal provides the book module in core for creating multi-level ordered content, such as books and manuals. However, this module stores structure and pagination separately from the nodes making serializing these relationships as RDF we can provide to Fedora more difficult than simply using field_member_of with an RDF mapping. Support for the book module may be added in the future.

Drupal also has a weight module that provides a weight field and a drag-and-drop reordering user-interface. However, this module requires users to set a specified range of values which includes their negative corresponding value. E.g. a range setting of '20' will require all children to have a value between '-20' to '20'. This presumes a repository manager can predict how many pages the largest paged content item in their repository will be beforehand. Also, these weight values are serialized into RDF using the Collections Ontology 'index' predicate which assumes positive integer values which cannot be guaranteed using the weight module.

Last update: April 1, 2021