I’m stuck –
I need to have a Wicket Panel be able to add a class attribute to the <body> tag of whatever page it’s on.
Example usage:
Java:
add(new SpecialSidebarComponent("sidebar"));
Generated HTML:
<body class="sidebar">
...
<div id="sidebar">My Wicket Panel</div>
...
</body>
I cannot add a wicket:id and make the body a Wicket component, because this makes it very difficult to add components to a page in the big page hierarchy I have, and it still also doesn’t easily allow for a Panel to modify the body attribute.
I thought BodyTagAttributeModifier may be for this, but apparently it is for something else and cannot get it to function ( Wicket: how to use the BodyTagAttributeModifier class? )
Any helpful ideas?
Update:
In looking at it, it appears the BodyTagAttributeModifier class is only for a Panel’s parent tag, not the Page’s <body> tag:
Example (Scala syntax):
class Home extends WebPage {
add(new Sidebar("sidebar"))
}
class Sidebar(id: String) extends Panel(id) {
add(new BodyTagAttributeModifier("class", true, new Model("layout-class"), getParent))
}
Template:
<html>
<body>
<div wicket:id="sidebar">Sidebar</div>
</body>
</html>
Rendered:
<html>
<body>
<div class="layout-class">
<h1>Hello World!</h1>
</div>
</body>
</html>
Very confusing name IMHO. Doesn’t solve the issue but at least makes more sense.
I personally think the Javascript option is the cleanest for this specific case. However, your comment about
add(Component...)being final leads me to believe that you might be interested in thesetTransparentResolver(true)method. Here’s how it works…BasePage.html
BasePage.java
MyPage.java (extends BasePage)
Even though you are not adding the SidebarPanel directly to the bodyContainer in the BasePage, it will still work out because of
setTransparentResolver(true).For your simple case, go with the Javascript. For the general issue of feeling constrained by subclasses not being able to fit inside containers, be aware of transparent resolving.