Is it possible to automatically mirror a page when created by a template?
Asked by Benjamin Gill:

We are creating a section in one space to display our monthly status reports. These are then mirrored into a couple other spaces (for permission and user reasons). Since this is done monthly, is it possible to create the new page in the main space, then have it automatically mirrored in the others? Or do we have to manually create the pages in each space and add the include page macro each time?


Answers:
author: Davin Studer
body: It sounds like you are asking if I create a page in space A called "November 2018 Status Report" is there a way to automatically create a page in space B and space C called "November 2018 Status Report" that includes the content from space A using the include page macro. Is that correct?

comments: author: Benjamin Gill
body: Hi Davin,

Yes, I am trying to figure out if I create a page in Sapce A called, "December Status Report", using the include page macro, can that page automatically be created in another space (or multiple spaces) or is it only for already existing pages?


author: Davin Studer
body: Unfortunately, that isn't easily doable. You could probably set something up with [Power Scripts for Confluence](https://marketplace.atlassian.com/apps/1219507/power-scripts-for-confluence?hosting=server&tab=overview) or [ScriptRunner for Confluence](https://marketplace.atlassian.com/apps/1215215/scriptrunner-for-confluence?hosting=cloud&tab=overview). Another workaround would be the Include Children user macro I created a few years ago. I will include the code below. You could put the macro in space B and space C and reference a page in space A. All the page children in space A will be included onto a page in space B and space C.

**Macro Name:**   
include_children

**Macro Title:**   
Include Children

**Macro Body Processing:**   
No macro body

**Template:**

```
## Developed By: Davin Studer
## Date Created: 12/4/2014
## Updated by: Milo Grika
## Added: show/hide title, link/unlink title.
## Updated by: Gregor Mirai
## Date updated: 26/1/2016
## Added: page separator, PDF split page marker options.
## Updated by: Davin Studer
## Date updated: 4/13/2018
## Added: Include Descendants checkbox
## Date updated: 10/3/2018
## Added: Added ability to specify the parent page

##############################
## Template:                ##
##############################
## @param ShowTitle:title=Show Title|type=boolean|desc=Deselect to remove the title of the child page.|default=true
## @param LinkTitle:title=Link Title|type=boolean|desc=Select to turn the titles of the child pages into links to those pages (Show Title must be selected).|default=false
## @param IncludeDescendants:title=Include Descendants|type=boolean|desc=Select to include descendants.|default=false
## @param PageSeparator:title=Page Separator|type=boolean|desc=Separate pages with horizontal ruler.|default=false
## @param SplitPages:title=Split Pages|type=boolean|desc=Split pages marker for PDF export will be inserted.|default=false
## @param Collapsible:title=Collapsible|type=boolean|desc=Should the included pages be collapsible?|default=false
## @param FilterLabel:title=Filter on Page Label|type=string|desc=Include only subpages with the specified label.
## @param Page:title=Page title|type=confluence-content|required=false|desc=If not specified, the current page is used.
## @param Order:title=Order|type=enum|enumValues=Nav Order,Reverse Nav Order,Alphabetical,Reverse Alphabetical,Create Date,Reverse Create Date|default=nav order|desc=In what order should the child pages be displayed? Nav Order refers to the order of the child pages in the page tree. Reverse Nav Order simply reverses that.

#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') )

#if( $paramPage && $paramPage != "" )
 ##########################
 ## Find the page ##
 ##########################
 #set( $parts = $paramPage.split(":") )
 #set( $i = 0 )
 #set ( $len = 0 )
 #set( $key = "" )
 #set( $name = "" )

 ##Having trouble finding out the length/size of $parts ... brute force it
 #foreach ( $part in $parts )
 #set ( $len = $len + 1 )
 #end
 
 #if ( $len == 1 )
 #set ( $key = $content.spaceKey )
 #set ( $name = $paramPage )
 #else
 #foreach ( $part in $parts )
 #if ( $i == 0 )
 #set ( $key = $part )
 #set ( $i = $i + 1 )
 #else
 #set ( $name = $part )
 #end
 #end
 #end

 #set ( $tempcontent = "" )
 #if ( $pageManager )
 #set ( $tempcontent = $pageManager.getPage($key, $name) )
 #end
 #if ( $tempcontent && $tempcontent != "" )
 #set ( $content = $tempcontent )
 #else
 The page "$paramPage" was not found in this space.
 #set ( $content = "" )
 #end
#end

#set( $data = "" )
#childPages ( $content.id )

#macro ( childPages $pageid )
 ## Find the array of (sorted) child pages.
 #if( $paramOrder == "Nav Order" || $paramOrder == "Reverse Nav Order" )
 #set( $children = $pageManager.getPage($pageid).getSortedChildren() )
 #elseif( $paramOrder == "Alphabetical" || $paramOrder == "Reverse Alphabetical" )
 #set( $array = $pageManager.getPage($pageid).getChildren() )
 ###############################################################
 ## Could not find a method to get them in Alphabetical order ##
 ## Must sort them myself ... Bubble sort ##
 ###############################################################
 #set( $size = $array.size() )
 #foreach( $junk in $array )
 #set( $count = -1 )
 #foreach( $line in $array )
 #set( $count = $count + 1 )
 #if( $velocityCount < $size )
 #if( $line.getTitle().compareToIgnoreCase($array.get($velocityCount).getTitle()) > 0 )
 #set( $tmp = $array.get($velocityCount) )
 #set( $junk = $array.set($velocityCount, $line) )
 #set( $junk = $array.set($count, $tmp) )
 #end
 #end
 #end
 #end
 #set( $children = $array )
 #elseif( $paramOrder == "Create Date" || $paramOrder == "Reverse Create Date" )
 #set( $children = $pageManager.getPage($pageid).getChildren() )
 #end
 
 ## Prepare children data. 
 #foreach( $child in $children )
 ## Create the map of labels for the page.
 #set( $labelsMap = {} )
 #foreach( $label in $child.getLabels() )
 #set( $dummy = $labelsMap.put($label.toString(), 1) )
 #end
 
 ## Include all pages (when no filter label is specified) or pages with a specific label.
 #if( !$paramFilterLabel || $paramFilterLabel && $labelsMap.containsKey($paramFilterLabel) )
 #set( $include = "" )
 #if ( $paramCollapsible == true )
 #set( $include = $include + '<ac:structured-macro ac:name="expand">' )
 #set( $include = $include + '<ac:parameter ac:name="title">' + $child.getTitle() + '</ac:parameter>' )
 #set( $include = $include + '<ac:rich-text-body>' )
 #set( $include = $include + '<p>' )
 #end
 #set( $include = $include + '<div class="included-child-page">' )
 
 ## Show title and links.
 #if( $paramShowTitle == true )
 #if( $paramLinkTitle == true )
 #set( $include = $include + '<h1 class="included-child-page-title"><a href="' + $child.getUrlPath() + '">' + $child.getTitle() + '</a></h1>' )
 #else
 #set( $include = $include + '<h1 class="included-child-page-title">' + $child.getTitle() + '</h1>' )
 #end
 #end
 
 ## Include sub page.
 #set( $include = $include + '<div class="included-child-page-body">' )
 #set( $include = $include + '<ac:structured-macro ac:name="include">' )
 #set( $include = $include + '<ac:parameter ac:name="">' )
 #set( $include = $include + '<ac:link>' )
 #set( $include = $include + '<ri:page ri:content-title="' + $child.getTitle() + '" ri:space-key="' + $content.spaceKey + '"/>' )
 #set( $include = $include + '</ac:link>' )
 #set( $include = $include + '</ac:parameter>' )
 #set( $include = $include + '</ac:structured-macro>' )
 #set( $include = $include + '</div>' )
 #set( $include = $include + '</div>' )

 #if ( $paramCollapsible == true )
 #set( $include = $include + '</p>' )
 #set( $include = $include + '</ac:rich-text-body>' )
 #set( $include = $include + '</ac:structured-macro>' )
 #end
 
 ## Define sorting order.
 #set( $inOrder = false )
 #if( $paramOrder == "Nav Order" || $paramOrder == "Alphabetical" || $paramOrder == "Create Date" )
 #set( $inOrder = true )
 #end
 
 ## Include page separator or include page split marker used for PDF exports.
 #if( $paramPageSeparator == true )
 #set( $include = $include + '<hr/><br/>' )
 #end
 #if( $paramSplitPages == true )
 #set( $include = $include + '<div style="page-break-before:always;"></div>' )
 #end

 ## Add page content in order or in reverse order.
 #if( $inOrder == true )
 #set( $data = $data + $include )
 #else
 #set( $data = $include + $data)
 #end
 #end
 
 #if($paramIncludeDescendants == true)
 #childPages( $child.id )
 #end
 #end
#end

$data
 
<style type="text/css">
 .included-child-page {
 margin-bottom: 30px;
 overflow: hidden;
 }
</style>
```


author: Carol Jones
body: You could use the include macro for this.

You mention permissions being a thing, so what I might suggest is having the shared communications page be more largely opened where the project spaces be tighten permissions. Your users need to have access to the page you are including which is why I suggest this method. While this way they wouldn't need to navigate to the shared area if you include it directly within their project space.

comments: author: Benjamin Gill
body: Thank you Carol. We created these initial pages in a more open space and are mimicking them in places where we know other teams will more likely see them since they use those teams spaces more often. I am trying to figure out if I have to manually include the page each month in each space, or if there is a way to automatically create a new page in these spaces when the original is created.


Tags: confluence-server

include

macro

server

user-macro