Перехват события сохранения в Form Builder

Я хотел бы отправить заявку после того, как форма была сохранена в Form Builder, сначала я пытался что-то вроде этого (в моем файле XBL):

<xf:action ev:event="fr-data-save-done" ev:observer="fr-form-model">
    <xf:message event="#all" level="modal">Saved</xf:message>
    <xf:send submission="my-submission" ev:event="#all"/>
</xf:action>

Приведенный выше код помещен в файл XBL между xbl:template, вне xbl:model (хотя я безуспешно пытался поместить его внутри xbl:model). К сожалению, это не работает, после сохранения формы в Form Builder сообщение не отображается. У кого-нибудь есть идеи, почему это не работает?


person pzeszko    schedule 22.12.2014    source источник
comment
Куда вы вставили этот код?   -  person ebruchez    schedule 24.12.2014
comment
В настоящее время он находится между xbl:template. Я попытался переместить его в xbl:model, но это не помогло.   -  person pzeszko    schedule 24.12.2014
comment
Также вопрос: имеет ли значение, какую версию Orbeon я использую? Он не работает под Orbeon 4.7, но может быть под 4.5?   -  person pzeszko    schedule 24.12.2014
comment
Я не думаю, что это должно работать с любой версией. Компоненты инкапсулируют функциональность, поэтому прослушивание события fr-data-save-done, которое является внешним по отношению к компоненту, не должно работать. В идеале ваш компонент и Form Builder должны быть связаны событиями, например: внешний обработчик событий, отправляющий пользовательское событие вашему компоненту, например.   -  person ebruchez    schedule 24.12.2014
comment
Ну, это звучит не так просто для меня, не могли бы вы быть более конкретными, говоря о «внешнем обработчике событий», или, может быть, есть несколько примеров, где делается что-то подобное? Правильно ли я понимаю, что невозможно добиться отправки заявки в форме сохранения на основе только моего XBL-файла? Счастливого Рождества, я думаю, это здорово, что вы делаете с Orbeon и помогаете всем этим людям - я очень ценю это   -  person pzeszko    schedule 25.12.2014
comment
Спасибо за добрые слова. В настоящее время я не думаю, что это возможно только с компонентом XBL.   -  person ebruchez    schedule 30.12.2014


Ответы (1)


Вы можете разместить вручную обработчик событий следующим образом:

<foo:bar id="my-component-id" bind="my-bind">
    <xf:dispatch
        event="fr-data-save-done"
        observer="fr-form-model"
        name="my-custom-event"
        targetid="my-component-id"/>
</foo:bar>

Обработчик не обязательно должен находиться внутри элемента:

<foo:bar id="my-component-id" bind="my-bind"/>
<xf:dispatch
    event="fr-data-save-done"
    observer="fr-form-model"
    name="my-custom-event"
    targetid="my-component-id"/>

И внутри компонента XBL:

<xbl:binding id="my-binding-id" element="foo:bar">
    <xbl:handlers>
        <xbl:handler event="my-custom-event" phase="target">
            ... XForms actions here ...
        </xbl:handler>
    </xbl:handlers>
    ...
</xbl:binding>
person ebruchez    schedule 29.12.2014
comment
Эй, Эрик, я только что понял, что не могу справиться с этой работой. Я создал этот пример gist.github.com/anonymous/30ab64d3e7642e7860f0, и он не работает: после нажатия кнопки «Сохранить» в построителе форм сообщение не отображается. Если я изменю событие с fr-data-save-done на #all, появится сообщение «Работает», поэтому, очевидно, что-то не так с этим событием. - person pzeszko; 15.01.2015
comment
Чтобы быть совершенно ясным: когда я изменяю событие на #all, сообщение отображается после того, как я нажимаю «Тест», и сообщение не отображается после нажатия «Сохранить». Значит, в целом обработчик работает, но есть какая-то проблема с 'fr-data-save-done'. - person pzeszko; 16.01.2015
comment
Если что-то все еще неясно, я могу объяснить больше или попытаться создать, возможно, лучший пример, если приведенный выше недостаточно хорош. - person pzeszko; 21.01.2015
comment
Ах, в Form Builder это совсем другая история! Я пропустил это, пришлось работать в билдере. Вполне вероятно, что что-то подобное сломается в будущем, потому что это слишком сильно зависит от внутренностей, которые могут измениться. Вместо этого конструктор форм имеет процесс называется oxf.fr.detail.process.save.orbeon.builder. Вы можете перезаписать этот процесс, чтобы добавить собственное поведение. - person ebruchez; 22.01.2015
comment
Спасибо за ответ. Да, я знаю, что могу использовать процессы, я прочитал этот пост кнопка отправки с параметрами"> stackoverflow.com/questions/27797037/, но я использую Orbeon 4.5 и надеялся, что смогу добиться того, чего хочу, и мне не нужно обновлять Orbeon до более новой версии. Итак, чтобы прояснить ситуацию: вы думаете, что в Orbeon 4.5 невозможно перехватить действие сохранения (отправить отправку после сохранения и т. д.)? - person pzeszko; 22.01.2015
comment
Я не уверен, что это абсолютно невозможно. Теоретически события, отправляемые на уровне Form Builder, должны быть скрыты от редактируемой формы. Но если это возможно, я подозреваю, что решение будет очень хрупким. - person ebruchez; 23.01.2015