Создайте аспект в Alfresco Content Model
В настоящее время я начинаю использовать Alfresco CMS. Мне нужно создать "аспект" в моей модели содержимого, который должен содержать ряд свойств, таких как:
Aspect:
property 1 : String
property 2 : int
property 3 : int
property 4 : long
Кроме того, он должен содержать еще два свойства, которые состоят из нескольких свойств:
Format:
FormatProperty1: int
FormatProperty2: int
FormatProperty3: int
Metadata:
list1: List<String>
list2: List<String>
MetadataProperty 3: boolean
Я еще не создал ни простую модель контента, ни аспект в Alfresco. Основываясь на моих предыдущих знаниях по реляционным базам данных, я воспринимаю вышеуказанную структуру как связь между таблицами. Как я могу выполнить это в контентной модели Alfresco с аспектом или более?
2 ответа
Вы должны посмотреть здесь в первую очередь. Создание модели в Alfresco далеко от БД.
это просто хорошо определенный XML. Сначала вы должны написать XML, а затем инициализировать его с помощью начальной загрузки.
Пример XML-модели cmodModel.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Definition of new Model -->
<model name="custom:custommodel" xmlns="http://www.alfresco.org/model/dictionary/1.0">
<!-- Optional meta-data about the model -->
<description>Custom Model</description>
<author>Whatever</author>
<version>1.0</version>
<!-- Imports are required to allow references to definitions in other models -->
<imports>
<!-- Import Alfresco Dictionary Definitions -->
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" />
<!-- Import Alfresco Content Domain Model Definitions -->
<import uri="http://www.alfresco.org/model/content/1.0" prefix="cm" />
<import uri="http://www.alfresco.org/model/system/1.0" prefix="sys" />
</imports>
<!-- Introduction of new namespaces defined by this model -->
<namespaces>
<namespace uri="custom.model" prefix="cmod" />
</namespaces>
<!-- Lists <String> -->
<constraints>
<constraint name="cmod:liststring1" type="LIST">
<parameter name="allowedValues">
<list>
<value>value 1</value>
<value>value 2</value>
</list>
</parameter>
</constraint>
<constraint name="cmod:liststring2" type="LIST">
<parameter name="allowedValues">
<list>
<value>value 1</value>
<value>value 2</value>
</list>
</parameter>
</constraint>
</constraints>
<types>
<!-- Document Type -->
<type name="cmod:customDoc">
<title>Document</title>
<description>Document</description>
<parent>cm:content</parent>
<mandatory-aspects>
<aspect>cmod:aspectBase</aspect>
<aspect>cmod:aspectFormat</aspect>
<aspect>cmod:aspectMetadata</aspect>
</mandatory-aspects>
</type>
</types>
<!-- Definition of custom aspects -->
<aspects>
<aspect name="cmod:aspectBase">
<title>Aspect base properties</title>
<properties>
<property name="cmod:property1">
<title>p1</title>
<description>p1</description>
<type>d:text</type>
</property>
<property name="cmod:property2">
<title>p2</title>
<description>p2</description>
<type>d:int</type>
</property>
<property name="cmod:property3">
<title>p3</title>
<description>p3</description>
<type>d:int</type>
</property>
<property name="cmod:property4">
<title>p4</title>
<description>p4</description>
<type>d:text</type>
</property>
</properties>
</aspect>
<aspect name="cmod:aspectFormat">
<title>Aspect Format</title>
<properties>
<property name="cmod:formatProperty1">
<title>fp1</title>
<description>fp1</description>
<type>d:int</type>
</property>
<property name="cmod:formatProperty2">
<title>fp2</title>
<description>fp2</description>
<type>d:int</type>
</property>
<property name="cmod:formatProperty3">
<title>fp3</title>
<description>fp3</description>
<type>d:int</type>
</property>
</properties>
</aspect>
<aspect name="cmod:aspectMetadata">
<title>Aspetto Metadata</title>
<properties>
<property name="cmod:metadataProperty1">
<title>mp1</title>
<description>mp1</description>
<type>d:text</type>
<constraints>
<constraint ref="cmod:liststring1" />
</constraints>
</property>
<property name="cmod:metadataProperty2">
<title>mp2</title>
<description>mp2</description>
<type>d:text</type>
<constraints>
<constraint ref="cmod:liststring2" />
</constraints>
</property>
<property name="cmod:metadataProperty3">
<title>mp3</title>
<description>mp3</description>
<type>d:boolean</type>
</property>
</properties>
</aspect>
</aspects>
</model>
контекст модели с именем cmod-model-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<!-- Registration of new models -->
<bean id="extension.dictionaryBootstrap"
parent="dictionaryModelBootstrap"
depends-on="dictionaryBootstrap">
<property name="models">
<list>
<value>alfresco/extension/model/cmodModel.xml</value>
</list>
</property>
</bean>
</beans>
Надеюсь, поможет.
Позвольте мне добавить дополнительную информацию к ответу @Alch3mi5t, основываясь на вашем комментарии. Я использую воображаемое экономическое обоснование здесь.
По сути, модель Alfresco состоит из 3 разделов: ограничения, типы и аспекты. Плюс, я добавлю ассоциации в смесь.
- Тип
Каждый узел на свежем воздухе (вы можете неправильно думать о нем как о "записи") имеет тип. Таким образом, этот тип имеет свойства ("столбцы"). Итак, у вас есть базовый тип, скажем, он называется Vendor. Он имеет два реквизита, имя и налоговый идентификатор (строка и int). Ваше определение типа будет выглядеть так:
<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>
Идет ваш тип, в отличие от таблицы БД со столбцами vendorName и vendorTax ID типа string и int.
- скованность
Допустим, теперь вам нужно добавить некоторое ограничение на налоговый идентификатор - пример простого регулярного выражения. Итак, у вас есть ограничение, определенное так:
<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>
Теперь нам нужно только изменить наше свойство taxId:
<property name="myCompany:vendorTaxID">
<title>Vendor Tax ID</title>
<type>d:int</type>
<constraints>
<constraint ref="myCompany:taxIdConstraint">
</constraints>
</property>
Итак, вы теперь наложили ограничение на это свойство.
- Аспект Теперь вам нужен аспект - в Alfresco это будет выглядеть так, как будто вы хотите добавить несколько дополнительных столбцов в эту таблицу.
Нет - лучше аналогия, вы хотите связь с вашей первоначальной таблицы. Так что, если это ноль, это ноль. Но в качестве альтернативы он создает отношение 1-1 (обычно) к вашим записям к этой другой таблице.
Базовая линия здесь заключается в том, что вы никогда не добавите ничего в таблицу аспектов - это всего лишь дополнение к базовому типу. Пример аспекта:
<aspect name="myCompany:myAspect">
<title>Address aspect</title>
<properties>
<property name="myCompany:city">
<title>City</title>
<type>d:text</type>
</property>
</properties>
</aspect>
Вы можете сделать это обязательным аспектом, если добавите это в определение типа (сразу после раздела свойств):
<mandatory-aspects>
<aspect>myCompany:myAspect</aspect>
</mandatory-aspects>
Теперь вы можете добавить "запись" в вашу базовую "таблицу", и если вы добавили это как обязательный аспект, то каждая запись будет иметь 3 реквизита: имя, налоговый идентификатор и город. Если не обязательно, то каждая запись будет иметь два базовых столбца, но вы сможете добавить третий, чтобы выбрать несколько. Программно или вручную, не имеет значения.
- Ассоциации Теперь мы также можем добавлять ассоциации в микс: это связь только между двумя узлами (или "записями"). Итак, после раздела свойств в вашем типе, вы можете добавить раздел связей. Допустим, вы хотите подключить (некоторых) поставщиков к их создателям (ключевые учетные записи).
Вы добавляете это к своему типу:
<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>
Вот оно! Теперь вы можете подключить некоторых или всех поставщиков в своей таблице поставщиков к их соответствующим KAM (скажем, вы можете отправлять KAM по электронной почте, когда что-то происходит с поставщиком, скажем). По сути, 1-n соединение между вашей таблицей Vendors и вашей таблицей Users. 1-n означает, что вы можете подключить одного Продавца ко многим Лицам. Вы также можете подключить разных поставщиков к одному человеку. (много параметров).
Вы также можете добавить ассоциацию к аспекту таким же образом:
<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>
Теперь вы можете создавать обычные папки на открытом воздухе (cm: тип папки) и называть их по названию штата, и каждый из городов должен быть подключен к одной из этих папок. (Не лучшим образом, но показывает мою точку зрения.) Поэтому эта ассоциация является обязательной, то есть, если вы добавите этот другой аспект (не исходный), который не является обязательным, вы ДОЛЖНЫ создать ассоциацию.
Так что играйте с комбинациями, чтобы делать то, что вам нужно.
- модель
Итак, теперь у вас есть пример модели:
<?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.