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