Object Relationships
Content Repository : Developer Guide
Many applications of the content repository require that content
items be related to each other as well as to other classes of objects.
Examples include:
- News stories may be linked to other stories on the same topic.
- An article may be linked to any number of photos or charts that are
embedded in the article.
- A long article is divided into multiple sections, each of which is
intended for separate display.
- Product reviews are linked to specific products.
- User portraits are linked to specific users.
The ACS kernel provides a standard, highly flexible data model and
API for relating objects to other objects. If you have a highly
specific problem and are developing your own user interface on the
content repository, you can use the ACS relationships framework
directly. The relationship framework in the content repository itself
is simply intended as a convenience for handling common relationship
situations involving content items.
Parent-Child Relationships
In many cases one content item may serve as a natural container for
another item. An article divided into sections, or a news story with
an associated photo are one example of this. These "parent-child"
relationships are handled by the basic hierarchical organization of the
content repository. Every item has a parent item, represented internally
by the parent_id column in the cr_items table.
It is often desirable to constrain the number and content type of
child items. For example, the specifications for a news story may
only allow for a single photo. A structured report may have exactly
three sections. Furthermore, it may be necessary to classify or
identify child items of the same type. Clearly the sections of a
report would have a logical order in which they would need to be
presented to the user. The layout for a photo album may have a special
position for a "featured" photo.
The content repository accommodates these situations in the
following ways:
- An API procedure, content_type.register_child_type, may be
used to specify the minimum and maximum number of children of a
particular content type that an item may have. You may optionally
specify a "tag" for identifying child items of the same type. For
example, you may want to allow only 1 image with the "featured" tag,
and up to 8 other images without this.
- A Boolean API function, content_item.is_valid_child,
which checks all registered child constraints on the content type of
an item and returns true if it is currently possible to add an child
of a particular type to tan item. Note that this function does not
protect against concurrent transactions; it is only foolproof if you
lock the cr_child_rels table beforehand.
- A mapping table, cr_child_rels, which contains two
attributes, order_n and relation_tag, that may be
used to characterize the parent-child relationship. Parent-child
relationships are themselves treated as ACS Objects, so this table may
be extended with additional attributes as required by the
developer.
Note that there is no currently no explicit API to "add a child."
You specify the parent of an item upon creating it. You can use the
API procedure content_item.move to change the parent of an
item.
Item-Object Relationships
In addition to the relationships to their parents and children in
the content repository hierarchy, content items may be linked to any
number of other objects in the system. This may include products,
users or content items on related subjects.
The same need to constrain the possibilities for an item-object
relationship, as described above for parents and children, also apply
to items and objects in general. The content repository provides a
data model and API for managing these constraints that parallels what
is provided for parent-child relationships:
- An API procedure, content_type.register_relation_type,
may be used to specify the minimum and maximum number of relations
with a particular object type that an item may have. There is no
limitation on the type of objects that may be related to content
items. If you wish to relate content items to other content items,
however, the object type should specify a content type (a subtype of
content_revision) rather than simply content_item.
As for parent-child relationship constraints, ou may optionally
specify a "tag" for identifying related objects of the same type.
- A Boolean API function, content_item.is_valid_relation,
which checks all registered constraints on the content type of an item
and returns true if it is currently possible to relate an object of a
particular type to an item.
- A mapping table, cr_item_rels, which contains two
attributes, order_n and relation_tag, that may be
used to characterize the item-object relationship. Item-object
relationships are themselves treated as ACS Objects, so this table may
be extended with additional attributes as required by the
developer.
Extending Parent-Child and Item-Object Relationships
The simple relation mechanisms described above may not be
sufficient for some applications. However, because both relationships
defined by the content repository are themselves objects, you
have the option to extend their types as you would for any other ACS
object.
karlg@arsdigita.com
Last modified: $Id: object-relationships.html,v 1.2 2017/08/07 23:47:47 gustafn Exp $