Пользовательская (отдельная) форма метаданных в ресурсе alfresco

На первый взгляд простое требование

Мне нужна форма, содержащая 4 поля (текстовое поле, полномочия и дата x2), которая ведет себя точно так же, как форма редактирования метаданных, поля, представляющие 4 свойства на узле.

Однако эта форма должна быть доступна как отдельный пользовательский интерфейс от формы редактирования метаданных, предпочтительно в том виде, в котором это пользовательский интерфейс; кнопка со значком в DocLibActions и всплывающая форма при нажатии на нее.

Возникли проблемы

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

Способ действия пользовательского интерфейса

Начав это как действие пользовательского интерфейса, я попытался получить доступ к узлу в пользовательском поле управления ftl, используя переменную модели form.destination, содержащую ссылку noderef. Однако, когда я хотел получить свойства узла с этим, оказалось, что объект companyhome, необходимый для этого в ftl, недоступен для элемента управления формы.

Затем я приступил к написанию пользовательского веб-скрипта java, который возвращает 4 свойства, которые мне нужны, с использованием заданного nodeRef, и вызывал его из моего пользовательского поля управления с помощью javascript. Это представляет следующие две проблемы:

  • Мне приходится самому передавать полученные значения в поля формы, что представляет собой довольно сложную задачу для элементов управления date.ftl, но гораздо сложнее даже для элемента управления authority.ftl.
  • Вызов веб-скрипта с клиентской стороны javascript добавляет еще один круговой путь.

Текущее определение формы

<config evaluator="string-compare" condition="my-action">
      <forms>
         <form>
            <field-visibility>
               <show id="textProperty" />
               <show id="authorityProperty" />
               <show id="dateProperty1" />
               <show id="dateProperty2" />
            </field-visibility>

            <appearance>
                <set id="generalSet" appearance="bordered-panel" label="General" />
                <field id="textProperty" label="textProp" set="generalSet">
                    <control template="/org/alfresco/components/form/controls/propertyBasedTextfield.ftl">
                        <control-param name="propertyProvider">/alfresco/service/mark/custom/nodeProperties</control-param>
                    </control>
                </field>

               <field id="authorityProp" label="Authority" set="generalSet" >
                   <control template="/org/alfresco/components/form/controls/authority.ftl" >
                    <control-param name="compactMode">true</control-param>
                   </control>
                </field>
                <field id="dateProperty1" label="Date 1" set="generalSet">
                    <control template="/org/alfresco/components/form/controls/date.ftl" />
                </field>
                <field id="dateProperty2" label="Date 2" set="generalSet">
                    <control template="/org/alfresco/components/form/controls/date.ftl" />
                </field>
            </appearance>
         </form>
      </forms>
   </config>

Как я могу лучше всего выполнить это требование? Обратите внимание, что использование действия пользовательского интерфейса не является обязательным; Я могу реализовать это так, как захочу.


person Mark Tielemans    schedule 13.07.2013    source источник
comment
Вы хотели бы добавить вторую форму редактирования в doclib? если да, посмотрели ли вы, как alfresco реализовала действие по умолчанию?   -  person alfrescian    schedule 15.07.2013


Ответы (1)


Взгляните на функцию Alfresco.doclib.Actions.onActionDetails() в клиентском модуле action.js (исходный код). Самый простой способ — зарегистрировать собственные пользовательский обработчик действий, который может быть основан на коде в onActionDetails(), но с использованием вашего собственного пользовательского идентификатора формы, который предоставляет базовую форму, например

var templateUrl = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/form?itemKind={itemKind}&itemId={itemId}&destination={destination}&mode={mode}&submitType={submitType}&formId={formId}&showCancelButton=true",
{
   itemKind: "node",
   itemId: nodeRef,
   mode: "edit",
   submitType: "json",
   formId: "***custom-form-id***"
});
var editDetails = new Alfresco.module.SimpleDialog(this.id + "-editDetails-" + Alfresco.util.generateDomId());
editDetails.setOptions({
   width: "40em",
   templateUrl: templateUrl,
   ...
});

Вам, очевидно, потребуется добавить собственное определение формы в файл share-config-custom.xml или аналогичный файл, куда вы также можете включить определение действия библиотеки документов.

Вам не нужно писать какие-либо пользовательские компоненты пользовательского интерфейса.

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

person Will Abson    schedule 15.07.2013
comment
Спасибо! Это отличная зацепка. Однако что вы подразумеваете под «полной страницей»? - person Mark Tielemans; 16.07.2013
comment
Я, возможно, неправильно прочитал ваш вопрос. Когда вы сказали, что хотите, чтобы ваша настраиваемая всплывающая форма вела себя как существующее действие «Редактировать метаданные», я предположил, что вам нужна кнопка во всплывающем окне, которая ведет на полную страницу с более подробной формой. Если это не требование, то это упростило бы ситуацию! - person Will Abson; 16.07.2013
comment
Подозревал что-то по линии :P. Это, конечно, так, спасибо. Однако я уже использую пользовательское действие, поэтому я думаю, что могу просто использовать с ним ваш собственный обработчик. Единственный вопрос, который приходит на ум, заключается в том, что в условии определения формы я помещаю действие или тип содержимого, содержащий свойства? Я добавлю свое текущее определение, чтобы уточнить. - person Mark Tielemans; 16.07.2013
comment
Недопустимо встраивать конфигурацию формы в действие, она должна находиться в разделе <config evaluator="node-type" condition="cm:content"> (или аналогичном). Также вам понадобится атрибут id для вашего элемента <form>, чтобы вы могли ссылаться на него из своего обработчика действий. - person Will Abson; 16.07.2013
comment
Я отредактировал ответ, чтобы удалить часть определения второй формы. - person Will Abson; 17.07.2013