blob: 9e39bd39bda2e22da4dfee9793ced783cb0627b1 [file] [log] [blame]
timothy@apple.comf42518d2008-02-06 20:19:16 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2<HTML
3><HEAD
4><TITLE
5>Template Customization</TITLE
6><META
7NAME="GENERATOR"
8CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
9REL="HOME"
10TITLE="The Bugzilla Guide - 2.20.1
11 Release"
12HREF="index.html"><LINK
13REL="UP"
14TITLE="Customising Bugzilla"
15HREF="customization.html"><LINK
16REL="PREVIOUS"
17TITLE="Customising Bugzilla"
18HREF="customization.html"><LINK
19REL="NEXT"
20TITLE="Template Hooks"
21HREF="cust-hooks.html"></HEAD
22><BODY
23CLASS="section"
24BGCOLOR="#FFFFFF"
25TEXT="#000000"
26LINK="#0000FF"
27VLINK="#840084"
28ALINK="#0000FF"
29><DIV
30CLASS="NAVHEADER"
31><TABLE
32SUMMARY="Header navigation table"
33WIDTH="100%"
34BORDER="0"
35CELLPADDING="0"
36CELLSPACING="0"
37><TR
38><TH
39COLSPAN="3"
40ALIGN="center"
41>The Bugzilla Guide - 2.20.1
42 Release</TH
43></TR
44><TR
45><TD
46WIDTH="10%"
47ALIGN="left"
48VALIGN="bottom"
49><A
50HREF="customization.html"
51ACCESSKEY="P"
52>Prev</A
53></TD
54><TD
55WIDTH="80%"
56ALIGN="center"
57VALIGN="bottom"
58>Chapter 5. Customising Bugzilla</TD
59><TD
60WIDTH="10%"
61ALIGN="right"
62VALIGN="bottom"
63><A
64HREF="cust-hooks.html"
65ACCESSKEY="N"
66>Next</A
67></TD
68></TR
69></TABLE
70><HR
71ALIGN="LEFT"
72WIDTH="100%"></DIV
73><DIV
74CLASS="section"
75><H1
76CLASS="section"
77><A
78NAME="cust-templates"
79>5.1. Template Customization</A
80></H1
81><P
82>&#13; Administrators can configure the look and feel of Bugzilla without
83 having to edit Perl files or face the nightmare of massive merge
84 conflicts when they upgrade to a newer version in the future.
85 </P
86><P
87>&#13; Templatization also makes localized versions of Bugzilla possible,
88 for the first time. It's possible to have Bugzilla's UI language
89 determined by the user's browser. More information is available in
90 <A
91HREF="cust-templates.html#template-http-accept"
92>Section 5.1.6</A
93>.
94 </P
95><DIV
96CLASS="section"
97><H2
98CLASS="section"
99><A
100NAME="template-directory"
101>5.1.1. Template Directory Structure</A
102></H2
103><P
104>&#13; The template directory structure starts with top level directory
105 named <TT
106CLASS="filename"
107>template</TT
108>, which contains a directory
109 for each installed localization. The next level defines the
110 language used in the templates. Bugzilla comes with English
111 templates, so the directory name is <TT
112CLASS="filename"
113>en</TT
114>,
115 and we will discuss <TT
116CLASS="filename"
117>template/en</TT
118> throughout
119 the documentation. Below <TT
120CLASS="filename"
121>template/en</TT
122> is the
123 <TT
124CLASS="filename"
125>default</TT
126> directory, which contains all the
127 standard templates shipped with Bugzilla.
128 </P
129><DIV
130CLASS="warning"
131><P
132></P
133><TABLE
134CLASS="warning"
135WIDTH="100%"
136BORDER="0"
137><TR
138><TD
139WIDTH="25"
140ALIGN="CENTER"
141VALIGN="TOP"
142><IMG
143SRC="../images/warning.gif"
144HSPACE="5"
145ALT="Warning"></TD
146><TD
147ALIGN="LEFT"
148VALIGN="TOP"
149><P
150>&#13; A directory <TT
151CLASS="filename"
152>data/templates</TT
153> also exists;
154 this is where Template Toolkit puts the compiled versions of
155 the templates from either the default or custom directories.
156 <EM
157>Do not</EM
158> directly edit the files in this
159 directory, or all your changes will be lost the next time
160 Template Toolkit recompiles the templates.
161 </P
162></TD
163></TR
164></TABLE
165></DIV
166></DIV
167><DIV
168CLASS="section"
169><H2
170CLASS="section"
171><A
172NAME="template-method"
173>5.1.2. Choosing a Customization Method</A
174></H2
175><P
176>&#13; If you want to edit Bugzilla's templates, the first decision
177 you must make is how you want to go about doing so. There are two
178 choices, and which you use depends mainly on the scope of your
179 modifications, and the method you plan to use to upgrade Bugzilla.
180 </P
181><P
182>&#13; The first method of making customizations is to directly edit the
183 templates found in <TT
184CLASS="filename"
185>template/en/default</TT
186>.
187 This is probably the best way to go about it if you are going to
188 be upgrading Bugzilla through CVS, because if you then execute
189 a <B
190CLASS="command"
191>cvs update</B
192>, any changes you have made will
193 be merged automagically with the updated versions.
194 </P
195><DIV
196CLASS="note"
197><P
198></P
199><TABLE
200CLASS="note"
201WIDTH="100%"
202BORDER="0"
203><TR
204><TD
205WIDTH="25"
206ALIGN="CENTER"
207VALIGN="TOP"
208><IMG
209SRC="../images/note.gif"
210HSPACE="5"
211ALT="Note"></TD
212><TD
213ALIGN="LEFT"
214VALIGN="TOP"
215><P
216>&#13; If you use this method, and CVS conflicts occur during an
217 update, the conflicted templates (and possibly other parts
218 of your installation) will not work until they are resolved.
219 </P
220></TD
221></TR
222></TABLE
223></DIV
224><P
225>&#13; The second method is to copy the templates to be modified
226 into a mirrored directory structure under
227 <TT
228CLASS="filename"
229>template/en/custom</TT
230>. Templates in this
231 directory structure automatically override any identically-named
232 and identically-located templates in the
233 <TT
234CLASS="filename"
235>default</TT
236> directory.
237 </P
238><DIV
239CLASS="note"
240><P
241></P
242><TABLE
243CLASS="note"
244WIDTH="100%"
245BORDER="0"
246><TR
247><TD
248WIDTH="25"
249ALIGN="CENTER"
250VALIGN="TOP"
251><IMG
252SRC="../images/note.gif"
253HSPACE="5"
254ALT="Note"></TD
255><TD
256ALIGN="LEFT"
257VALIGN="TOP"
258><P
259>&#13; The <TT
260CLASS="filename"
261>custom</TT
262> directory does not exist
263 at first and must be created if you want to use it.
264 </P
265></TD
266></TR
267></TABLE
268></DIV
269><P
270>&#13; The second method of customization should be used if you
271 use the overwriting method of upgrade, because otherwise
272 your changes will be lost. This method may also be better if
273 you are using the CVS method of upgrading and are going to make major
274 changes, because it is guaranteed that the contents of this directory
275 will not be touched during an upgrade, and you can then decide whether
276 to continue using your own templates, or make the effort to merge your
277 changes into the new versions by hand.
278 </P
279><P
280>&#13; Using this method, your installation may break if incompatible
281 changes are made to the template interface. Such changes should
282 be documented in the release notes, provided you are using a
283 stable release of Bugzilla. If you use using unstable code, you will
284 need to deal with this one yourself, although if possible the changes
285 will be mentioned before they occur in the deprecations section of the
286 previous stable release's release notes.
287 </P
288><DIV
289CLASS="note"
290><P
291></P
292><TABLE
293CLASS="note"
294WIDTH="100%"
295BORDER="0"
296><TR
297><TD
298WIDTH="25"
299ALIGN="CENTER"
300VALIGN="TOP"
301><IMG
302SRC="../images/note.gif"
303HSPACE="5"
304ALT="Note"></TD
305><TD
306ALIGN="LEFT"
307VALIGN="TOP"
308><P
309>&#13; Regardless of which method you choose, it is recommended that
310 you run <B
311CLASS="command"
312>./checksetup.pl</B
313> after creating or
314 editing any templates in the <TT
315CLASS="filename"
316>template/en/default</TT
317>
318 directory, and after editing any templates in the
319 <TT
320CLASS="filename"
321>custom</TT
322> directory.
323 </P
324></TD
325></TR
326></TABLE
327></DIV
328><DIV
329CLASS="warning"
330><P
331></P
332><TABLE
333CLASS="warning"
334WIDTH="100%"
335BORDER="0"
336><TR
337><TD
338WIDTH="25"
339ALIGN="CENTER"
340VALIGN="TOP"
341><IMG
342SRC="../images/warning.gif"
343HSPACE="5"
344ALT="Warning"></TD
345><TD
346ALIGN="LEFT"
347VALIGN="TOP"
348><P
349>&#13; It is <EM
350>required</EM
351> that you run
352 <B
353CLASS="command"
354>./checksetup.pl</B
355> after creating a new
356 template in the <TT
357CLASS="filename"
358>custom</TT
359> directory. Failure
360 to do so will raise an incomprehensible error message.
361 </P
362></TD
363></TR
364></TABLE
365></DIV
366></DIV
367><DIV
368CLASS="section"
369><H2
370CLASS="section"
371><A
372NAME="template-edit"
373>5.1.3. How To Edit Templates</A
374></H2
375><DIV
376CLASS="note"
377><P
378></P
379><TABLE
380CLASS="note"
381WIDTH="100%"
382BORDER="0"
383><TR
384><TD
385WIDTH="25"
386ALIGN="CENTER"
387VALIGN="TOP"
388><IMG
389SRC="../images/note.gif"
390HSPACE="5"
391ALT="Note"></TD
392><TD
393ALIGN="LEFT"
394VALIGN="TOP"
395><P
396>&#13; If you are making template changes that you intend on submitting back
397 for inclusion in standard Bugzilla, you should read the relevant
398 sections of the
399 <A
400HREF="http://www.bugzilla.org/docs/developer.html"
401TARGET="_top"
402>Developers'
403 Guide</A
404>.
405 </P
406></TD
407></TR
408></TABLE
409></DIV
410><P
411>&#13; The syntax of the Template Toolkit language is beyond the scope of
412 this guide. It's reasonably easy to pick up by looking at the current
413 templates; or, you can read the manual, available on the
414 <A
415HREF="http://www.template-toolkit.org"
416TARGET="_top"
417>Template Toolkit home
418 page</A
419>.
420 </P
421><P
422>&#13; One thing you should take particular care about is the need
423 to properly HTML filter data that has been passed into the template.
424 This means that if the data can possibly contain special HTML characters
425 such as &#60;, and the data was not intended to be HTML, they need to be
426 converted to entity form, i.e. &#38;lt;. You use the 'html' filter in the
427 Template Toolkit to do this. If you forget, you may open up
428 your installation to cross-site scripting attacks.
429 </P
430><P
431>&#13; Also note that Bugzilla adds a few filters of its own, that are not
432 in standard Template Toolkit. In particular, the 'url_quote' filter
433 can convert characters that are illegal or have special meaning in URLs,
434 such as &#38;, to the encoded form, i.e. %26. This actually encodes most
435 characters (but not the common ones such as letters and numbers and so
436 on), including the HTML-special characters, so there's never a need to
437 HTML filter afterwards.
438 </P
439><P
440>&#13; Editing templates is a good way of doing a <SPAN
441CLASS="QUOTE"
442>"poor man's custom
443 fields"</SPAN
444>.
445 For example, if you don't use the Status Whiteboard, but want to have
446 a free-form text entry box for <SPAN
447CLASS="QUOTE"
448>"Build Identifier"</SPAN
449>,
450 then you can just
451 edit the templates to change the field labels. It's still be called
452 status_whiteboard internally, but your users don't need to know that.
453 </P
454></DIV
455><DIV
456CLASS="section"
457><H2
458CLASS="section"
459><A
460NAME="template-formats"
461>5.1.4. Template Formats and Types</A
462></H2
463><P
464>&#13; Some CGI's have the ability to use more than one template. For example,
465 <TT
466CLASS="filename"
467>buglist.cgi</TT
468> can output itself as RDF, or as two
469 formats of HTML (complex and simple). The mechanism that provides this
470 feature is extensible.
471 </P
472><P
473>&#13; Bugzilla can support different types of output, which again can have
474 multiple formats. In order to request a certain type, you can append
475 the &#38;ctype=&#60;contenttype&#62; (such as rdf or html) to the
476 <TT
477CLASS="filename"
478>&#60;cginame&#62;.cgi</TT
479> URL. If you would like to
480 retrieve a certain format, you can use the &#38;format=&#60;format&#62;
481 (such as simple or complex) in the URL.
482 </P
483><P
484>&#13; To see if a CGI supports multiple output formats and types, grep the
485 CGI for <SPAN
486CLASS="QUOTE"
487>"GetFormat"</SPAN
488>. If it's not present, adding
489 multiple format/type support isn't too hard - see how it's done in
490 other CGIs, e.g. config.cgi.
491 </P
492><P
493>&#13; To make a new format template for a CGI which supports this,
494 open a current template for
495 that CGI and take note of the INTERFACE comment (if present.) This
496 comment defines what variables are passed into this template. If
497 there isn't one, I'm afraid you'll have to read the template and
498 the code to find out what information you get.
499 </P
500><P
501>&#13; Write your template in whatever markup or text style is appropriate.
502 </P
503><P
504>&#13; You now need to decide what content type you want your template
505 served as. The content types are defined in the
506 <TT
507CLASS="filename"
508>Bugzilla/Constants.pm</TT
509> file in the
510 <TT
511CLASS="filename"
512>contenttypes</TT
513>
514 constant. If your content type is not there, add it. Remember
515 the three- or four-letter tag assigned to your content type.
516 This tag will be part of the template filename.
517 </P
518><DIV
519CLASS="note"
520><P
521></P
522><TABLE
523CLASS="note"
524WIDTH="100%"
525BORDER="0"
526><TR
527><TD
528WIDTH="25"
529ALIGN="CENTER"
530VALIGN="TOP"
531><IMG
532SRC="../images/note.gif"
533HSPACE="5"
534ALT="Note"></TD
535><TD
536ALIGN="LEFT"
537VALIGN="TOP"
538><P
539>&#13; After adding or changing a content type, it's suitable to edit
540 <TT
541CLASS="filename"
542>Bugzilla/Constants.pm</TT
543> in order to reflect
544 the changes. Also, the file should be kept up to date after an
545 upgrade if content types have been customized in the past.
546 </P
547></TD
548></TR
549></TABLE
550></DIV
551><P
552>&#13; Save the template as <TT
553CLASS="filename"
554>&#60;stubname&#62;-&#60;formatname&#62;.&#60;contenttypetag&#62;.tmpl</TT
555>.
556 Try out the template by calling the CGI as
557 <TT
558CLASS="filename"
559>&#60;cginame&#62;.cgi?format=&#60;formatname&#62;&#38;ctype=&#60;type&#62;</TT
560> .
561 </P
562></DIV
563><DIV
564CLASS="section"
565><H2
566CLASS="section"
567><A
568NAME="template-specific"
569>5.1.5. Particular Templates</A
570></H2
571><P
572>&#13; There are a few templates you may be particularly interested in
573 customizing for your installation.
574 </P
575><P
576>&#13; <B
577CLASS="command"
578>index.html.tmpl</B
579>:
580 This is the Bugzilla front page.
581 </P
582><P
583>&#13; <B
584CLASS="command"
585>global/header.html.tmpl</B
586>:
587 This defines the header that goes on all Bugzilla pages.
588 The header includes the banner, which is what appears to users
589 and is probably what you want to edit instead. However the
590 header also includes the HTML HEAD section, so you could for
591 example add a stylesheet or META tag by editing the header.
592 </P
593><P
594>&#13; <B
595CLASS="command"
596>global/banner.html.tmpl</B
597>:
598 This contains the <SPAN
599CLASS="QUOTE"
600>"banner"</SPAN
601>, the part of the header
602 that appears
603 at the top of all Bugzilla pages. The default banner is reasonably
604 barren, so you'll probably want to customize this to give your
605 installation a distinctive look and feel. It is recommended you
606 preserve the Bugzilla version number in some form so the version
607 you are running can be determined, and users know what docs to read.
608 </P
609><P
610>&#13; <B
611CLASS="command"
612>global/footer.html.tmpl</B
613>:
614 This defines the footer that goes on all Bugzilla pages. Editing
615 this is another way to quickly get a distinctive look and feel for
616 your Bugzilla installation.
617 </P
618><P
619>&#13; <B
620CLASS="command"
621>global/variables.none.tmpl</B
622>:
623 This defines a list of terms that may be changed in order to
624 <SPAN
625CLASS="QUOTE"
626>"brand"</SPAN
627> the Bugzilla instance In this way, terms
628 like <SPAN
629CLASS="QUOTE"
630>"bugs"</SPAN
631> can be replaced with <SPAN
632CLASS="QUOTE"
633>"issues"</SPAN
634>
635 across the whole Bugzilla installation. The name
636 <SPAN
637CLASS="QUOTE"
638>"Bugzilla"</SPAN
639> and other words can be customized as well.
640 </P
641><P
642>&#13; <B
643CLASS="command"
644>list/table.html.tmpl</B
645>:
646 This template controls the appearance of the bug lists created
647 by Bugzilla. Editing this template allows per-column control of
648 the width and title of a column, the maximum display length of
649 each entry, and the wrap behaviour of long entries.
650 For long bug lists, Bugzilla inserts a 'break' every 100 bugs by
651 default; this behaviour is also controlled by this template, and
652 that value can be modified here.
653 </P
654><P
655>&#13; <B
656CLASS="command"
657>bug/create/user-message.html.tmpl</B
658>:
659 This is a message that appears near the top of the bug reporting page.
660 By modifying this, you can tell your users how they should report
661 bugs.
662 </P
663><P
664>&#13; <B
665CLASS="command"
666>bug/process/midair.html.tmpl</B
667>:
668 This is the page used if two people submit simultaneous changes to the
669 same bug. The second person to submit their changes will get this page
670 to tell them what the first person did, and ask if they wish to
671 overwrite those changes or go back and revisit the bug. The default
672 title and header on this page read "Mid-air collision detected!" If
673 you work in the aviation industry, or other environment where this
674 might be found offensive (yes, we have true stories of this happening)
675 you'll want to change this to something more appropriate for your
676 environment.
677 </P
678><P
679>&#13; <B
680CLASS="command"
681>bug/create/create.html.tmpl</B
682> and
683 <B
684CLASS="command"
685>bug/create/comment.txt.tmpl</B
686>:
687 You may not wish to go to the effort of creating custom fields in
688 Bugzilla, yet you want to make sure that each bug report contains
689 a number of pieces of important information for which there is not
690 a special field. The bug entry system has been designed in an
691 extensible fashion to enable you to add arbitrary HTML widgets,
692 such as drop-down lists or textboxes, to the bug entry page
693 and have their values appear formatted in the initial comment.
694 A hidden field that indicates the format should be added inside
695 the form in order to make the template functional. Its value should
696 be the suffix of the template filename. For example, if the file
697 is called <TT
698CLASS="filename"
699>create-cust.html.tmpl</TT
700>, then
701 <TABLE
702BORDER="0"
703BGCOLOR="#E0E0E0"
704WIDTH="100%"
705><TR
706><TD
707><FONT
708COLOR="#000000"
709><PRE
710CLASS="programlisting"
711>&#60;input type="hidden" name="format" value="cust"&#62;</PRE
712></FONT
713></TD
714></TR
715></TABLE
716>
717 should be used inside the form.
718 </P
719><P
720>
721 An example of this is the mozilla.org
722 <A
723HREF="http://landfill.bugzilla.org/bugzilla-tip/enter_bug.cgi?product=WorldControl&#38;format=guided"
724TARGET="_top"
725>guided
726 bug submission form</A
727>. The code for this comes with the Bugzilla
728 distribution as an example for you to copy. It can be found in the
729 files
730 <TT
731CLASS="filename"
732>create-guided.html.tmpl</TT
733> and
734 <TT
735CLASS="filename"
736>comment-guided.html.tmpl</TT
737>.
738 </P
739><P
740>&#13; So to use this feature, create a custom template for
741 <TT
742CLASS="filename"
743>enter_bug.cgi</TT
744>. The default template, on which you
745 could base it, is
746 <TT
747CLASS="filename"
748>custom/bug/create/create.html.tmpl</TT
749>.
750 Call it <TT
751CLASS="filename"
752>create-&#60;formatname&#62;.html.tmpl</TT
753>, and
754 in it, add widgets for each piece of information you'd like
755 collected - such as a build number, or set of steps to reproduce.
756 </P
757><P
758>&#13; Then, create a template like
759 <TT
760CLASS="filename"
761>custom/bug/create/comment.txt.tmpl</TT
762>, and call it
763 <TT
764CLASS="filename"
765>comment-&#60;formatname&#62;.txt.tmpl</TT
766>. This
767 template should reference the form fields you have created using
768 the syntax <TT
769CLASS="filename"
770>[% form.&#60;fieldname&#62; %]</TT
771>. When a
772 bug report is
773 submitted, the initial comment attached to the bug report will be
774 formatted according to the layout of this template.
775 </P
776><P
777>&#13; For example, if your custom enter_bug template had a field
778 <TABLE
779BORDER="0"
780BGCOLOR="#E0E0E0"
781WIDTH="100%"
782><TR
783><TD
784><FONT
785COLOR="#000000"
786><PRE
787CLASS="programlisting"
788>&#60;input type="text" name="buildid" size="30"&#62;</PRE
789></FONT
790></TD
791></TR
792></TABLE
793>
794 and then your comment.txt.tmpl had
795 <TABLE
796BORDER="0"
797BGCOLOR="#E0E0E0"
798WIDTH="100%"
799><TR
800><TD
801><FONT
802COLOR="#000000"
803><PRE
804CLASS="programlisting"
805>BuildID: [% form.buildid %]</PRE
806></FONT
807></TD
808></TR
809></TABLE
810>
811 then something like
812 <TABLE
813BORDER="0"
814BGCOLOR="#E0E0E0"
815WIDTH="100%"
816><TR
817><TD
818><FONT
819COLOR="#000000"
820><PRE
821CLASS="programlisting"
822>BuildID: 20020303</PRE
823></FONT
824></TD
825></TR
826></TABLE
827>
828 would appear in the initial comment.
829 </P
830></DIV
831><DIV
832CLASS="section"
833><H2
834CLASS="section"
835><A
836NAME="template-http-accept"
837>5.1.6. Configuring Bugzilla to Detect the User's Language</A
838></H2
839><P
840>Bugzilla honours the user's Accept: HTTP header. You can install
841 templates in other languages, and Bugzilla will pick the most appropriate
842 according to a priority order defined by you. Many
843 language templates can be obtained from <A
844HREF="http://www.bugzilla.org/download.html#localizations"
845TARGET="_top"
846>http://www.bugzilla.org/download.html#localizations</A
847>. Instructions
848 for submitting new languages are also available from that location.
849 </P
850><P
851>After untarring the localizations (or creating your own) in the
852 <TT
853CLASS="filename"
854>BUGZILLA_ROOT/template</TT
855> directory,
856 you must update the <VAR
857CLASS="option"
858>languages</VAR
859> parameter to contain any
860 localizations you'd like to permit. You may also wish to set the
861 <VAR
862CLASS="option"
863>defaultlanguage</VAR
864> parameter to something other than
865 <SPAN
866CLASS="QUOTE"
867>"en"</SPAN
868> if you don't want Engish to be the default language.
869 </P
870></DIV
871></DIV
872><DIV
873CLASS="NAVFOOTER"
874><HR
875ALIGN="LEFT"
876WIDTH="100%"><TABLE
877SUMMARY="Footer navigation table"
878WIDTH="100%"
879BORDER="0"
880CELLPADDING="0"
881CELLSPACING="0"
882><TR
883><TD
884WIDTH="33%"
885ALIGN="left"
886VALIGN="top"
887><A
888HREF="customization.html"
889ACCESSKEY="P"
890>Prev</A
891></TD
892><TD
893WIDTH="34%"
894ALIGN="center"
895VALIGN="top"
896><A
897HREF="index.html"
898ACCESSKEY="H"
899>Home</A
900></TD
901><TD
902WIDTH="33%"
903ALIGN="right"
904VALIGN="top"
905><A
906HREF="cust-hooks.html"
907ACCESSKEY="N"
908>Next</A
909></TD
910></TR
911><TR
912><TD
913WIDTH="33%"
914ALIGN="left"
915VALIGN="top"
916>Customising Bugzilla</TD
917><TD
918WIDTH="34%"
919ALIGN="center"
920VALIGN="top"
921><A
922HREF="customization.html"
923ACCESSKEY="U"
924>Up</A
925></TD
926><TD
927WIDTH="33%"
928ALIGN="right"
929VALIGN="top"
930>Template Hooks</TD
931></TR
932></TABLE
933></DIV
934></BODY
935></HTML
936>