MACROS
These are some default macros which are used by various templates in the system.
link
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 ; '<a href="' _ lnk _ '">'; label | html; "</a>"; END; %]
[%#
maybe_link_view
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.id.join('/'), object); ELSE; object | html ; END; END; %]
[%#
display_line
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" OR col == classmetadata.table _ "_id"; col_obj = item.find_column(col); "<td>"; IF col == "url" AND item.url; '<a href="'; item.url | html ; '"> '; item.url; '</a>'; ELSIF col == classmetadata.stringify_column; maybe_link_view(item); ELSIF col_obj; # its a real column accessor = item.accessor_name_for(col_obj) || item.accessor_name(col_obj); # deprecated in cdbi maybe_link_view(item.$accessor); ELSE; item.$col; END;
"</td>";
END;
'<td class="actions">';
button(item, "edit");
button(item, "delete");
"</td>";
END %]
[%#
button
This is a generic button, which performs an action on an object.
view_related
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.
view_item
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 || col | ucfirst | replace('_',' '); %]</td> <td> [% IF col == "url" && item.url; # Possibly too much magic. '<a href="'; item.url | html ; '"> '; item.url; '</a>'; ELSIF item.$col.size > 1; # has_many column FOR thing IN item.$col; maybe_link_view(thing);", "; END;
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.