Модели контента в Alfresco (часть 2)
Продолжим начатую тему. Впереди - самое главное. Как же применить этот XML, написанный ранее? Зачем он нам? А вот сейчас посмотрим.
Применение новой модели
Сначала надо уведомить Alfresco о том, что у нас появилась новая модель. Это делается добавлением нового файла в директорию tomcat/shared/classes/alfresco/extension/, название файла должно соответствовать маске *-context.xml. Можно просто добавить код в стандартный custom-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/request.xml</value> </list> </property> </bean> </beans>
Этап 2. Добавление модели в интерфейс /alfresco
В интерфейс alfresco всего 3 места, где нужно что-то изменить:
1. Content Wizard - модуль, отвечающий за загрузку новый документов. Чтобы мы могли выбрать для нового документа принадлежность к нашему типу.
Находим/создаем в той же директории tomcat/shared/classes/alfresco/extension/ файл web-client-config-custom.xml и добавляем туда следующие строки:
<config evaluator="string-compare" condition="Content Wizards" replace="true"> <content-types> <type name="itd:Request" /> </content-types> </config>
После этого получаем такой результат:
2. Вторым этапом добавляем свойства файла. Какие и как должны показываться? Самый простой вариант:
<config evaluator="node-type" condition="itd:Request"> <property-sheet> <show-property name="itd:Number" /> <show-property name="itd:Category" /> <show-property name="itd:Status" /> <show-association name="itd:relatedDocuments" /> </property-sheet> </config>
Все в соответствии с моделью: свойства, ассоциации. Конечно же эту часть можно делать более сложно и с множеством рюшечек, но сейчас у нас цель - просто понять, как это счастье нам покажется. А вот так:
- сначала при редактировании
- потом просто так
А где же мы потеряли аспекты?
3. А аспекты мы описываем в разделе Action Wizards - Rule Wizard.
Добавляем в tomcat/shared/classes/alfresco/extension/ файл web-client-config-custom.xml строки
<config evaluator="string-compare" condition="Action Wizards" replace="true"> <aspects> <!-- добавляем все аспекты, которые успели создать в моделе--> <aspect name="itd:Severity" /> </aspects> <subtypes> <type name="itd:Request" /> </subtypes> </config>
Далее добавление действий на аспекты выглядит примерно так:
С вашего позволения точнее описывать пока что не буду, спать хочется.. Если есть вопросы по реализации конкретного аспекта - пишите в комменты, а вообще пробуйте..
Этап 3. Добавление модели в интерфейс /share
Во первых, нужно научиться загружать документы нашего типа. Это делается в файле tomcat/webapps/share/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/upload/flash-upload.get.js. Требуется добавить наш тип в список, либо изменить существующий на новый. Мы облегчим задачу и просто удалим все типы кроме нашего.
function getContentTypes() { var contentTypes = [ { id: "itd:Request", value: "itd_Request" }]; return contentTypes; } model.contentTypes = getContentTypes();
После этого все загружаемые документы будут нашего типа.
Следующим этапом отображаем новые свойства в метаданных. Для этого нужно найти (или создать) файл tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml. По аналогии с web-client-config-custom.xml получается такой файл:
<alfresco-config> <config evaluator="node-type" condition="itd:Request"> <forms> <form> <field-visibility> <show id="itd:Number" /> <show id="itd:Category" /> <show id="itd:Status" /> <show id="itd:relatedDocuments" /> <show id="cm:name" /> </field-visibility> </form> </forms> </config> </alfresco-config>
Вот и все. Ничего нереального, но это помогает заметно упростить категоризацию и обработку документов, обладающих определенными свойствами.
В ожидании ваших комментариев,
Олег Китаков
okitakov [AT] gmail [DOT] com
Комментарии
27/04/2011 - 17:45
Здравствуйте, подскажите пожалуйста что нужно добавить в код, чтобы в момент когда документ отправляелся корректорам, у инициатора т у корректора он перемещался в какую-нибудь папку, например у инициатора из 'Входящие" в "Редактируемые", а у корректора, во "Входящие" ?
13/05/2011 - 12:11
А есть ли смысл в такого рода перемещении? Ведь на самом деле документ никуда не перещается в ходе процесса, просто ссылка на него находится в ресурсах процесса и передается из задачи в задачу. Если же таки нужно переместить, то должен быть такой примерно код (в примере у меня документ перемещается в подпапку "Входящие" домашней папки лица, выбираемого через bpm:assignee. Папка имее пользовательский тип inFolder)
Скрипт привязываем к transition
<transition name="" to="NextNode" >
<action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
<runas>admin</runas>
<script>
// Здесь определяем логин человека
var actor=bpm_assignee.properties['cm:userName'];
// Строка для поиска его домашней папки
var str='@cm\\:owner:"'+actor+'"';
// Ищем домашнюю папку
var nodes = search.luceneSearch(str);
// У нас только одна папка во владении юзера, если это не так, то нужно как-то опознать ее
var homenode=nodes[0];
// Просматриваем папку и ищем в ней вложенную папку с типом inFolder (или по названию ищем, но здесь больше возможностей для ошибок)
for (var i = 0; i < homenode.children.length; i++) {
if ( homenode.children[i].type == '{http://www.company.com/model/content/1.0}inFolder' ) {
// нашли и пересылаем документ
bpm_package.children[0].move(homenode.children[i]);
}
}
</script>
</action>
</transition>
28/04/2011 - 17:31
Спасибо за информацию, думаю она очень важна для начинающих пользователей. К сожалению, Вы не осветили вопрос локализации, без этого наверно приведенные примеры будут нерабочими.
И еще вопрос - сейчас Альфреска позволяет динамически загружать модели, путем либо ручной загрузки в папку Company home/Data Dictionary/Model, либо через веб-консоль администратора репозитория http://localhost:8080/alfresco/faces/jsp/admin/repoadmin-console.jsp. Сама модель при этом загружается нормально и автоматически становится доступным создание контента нового типа, однако непонятно как реализуются интерфейсы просмотра и редактирования.
28/04/2011 - 18:21
Интерфейсы (если Вы о формочках, а Вы ведь о них?) просмотра реализуются при помощи правки share-config.custom.xml. Его можно перезагрузить при помощи Refresh Web Scripts по адресу http://localhost:8080/share/service/index
29/04/2011 - 13:07
Не совсем, я пока не о шаре, а о собственно Alfresco-веб-клиенте (который http://localhost:8080/alfresco/). Куда загружать файл web-client-config-custom.xml я разобрался (Company Home/Data Dictionary/Web Client Extentions), новый тип контента и новый аспект появляются где нужно, а вот с локализацией не совсем понятно.
Спасибо за помощь.
29/04/2011 - 13:16
Вот что написано по этому поводу на вики:
Deploying web client properties
Upload a custom 'webclient.properties' file to the 'Web Client Extension' space. These properties will be applied for the next user session/login.
30/04/2011 - 17:28
Вроде все работает. Могу поделиться опытом динамического управления моделями данных (без перезагрузок сервера), если есть интерес, но это нужно отдельный пост ваять. Интересует ли это кого-то?
30/04/2011 - 19:19
Конечно! На портале ощутима нехватка статей, написанных администраторами системы. Лично мне эта тема весьма интересна, так что жду :)
18/05/2011 - 12:06
Я был бы очень рад почитать о подобном опыте. Интерес очень большой
02/06/2011 - 15:48
Здравствуйте, подскажите пожалуйста, как можно изменить тип уже существующего контента? Т.е. создали новый документ типа "cm:content", а теперь я хочу изменить его тип на другой, например, "custom:Details"? И возможно ли это сделать программно (JavaScript)?
03/06/2011 - 00:02
Попробуйте использовать specializeType для node (http://my.safaribooksonline.com/book/databases/content-management-system...)
14/06/2011 - 15:21
Здравствуйте!
В Share в форме расширенного поиска отсутствует возможность отключить поиск по полю, значение которого выбирается из заранее определенного списка (constraint). В Alfresco Explorer такая возможность существует, напротив такого поля там ставится "checkbox" автоматически. Подскажите, пожалуйста, есть ли что-то похожее в Share? Или есть возможность просто как-то очищать такие поля перед поиском? Заранее благодарю.
15/06/2011 - 01:09
Здравствуйте. Это то, что вам нужно?
16/06/2011 - 12:10
Здравствуйте! Пришлось сделать на основе шаблона "mimetype" свои (вместо "неизвестный" - "не учитывать" и т.д.), и все сработало. Не знаю, то ли вы имели в виду, но все равно огромное спасибо! У меня возник еще один важный вопрос. Как в форме (в Share или в Explorer) увидеть тип контента уже созданного документа? В момент создания я его вижу, а потом - нет. Вариант с добавлением cm:type в форму не срабатывает. Выдается пустое поле. Пока могу посмотреть только в информации об узлах в Explorer. Но это не очень удобно. Или косвенно можно догадаться по наличию в документе обязательного аспекта. Но это тоже не подходит. Помогите, пожалуйста. Заранее благодарю.
30/09/2011 - 16:42
Может, кому пригодится такая информация. В Alfresco существует такая особенность: можно изменить тип контента с cm:content на какой-либо другой, но обратно поменять тип нельзя. Поэтому необходимо сразу определять правильно тип контента на этапе его загрузки или создания, если это невозможно - лучше пока присвоить тип cm:content, а потом исправить.
20/12/2011 - 11:46
Вопрос - как отобразить связанные документы как ссылки, перехода к ним "по одному клику"
у меня стоит версия альфрески 4, и в файл *-context.xml пришлось дописать
<bean id="extension.webclient.configBootstrap" class="org.alfresco.web.config.WebClientConfigBootstrap" init-method="init">
<property name="configs">
<list>
<value>alfresco/extension/web-client-config-custom.xml</value>
</list>
</property>
</bean>
иначе не работало.