Модели контента в 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

4059

Комментарии

Здравствуйте, подскажите пожалуйста что нужно добавить в код, чтобы в момент когда документ отправляелся корректорам, у инициатора т у корректора он перемещался в какую-нибудь папку, например у инициатора из 'Входящие" в "Редактируемые", а у корректора, во "Входящие" ?

А есть ли смысл в такого рода перемещении? Ведь на самом деле документ никуда не перещается в ходе процесса, просто ссылка на него находится в ресурсах процесса и передается из задачи в задачу. Если же таки нужно переместить, то должен быть такой примерно код  (в примере у меня  документ перемещается в подпапку "Входящие" домашней папки лица, выбираемого через 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 &lt; 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> 

Спасибо за информацию, думаю она очень важна для начинающих пользователей. К сожалению, Вы не осветили вопрос локализации, без этого наверно приведенные примеры будут нерабочими.

И еще вопрос -  сейчас Альфреска позволяет динамически загружать модели, путем либо ручной загрузки в папку Company home/Data Dictionary/Model, либо через веб-консоль администратора репозитория http://localhost:8080/alfresco/faces/jsp/admin/repoadmin-console.jsp. Сама модель при этом загружается нормально и автоматически становится доступным создание контента нового типа, однако непонятно как реализуются интерфейсы просмотра и редактирования.

fufler аватар

 Интерфейсы (если Вы о формочках, а Вы ведь о них?) просмотра реализуются при помощи правки share-config.custom.xml. Его можно перезагрузить при помощи Refresh Web Scripts по адресу http://localhost:8080/share/service/index

Не совсем, я пока не о шаре, а о собственно Alfresco-веб-клиенте (который http://localhost:8080/alfresco/). Куда загружать файл web-client-config-custom.xml я разобрался (Company Home/Data Dictionary/Web Client Extentions), новый тип контента и новый аспект появляются где  нужно, а вот с локализацией не совсем понятно.

Спасибо за помощь.

fufler аватар

 Вот что написано по этому поводу на вики:

 

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.

Вроде все работает. Могу поделиться опытом динамического управления моделями данных (без перезагрузок сервера), если есть интерес, но это нужно отдельный пост ваять.  Интересует ли это кого-то?



fufler аватар

Конечно! На портале ощутима нехватка статей, написанных администраторами системы. Лично мне эта тема весьма интересна, так что жду  :)

Я был бы очень рад почитать о подобном опыте. Интерес очень большой

Здравствуйте, подскажите пожалуйста, как можно изменить тип уже существующего контента? Т.е. создали новый документ типа "cm:content", а теперь я хочу изменить его тип на другой, например, "custom:Details"? И возможно ли это сделать программно (JavaScript)?

fufler аватар

  Попробуйте использовать specializeType для node (http://my.safaribooksonline.com/book/databases/content-management-system...)

Здравствуйте!

В Share в форме расширенного поиска отсутствует возможность отключить поиск по полю, значение которого выбирается из заранее определенного списка (constraint). В Alfresco Explorer такая возможность существует, напротив такого поля там ставится "checkbox" автоматически. Подскажите, пожалуйста, есть ли что-то похожее в Share? Или есть возможность просто как-то очищать такие поля перед поиском? Заранее благодарю.

fufler аватар

Здравствуйте. Это то, что вам нужно?

Здравствуйте! Пришлось сделать на основе шаблона "mimetype" свои (вместо "неизвестный" - "не учитывать" и т.д.), и все сработало. Не знаю, то ли вы имели в виду, но все равно огромное спасибо!  У меня возник еще один важный вопрос. Как в форме (в Share или в Explorer) увидеть тип контента уже созданного документа? В момент создания я его вижу, а потом - нет. Вариант с добавлением cm:type в форму не срабатывает. Выдается пустое поле. Пока могу посмотреть только в информации об узлах в Explorer. Но это не очень удобно.  Или косвенно можно догадаться по наличию в документе обязательного аспекта. Но это тоже не подходит. Помогите, пожалуйста. Заранее благодарю.

Может, кому пригодится такая информация. В Alfresco существует такая особенность: можно изменить тип контента с cm:content на какой-либо другой, но обратно поменять тип нельзя. Поэтому необходимо сразу определять правильно тип контента на этапе его загрузки или создания, если это невозможно - лучше пока присвоить тип cm:content, а потом исправить.   

Вопрос - как отобразить связанные документы как ссылки, перехода к ним "по одному клику"

у меня стоит версия альфрески 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>

иначе не работало.