Динамическое управление пользовательскими моделями в Alfresco
Небольшая коллекция набитых шишек по динамическому управлению собственными типами данных для чайников....
Альфресо развивается настолько быстро, что документация по ней часто не поспевает за изменениями. Касается это и такой важной сферы, как кастомизация - включая создание пользовательских моделей данных и процессов, а также управление их отображением в различных интерфейсах. Классические введения в предмет от Jeff Potts ”Working with Custom Content Types” и “Advanced Workflows” , соответсвующие страницы Wiki Creating_A_Custom_Model, а также заметки уважаемых коллег на этом сайте подробно и вразумительно описывают процессы создания моделей и бизнес процессов. При этом внедрять собственные разработки предполагается путем размещения файлов в папках extention и web-extention с дальнейшим перезапуском сервера. Увы, процесс рестарта системы достаточно длителен, и такой путь подходит скорее для воплощения уже готовой и отлаженной модели, но никак для процесса разработки. Вместе с тем, версии Альфреско, начиная с 3-й, для внедрения ваших наработок вообще не требуют перезагрузок, и поддерживают динамическое управление пользовательскими типами данных. Реализуется это при помощи загрузок соответствующих файлов в папки раздела Company Home/Data Dictionary, а также при помощи ряда консолей.
Начнем с внедрения модели данных. Файлы моделей располагаются в папке Models. Загружаем в эту папку файл с нашей моделью. Изначально модель не активна. Для ее оживления переходим к редактированию метаданных, отмечаем флажок Model Active и сохраняем. Если при этом Альфреска ругается и не принимает модель, запускаем консоль управления репозитарием http://localhost:8080/alfresco/faces/jsp/admin/repoadmin-console.jsp. Вводим команду "activate model NashaModel.xml" и любуемся на источник недоразумения (ну или же смотрим логи сервера, что менее удобно). Исправляем ошибки до тех пор, пока Альфреска не примет модель. Список активных моделей виден по команде show models. В принципе, все операции с моделями можно выполнять из этой консоли, список возможных команд выводится по команде help.
Далее готовим файл "web-client-config-custom.xml". Загружаем его в папку Web Client Extension. Запускаем еще одну консоль http://localhost:8080/alfresco/faces/jsp/admin/webclientconfig-console.jsp и в ней вводим команду reload. Если что-то не так - смотрим выданый лог, исправляем и снова reload, если все получилось (выдано сообщение типа web-client-config-custom.xml. -----> OK) - тестируем возможность создания модели, а также просмотра и редактирования наших свойств и т.д. Осталось назначить новым элементам интерфейса удобоваримые названия на английском (по желанию) и на великом и могучем. Немного о способе управления визуализацией модели (в предыдущих статьях подразумевалось, что это очевидно, хотя у начинающего могут возникнуть вопросы). Все отображаемые строки берутся из файлов свойств, в нашем случае webclient.properties (английские варианты) и его аналогов для поддерживаемых языков (например webclient_ru_RU.properties). Файл состоит из строк вида
Идентификатор=Значение
где Идентификатор привязывется к некоторому элементу даных. По умолчанию с элементом автоматически связывается идентификатор, образуемый из полного наименования элемента (начиная с неймспейса), заменой двоеточия на подчеркивание. Например MyModel:NewType.MyModel:NewProperty.title связывается с идентификатором MyModel_NewType.MyModel_NewProperty.title. Задав в файле webclient.properties строку MyModel_NewType.MyModel_NewProperty.title=Это наше новое свойство, мы зададим отображение элемента по умолчанию. Но если захочется, например, в форме при редактировании обозвать элемент по другому, то можно указать в файле web-client-config-custom.xml что-то наподобие
<property-sheet> <show-property name="MyModel:NewProperty" display-label-id="LabelIdForThisSheet" /> </property-sheet>
и потом в webclient.properties добавить строку LabelIdForThisSheet=А здесь отобразим по-другому. Такое объявление имеет более высокий приоритет. Для появления в интерфейсе кириллицы поступаем следующим образом (Внимание, в этом месте НЕ ТАК, как при загрузке модели в каталог extention/ с последующим рестартом сервера). Файлы webclient.properties и webclient_ru_RU.properties загружаются в папку 'Web Client Extension", при этом кириллические элементы интерфейса пишутся в любимом текстовом редакторе в формате UTF-8. Никаких преобразований в неудобочитаемые последовательности \uXXXX.делать НЕ НУЖНО, конвертация просиходит автоматически. Для активизации локализованого отображения достаточно выйти из Альфрески и снова залогинится.
После любования плодами трудов своих неизбежно возникает желание усовершенствования модели данных. Простое расширение модели (добавление типов, аспектов, свойств и т.д) выполняется путем ее деактивации, онлайн-редактирования и повторной активации. Если же нужно что-то удалять или менять, то модель должна быть удалена и загружена по-новому. Перед удалением модели должны быть удалены все созданные/загруженные данные, связанные с моделью, а также файлы web-client-config-custom.xml и *.properties, загруженные в Web Client Extension. После чего пробуем удалить саму модель, и с огорчением наблюдаем сообщение о том, что не все файлы, используещие модель, удалены. Оказывается, нужно почистить корзину, доступ к которой не совсем очевиден - он спрятан в интерфейсе http://localhost:8080/alfresco/ в персональных настройках, в самом низу страницы. После очистки корзины можно удалить модель и загрузить новую.
Теперь о workflow. Загрузка описания процессов производится в папку Workflow definition, процесс внедряется после отметки в метаданных флажка Deployed. При этом процесс сразу становится доступен в списке выбора процессов, (пока в виде mywf:myproc). Для локализации/экстернализации нужно файлы myworkflow.properties и myworkflow_ru_RU.properties загрузить в папку Messages. Опять же, для киррилизации достоточно задать строки в UTF-8, перекодировка не требуется. Затем в консоли управления репозитарием перегружаем файлы свойств командой reload message myworkflow. При изменении описания процесса нужно сначала удалить все задачи, созданные им.
Вот в принципе и все об динамическом управлении совбственными типами. При редактировании моделей старайтесь где только возможно, пользоваться встроенными средствами Альфреско, а не просто удалять и загружать заново файл. Связанно это с тем, что при редактировании файла его UUID не меняется, в отличие от загрузки нового, когда создается новый узел с новым UUID. В некоторых случаях это вызывает ошибки с указанием на несуществующие узлы (например в списке процессов) и требует перезагрузки сервера для исправления.
К сожалению, мне не хватило времени разобраться с возможностью динамического управления внешним видом в Share (файл share-custom-config.xml). И отдельного разговора заслуживает консоль управления бизнес-процессами, дающая возможность динамической отладки процессов.
Дополнение
Для динамического обновления в Share достаточно освежить файл share-custom-config.xml (должен лежать в tomcat/shared/classes/alfresco/web-extension) , зайти по ссылке <Server>/share/page/index и нажать кнопку "Refresh Web Scripts".
Комментарии
27/05/2011 - 10:18
Очень хорошая статья. Спасибо, будем пробовать. Про консоль управления бизнес-процессами тоже было бы очень интересно почитать :)
26/07/2011 - 15:10
Здравствуйте, может вы знаете в чем может быть проблема
У меня есть модель данных
<model name="sc:myModel" xmlns="http://www.alfresco.org/model/dictionary/1.0">
.....
<types>
<type name="sc:myType">
<parent>cm:content</parent>
<properties>
<property name="sc:regNum">
<title>Reg nomer</title>
<type>d:text</type>
<mandatory>false</mandatory>
</property>
.......
</model>
В файле myLabels.properties я написала вот так
sc_myModel.property .sc_regNum.title=Регистрационный номер
загрузила в папку Messages
В share-custom-config.xml
<field-visibility> <show id="sc:regNum" /> </field-visibility>
Но почему-то при отображении значение из myLabels.properties не берется, хотя он файл от точно видит, так как все labels для workflow описанные в нем, подставляются....
26/07/2011 - 21:30
нужна секция <appearance>, внутри которй будет что-то типа <show id="sc:regNum" label-id="sc_myModel.property .sc_regNum.title" />
02/08/2011 - 12:52
Покажите всю секцию из share-custom-config.xml, которая должна показывать то, что вам необходимо, начиная с тега
<config evaluator=
02/08/2011 - 14:32
<config evaluator="node-type" condition="sc:conversation" replace="true">
<forms>
<form>
<view-form template="/fdk/templates/tab-edit-form.ftl" />
<edit-form template="/fdk/templates/tab-edit-form.ftl" />
<create-form template="/fdk/templates/tab-edit-form.ftl" />
<field-visibility>
<show id="sc:regNum" force="true" />
</field-visibility>
<appearance>
<set id="" label-id="tab.label.kartochka" />
<field id="sc:regNum" label-id="sc_myModel.property .sc_regNum.title"/>
</appearance>
</form>
</forms>
</config>
02/08/2011 - 14:34
resource bundle подгружен?
03/08/2011 - 10:11
Не совсем понимаю вопрос
файл с label загружен динамически и через консоль по команде show messages показывает, что мой файл он видит
03/08/2011 - 11:23
Не совсем понимаю ответ, но resource bundles для Explorer и Share разные. Вы, скорее всего, смотрите список сообщений, загруженных для Explorer.
03/08/2011 - 17:54
ААА... Точно.. Вот в где собака зарылась.. Тогда такой вопрос.. Можно ли их динамически для шары грузить и если можно то как?
03/08/2011 - 22:03
Не знаю, не возникало потребности. Попробуйте, возможно "Refresh Web Scripts" на /share/service/index перечитывает файлы с ресурсами.
04/08/2011 - 09:49
Спасибо за помощь, теперь хоть понятно в чем была проблема :)
27/07/2011 - 11:38
Если я вставляю
<appearance>
<field id="sc:regNum" label-id="sc_myModel.property .sc_regNum.title" />
</appearance>
То на форме так и подписыват sc_myModel.property .sc_regNum.title ((
Вообще не понимаю, почему для workflow label видны а для метаданных нет
25/10/2011 - 17:13
Спасибо большое за полезный пост.
Вопрос: задеплоила и активировала.xml c описанием модели, и кинула web-client-config-custom.xml, после reload выдало ок, но новый список так и не появился. Что это может быть?
01/11/2011 - 19:25
разобралась: неправильный parent.
но появился следующий вопрос: что делать с формами, куда их надо грузить?
19/12/2011 - 19:32
Если для динамической локализации Alfresco Explorer используется файл webclient.properties (и его помещение в папку web-client-config), то для чего нужна локализация модели (Model Resource Bundle) и помещение в папку Messages?