Yes, I fully understand the JSF lifecycle, but that doesn't address my
problem. The problem is that the partialTriggers functionality of the
UIXCommand components depends on the broadcasting of the ActionEvent. This
event's phase cannot be changed without drastically affecting the
application.

The question is this:

How can an web application developer re-render a component as a result of a
validation or conversion error during a partial submission of a UIXCommand
component without writing a custom component or custom renderer?

-Andrew

On 8/28/07, Gary VanMatre <[EMAIL PROTECTED]> wrote:
>
> >From: "Andrew Robinson" <[EMAIL PROTECTED]>
> >
> > It is a simple case of showing the effects of the failed validation.
> > Take the following use case as an example:
> >
> > User clicks on a register button to create a user account for a web
> site.
> >
> > The user enters a username that is already in use and hits the
> > register/save button
> >
> > A unique validator on the username field fails its validation and adds
> > a validation message to the faces context using the component. All
> > message components that are for this component as well as any messages
> > components that are not global have to be re-rendered to show the user
> > the validation error.
> >
> > This is just one use case to illustrate the fact that at the very
> > least, message and messages components need to be re-rendered when
> > validation errors and conversion errors are thrown on the se rver. This
> > doesn't include any components that need to be re-rendered as a
> > result. For example, the panelLabelAndMessage component renders an
> > error icon in the label when there is an error message for the input
> > component. It is also common for people to style components different
> > (red border for example) when their validation fails.
> >
> > The way Trinidad components are written, there is no way out of the
> > box to accomplish this. The commandLink and commandButton will only
> > run the partial trigger functionality if the action event is
> > broadcast. Therefore, there is a large gap in the PPR functionality to
> > allow code to trigger rendering when the renderResponse method is
> > called before the broadcasting of the event.
> >
>
> My take on it is that Trinidad uses the JSF lifecycle to achieve PPR.
> In the JSF Lifecycle, the UIViewRoot processes queued events for
> each phase by calling the broadcast on the source component for
> all phases except render  response.  The components queue events
> in the decode (apply request values) and can specify the phase
> they should be invoked in.  I believe the default phaseId for the
> FacesEvent is ANY.
>  In all of these cases, events are processed prior to checking
> if the response is completed or render response has be set to
> true.
>
> Take a look at the following methods in the UIViewRoot [1].
> processDecodes   - apply request values
> processValidators - process validators
> processUpdates    - update model
> processApplication - invoke application
>
>
> [1]
> http://svn.apache.org/viewvc/myfaces/core/branches/1_1_5/api/src/main/java/javax/faces/component/UIViewRoot.java?view=markup
>
>
> > Now, doesn't it make sense for a message component to be triggered on
> > the fact that the command was executed (meaning the button was
> > clicked, form was submitted) but not necessarily that the JSF action
> > was run?
> >
> > Even if you don't agree, you have to realize that the PPR currently
> > makes re-rendering impossible if renderResponse is called, shortening
> > the JSF lifecycle.
> >
> > I realize that many people use client side validation with Trinidad
> > and therefore are less likely to have this issue, but there are
> > several reasons that client side validation is not a complete
> > solution.
> >
> > With custom components and integration with the Tridindad APIs this
> > functionality is definitely possible, but it really should be provided
> > out of the box.
> >
> > So to answer your question, there is absolutely no point in
> > re-rendering a message component if there isn't a validation error or
> > conversion error.
> >
> > -Andrew
> >
>
> Gary
>
> > On 8/28/07, Adam Winer wrote:
> > > I don't understand that sentence... You're saying that you
> > > *do* want validation to fire, but want the components to
> > > re-render just the same? This seems odd... If validation
> > > fails, what state has changed such that you need updated
> > > content?
> > >
> > >
> > > -- Adam
> > >
> > >
> > > On 8/28/07, Andrew Robinson wrote:
> > > > But the action should not be immediate, only the effect of the
> re-rendering
> > > >
> > > > On 8/28/07, Adam Winer wrote:
> > > > > On 8/28/07, Andrew Robinson wrote:
> > > > > > I got it to work with a custom component. I created a component
> that
> > > > > > doesn't render, that simply houses children. In the queueEvent
> me thod < BR>> > > > > of that component, if the type of the event is
> ActionEvent, I then use
> > > > > > it to add components as partial targets.
> > > > > >
> > > > > > It just would be nice to have this supported by Trinidad out of
> the
> > > > > > box. A4J creates AjaxEvents that have their phase ID set to ANY,
> so
> > > > > > they fire almost immediately, and thus work regardless of what
> phases
> > > > > > are run.
> > > > > >
> > > > > > I'm just wondering if there would be any harm to moving the code
> from
> > > > > > the broadcast method to the queue method.
> > > > >
> > > > > Yes, there would be! It'd break the semantics of partialTriggers.
> > > > >
> > > > > If you want your action event to fire in the "ANY" phase, just set
>
> > > > > immediate ="true ".
> > > > >
> > > > > -- Adam
> > > > >
> > > > > >
> > > > > > On 8/28/07, Simon Lessard wrote:
> > > > > > > Hello Andrew,
> > > > > > >
> > > > > > > To my knowledge, this is the desired behavior since PPR
> requests does
> > not
> > > > > > > use a different lifecycle than a normal requests. However,
> since I had
> > to
> > > > > > > deal with that with every single ADF Faces/Trinidad projects I
> was on,
> > I
> > > > > > > made a new lifecycle that alter the behavior with PPR request
> by
> > skipping
> > > > > > > required check validations and running validation and update
> model
> > phases
> > > > > > > only on the PPR source then I restore the model value after
> the render
> > to
> &g t; &gt ; > > > > make sure the model does not stay polluted. Finally, I
> have to save
> > all
> > > > > > > values that were pushed from PPR that way so that in further
> PPR
> > requests
> > > > > > > (in case there's more than one PPR active element in the
> page), I push
> > the
> > > > > > > value back to the model from the previous PPR requests. This
> last part
> > is
> > > > > > > the source of most of the complexity but is required when
> populating a
> > > > > > > selectOneMenu's list of values from the value of two other
> fields for
> > > > > > > example.
> > > > > > >
> > > > > > >
> > > > > > > Regards,
> > > > > > >
> > > > > > > ~ Simon
> > > > > > >
> > > > > > >
> > > > > > > On 8/27/07, Andrew Robinson wrote:
> > > > > > > > I have a login form with a login command link. The form is a
>
> > > > > > > > panelFormLayout with panelLabelAndMessage components with
> inputText
> > > > > > > > components (username and password).
> > > > > > > >
> > > > > > > > I have:
> > > > > > > >
> > > > > > > > > > > > > > > id="login"
> > > > > > > > partialSubmit="true"
> > > > > > > > action="#{identity.login}"
> > > > > > & gt; &g t; text="#{messages.page_login_login}" />
> > > > > > > > ...
> > > > > > > >
> > > > > > > > Now the panel is not updated because the code to trigger the
> PPR is
> > in
> > > > > > > > the broadcast method of the UIXCommand (parent of the
> command link).
> > > > > > > > The validation error causes the ActionEvent to not be
> broadcast, and
> > > > > > > > thus the PPR is not properly triggered.
> > > > > > > >
> > > > > > > > Should this be considered a bug?
> > > > > > > >
> > > > > > > > Should the "adfContext.partialUpdateNotify(component);" call
> be made
> > > > > > > > from the queueEvent method rather than the broadcast method?
>
> > > > > > > >
> > > > > > > > Or is there a diffe rent way to do this that I am missing?
> > > > > > > >
> > > > > > > > Another nice feature would be to automatically have the
> > > > > > > > panelLabelAndMessage and panelFormLayout components
> automatically
> > get
> > > > > > > > re-rendered if there is a validation or conversion error in
> one of
> > > > > > > > their nested children components.
> > > > > > > >
> > > > > > > > Thanks,
> > > > > > > > Andrew
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> > > > > > > > ...
> > > > > > > >
> > > > > > > >
>

Reply via email to