Использование отправки XForms для загрузки частично заполненной формы

Я создаю небольшое приложение XForms, чтобы помочь некоторым сотрудникам создавать сложные записи метаданных (заголовки TEI). Я исхожу из того, что пользователям может потребоваться более одного сеанса, чтобы полностью заполнить все метаданные, запрошенные проектом. Итак, что я хотел бы сделать, так это сохранить данные формы в файлы, названные с идентификаторами, специфичными для элемента, а затем разрешить возвращающимся пользователям выбирать из списка частично заполненных форм, загружать данные обратно в редактор и возобновлять работу. К сожалению, я не могу заставить функцию загрузки работать так, как я ожидаю, то есть я не могу загрузить данные из сохраненной формы обратно в редактор после того, как выберу имя файла из списка.

Вот экземпляры в моей модели:

<xf:instance id="itemMD" xmlns="http://www.tei-c.org/ns/1.0"
src="http://localhost:8080/exist/rest/db/home/sga/model.sga.metadata.xml"></xf:instance>

<xf:instance id="control-codes" xmlns="">
    <data>
        <boolean1>false</boolean1>
        <output-filename>temp</output-filename>
        <input-filename></input-filename>
    </data>
</xf:instance>

<xf:instance id="file-utils" xmlns="http://exist.sourceforge.net/NS/exist" src="http://localhost:8080/exist/rest/db/home/sga/posted_data/"></xf:instance>

А вот и элементы подачи:

<xf:submission id="save" method="put"
replace="none">
<xf:resource value="concat('http://localhost:8080/exist/webdav/db/home/sga/posted_data/', instance('control-codes')/output-filename)"></xf:resource>
</xf:submission>

<xf:submission id="load" method="get" replace="instance" instance="itemMD">
<xf:resource value="concat('http://localhost:8080/exist/webdav/db/home/sga/posted_data/', instance('control-codes')/input-filename)">
</xf:resource>
<xf:message ev:event="xforms-submit-error">Cannot load!</xf:message>
</xf:submission>

А вот соответствующие виджеты в теле документа:

<div id="loader" class="span4 offset8">
<xf:select1 id="load-from-file" ref="instance('control-codes')/input-filename">
<xf:label>Choose file: </xf:label>
<xf:itemset nodeset="instance('file-utils')//exist:resource">
<xf:label ref="@name"></xf:label>
<xf:value ref="@name"></xf:value>
</xf:itemset>
</xf:select1>
<xf:submit submission="load">
<xf:label>Load</xf:label>
</xf:submit>
</div>

Это моя первая серьезная работа с XForms, поэтому, возможно, здесь есть что-то очевидное, что я должен был исправить, но я в тупике. (Мне также интересно, передаю ли я строку здесь, где я должен передавать URI?). Я использую процессор XSLTForms, входящий в состав eXistDB.


person trevormunoz    schedule 19.07.2012    source источник


Ответы (2)


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

Например, вы знакомы с Firebug?

У меня работает следующий тестовый пример:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events">
 <head>
   <title>Save-Load</title>
   <xf:model>
           <xf:instance id="itemMD">
                <data xmlns=""/>
            </xf:instance>
            <xf:instance id="control-codes" xmlns="">
                <data>
                    <boolean1>false</boolean1>
                    <output-filename>temp.xml</output-filename>
                    <input-filename>temp.xml</input-filename>
                </data>
            </xf:instance>
            <xf:submission id="save" method="put" replace="none">
                <xf:resource value="concat('http://localhost/direct/', instance('control-codes')/output-filename)"/>
            </xf:submission>
            <xf:submission id="load" method="get" replace="instance" instance="itemMD">
                <xf:resource value="concat('http://localhost/direct/', instance('control-codes')/input-filename)"/>
                <xf:message ev:event="xforms-submit-error">Cannot load!</xf:message>
            </xf:submission>
        </xf:model>
 </head>
 <body>
    <xf:input ref=".">
        <xf:label>Data: </xf:label>
    </xf:input>
    <br/>
    <xf:input ref="instance('control-codes')/output-filename">
        <xf:label>Output File: </xf:label>
    </xf:input>
    <xf:submit submission="save">
        <xf:label>Save</xf:label>
    </xf:submit>
    <br/>
    <xf:input ref="instance('control-codes')/input-filename">
        <xf:label>Input File: </xf:label>
    </xf:input>
    <xf:submit submission="load">
        <xf:label>Load</xf:label>
    </xf:submit>
   <br/>
 </body>
</html>

Спасибо за ваши отзывы!

-Ален

person Alain Couthures    schedule 19.07.2012
comment
Спасибо, что так быстро ответили. Я знаком с Firebug и подобными инструментами. Я просмотрел выходные данные этих инструментов, и они заставили меня поверить, что я неправильно использовал отправку xforms, а не в том, что HTTP-запрос, сгенерированный XSLTForms, неверен. - person trevormunoz; 20.07.2012
comment
Я вижу, что нажатие кнопки «Загрузить» в моей форме отправляет событие xforms-submit-error (из отладчика XSLTForms), но когда я получаю доступ к сообщению об ошибке, я получаю только неопределенное значение и не знаю, что делать дальше. Спасибо. - person trevormunoz; 20.07.2012

Я не вижу ничего очевидного неправильного, но (если вы все еще боретесь с этим) вот что нужно сделать:

Добавьте что-то подобное в свой документ рядом с элементом управления Choose file:. (Здесь я разбил строки для удобочитаемости; возможно, вам придется это отменить.)

  <div>Debugging:
    <xf:output value = 
       "concat('http://localhost:8080',
               '/exist/webdav/db/home',
               '/sga/posted_data/',
               instance('control-codes')/input-filename
               )">
      <xf:label>URI for document request: </xf:label>
    </xf:output>
  </div>

Это должно отображать URI, который получает ваше представление load.

Затем разыменуйте этот URI вручную, чтобы увидеть, сможете ли вы это сделать. (Если вы не можете, вы нашли проблему.)

Если разыменование URI работает вручную, но не автоматически, попробуйте жестко закодировать URI (на данный момент), чтобы независимо от того, какой файл выберет пользователь, обслуживаемый файл был тем, который вы жестко закодировали. т.е. замените выражение concat() в атрибуте xf:resource/@value буквальной строкой в ​​одинарных кавычках: value="'http://localhost...'" Если это не удается, проверьте журналы сервера, чтобы узнать, какой URI использовался для HTTP-запроса GET. (Иногда, когда я был неосторожен, я пренебрегал тем, что моя отправка будет отправлять содержимое экземпляров по умолчанию в качестве параметров запроса, если я не предприму шаги, запрещающие это; тогда мне придется снова искать их и исправлять.)

person C. M. Sperberg-McQueen    schedule 20.08.2012