Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create an aspect in Alfresco Content Model

I am starting currently using Alfresco CMS. I need to create an "aspect" in my content model which must contains a number of properties as:

Aspect: 
    property 1 : String
    property 2 : int
    property 3 : int
    property 4 : long

Moreover it must contains two more properties which are composed either of number of properties as:

Format: 
   FormatProperty1: int
   FormatProperty2: int
   FormatProperty3: int

Metadata:
   list1: List<String>
   list2: List<String>
   MetadataProperty 3: boolean

I have not yet created neither a simple content model nor an aspect in Alfresco. Based on my previous knowledge in Relational Databases I perceive the above structure as association between tables. How can I carry out that in Alfresco content model with an aspect or more?

like image 303
arjacsoh Avatar asked Jan 14 '23 21:01

arjacsoh


1 Answers

Let me try to add some extra info to @Alch3mi5t's answer based on your comment. I'm using an imaginary business case here.

Basically, Alfresco model consists of 3 sections: constraints, types and aspects. Plus, I'll add associations in the mix.

  • Type

Each node in alfresco (you might incorrectly think of it as of a "record") has a type. So this type has properties ("columns"). So you have your base type, let's say it's called Vendor. It has two props, Name and tax ID (string and int). Your type definition would look like:

<type name="myCompany:vendor">
  <title>Vendor</type>
  <parent>cm:folder</parent>
  <properties>
    <property name="myCompany:vendorName">
      <title>Vendor name</title>
      <type>d:text</type>
    </property>
    <property name="myCompany:vendorTaxID">
      <title>Vendor Tax ID</title>
      <type>d:int</type>
    </property>
  </properties>
</type>

There goes your type, not unlike a db table with columns vendorName and vendorTaxID of the string and int type.

  • Constraint

Let's say you now have to add some constraint on the tax id - simple regex example. So you have a constraint defined like this:

<constraint name="myCompany:taxIdConstraint" type="REGEX">
  <parameter name="expression">
    <value>^ID[1-9](\-[1-9])*</value>
  </parameter>
  <parameter name="requiresMatch">
    <value>true</value>
  </parameter>
</constraint>

Now we only need to modify our taxId property:

<property name="myCompany:vendorTaxID">
  <title>Vendor Tax ID</title>
  <type>d:int</type>
  <constraints>
    <constraint ref="myCompany:taxIdConstraint">
  </constraints>
</property>

So, you now placed a constraint on that property.

  • Aspect Now you want an aspect - in Alfresco, this would be as if you want to add few extra columns to that table.

No - better analogy, you want a relation from your original table. So if it's null, it's null. But alternatively, it creates a 1-1 (usually) relation to your records to that other table.

The baseline here is that you would never add anything into the aspect table alone - it only comes as an addition to the base type. An example aspect:

<aspect name="myCompany:myAspect">
  <title>Address aspect</title>
  <properties>
    <property name="myCompany:city">
      <title>City</title>
      <type>d:text</type>
    </property>
  </properties>
</aspect>

You can make this a mandatory aspect if you add this to your type definition (just after the properties section):

<mandatory-aspects>
  <aspect>myCompany:myAspect</aspect>
</mandatory-aspects>

Now, you can add a "record" to your base "table", and if you added this as a mandatory aspect, then each record will have 3 props: name, tax id and city. If not mandatory, then each record will have two base columns, but you will be able to add the third to select few. Programatically or manually, doesn't matter.

  • Associations Now we can also add associatons in the mix: this is a link only between two nodes (or "records"). So, after the properties section in your type, you can add associations section. Let's say you want to connect (some) Vendors to their creators (Key accounts).

You add this to your type:

<associations>
  <association name="myCompany:keyAccountManager">
    <source>
      <mandatory>false</mandatory>
      <many>true</many>
    </source>
    <target>
      <class>cm:person</class>
      <mandatory>false</mandatory>
      <many>true</many>
    </target>
  </association>
</associations>

There you have it! You can now connect some or all of the Vendors in your Vendor table to their respective KAMs (so you can email KAMs when something is going on with the Vendor, let's say). Basically, a 1-n connection between your Vendors table and your Users table. 1-n meaning you can connect one Vendor to many Persons. You can also connect different Vendors to one person. (the many parameters).

You can also add association to an aspect, in the same manner:

<aspect name="myCompany:stateAspect">
 <properties>
 ...
 </properties>
 <associations>
  <association name="myCompany:myState">
    <source>
      <mandatory>true</mandatory>
      <many>true</many>
    </source>
    <target>
      <class>cm:folder</class>
      <mandatory>false</mandatory>
      <many>true</many>
    </target>
  </association>
 </associations>
</aspect>

Now you can create regular alfresco folders (cm:folder type) and name them after the state, and have each of the cities be connected to one of them folders. (Not the best way, but shows my point.) so this association is mandatory, meaning if you add this other aspect (not the original one), which is not mandatory, you HAVE to create an association.

So play with the combinations to do what you need.

  • Model

So now you have your example model:

    <?xml version="1.0" encoding="UTF-8"?>
    <model name="myCompany:myContentModel" xmlns="http://www.alfresco.org/model/dictionary/1.0">
      <description>Custom Content Model</description>
      <author>Zlatko Đurić</author>
      <published>2013-03-22</published>
      <version>1.0</version>
      <imports>
        <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
        <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
      </imports>

      <namespaces>
        <namespace uri="myCompany.model" prefix="bv"/>
      </namespaces>

      <constraints>
        <constraint name="myCompany:taxIdConstraint" type="REGEX">
          <parameter name="expression">
            <value>^ID[1-9](\-[1-9])*</value>
          </parameter>
          <parameter name="requiresMatch">
            <value>true</value>
          </parameter>
        </constraint>
      </constraints>

      <types>
        <type name="myCompany:vendor">
          <title>Vendor</type>
          <parent>cm:folder</parent>
          <properties>
            <property name="myCompany:vendorName">
              <title>Vendor name</title>
              <type>d:text</type>
            </property>
            <property name="myCompany:vendorTaxID">
              <title>Vendor Tax ID</title>
              <type>d:int</type>
              <constraints>
                <constraint ref="myCompany:taxIdConstraint">
              </constraints>
              </property>
          </properties>
          <mandatory-aspects>
            <aspect>myCompany:myAspect</aspect>
          </mandatory-aspects>
          <associations>
            <association name="myCompany:keyAccountManager">
              <source>
                <mandatory>false</mandatory>
                <many>true</many>
              </source>
              <target>
                <class>cm:person</class>
                <mandatory>false</mandatory>
                <many>true</many>
              </target>
            </association>
          </associations>
        </type>
      </types>

      <aspects>
        <aspect name="myCompany:myAspect">
          <title>Address aspect</title>
          <properties>
            <property name="myCompany:city">
              <title>City</title>
              <type>d:text</type>
            </property>
          </properties>

          <associations>
            <association name="myCompany:myState">
              <source>
                <mandatory>true</mandatory>
                <many>true</many>
              </source>
              <target>
                <class>cm:folder</class>
                <mandatory>false</mandatory>
                <many>true</many>
              </target>
            </association>
           </associations>
         </aspect>
      </aspects>
    </model>

There, I hope this helps you.
like image 165
Zlatko Avatar answered Jan 30 '23 21:01

Zlatko