Setup and Administration Defining Content Types Content Types Predefined Content Types The ACS content repository package includes two pre-defined content types, the basic item -- or content_revision type -- and the image type. Other predefined content types include the acs_message_revision, which is used by the ACS messaging package. All other content types should have content_revision as an ancestor type. Using Methods from the <computeroutput>content_type</computeroutput> package You may also define content types to suit your own needs by using the create_type procedure in the content_type package: procedure create_type ( --/** Create a new content type. Automatically create the attribute table -- for the type if the table does not already exist. -- @author Karl Goldstein -- @param content_type The name of the new type -- @param supertype The supertype, defaults to content_revision -- @param pretty_name Pretty name for the type, singular -- @param pretty_plural Pretty name for the type, plural -- @param table_name The name for the attribute table, defaults to -- the name of the supertype -- @param id_column The primary key for the table, defaults to 'XXX' -- @param name_method As in acs_object_type.create_type -- @see {acs_object_type.create_type} --*/ content_type in acs_object_types.object_type%TYPE, supertype in acs_object_types.object_type%TYPE default 'content_revision', pretty_name in acs_object_types.pretty_name%TYPE, pretty_plural in acs_object_types.pretty_plural%TYPE, table_name in acs_object_types.table_name%TYPE, id_column in acs_object_types.id_column%TYPE default 'XXX', name_method in acs_object_types.name_method%TYPE default null ); content_type denotes the name of the new content type you wish to define. supertype defaults to content_revision, the root object type for content types. Content types can also be defined by sub-classing other content types -- i.e. sub-types of the content_revision object type. Sub-classing another content type gives the designer the added benefit of any pre-existing attributes associated with the sub-typed content type. [include a compelling example of why that might be a good idea] Example Here's an example of a content type definition; we made cr_demo_article_image a sub-class of the image content type so that it would inherit the properties of a basic image, but also included the caption field for text information to be included with the image: declare attr_id integer; begin content_type.create_type ( content_type => 'cr_demo_article_image', supertype => 'image', pretty_name => 'Captioned image', pretty_plural => 'Captioned images', table_name => 'cr_demo_article_images', id_column => 'article_image_id' ); attr_id := content_type.create_attribute ( content_type => 'cr_demo_article_image', attribute_name => 'caption', datatype => 'text', pretty_name => 'Caption', pretty_plural => 'Captions' ); cm_form_widget.register_attribute_widget( content_type => 'cr_demo_article_image', attribute_name => 'caption', widget => 'text', is_required => 't' ); end; / show errors The other procedural calls, content_type.create_attribute and cm_form_widget.register_attribute_widget are used for creating content type-specific attributes and for registering those attributes with the CMS form-builder. Attributes Content types are largely distinguished by the attributes and methods associated with the type. CMS features convenient form-generating functions that build forms that request for values appropriate for each content type's attributes; in order to do this, CMS requires that content type attributes be registered in the database. Registering Attributes for Your Content Type Register content type attributes with the create_attribute function in the content_type package: function create_attribute ( --/** Create a new attribute for the specified type. Automatically creates -- the column for the attribute if the column does not already exist. -- @author Karl Goldstein -- @param content_type The name of the type to alter -- @param attribute_name The name of the attribute to create -- @param pretty_name Pretty name for the new attribute, singular -- @param pretty_plural Pretty name for the new attribute, plural -- @param default_value The default value for the attribute, defaults to null -- @return The id of the newly created attribute --*/ content_type in acs_attributes.object_type%TYPE, attribute_name in acs_attributes.attribute_name%TYPE, datatype in acs_attributes.datatype%TYPE, pretty_name in acs_attributes.pretty_name%TYPE, pretty_plural in acs_attributes.pretty_plural%TYPE default null, sort_order in acs_attributes.sort_order%TYPE default null, default_value in acs_attributes.default_value%TYPE default null, column_spec in varchar2 default 'varchar2(4000)' ) return acs_attributes.attribute_id%TYPE; content_type contains the name of the content type with which the attribute is associated. datatype should contain the one of the keyword datatype values contained in the acs_datatypes table, e.g. boolean, date, integer, money. If you wish to designate a datatype not already recorded in the acs_datatypes table, be sure to first insert your datatype into the table before registering your attribute. content_type.create_attribute returns the attribute_id associated with your newly created attribute. See Defining Content Types [put ref links here to ch 2.2.1 when you learn how to do that] for an example of content_type.attribute_create in use. File Types CMS Default Mime Types A listing of file types, or mime types, whose storage is supported by the ACS content repository is stored in the cr_mime_types table. The ACS Content Repository supports four pre-registered mime types: plain and html text, as well as image GIFs and jpegs. The CMS News Demo also registers upon installation a few mime types designating audio files and video files: begin /* Insert audio and video MIME types */ dbms_output.put_line('Inserting audio and video MIME types...'); insert into cr_mime_types ( label, mime_type, file_extension ) values ( 'Wave Audio File','audio/x-wav','wav' ); insert into cr_mime_types ( label, mime_type, file_extension ) values ( 'Basic Audio File','audio/basic','au' ); insert into cr_mime_types ( label, mime_type, file_extension ) values ( 'QuickTime Video','video/quicktime','qt' ); insert into cr_mime_types ( label, mime_type, file_extension ) values ( 'Mpeg Video','video/mpeg','mpg' ); end; / show errors Registering Mime Types to Your Content Types Each content object stored in CMS -- such as an image, text article or movie clip -- must be associated with a specific mime type. Also, each content type must also be pre-registered with all of the possible mime types with which that content type might be associated. For example, the image content type is registered to hold jpeg and gif files, but each instance of the image type -- that is, each image revision stored in the CMS -- will contain only one file of either the jpeg or gif file type. Use content_type.register_mime_type to register pre-defined mime types with your newly created content type: procedure register_mime_type ( content_type in cr_content_mime_type_map.content_type%TYPE, mime_type in cr_content_mime_type_map.mime_type%TYPE ); If the mime type you wish to register is not yet defined in the ACS content repository, define it by inserting a row in the cr_mime_types table as you saw done in CMS Default Mime Types. Templates Overview Each piece of content requires atleast one template on which to be displayed before the content piece can be published by CMS. Templates serve as the framework upon which a content item is mounted. Templates are associated to content types, and each individual content item published by CMS will be displayed upon one of the templates associated to its content type. Multiple templates can be associated to multiple content types, allowing a single piece of content to be framed upon multiple templates, such as an image published with borders of various colors, or a single template to display multiple content types, such as using a common background for all text, images and video feeds. Registering Templates to a Content Type Register templates through the CMS clipboard system, first by marking or adding items to the CMS clipboard, then by clicking on by going to the "Templates" tabbed page of the appropriate content type. Adding Templates to the Clipboard Templates can be marked for addition to the clipboard by opening the folder in which the template is contained. A listing of templates and folders will appear in the main right-side widow, a listing which includes a column of checkboxes for adding selected templates to the clipboard. The above screenshot displays the contents of my /articles folder, which contains three templates already added to the clipboard. Registering Templates from the Clipboard Find the "Templates" page of your content type by first expanding the Content Types folder (and perhaps other sub-folders) on the CMS navigation tree, clicking on the folder or label for your content type, and then clicking on the light blue "Templates" tab in the main frame. With your mouse, point and click on Register marked templates to this content type, and then choose select from the clipboard the templates you wish to register. The Template section of the Basic Item content type. CMS News Demo Templates Though CMS does not come with any prepackaged templates, the CMS News Demo package does contain a variety of news article templates that include image and multimedia link tags. These templates can be found under /cms-news-demo/templates/demo_articles in the News Demo package. &data-entry-methods; Relationships Overview 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: Content to non-content object: User portraits are linked to specific users. Content to content: An article may be linked to any number of photos or charts that are embedded in the article. Content within content: A long article is divided into multiple sections, each of which is intended for separate display. Multiple content items to a category: News stories may be linked to other stories on the same topic. When relating content types, it is important to establish whether your related items of content can exist separately of each other, such as an article and piece of stock footage or photography, or whether the one of the content items should exist only within the context of another, as in the example from above of a sectioned article with individual portions meant for separate display. We refer to these latter relationships as parent-child relationships. The former can be generically grouped as Item-Object Relationships; relationships between items of content to non-content objects (example 1) would also fall under this category. Of the above examples, the first three types of relationship are handled by the content_type package API, and the last managed through CMS itself. Item-Object Relationships Define item-object relationships with the content_type.register_relation_type API: procedure register_relation_type ( content_type in cr_type_relations.content_type%TYPE, target_type in cr_type_relations.target_type%TYPE, relation_tag in cr_type_relations.relation_tag%TYPE default 'generic', min_n in integer default 0, max_n in integer default null ); content_type refers to the name of the content type from which the relationship originates. target_type takes the name of the object type to which the content is related. relation_tag accepts a simple token identifier used in distinguishing relationships min_n and max_n refer to the minimum/maximum relationships of this type required before the item of content goes live. After a relationship between one content type and another object type (content or not) has been registered, you may use content_item.is_valid_relation to confirm potential relationships. Parent-Child Relationships Parent-child relationships are also registered using the content_type package API: procedure register_child_type ( parent_type in cr_type_children.parent_type%TYPE, child_type in cr_type_children.child_type%TYPE, relation_tag in cr_type_children.relation_tag%TYPE default 'generic', min_n in integer default 0, max_n in integer default null ); The parameters for content_type.register_child_type are largely analogous to those for content_type.register_relation_type , except parent_type and child_type must both be content types ( content_revision or a sub-class of it). content_item.is_valid_relation can also be used to verify the validity of a potential parent-child relationship. Register Staff Users [This document is still under construction] Defining Workflows Departments Roles Structuring the Site Map Folders &user-permissions; Content Types &cms-tasks;