value just to be on the safe side (see this post for more info on sanitization). Now we create the actual show() function which will display our StaffMember DataObject as a page. We first test to see if there is a StaffMember to show by trying to assing the result of our getStaffMember() function to $StaffMember . If this fails then we pass the user to a 404 page, otherwise we then define an array with our $StaffMember object in it. This array is then returned using the customise(). This is really the heart of this whole process. What we are doing here is saying when you render the page again, include our custom $Data in the template. Although we are only defining a single value here, you can add as many as you like, for example setting 'Title' or 'Content' to something other than that in StaffPage, which is effectively still the page we are on. Note. We could have easily combined the getStaffMember() function into the show() function, but as you will see later it is very useful to be able to fetch the current StaffMember for use in other functions, in this instance we will be using it in our custom Breadcrumbs trail. The clever bit in all this comes with the temeplate that SilverStripe uses. Because we have called a URL action SilverStripe knows to look for a template that follows the convention PageType_action . In this case our page type is StaffPage and our action