You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Adriaan Joubert <ad...@gmail.com> on 2008/04/04 11:55:08 UTC
Form fragments and radio buttons
Hi,
I had an issue with triggering a form fragment with a radio button. I
came up with the following solution, and thought I'd share and ask for
comments - perhaps it is possible to come up with something that can
be included in Tapestry.
The .tml looks as follows:
<t:form t:id="create">
<t:radiogroup t:id="createAction" value="action"
encoder="actionEncoder">
<t:radio t:id="copy" t:mixins="radiotriggerfragment"
fragment="copyfragment" />
<t:label for="copy" />
<t:radio t:id="new" />
<t:label for="new" />
</t:radiogroup>
<t:formfragment t:id="copyfragment" visible="true">
This is the copy form fragment
</t:formfragment>
</t:form>
This required the following mixin (mostly a copy of TriggerFragment.java):
/**
* Deal with using a radio button to make a form fragment visible/invisible
*/
public class RadioTriggerFragment {
/** The container for this mixin */
@InjectContainer
private Field container_;
/**
* The {@link org.apache.tapestry.corelib.components.FormFragment} instance
* to make dynamically visible or hidden.
*/
@Parameter(name = "fragment", required = true, defaultPrefix = "component")
private ClientElement fragment_;
/** Page render support to get unique client side ids and generate links */
@Environmental
private PageRenderSupport renderSupport_;
/** The heartbeat */
@Environmental
private Heartbeat heartbeat_;
/**
* Render the javascript call to deal with the radio button check/uncheck
*/
void beginRender() {
Runnable r = new Runnable() {
@SuppressWarnings("synthetic-access")
public void run() {
renderSupport_.addScript(
"aplLinkRadioButtonToFormFragment('%s', '%s');",
container_.getClientId(), fragment_.getClientId());
}
};
// Defer generating the script to ensure that the FormFragment has
// rendered
// and generated its client id.
heartbeat_.defer(r);
}
}
and the following bit of javascript:
function aplLinkRadioButtonToFormFragment(radio, form) {
radio = $(radio);
// Get the name on this radio button
var allRadios = radio.form[radio.name];
for (var i=0; i<allRadios.length; i++)
allRadios[i].observe("click", function() {
$(form).formFragment.setVisible(radio.checked);
});
}
There does not seem to be a different way but to listen for events on
all radio buttons in a radio group.
Cheers,
Adriaan
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: Form fragments and radio buttons
Posted by Howard Lewis Ship <hl...@gmail.com>.
This was fixed recently:
https://issues.apache.org/jira/browse/TAPESTRY-2261
On Fri, Apr 4, 2008 at 2:55 AM, Adriaan Joubert <ad...@gmail.com> wrote:
> Hi,
>
> I had an issue with triggering a form fragment with a radio button. I
> came up with the following solution, and thought I'd share and ask for
> comments - perhaps it is possible to come up with something that can
> be included in Tapestry.
>
> The .tml looks as follows:
>
> <t:form t:id="create">
> <t:radiogroup t:id="createAction" value="action"
> encoder="actionEncoder">
> <t:radio t:id="copy" t:mixins="radiotriggerfragment"
> fragment="copyfragment" />
> <t:label for="copy" />
> <t:radio t:id="new" />
> <t:label for="new" />
> </t:radiogroup>
>
> <t:formfragment t:id="copyfragment" visible="true">
> This is the copy form fragment
> </t:formfragment>
> </t:form>
>
> This required the following mixin (mostly a copy of TriggerFragment.java):
>
> /**
> * Deal with using a radio button to make a form fragment visible/invisible
> */
> public class RadioTriggerFragment {
>
> /** The container for this mixin */
> @InjectContainer
> private Field container_;
>
> /**
> * The {@link org.apache.tapestry.corelib.components.FormFragment} instance
> * to make dynamically visible or hidden.
> */
> @Parameter(name = "fragment", required = true, defaultPrefix = "component")
> private ClientElement fragment_;
>
> /** Page render support to get unique client side ids and generate links */
> @Environmental
> private PageRenderSupport renderSupport_;
>
> /** The heartbeat */
> @Environmental
> private Heartbeat heartbeat_;
>
> /**
> * Render the javascript call to deal with the radio button check/uncheck
> */
> void beginRender() {
> Runnable r = new Runnable() {
> @SuppressWarnings("synthetic-access")
> public void run() {
> renderSupport_.addScript(
> "aplLinkRadioButtonToFormFragment('%s', '%s');",
> container_.getClientId(), fragment_.getClientId());
> }
> };
>
> // Defer generating the script to ensure that the FormFragment has
> // rendered
> // and generated its client id.
>
> heartbeat_.defer(r);
> }
> }
>
> and the following bit of javascript:
>
> function aplLinkRadioButtonToFormFragment(radio, form) {
> radio = $(radio);
> // Get the name on this radio button
> var allRadios = radio.form[radio.name];
> for (var i=0; i<allRadios.length; i++)
> allRadios[i].observe("click", function() {
> $(form).formFragment.setVisible(radio.checked);
> });
> }
>
> There does not seem to be a different way but to listen for events on
> all radio buttons in a radio group.
>
> Cheers,
>
> Adriaan
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>
--
Howard M. Lewis Ship
Creator Apache Tapestry and Apache HiveMind
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org