Render an HTML "a" anchor element that acts like a form submit button when clicked.
General Behaviour
Both the encode and decode behavior require the ability to get the id/name for a hidden field, which may be rendered in markup or which may be programmatically added via client DOM manipulation, whose value is set by the JavaScript form submit. This name must be constructed as follows:
Get the clientId for the form of which this component is a child.
Append
NamingContainer.SEPARATOR_CHAR.
Append a constant string that is the same for all command link components in the tree.
In the following text, this String is called hiddenFieldName.
Decode Behavior
Obtain the "clientId" property of the component. Obtain the
Map from the "requestParameterMap" property of the
ExternalContext. Derive hiddenFieldName as above.
Get the entry in the
Map under the key that is the
hiddenFieldName. If the there is no entry, or the entry is the
empty String, or the entry is not equal to the value of the
"clientId" property, return immediately. If there is an entry,
and its value is equal to the value of the "clientId" property,
create a new
javax.faces.event.ActionEvent instance
around the component and call
queueActionEvent() on
the component, passing the event.
Encode Behavior
If the value of the
disabled attribute is
true, render a span element. Render all the
ignored-by-renderer attributes and the
target
attribute as ignored-by-renderer attributes on the span, even
though the
target attribute will have no effect on a
span. Render the current value of the component as the content of
the span. Return.
If the
disabled attribute is not present, or its
value is
false, render an HTML
a
element. Render "#" as the value of the "href" attribute. Render
the current value of the component as the link text if it is
specified. Render JavaScript that is functionally equivalent to
the following as the value of the "onclick" attribute:
document.forms['CLIENT_ID']['hiddenFieldName'].value='CLIENT_ID';
document.forms['CLIENT_ID']['PARAM1_NAME'].value='PARAM1_VALUE';
document.forms['CLIENT_ID']['PARAM2_NAME'].value='PARAM2_VALUE';
document.forms['CLIENT_ID'].submit(); return false;
where hiddenFieldName is as described above, CLIENT_ID is the
clientId of the UICommand component, PARAM*_NAME and PARAM*_VALUE
are the names and values, respectively, of any nested UIParameter
children. The name and the value must be URLEncoded. Note that the required url
encoding is handled by
ResponseWrter.writeAttribute(). If an
"onclick" attribute was specified by the user, render this
JavaScript in a function, and render the user's JavaScript in a
function. Render both functions in a choice function as
follows:
var a=function(){#USER_FUNCTION#};
var b=function(){#JSF_FUNCTION#};
return (a()==false) ? false : b();
where #USER_FUNCTION# is the user's JavaScript and #JSF_FUNCTION# is the JavaScript rendered by JSF. The choice function should operate such that if the user's JavaScript returns true, then the rendered JavaScript will also execute.
If the "styleClass" attribute is specified, render its value as the value of the "class" attribute. Render any non-UIParameter output children as normal inside of the "a" element. These will appear as the link text. Allow the form renderer to output a single "input" element (for the entire page, regardless of how many command link components are in the page) of "type" "hidden" whose "name" is the value of hiddenFieldName, and which must not have a "value" attribute. Multiple occurrences of command link components in the tree should not cause multiple hiddenFieldName hidden fields. Allow the form renderer to output an "input" element of "type" "hidden" for each of the nested UIParameter children, taking the name property (but not the value) from each one in turn. If the "disabled" attribute is specified, do not render the HTML "a" anchor element or its "href" attribute. Instead, render a "span" element. If the "styleClass" attribute is specified, render its value as the value of the "class" attribute on the "span". Render any ignored-by-renderer attributes on the "span". The content of the span element comes from the value of the component or its children as specified above.
If the user specified a
target attribute, its
value must be set using javascript since the
onclick
handler will prevent the target attribute from being generated.
This must be accomplished using JavaScript that is equivalent to
the following.
document.forms['CLIENT_ID'].target='TARGET';
Where TARGET is the value of the target attribute on the JSPLink
<f:attribute
</h:commandLink>
This renderer.