[Xsltforms-support] can one automatically load a sub-form?
Brought to you by:
alain-couthures
|
From: C. M. Sperberg-M. <cm...@bl...> - 2016-06-18 19:22:22
|
Apologies for an ignorant question; my knowledge and understanding
of the event model underlying XForms is incomplete (in the places
where it exists at all). This level of ignorance is compatible with a lot
of usage of XForms, as long as everything you want to happen is
triggered by a button press and you can catch it with ev:event
= "DOMActivate", but I find myself wanting something different for
the form I'm working on right now.
Subforms can be loaded on a DOMActivate event; this is reasonably
straightforward.
Can they be loaded on other events? in particular, can they be loaded
automatically when an element matches a group in the form? Or
when the main form itself is loaded?
Consider two use cases:
A. A user has done a search in a database and is paging through the
results. The back end has sent us $rows-in-page items in the results,
along with a $total-hit-count number telling us how many hits the
user's query actually produced, and a $start-row number telling us
where in the results this extract starts. For the first page of results, $start-row
will be 1, and $rows-in-page can be adjusted by the user.
Both at the top of the results display and at the bottom, I want
two buttons: a Previous or Back button (iff $start-row > 1)
and a Next or Forward button (iff $start-row + $rows-in-page
< $total-hit-count).
The logic, the markup structure, and the CSS styling of the two
buttons is just complicated enough that the handling of the buttons
takes up 42 lines in the example I just examined, and they get
tweaked repeatedly.
Keeping two occurrences of a 42-line block in synch is boring and
error-prone, and having a full screen or more devoted to such
secondary concerns makes the form hard to read. At the moment, I
handle both of these problems by maintaining the re-used block as
an external entity, which gets inserted into the main form when I
run xmllint, rxp, an identity transform, or any other XML normalizer
to create form.xhtml out of form.xml and its external entities.
But it might be nicer to handle the repeated code by means of a
sub-form. To make that work, I would need to have something
at the locations where the sub-form needs to be loaded which
causes the loading and which is triggered by an event generated
automatically when the search results are returned.
Is there a suitable event in the XForms model? Can anyone point to
an example of its use?
B. In a form I'm writing now, the documents being edited by the user
consist of a series of top-level children of the document element,
in a relatively fixed order, each top-level child having a characteristic
intermal substructure. Some of the top-level elements have mixed
content (for which I am using a subform); others have element-only
content, but sometimes have children (or in some cases, distant
descendants) which have mixed content.
I would like the user to be presented, on loading a document, with
read-only displays of each top-level element, and buttons offering
to edit (a) the top-level mixed-content elements, and (b) the
second-level elements, some of which have mixed content and
others of which have other specialized needs which will be handled
with other specialized sub-forms.
Right now, the main structure of the form has the structure
<xf:repeat nodeset="*">
<xf:group ref=".[ ... element has mixed content ...]">
... read/edit switch; read case shows the data; edit case loads
mixed-content subform ...
</xf:group>
<xf:group ref=".[ ... element has element-only content ... ]>
<xf:repeat nodeset="*">
<xf:group ref=".[ ... element has mixed content ...]">
... read/edit switch; read case shows the data; edit
case loads mixed-content subform ...
</xf:group>
<xf:group ref=".[ ... element has other specialized content ...]">
... read/edit switch; read case shows the data; edit
case loads suitable subform ...
</xf:group>
...
</xf:repeat>
</xf:group>
</xf:repeat>
Actually, in the current version of the form its worse than this: the
read/edit switch for mixed-content elements occurs three times, not just
twice.
If I could (a) represent the read/edit switch for mixed content as a subform,
and (b) cause that subform to load automatically at the two different locations
where it's needed, then I would have less repetition in my code, fewer
opportunities for unintentional inconsistency, and smaller modules
which are (probably) easier to understand.
If I can find a way to make this work (and especially if I can find a way
to make it work recursively), then it might be possible to write XForms
for documents with less repetition and in a way that feels more like
the template-driven style of XSLT. (Where I come from, that would be
a very good thing.)
Any comments welcome.
Michael Sperberg-McQueen
--
****************************************************************
* C. M. Sperberg-McQueen, Black Mesa Technologies LLC
* http://www.blackmesatech.com
* http://cmsmcq.com/mib
* http://balisage.net
****************************************************************
|