Simon Flack


These are some default macros which are used by various templates in the system.

This creates an <A HREF="..."> to a command in the Apache::MVC system by catenating the base URL, table, command, and any arguments.

#%] [% MACRO link(table, command, additional, label) BLOCK; SET lnk = base _ "/" _ table _ "/" _ command _ "/" _ additional; lnk = lnk | uri | html; '<a href="' _ lnk _ '">'; label; "</a>"; END; %]


maybe_link_view takes something returned from the database - either some ordinary data, or an object in a related class expanded by a has-a relationship. If it is an object, it constructs a link to the view command for that object. Otherwise, it just displays the data.


[% MACRO maybe_link_view(object) BLOCK; IF object.isa('Maypole::Model::Base'); link(object.table, "view",'/'), object); ELSE; object; END; END; %]



display_line is used in the list template to display a row from the database, by iterating over the columns and displaying the data for each column. It misses out the id column by default, and magically URLifies columns called url. This may be considered too much magic for some.

#%] [% MACRO display_line(item) BLOCK; FOR col = classmetadata.list_columns; NEXT IF col == "id"; "<td>"; IF col == "url" AND item.url; '<a href="'; item.url; '"> '; item.url; '</a>'; ELSIF col == item.stringify_column; maybe_link_view(item); ELSE; accessor = item.accessor_name(col); maybe_link_view(item.$accessor); END; "</td>"; END; '<td class="actions">'; button(item, "edit"); button(item, "delete"); "</td>"; END %] [%#


This is a generic button, which performs an action on an object.

This takes an object, and looks up the related_accessors; this should give a list of accessors that can be called to get a list of related objects. It then displays a title for that accessor, (i.e. "Beers" for a brewery) calls the accesor, and displays a list of the results.


This takes an object and and displays its properties in a table.

It gets the displayable form of a column's name from the hash returned from the column_names method:

#%] <tr> <td class="field">[% classmetadata.colnames.$col; %]</td> <td> [% IF col == "url" && item.url; # Possibly too much magic. '<a href="'; item.url; '"> '; item.url; '</a>'; ELSE; maybe_link_view(item.$col); END; %] [%#

This tests whether or not the returned value is an object, and if so, creates a link to a page viewing that object; if not, it just displays the text as normal. The object is linked using its stringified name; by default this calls the name method, or returns the object's ID if there is no name method or other stringification method defined.