[Struts / Tiles] Tile dynamisch opvullen

Pagina: 1
Acties:

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Ik zit nu al een tijdje te zoeken naar de manier om uit dit probleem te geraken, maar ik kan de best passende oplossing maar niet vinden.

Het gaat om een Struts webapplicatie dat gebruik maakt van tiles voor de opbouw. Ik heb dan ook 1 main template definition gedefinieerd:
XML:
1
2
3
4
5
6
7
<definition name="mainLayout" path="/pages/tiles/maintemplate.jsp">
    <put name="tile.header" value="/pages/tiles/header.jsp"/>
    <put name="tile.submenu" value="/pages/tiles/submenu.jsp"/>
    <put name="tile.messages" value="/pages/tiles/messages.jsp"/>
    <put name="tile.content" value=""/>
    <put name="tile.footer" value="/pages/tiles/footer.jsp"/>
</definition>


Mijn template pagina ziet er dan als volgt uit:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html:html xhtml="true">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <title><bean:message key="portal.title"/></title>
</head>
<body>
  <table width="100%" cellpadding="0" cellspacing="0" border="0">
    <tr>
      <td height="120" vAlign="top"><tiles:get name="tile.header"/></td>
    </tr>
    <tr>      
      <td valign="top">
        <tiles:insert attribute="tile.submenu" ignore="true"/>

        <table width="800" cellpadding="0" cellspacing="5" border="0">
          <tr align="center">
            <td valign="top">&nbsp;<tiles:get name="tile.messages" /></td>
          </tr>
          <tr>
            <td valign="top"><tiles:get name="tile.content" /></td>
          </tr>
        </table>

      </td>
    </tr>
  </table>
</body>
</html:html>

Aangezien de submenu altijd op deze plaats moet komen (vooral voor de integratie met het design), dien ik deze hier wel als tile te definiëren.

Wat wil ik eigenlijk bereiken?
Ik zou een submenu.jsp willen hebben, waarin o.a. de layout van de submenu bepaalt wordt, deze jsp moet dan geïnserteerd worden op de plaats die aangegeven is in de maintempate.

submenu.jsp ziet er bvb als volgt uit:
Java:
1
2
3
4
<%@taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>
<div id="subMenu" style="margin-top: -3px; width: 100%; height: 32px; background: url(images/submenubg.gif);">
  // insert buttons, links, comboboxes, ... here
</div>

Waar op dit moment nog de comment staat, wil ik een soort van (tiles) container voorzien waarin de geschikte content dan geladen kan worden.

Deze content zou ik willen laden vanuit de pagina de de verdere content van dit submenu bevat.
Bvb een person_overview.jsp
Java:
1
2
3
4
5
6
7
8
9
<logic:present parameter="id">
  <h1><bean:message key="title.person.edit"/>:
      <bean:write name="personForm" property="firstName"/>
      <bean:write name="personForm" property="lastName"/>
  </h1>
  // -- deze button moet eigenlijk in het submenu terechtkomen/geladen worden
  <button onclick="location.href='action.do?method=new'"><bean:message key="person.new"/></button>
  // -- ^
</logic:present>


Ik heb al geprobeerd om in de submenu.jsp een <tiles:insert attribute="submenu.content"/> te voorzien, en dan in de person_overview.jsp een <tiles:put name="submenu.content"><button ...></tiles:put>. Maar dit werkt natuurlijk niet.

Ik hoop dat het ongeveer duidelijk is hetgeen ik probeer te bereiken. Misschien wil ik het wel op een manier die onmogelijk is, maar dan zou ik toch graag hebben als jullie mij helpen meedenken en misschien wel tot een flexibelere oplossing kunnen komen.

  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:21

momania

iPhone 30! Bam!

Wat jij wil kan met het volgende:

Je main layout als basis
XML:
1
2
3
4
5
6
7
<definition name="mainLayout" path="/pages/tiles/maintemplate.jsp">
    <put name="tile.header" value="/pages/tiles/header.jsp"/>
    <put name="tile.submenu" value="/pages/tiles/submenu.jsp"/>
    <put name="tile.messages" value="/pages/tiles/messages.jsp"/>
    <put name="tile.content" value=""/>
    <put name="tile.footer" value="/pages/tiles/footer.jsp"/>
</definition>

Een pagina die je main layout extend en waarbij het submenu naar een nieuwe tileset template wijst
XML:
1
2
3
<definition name=".tileset.test" extends="mainLayout">
    <put name="tile.submenu" value="tile.sub.submenu"/>
</definition>

Dit is de andere (sub) template voor je menu
XML:
1
2
3
4
<definition name="subMenuLayout" path="/pages/tiles/submenutemplate.jsp">
    <put name="tile.submenu.top" value="/pages/menu/dummy.jsp"/>
    <put name="tile.submenu.body" value="/pages/menu/dummy.jsp"/>
</definition>

En dit is dan de invulling van je menu :)
XML:
1
2
3
4
<definition name="tile.sub.submenu" extends="subMenuLayout">
    <put name="tile.submenu.top" value="/pages/menu/top.jsp"/>
    <put name="tile.submenu.body" value="/pages/menu/body.jsp"/>
</definition>


Bedoel je dit? :)

Neem je whisky mee, is het te weinig... *zucht*


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
momania schreef op maandag 07 november 2005 @ 20:04:
Wat jij wil kan met het volgende:

Je main layout als basis
XML:
1
2
3
4
5
6
7
<definition name="mainLayout" path="/pages/tiles/maintemplate.jsp">
    <put name="tile.header" value="/pages/tiles/header.jsp"/>
    <put name="tile.submenu" value="/pages/tiles/submenu.jsp"/>
    <put name="tile.messages" value="/pages/tiles/messages.jsp"/>
    <put name="tile.content" value=""/>
    <put name="tile.footer" value="/pages/tiles/footer.jsp"/>
</definition>

Een pagina die je main layout extend en waarbij het submenu naar een nieuwe tileset template wijst
XML:
1
2
3
<definition name=".tileset.test" extends="mainLayout">
    <put name="tile.submenu" value="tile.sub.submenu"/>
</definition>

Dit is de andere (sub) template voor je menu
XML:
1
2
3
4
<definition name="subMenuLayout" path="/pages/tiles/submenutemplate.jsp">
    <put name="tile.submenu.top" value="/pages/menu/dummy.jsp"/>
    <put name="tile.submenu.body" value="/pages/menu/dummy.jsp"/>
</definition>

En dit is dan de invulling van je menu :)
XML:
1
2
3
4
<definition name="tile.sub.submenu" extends="subMenuLayout">
    <put name="tile.submenu.top" value="/pages/menu/top.jsp"/>
    <put name="tile.submenu.body" value="/pages/menu/body.jsp"/>
</definition>


Bedoel je dit? :)
Denk het niet. Begrijp ook niet helemaal wat je hiermee wil bereiken.. :?

Wat ik zou willen is de submenu-tile dynamisch opvullen vanuit de tile.content pagina's.
In de tile.submenu pagina een soort van container-placeholder voorzien, die dan vanuit de content pagina ingevuld kan worden met iets als tile:put.

Maar ik ben er ook niet zeker van ofdat dit technische mogelijk is...

  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:21

momania

iPhone 30! Bam!

Wat je dan wil is gewoon verschillende submenu's bij je verschillende content toch?
Of wil je ook nog verschillende menu's bij gelijke content (template) alleen dan met bijvoorbeeld andere dynamische data?

In het eerste geval kan je toch gewoon de opmaak van je menu naar de main template verhuizen en daar de insert laten zoals hij is?

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<html:html xhtml="true">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <title><bean:message key="portal.title"/></title>
</head>
<body>
  <table width="100%" cellpadding="0" cellspacing="0" border="0">
    <tr>
      <td height="120" vAlign="top"><tiles:get name="tile.header"/></td>
    </tr>
    <tr>      
      <td valign="top">
        <div id="subMenu" style="margin-top: -3px; width: 100%; height: 32px; background: url(images/submenubg.gif);">
  // insert buttons, links, comboboxes, ... here
            <tiles:insert attribute="tile.submenu" ignore="true"/>
        </div>

        <table width="800" cellpadding="0" cellspacing="5" border="0">
          <tr align="center">
            <td valign="top">&nbsp;<tiles:get name="tile.messages" /></td>
          </tr>
          <tr>
            <td valign="top"><tiles:get name="tile.content" /></td>
          </tr>
        </table>

      </td>
    </tr>
  </table>
</body>
</html:html>


Nu kan je toch gewoon verschillende submenu's hebben bij verschillende content?
Zoiets:
XML:
1
2
3
4
5
6
7
8
<definition name=".tileset.page1" extends="mainLayout">
    <put name="tile.submenu" value="menu/menu1.jsp"/>
    <put name="tile.content" value="/page/page1.jsp"/> 
</definition>
<definition name=".tileset.page2" extends="mainLayout">
    <put name="tile.submenu" value="menu/menu2.jsp"/>
    <put name="tile.content" value="/page/page2.jsp"/> 
</definition>

Is dit het niet, zal je het echt beter uit moeten leggen :P

[ Voor 29% gewijzigd door momania op 07-11-2005 21:16 ]

Neem je whisky mee, is het te weinig... *zucht*


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Ik wil inderdaad verschillende submenu's bij verschillende content. De layout mag dezelfde zijn.
MAAR als er geen submenu nodig is, hoef ik daar de layout ook niet van te zien. En dat is in het vb die jij aanhaalt wel het geval, want je plaatst die div altijd.

Verder wil ik die submenu content niet definiëren in mijn tiles-defs.xml, maar zou ik die graag willen inserteren via mijn contentpages.
Zodat ik in mijn contentpages gewoon kan zeggen
<tiles:insertContentOfThisTagInTheRightTile>
<button 1 value="Add">
<button 2 value="Edit">
</tiles:insertContentOfThisTagInTheRightTile>

Op die manier hoef ik niet voor iedere submenu content ook een aparte jsp aan te maken. Maar verwijs ik gewoon in mijn content pagina dat die buttons getekent moeten worden in mijn voorziene tile container.

  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:21

momania

iPhone 30! Bam!

Je wil dus vanaf client side iets injecteren wat serverside aan elkaar geplakt wordt.. en dat kan niet

Je kan toch die submenu houden zoals je die had?
En in geval je geen submenu wilt, laat je dat deel leeg middels een dummy.jsp :)

Neem je whisky mee, is het te weinig... *zucht*


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Neen, toch niet. Ik wil serverside de tiles dynamisch in elkaar injecteren.

Ik zou idd met een dummy.jsp kunnen werken voor de pagina's waar ik het submenu niet wil laten zien.
Maar wat ik eigenlijk zou willen bereiken is dat ik niet voor iedere pagina een aparte jsp moet gaan voorzien die de submenu content voedt.
Ik zou dan een person_overview.jsp hebben, maar dan zou ik ook nog een person_overview_submenu.jsp moeten hebben.

Wat ik dus graag had gehad is mijn algemene definities definiëren in de tiles-defs.xml, maar voor de submenu content werken met een tag in de algemene contentpagina.

Iets in de aard van:
<tiles:putDezeTagBodyButtonsInDeDaarvoorVoorzieneSubMenuTile> :)
deze buttons
</tiles:put>

Zodat ik deze content meeneem in de jsp's, maar deze toch op de juiste plaats gerenderd worden.

Ik zou niet weten hoe ik het anders nog kan uitleggen, hopelijk snap je nu een beetje wat ik wil zeggen.

  • ronaldmathies
  • Registratie: Juni 2001
  • Niet online
Het voorbeeld van mamoia was volgens jou niet goed omdat je de div altijd plaatst.
dat kan je oplossen door het volgende te doen:

Ik heb een klasse gemaakt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
public class TilesUtils {

public static String getAsString(PageContext pageContext, String name) throws JspException {
    ComponentContext compContext = (ComponentContext)pageContext.getAttribute( ComponentConstants.COMPONENT_CONTEXT, PageContext.REQUEST_SCOPE);
        
    if( compContext == null )
        throw new JspException ( "Error - TilesUtils.getAsString : component context is not defined. Check tag syntax" );
              
    Object value = compContext.getAttribute(name);
    return (String)value;
    }
}


Deze code kan je in je pagina gebruiken om te testen of een bepaalde tiles onderdeel (in jouw geval 'tile.submenu') aanwezig is of niet.

code:
1
2
3
4
5
6
7
<% 
    if (TilesUtils.getAsString(pageContext, "tile.submenu")!= null) {
%>
<tiles:insert attribute="tile.submenu" ignore="true"/>
<% 
    }
%>

3015 Wp-z 5360 Wp-nno op 2 x SMA-SB3600 TL-21, Warmtepomp: ERSC-VM2CR2 / PUHZ-SHW140 YHA, WTW Q350, EV Kia Ev6 GT-Line


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Dat kan in dit geval wel handig zijn de submenu layout al dan niet te tonen.

Maar om even terug te komen op de submenu content. Is het enigszins mogelijk om deze content te laden vanuit een jsp, zonder alle submenu's hoeven onder te verdelen in aparte *_submenu.jsp's?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:21

momania

iPhone 30! Bam!

Ik denk dat er weinig anders opzit dan een submenu te maken per content.

Eventueel zou je nog met een controllerClass iets kunnen doen, door er 1 te maken die speciaal voor je submenu.jsp de juiste gegevens verzamelend om een menu op te kunnen bouwen.

Neem je whisky mee, is het te weinig... *zucht*

Pagina: 1