Ivelin Ivanov wrote:
I was refering to the demo wizard not the howto wizard, although they are similar.
Uh, does it matter? Is the action code in that wizard any less convoluted?
It would look exactly the same. See Ovidiu's answer to Daniel's message cited below. This functionality can be implemented outside the flow script itself.How would the flow code look if you implement the functionality of 2 way navigation (prev, next).
Additionally when prev is pressed, validation is skipped.Well, there are many ways to implement this behavior, none of them difficult, for example:
function shouldValidate(form, request) {
// do whatever to decide if validation should happen
return true;
}
function sendView(form, view, uri) {
form.clearViolations();
if (uri == undefined) {
uri = view + ".xml";
}
sendPageAndWait(uri, {id: view});
if (shouldValidate(form, cocoon.request) {
form.populate(cocoon.request);
if (form.violations != null) {
sendView(form, view, uri);
}
}
}
Bottom line, in my opinion, there's no doubt such functionality can be implemented. And there's equally no doubt in my opinion that the flow layer provides an elegant solution compared to using actions. (Remember, that was the objection you most recently raised).
Regards,
Chris
Ivelin
----- Original Message -----
From: "Christopher Oliver" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, December 06, 2002 9:13 PM
Subject: Re: [Proposal] Implementing XMLForm with Flow
Um, I think Daniel basically answered this question a long time ago:
http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=102052662705449&w=2.
Sorry, I don't have an actual implementation, but I think it's clear
that the corresponding flow code would be much more readable than the
action code in the XML form howto (namely something like below). That is
the whole point of the flow layer - that you don't have to write
state-machine code as in XMLForm actions. Compare the flow version to
the original XMLForm action code reproduced below, and judge for yourself.
// display form, wait for submission, and
// apply validations; repeat until no violations
function sendView(form, view, uri) {
form.clearViolations();
if (uri == undefined) {
uri = view + ".xml";
}
sendPageAndWait(uri, {id: view});
form.populate(cocoon.request);
if (form.violations != null) {
sendView(form, view, uri);
}
}
function createForm() {
// create the Form object
// ...
}
function howToWizard() {
// different form views
// participating in the wizard
var VIEW_START = "start";
var VIEW_REGISTRATION = "registration";
var VIEW_INTEREST = "interest";
var VIEW_GARDENING = "organicGardening";
var VIEW_COOKING = "cooking";
var VIEW_SMALLHOLDING = "smallholdingManagement";
var VIEW_CONFIRM = "confirm";
var VIEW_END = "end";
var form = createForm();
var jBean = form.getModel();
sendView(form, VIEW_START);
sendView(form, VIEW_REGISTRATION);
sendView(form, VIEW_INTEREST);
if (jBean.organicGardening) {
sendView(form, VIEW_GARDENING);
} else if (jBean.cooking) {
sendView(form, VIEW_COOKING);
} else if (jBean.smallholdingManagement) {
sendView(form, VIEW_SMALLHOLDING);
}
sendView(form, VIEW_CONFIRM);
sendView(form, VIEW_END);
}
------------------------------------------------------------
From HowToWizardAction.java:
....
// apply control flow rules
if ( formView.equals ( VIEW_REGISTRATION ) )
{
if ( command.equals( CMD_NEXT ) )
{
return page( VIEW_INTEREST );
}
}
else if ( formView.equals ( VIEW_INTEREST ) )
{
if ( command.equals( CMD_NEXT ) )
{
if ( jBean.getOrganicGardening() == true )
{
return page( VIEW_GARDENING );
}
else if ( jBean.getCooking() == true )
{
return page( VIEW_COOKING );
}
else if ( jBean.getSmallholdingManagement() == true )
{
return page( VIEW_SMALLHOLDING );
}
//else if ( getForm().get
return page( VIEW_CONFIRM );
}
if ( command.equals( CMD_PREV ) )
{
return page( VIEW_REGISTRATION );
}
}
else if ( formView.equals ( VIEW_GARDENING ) )
{
if ( command.equals ( CMD_NEXT ) )
{
if ( jBean.getCooking() == true )
{
return page( VIEW_COOKING );
}
else if ( jBean.getSmallholdingManagement() == true )
{
return page( VIEW_SMALLHOLDING );
}
return page( VIEW_CONFIRM );
}
else if( command.equals( CMD_PREV ) )
{
return page( VIEW_INTEREST );
}
}
else if ( formView.equals ( VIEW_COOKING ) )
{
if ( command.equals ( CMD_NEXT ) )
{
if ( jBean.getSmallholdingManagement() == true )
{
return page( VIEW_SMALLHOLDING );
}
return page( VIEW_CONFIRM );
}
else if ( command.equals( CMD_PREV ) )
{
if ( jBean.getOrganicGardening() == true )
{
return page( VIEW_GARDENING );
}
return page( VIEW_INTEREST );
}
}
else if ( formView.equals ( VIEW_SMALLHOLDING ) )
{
if ( command.equals( CMD_NEXT ) )
{
return page( VIEW_CONFIRM );
}
else if ( command.equals( CMD_PREV ) )
{
if ( jBean.getCooking() == true )
{
return page( VIEW_COOKING );
}
else if ( jBean.getOrganicGardening() == true )
{
return page( VIEW_GARDENING );
}
return page( VIEW_INTEREST );
}
}
else if ( formView.equals ( VIEW_CONFIRM ) )
{
if ( command.equals( CMD_NEXT ) )
{
return page( VIEW_END );
}
else if( command.equals( CMD_PREV ) )
{
if ( jBean.getOrganicGardening() == true )
{
return page( VIEW_GARDENING );
}
return page( VIEW_INTEREST );
}
}
}
Ivelin Ivanov wrote:
Sorry I wasn't clear before.---------------------------------------------------------------------
I know you can call Java from the flow.
The question is how to use the flow in a way which significantly reduces
code
while making the maintenance easier and improving the readability.
Try to beat the existing XMLForm wizard demo.
If you succeed, it will be great !
Fingers crossed,
Ivelin
----- Original Message -----
From: "Ugo Cei" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, December 05, 2002 2:36 AM
Subject: Re: [Proposal] Implementing XMLForm with Flow
Ivelin Ivanov wrote:have
I hope you are the last hero trying to confront this monster.
The discussion how to combine the two has been going on forever, but we
standardizednot come to an agreement.I'm currently recovering the previous threads from the archive and
reading them.
I would gladly offer my tactical guidance for your effort.Thank you.
If I was to do this with Actions, I could use well known and
---------------------------------------------------------------------Java APIs - JWSP or JDBC.But, as Ovidiu pointed out, you can!
var schemaFactory =
Packages.org.apache.cocoon.components.validation.SchemaFactory.lookup
("http://www.ascc.net/xml/schematron");
var is = new Packages.org.xml.sax.InputSource
("flows/newuser-schema.xml");
var schema = schemaFactory.compileSchema(is);
var validator = schema.newValidator();
validator.setProperty("http://xml.apache.org/cocoon/validator/phase",
"NewUser");
violations = validator.validate(userBean);
This is just a quick hack I put together looking at the code for the
AbstractXMLFormAction and Form, but it works. I just need to define some
symbolic constants for the namespaces and find a way to access a
SourceResolver from JavaScript to make it pretty.
Anyway, if you prefer to write complex business logic in Java (and I'd
agree wholeheartedly with that), you can encapsulate it in a Java method
that returns a boolean or an index to drive the flow that will be
implemented by an if/then/else or a switch in JavaScript.
What do we gain by this? We remove flow logic from the sitemap in the
form of actions and put it in the flowscript, where it belongs (IMHO).
Ugo
--
Ugo Cei - http://www.beblogging.com/blog/
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]