Template reuse

Important

This document has been migrated from our old wiki as is, and has not yet been revised. The content might be outdated, links and images could be broken. We are aware and will fix any issues as soon as possible.

It’s wasteful, and generally harmful, to have the same code repeated in multiple places, even if that code is HTML. A single definition means that only that definition need ever be changed, and you can’t wind up with two definitions that are subtly different. There are two ways of avoiding this: fragment views and macros.

Fragment Views

Fragment views are the preferred method. When working with content classes, you may want to render a content class in a view for another class. The HTML you would want to include is usually the default view’s HTML, stripped of its leading and trailing HTML, like <html>, <head> and body.

So given a default view named +index , you would create a new view called +fragment, and move the body of the HTML into it. The +index TAL would then include context/@@+fragment to copy the content in.

You could then reuse +fragment in other locations where you want to display that content object.

The +fragment view can also be viewed in a browser by hand-hacking its URL. Since it’s only meant to be included in other pages, allowing a browser to view it is not really pure. Providing it this way permits AJAX to reuse it, and normal users would need to hand-hack URLs to even be aware of it.)

Macros

In cases where you’re not dealing with a particular content object, it may make more sense to use a macro. For example, if you’re writing a page that seems to have certain things repeated frequently, you can define a macro for the repeated code, then use the macro later in the page.

Single-view Macros

To refer to the macro mymacro within the page where you defined it, you can use template/macros/mymacro. template refers to the template that is currently being rendered.

Context-wide Macros

If you have macros that need to be reused across pages for a given content object, then you may wish to create a view that holds the relevant macros for that content object, like +macros .

You can then refer to it as context/@@/+macros/mymacro. It is rarely a good idea for one view to refer to the macro of a “normal” view, because that reuse will not be obvious to the casual observer.

Multi-context Macros

If you wish to reuse macros for views across various context objects, you’ll need to create a reference to the correct Zope Page Template. You can do this by making a member of the view class which is an instance of ViewPageTemplateFile.

The view class would look like:

class FooView(LaunchpadView):
    bar_macros = ViewPageTemplateFile("../templates/bar-macros.pt")

A reference to the macro mymacro would look like:

view/bar_macros/macros/mymacro