Using a Confluence page as a base page for a user macro
If you’re using Confluence (like I do at work) and have been digging around the user macros feature, this might be something for you.
I wanted to create a user macro, which basically just inserts a parametrized confluence page. Googling for it, I didn’t find a thing noted about how one would create such a macro. So, now there is.
A Confluence user macro is basically a Velocity template with parameters, that are evaluated by Confluence and presented to the user in a nice UI. These parameters are stuck in „$param<Name>“ variables, that can be used in the template.
So, basically you first have to create a Confluence page somewhere and use that kind of parameters there (note the prefix $param!). Please check the storage format after saving your page and check, that the parameters really are in the text like they should. (I came across a problem when I entered a parameter and edited it later and Confluence threw in a „<span>“-Tag in that)
After that, create a user macro and enter these basic code:
## Specify the page, this macro is based on #set($key="SPACE") #set($name="Page") ## Specify the parameters for that page ## (...) ## Get PageManager object instance #set($containerManagerClass=$content.class.forName('com.atlassian.spring.container.ContainerManager')) #set($getInstanceMethod=$containerManagerClass.getDeclaredMethod('getInstance',null)) #set($containerManager=$getInstanceMethod.invoke(null,null)) #set($containerContext=$containerManager.containerContext) #set($pageManager=$containerContext.getComponent('pageManager')) ## Get the Page object instance #set($page=$pageManager.getPage($key,$name)) ## Render the page with the parameters above #evaluate($page.getBodyContent().getBody())
Replace the words SPACE and Page with your actual Space- and Pagenames. Finally, define the parameters for that page at the (…)-place in the code and you’re ready to go.