X-Git-Url: https://git.decadent.org.uk/gitweb/?p=maypole.git;a=blobdiff_plain;f=examples%2Ffancy_example%2Ftemplates%2Ffactory%2Fmacros;fp=examples%2Ffancy_example%2Ftemplates%2Ffactory%2Fmacros;h=fc75d09cc36bf9e380c74ce7adf6289b0dc8280d;hp=0000000000000000000000000000000000000000;hb=79aa8d27d124d06bf88b2fc0487ae97563b98936;hpb=1c8db728a3fb5adb4f0ea876ea1316457700edf8 diff --git a/examples/fancy_example/templates/factory/macros b/examples/fancy_example/templates/factory/macros new file mode 100644 index 0000000..fc75d09 --- /dev/null +++ b/examples/fancy_example/templates/factory/macros @@ -0,0 +1,185 @@ +[%# + +=head1 MACROS + +These are some default macros which are used by various templates in the +system. + +=head2 link + +This creates an 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; + ''; + label | html; + ""; +END; +%] + +[%# + +=head2 maybe_link_view + +C 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; +%] + +[%# + +=head2 display_line + +C 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 column by default, and magically +URLifies columns called C. 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); + ""; + IF col == "url" AND item.url; + ' '; item.url; ''; + 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; + + ""; + END; + ''; + 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; %] +[% IF obj.is_public(action) %] +
+
+[% END %] +[% END %] +[%# + +=head2 view_related + +This takes an object, and looks up the C; 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; + "
"; accessor | ucfirst; "
\n"; + "
    "; + FOR thing = object.$accessor; + "
  • "; maybe_link_view(thing); "
  • \n"; + END; + "
"; + END; +END; + +MACRO test_xxxx(myblock) BLOCK; + FOR col = classmetadata.columns; + NEXT IF col == "id"; + myblock; + END; +END; +%] +[%# + +=head2 view_item + +This takes an object and and displays its properties in a table. + +=cut + +#%] +[% MACRO view_item(item) BLOCK; %] + [% SET string = classmetadata.stringify_column %] +
[% item.$string | html %]
+ [% INCLUDE navbar %] + + + + + + [% FOR col = classmetadata.columns.list; + NEXT IF col == "id" OR col == string OR col == classmetadata.table _ "_id";; + NEXT UNLESS item.$col; + %] +[%# + +=for doc + +It gets the displayable form of a column's name from the hash returned +from the C method: + +#%] + + + + + [% END; %] +
[% classmetadata.colnames.$string %][% item.$string | html %]
[% classmetadata.colnames.$col || + col | ucfirst | replace('_',' '); %] + [% IF col == "url" && item.url; # Possibly too much magic. + ' '; item.url; ''; + 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 C method, or returns the object's ID +if there is no C method or other stringification method defined. + +=cut + +#%] +
+[% END %]