Hi Guys

No problem, thanks Otho and donf yang for helping a newbie at Tapestry.
Am still trying get my head around how to pass data between components
(not same as pages) ie how to pass data from one component to another.
Let me be more precise: 

If I use the @Component annotation then my second menu component it has
be nested inside first <t:mainMenu><div class="sidemenu"/></t:mainMenu>
there you can pass a string to submenu provided that its enclosed inside
MainMenu component, however would not work if my two menu components sit
independently from each other inside my Layout component. Apologies is I
did not explain myself clearly enough. Here is my Layout.tml code
fragment: 


... 

<!--Main menu top-->
<!--header-->                                   
<t:mainmenu myStringParameter="Link1,Link2 Link3..."/> 
        <div style="clear:both;"/>
        <!-- Body -->
        <div id="bd">
                <div id="yui-main">
                        <div class="yui-b">
                                <div id="bd">
                                   <t:body />
                              </div>
                        </div>
                </div>
                <div class="yui-b">
                        <t:sideMenu/>
                </div>
        </div>            
         <!-- end body -->
        <div style="clear:both;"></div>

...

When the event hander is called ie onAction(String context) from
MainMenu.java I want to be able to pass that string from the onAction
method (MainMenu.java) to another method called
setSelectedMenuItem(String context) inside SideMenu.java without getting
a NullPointerException. If I use @Component annotation then I need to
nest <t:mainMenu><div class="sidemenu"/></t:mainmenu> then it will work.
But because my sidemenu component sits further down in my Layout.tml
page, how can I do this ?

Thanks again for the assistance. 



-----Original Message-----
From: Otho [mailto:[email protected]] 
Sent: Friday, June 12, 2009 2:55 PM
To: Tapestry users
Subject: Re: Two Menu Components

Oops, sorry. My bad.

This doesn't work with components in this way.

If you want to update with Ajax I suggest you try donf jangs solution.
The
following works on full page refresh.

You need to have MainMenu and SideMenu as components in your Layout.java

Layout.java

@Component
private MainMenu mainMenu;

@Component
private SideMenu sideMenu;


Object setupRender()
{

sideMenu.setSelectedMainMenuItem(mainMenu.getSelectedMenuItem());

....

  return null;
}


MainMenu.java

@Persist
private String selectedItem;

@Property
private List<String> menuItems = Arrays.asList("home", "about", "help");

@Property
private String currentMenuItem;

public String getSelectedMenuItem()
{
  return selectedItem;
}

Object onActionFromMyMenu(String context)
{
   selectedItem = context;

   return null;
}

MainMenu.tml
...
<ul>
<t:loop source="menuitems" value="currentMenuItem">
<li><a t:type="actionLink" t:id="myMenu"
context="currentMenuItem">${message:${currentMenuItem}-label}</a>
</t:loop>
</ul>

MainMenu.properties

home-label=Start
about-label=About
help-label=Help


SideMenu.java

@Persist
private String selectedMainMenuItem;

public getSelectedMainMenuItem()
{
  return selectedMainMenuItem;
}

public setSelectedMainMenuItem(String value)
{
  selectedMainMenuItem=value;
}

The rest with the blocks can stay as it is in the first post.

If you don't write explicit getters and setters like I did in this
second
example, it won't compile, since the getters and setters are only
created at
runtime by Tapestry when using the @Property annotation. Sorry for being
so
rash. I hope this helps, and as I said if you want Ajax, look at donf
yangs
code.


2009/6/12 Eldred Mullany <[email protected]>

> Hi Otho
>
> Thank you for the feedback, I am trying this example, but notice that
I
> get a transformation exception if I inject my component as per your
> example. Complaining about it not having a serviceID ?
>
> Using T5 5.1.0.5
>
> How do I provide a serviceID to ComponentResourcesInjectionProvider ?
>
> Thank you
>
> -----Original Message-----
> From: Otho [mailto:[email protected]]
> Sent: Thursday, June 11, 2009 3:33 PM
> To: Tapestry users
> Subject: Re: Two Menu Components
>
> Create an eventhandler in your MainMenu component which fires on
select
> and
> gives the selected menuitem as context.
>
> For example
>
> class MainMenu
> @Inject
> private SideMenu sideMenu;
>
> Object onActionFromYourMenu(String context)
> {
>   sideMenu.setSelectedMainMenuItem(context);
>
>   return null;
> }
>
> class SideMenu
>
> @Property
> @Persist
> private String selectedMainMenuItem;
>
> @Inject
> private Block whateverBlock;
>
> @Property
> @Persist
> private Block displayBlock;
>
> Object setupRender()
> {
>  if(selectedMainMenuItem.equals("whatever")
>    displayBlock = whateverBlock;
>
> ...
>
>  return null;
> }
>
> SideMenu.tml
>
> <div class="sidemenu">
> <t:delegate to="displayBlock"/>
> </div>
>
> <t:block t:id = "whateverBlock">
> <ul>
> <li>Whatver has to be done</li>
> <ul>
> </t:block>
>
>
> 2009/6/11 Eldred Mullany <[email protected]>
>
> > Hi All
> >
> >
> >
> > I need some advice on how to get two menu components to talk to each
> > other. The fist component is a top menu with a whole lot of links,
> when
> > an action link is fired(from the first menu component) I want to
pass
> a
> > parameter string to the second component (sub-menu) which will
render
> > based on the parameter it's been passed to it.
> >
> >
> >
> > So in other words second menu component is dependent on the first.
> >
> >
> >
> > Its pretty much high level but some advice would be useful. Perhaps
a
> > component listener of some sort?
> >
> >
> >
> > Any ideas ?
> >
> >
> >
> > Thanks
> >
> > Eldred
> >
> >
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to