Добавление поля в профиль пользователя и при его регистрации

Добрый день, форумчане!!!
Мое знакомство с альфреско идет уже неделю и идет плохо.
Чувствую себя таким чайником, что аж вешаться охота. 
Есть приложение одно на альфреско, делал его прошлый программер, но не доделал. Остались мелочи. И в их числе стоит мелочь:
Добавить поле ИИН при регистрации пользователя, т.е. когда мы нажимаем новый пользователь и при просмотре пользователя чтобы поле ИИН тоже было. 
Читал, что для этого нужны аспекты. Но что прописывать в аспектах, куда, я не знаю.((((
Прикрепленные файлыРазмер
1.jpg62.92 кб

Комментарии

Aviriel аватар
Честно говоря, вы спрашиваете о том, как переделать приборную панель автомобиля, сохранив всю функциональность, увидев, как выглядит автомобиль первый раз.
Начните с изучения статьи http://www.ossportal.ru/technologies/alfresco/blogs/156.
1. Вам нужно найти модель, описывающую системные типы. Внутри будет тип пользователя. Посмотрите как она сделана.
2. Создайте свою модель, содержащую 1 аспект со свойством "ИНН".
3. Напишите скрипт (это к fufler, я не умею), который будет автоматически цеплять аспект всем пользователям в момент их создания.
4. перегрузите все компоненты интерфейса Share, в которых нужно отображать это поле пользователя (страница создания пользователя в админке, страница просмотра пользователя, страница редактирования информации  о пользователе итд).
Спасибо большое за ответ.)))
Будем искать.
И еще один маленький вопросик.
Что нужно знать, чтобы работать в альфреско? Java, JS, PHP????
Простите за столь тупой вопрос.
Aviriel аватар
Для начала - знать архитектуру Alfresco, научиться писать XML-файлы и кастомизировать систему так, чтобы при обновлении Alfresco ничего не ломалось (это то, почему я не предложила в прошлом комменте "найдите системную модель в Alfresco и добавьте аспект прямо в нее", а сказала "добавьте свою новую модель"), потом для решения вашей задачи полезно знать JS, для более глубоких задач - Java.
Нашел вот по этому адресу C:\Alfresco\tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\components\profile файлики, которые отвечают за профиль пользователя (по крайней мере я так думаю) и только 2 файла содержат строчки, которые мне нужны - это userprofile.get.html.ftl и userprofile.get.js. Там стоит копаться или лучше создать собственный документ с аспектом???
avasyukov аватар
Собственный аспект. Иначе потом проблем не оберетесь с сопровождением.
Snob аватар
Решил не  создавать новую нему, потому что задача стоит такая же. Для уточнения скажу, что стою на самом начальном пути освоения альфрески (Alfresco42с) со всеми вытекающими последствиями ((. 
Целиком задача, которую мне необходимо реализовать, это добавить в профиль пользователя поле "учетная запись из другой систему". При этом варианты записей будут формироваться из результата запроса к БД другой учетной системе предприятия. Я решил решать задачу по частям, начав с добавления простого текстового поля к профилю пользователей.
Погуглив нашел смежные темы, с чего начать, так сказать:
Каждая из перечисленный ссылок, по крайней мере для меня, проливала свет на некоторые моменты, но все же не давала полного руководства к действию.  Сделав выжимку из всего, я составил план и начал:
Создаем в tomcat/shared/classes/alfresco/extension файл my-model.xml, в котором объявляем модель, подключаем словари и прописываем аспект:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Definition of Substitution Model -->
<model name="my:userOtherBase" xmlns="http://www.alfresco.org/model/dictionary/1.0">
   <!-- Optional meta-data about the model -->
   <description>UserOtherBase Model</description>
   <author></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"/>
   </imports>
   <!-- Introduction of new namespaces defined by this model -->
   <namespaces>
      <namespace uri="http://www.alfresco.com/model/substitution/1.0" prefix="sub"/>
   </namespaces>
    <aspects>
      <!-- Definition of new Content Aspect: Substitution User -->
      <aspect name="my:userOtherBase">
         <title>User Substitutionable</title>
         <properties>
            <property name="sub:userOtherBaseId">
               <type>d:text</type>
            </property>
         </properties>
      </aspect>
   </aspects>
</model>

Далее для того чтобы зарегистрировать модель в репозитории (http://wiki.alfresco.com/wiki/Data_Dictionary_Guide#Step_4:_Register_the...), насколько я понял, создаем в tomcat/shared/classes/alfresco/extension файл my-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.sub.dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="dictionaryBootstrap">
        <property name="models">
            <list>
                <value>alfresco/extension/my-model.xml</value>
            </list>
        </property>
    </bean>
     <bean id="extension.my.resourceBundle" class="org.alfresco.i18n.ResourceBundleBootstrapComponent">
       <property name="resourceBundles">
          <list>
             <value>alfresco.messages.substitution</value>
          </list>
       </property>
    </bean>
</beans>
 
Файл составллен по примерам и в нем я не совсем понимаю смысл куска:

<bean id="extension.my.resourceBundle" class="org.alfresco.i18n.ResourceBundleBootstrapComponent">
       <property name="resourceBundles">
          <list>
             <value>alfresco.messages.substitution</value>
          </list>
       </property>
    </bean>
 
Подскажите зачем он нужен?
Далее, опять же по примерам, надо скопировать файл tomcat/webapps/alfresco/WEB-INF/classes/alfresco/model/contentModel.xml в  tomcat/shared/classes/alfresco/extension/customContentModel.xml и в нести в него изменения. Как я понял нужно добавить свой аспект в объявлении типа cm:person (<type name="cm:person">), после ассоциаций (за теком </association>)
 
Получается кусок файла customContentModel.xml
</associations>
<aspects>
           <aspect>my:userOtherBase</aspect>
        </aspects>
      </type>
Перезапускаю альфреску:
C:\Alfresco42c\servicerun.bat STOP
C:\Alfresco42c\servicerun.bat START
Захожу  http://127.0.0.1:8080/alfresco и получю:
HTTP Status 404 - /alfresco
________________________________________
type Status report
message /alfresco
description The requested resource is not available.

Получается что я допусти ошибку на этапе объявления модели.
Подскажите что я делаю не так?
Спасибо.
PS Файлы загрузил архивом.
 
 
 
 
 
 
Прикрепленные файлыРазмер
files.TAR 58.5 кб
Snob аватар
 Я понимаю что, чтобы ответить на мои вопросмы, требуется время, которого обычно нет.
Может быть кто-то поделиться рабочим примером?
Aviriel аватар
Здесь Вы правы, со временем плохо :(
Один комментарий: resource bundle - это файлы локализации. Если у Вас - только модель и никаких дополнитьных файлов нет, вообще удалите этот кусок из context, оставьте только модель. Тогда, если все правильно, система должна запуститься.
Snob аватар
Aviriel, спасибо, попробую убрать.
fufler аватар
Кусок 
<bean id="extension.my.resourceBundle" class="org.alfresco.i18n.ResourceBundleBootstrapComponent">
       <property name="resourceBundles">
          <list>
             <value>alfresco.messages.substitution</value>
          </list>
       </property>
    </bean>
задаёт Spring Bean, отвечающий за загрузку файлов локализации (classpath:alfresco/messages/substitution*.properties в данном случае). Как было сказано выше, если вы не загружаете дополнительных файлов локализации, то вам этот кусок не нужен.

Я бы не советовал добавлять аспект непосредственно в стандартную модель, так как это может привести к не самым приятным последствиям. Лучше попробуйте добавить аспект через API к уже созданному пользователю. Чтобы попробовать API в действии вам понадобится JavaScript Console.

Для того, чтобы нормально диагностировать проблему, нужны логи (там обычно написано, почему Alfresco не запустилась).
Snob аватар
 fufler, спасибо за разъяснения. Уверен что локализация мне потом понадобитсья, но пока обойдемся без нее -- удаляю.

За ссылку на API спасибо, действительно удобно работать с JavaScript Console. Но т.к. я работаю с чистой, не рабочей базой то это ведь не так страшно, ронять нечего. Или то, как я делаю все же не «кошерно»?

После того как убрал Spring Bean, полез в логи (что-то я забыл о эффективности  их анализа). Сразу нашел пару косяков (думаю стоит расписать ошибки нуба для потомков):

 в файле my-model-context.xml
должно быть (плохо проанализировал пример и не все заменил) не
<
bean id="extension.sub.dictionaryBootstrap"...

а 
<bean id="extension.my.dictionaryBootstrap"

 

в файле customContentModel.xml забыл импортировать свою модель (третья строка):

 

<imports>
      <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
      <import uri="http://www.alfresco.org/model/system/1.0" prefix="sys"/>
   <import uri="//www.alfresco.com/model/userOtherBase/1.0" prefix="my"/>
   </imports>

Дальше нужна опять ваша помощь. Не могу понять почему остается ошибка:

ERROR [org.springframework.web.context.ContextLoader] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'extension.my.dictionaryBootstrap'
defined in file [C:\Alfresco42c\tomcat\shared\classes\alfresco\extension\my-model-context.xml]: Invocation of init method
failed; nested exception is org.alfresco.service.cmr.dictionary.DictionaryException: 02270001 Could not import bootstrap model alfresco/extension/my-model.xml

Альфреска не видит мой bean 'extension.my.dictionaryBootstrap' или дело в другом ?

fufler аватар
должно быть (плохо проанализировал пример и не все заменил) не
<bean id="extension.sub.dictionaryBootstrap"...
а
<bean id="extension.my.dictionaryBootstrap"
Особых требований на id не налагается, он просто должен быть уникальным (если только вы не пытаетесь переопределить другой bean).
Альфреска не видит мой bean 'extension.my.dictionaryBootstrap' или дело в другом ?
Сложно с ходу сказать. В логах ниже должны быть строки, начинающиеся с «Caused by», — вот там и следует искать причины падения.
Snob аватар
Нашел зело полезную книгу "Alfresco 3 Cookbook", всем рекомендую. Там очень здорово пошагово рассказано о "Creating new custom content type". Немного перекликается с моей задачей. 
Благодаря ей и вашей помощи, на текущий момент альфреска у меня взлетает без ошибок. Я создал модель, стартанул ее в beans, создал аспект.

Теперь встал вопрос как вывести мое дополнительное поле при регистрации пользователя. Нашел дашлет 
  \tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\components\dashlets\site-profile.get.html.ftl
Как правильно делается: редактировать этот файл или его надо скопировать куда-нибудь и редактировать как расширение (по принципу как создавал модель)?
fufler аватар
 Если речь только о дашлете, то правильнее скопировать этот под другим именем и исправить всё, что нужно. Получите два дашлета: оригинальный и свой модифицированный.
Snob аватар
А не подскажете где лежай файлы  дашлета (или это не дашлет) "New User Wizard"? Ну никак не могу его найти (Alfresco42c).
Snob аватар

Сам себе и отвечу :) Хочется верить, что не я один задаю такие глупые вопросы и это кому-то еще поможет.)
Итак, путем поиска и перебора я обнаружил что за обработку регистрации нового пользователя отвечает 
CreateUserWizard который инициализируется (поправьте если выразился некорректно) в \Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\web-client-config-wizards.xml

Шаблон полей первого шага, для каждого шага свой,  задается в \Alfresco\tomcat\webapps\alfresco\jsp\users\new-user-wizard\person-properties.jsp

Поделитесь ссылкой чтобы понять с каким файлами (кодом) взаимодействует файл person-properties.jsp и задаются и обрабатываются переменные типа WizardManager.bean.firstName.

Может быть есть статья на эту тему, подскажите пожалуйста. 
Snob аватар
 никто не подскажет ? :(