-[% MACRO maybe_link_view(object) BLOCK;
+[%#
+
+=head1 MACROS
+
+These are some default macros which are used by various templates in the
+system.
+
+=head2 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;
+ '<A HREF="' _ base _ table _ "/" _ command _ "/" _ additional _ '">';
+ label;
+ "</A>";
+END;
+%]
+
+[%#
+
+=head2 maybe_link_view
+
+C<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.moniker; # It's an object, i.e. a has-a
- "<A HREF='" _ base _ object.moniker _ "/view/" _ object.id _"'>";
- object;
- "</A>";
+ link(object.moniker, "view", object.id, object);
ELSE;
object;
END;
END;
%]
+[%#
+
+=head2 display_line
+
+C<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 C<id> column by default, and magically
+URLifies columns called C<url>. This may be considered too much magic
+for some.
+
+#%]
[% MACRO display_line(item) BLOCK;
FOR col = classmetadata.columns;
NEXT IF col == "id";
"<td>";
- IF col == "url"; # Possibly too much magic.
+ IF col == "url";
"<A HREF="; item.url; "> "; item.url; "</A>";
ELSIF col == "name";
maybe_link_view(item);
button(item, "edit");
button(item, "delete");
END %]
+[%#
+
+=head2 button
+This is a generic button, which performs an action on an object.
+
+=cut
+
+#%]
[% MACRO button(obj, action) BLOCK; %]
<TD>
<FORM METHOD="post" ACTION="[%base%]/[%obj.moniker%]/[%action%]/[%obj.id%]">
</FORM>
</TD>
[% END %]
+[%#
+
+=head2 view_related
-[% MACRO view_related(object) BLOCK;
+This takes an object, and looks up the C<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.
+
+=cut
+
+#%]
+[%
+MACRO view_related(object) BLOCK;
FOR accessor = classmetadata.related_accessors.list;
"<H3>"; accessor | ucfirst; "</H3>\n";
"<UL id=\"vlist\">";
"</UL>";
END;
END;
+
+MACRO test_xxxx(myblock) BLOCK;
+ FOR col = classmetadata.columns;
+ NEXT IF col == "id";
+ myblock;
+ END;
+END;
%]
+[%#
+
+=head1 navbar
+
+This is a navigation bar to go across the page. (Or down the side, or
+whatetver you want to do with it.) It displays all the tables which are
+accessible, with a link to the list page for each one.
+
+#%]
+[% PROCESS macros %]
<div id="navcontainer">
<ul id="navlist">
[%
FOR table = config.display_tables;
- '<LI '; 'id="active"' IF table == classmetadata.moniker;
- '>';
- '<A HREF="';
- base; table; "/list/";
- '"';
- ' id="current"' IF table == classmetadata.moniker;
- '> '; table; "</A>";
+ '<LI '; 'id="active"' IF table == classmetadata.moniker; '>';
+
+ # Hack
+ SET active = '" id="current' IF table == classmetadata.moniker;
+
+ link(table, "list", active, table);
+ SET active = "";
+ '</LI>';
END;
%]
</ul>
+[%#
+
+=head1 pager
+
+This controls the pager display at the bottom (by default) of the list
+and search views. It expects a C<pager> template argument which responds
+to the L<Data::Page> interface.
+
+#%]
[%
IF pager AND pager.first_page != pager.last_page;
%]
IF num == pager.current_page;
"["; num; "] ";
ELSE;
- '<A HREF="'; base; classmetadata.moniker; "/list/?page="; num; '">';
- "["; num; "]";
- '</A> ';
+ SET args = "?page=" _ num; # Order?
+ SET label = "[" _ num _ "]";
+ link(classmetadata.moniker, "list", args, label);
END;
END;
%]