Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Fixed typos

...

An array property can contain a series of object references to other objects in the COAPI; a many-to-many relationship. When its it's presented to the system view or webskin its it's represented as an actual array property, where each index contains the objectid (or primary key) of the related object. This objectid can then be used to reference the related object as needed. In addition, the order (or sequence) of the relationship is preserved so that programmers can rely on the order to be exactly as the user nominated.

Array properties in terms of how they are defined in a content type really don't differ all that much to normal properties. You add a <cfproperty> and simply define type="array" and a list of content types that you would like to allow to be associated using ftJoin, for example ftJoin="SuperPowersuperPower". However, what happens behind the scenes is much more involved.

Code Block
titleExample Array Property
<cfcomponent ..>
...
<cfproperty 
	name="apowersaPowers" type="array" hint="Array of superhuman powers."
	ftSeq="12" ftFieldset="Related Content" ftWizardStep="Relationships" ftLabel="Powers"
	fttypeftType="array" ftJoin="superPower" />
...
</cfcomponent>

...

If you open up the database model after you deploy an array property, you'll notice that the property (for example, aPowers) is not represented by a column in the table. Array data is essentially an index of references to other objects and is defined by its own linked table (for example, superHero_apowersaPowers). The array table includes the parent object, the referenced objectid, the sequence multiple entries should be represented in, and the typename of the referenced object. Importantly, the data model in the database itself does not need to be understood to work with arrays - the framework handles recording and retrieving this information.

Info
titleExtended Arrays

Array properties can themselves be extended to include additional attributes - but heh lets keep it simple for now.

ftjoin ftJoin is a critical piece of metadata as it designates exactly what content types are allowed to be related to this specific property. Interestingly, FarCry Framework is quite happy to have multiple content types referenced, even though the content types themselves may have very different sets of properties. The default UI controls for libraries are designed to allow users to switch between nominated content types if multiple types have been referenced.

...

We're going to add an array property [aSuperPowersaPowers] to join our hero to the powers they posesspossess.

  1. Open the ./packages/types/SuperHerosuperHero.cfc component for editing.
  2. Add the following property
    Code Block
    <cfproperty ftSeq="12" ftFieldset="Related Content" ftWizardStep="Relationships"
    	name="apowersaPowers"
    	type="array"
    	ftLabel="Powers"
    	ftJoin="superPower"
    	hint="Array of superhuman powers." />
    
  3. Go to the webtop COAPI admin area and deploy your new property
  4. If you have a tool for browsing the database schema, now would be a good time to take a look at the underlying array table
    • many to many relationship (bridging table)
    • ParentID, Data, Seq, Typename
  5. Reload the COAPI Metadata
  6. Go to the Super Hero administration screen, and associate super powers from the library picker that should now be available in the edit handler.

...

By default the library will only show a content objects object's label, and if that's blank the objectid. However, like many aspects of the framework, this behaviour can be modified to suit your specific application. FarCry Framework has a special webskin (or view) for rendering the objects selected for the library: ./webskin/typename/librarySelected.cfm (where typename is represented by the actual typename you are trying to modify).

...

  1. Create a new webskin template ./webskin/superpowersuperPower/librarySelected.cfm
  2. Copy the following code into the webskin:
    Code Block
    <cfsetting enablecfoutputonly="true" />
    <!--- @@displayname: Power (Library) --->
    
    <cfoutput>
    <div>
    <img src="#application.url.webroot##stobj.imgPower#"  alt="#stobj.title#" title="#stobj.title#" /> #stobj.title#<br />
    #stobj.description#
    </div>
    </cfoutput>
    
    <cfsetting enablecfoutputonly="false" />
    
  3. Reload the COAPI Metadata to register the newly added webskin.
  4. Go back to the Super Hero admin and try adding super powers. Make sure your librarySelected webskin is working as expected.

...

A UUID property is a single object reference or one-to-many relationship. It behaves in very much the same way as an array property in terms of UI , and the library options that are available. The object reference is stored in a simple string field in the database.

Code Block
titleExample UUID Property
<cfproperty 
	name="sidekickid" type="uuid" hint="Super hero sidekick."
	ftSeq="11" ftFieldset="Related Content" ftWizardStep="Relationships" ftLabel="Sidekick"
	fttypeftType="uuid" ftjoinftJoin="superherosuperHero" />

Walkthrough: Side Kick (there can be only one)

...

  1. Open the ./packages/types/SuperHerosuperHero.cfc component for editing.
  2. Add a UUID property for sidekickID sidekickid
    Code Block
    <cfproperty 
    	name="sidekickid" type="uuid" hint="Super hero sidekick."
    	ftSeq="11" ftFieldset="Related Content" ftWizardStep="Relationships" ftLabel="Sidekick"
    	fttypeftType="uuid" ftjoinftJoin="superherosuperHero" />
    
  3. Go to the webtop COAPI admin area. You should see a single conflict for the Super Hero component.
    • Deploy the sidekickID uuid sidekickid UUID property.
  4. Go to the Super Hero administration screen, and associate a side-kick from the library picker that should now be available in the edit handler.

...

  1. Create a new component; ./packages/types/supergroupsuperGroup.cfc
    • title (string, required)
    • description (longchar, rich text area)
    • headquarters (string)
    • imgHeadQuarters imgHeadquarters (image; 200x200 dimensions, fit inside)
    • aSuperHeroes (joining to superHero)
  2. Deploy the new content type under the COAPI area
  3. Use the scaffold utility to create an admin area and default webskins
  4. Go to the administration area and add "Super Groups" containing your favourite Super Heroes

...