% Copyright (C) 2007, The LedgerSMB core team. % % This program is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; version 2 of the License. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program; if not, write to the Free Software % Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA \documentclass[english]{article} \usepackage[utf8]{inputenc} \hyphenation{LedgerSMB} \newcommand{\pitag}[1]{\textless?lsmb #1 ?\textgreater} \newcommand{\tg}{\textgreater} \newcommand{\tl}{\textless} \newcommand{\version}{1.3} \newcommand{\lsmb}{LedgerSMB } \newcommand{\lsmbn}{LedgerSMB} \newcommand{\lsmbt}{LedgerSMB::Template} \title{Templating for LedgerSMB v. \version} \author{The LedgerSMB Core Team} \date{\today} \begin{document} \maketitle Copyright \copyright 2007 The LedgerSMB Core Team. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License version 2. \tableofcontents{} %\listoffigures \clearpage \part{Template Syntax} As in \lsmb 1.2, templating directives in \version{ }are expressed with the base form of \pitag{foo}. That, and basic variable substitution, is about the only part of templating that has remained unchanged. Starting with 1.3, the primary rendering engine is Template Toolkit, with START\_TAG changed to ``\textless?lsmb'' and END\_TAG changed to ``?\textgreater''. \section{Variable Substitution} For simple output, the name of the variable is placed on its own, as in \pitag{foo}. Hash elements are accessed using the form \pitag{hash.key}. Arrays are treated as a form of hash where the key is the index of the element, indexed from zero. In more complex cases, such as where the desired hash key is the value of another variable, values can be extracted by prefixing the name of the other variable with \$. This results in the form \pitag{row.\$column}. Through Template Toolkit, \lsmbt{ }has the concept of private variables. If any component of the variable name starts with an underscore, it is private and will not be output to the rendered document. Something to watch for when dealing with variable substitution for hashes is that in some cases, the key name conflicts with one of TT's VMethods for the type. When that occurs and the value is not defined, the VMethod is executed instead of retrieving the value. An example of where this could happen is when retreiving the value of form.sort. As it is often undefined and included in ``hidden'' HTML elements, it can cause application errors when a templater attempts to retrieve it using form.sort instead of form.item('sort'). \section{Functions} \subsection{Internationalisation} In addition to the regular Template Toolkit functions, \lsmb has the additional functions text and gettext. Both of these functions are interfaces to the underlying gettext infrastructure and both can handle simple gettext substitutions. The difference between these functions is that text makes use of the locale of the current user, while gettext must be passed a string that identifies one of the gettext translations. These gettext lookups can take placeholders in the same syntax that the underlying Perl does, ``[\_\emph{n}]''. The output of the i18n functions is not escaped and the input values are not unescaped. \pitag{gettext('fr\_CA', 'Item \#[\_1]', value)} \subsection{Formatting} The only formatting function that is added is \emph{escape}. The escape function escapes a value using the rules for the template format. \section{Control Structures} The base IF, ELSIF, ELSE FOREACH \section{Debugging} Two template-side tools that can help with debugging are the interface to Data::Dumper and setting a debug message format. \subsection{Variable Dumping} The Data::Dumper interface is loaded using \pitag{USE dumper()} and used with either \pitag{dumper.dump(\emph{var})} or \pitag{dumper.dump\_html(\emph{var})}. Both dumper.dump and dumper.dump\_html perform the same basic dumping, however dump\_html also escapes the values and applies basic formatting. See Template::Plugin::Dumper for details. \subsection{Line Specification} Template Toolkit has a DEBUG directive that can cause line-based logging messages to appear in the rendered output when the debug flag to \lsmbt{ }is true. A sample tag to start a debugging region with \LaTeX{ }templates is \pitag{DEBUG format '\% \$file:\$line \$text'}. The debugging messages will start with the line that has the directive and a debugging region can be optionally terminated with \pitag{DEBUG format ''}, which tells TT to use an empty message. \part{The Templating API} \section{\lsmbt} A new templating API was added in \lsmb 1.3. This API is accessed through \lsmbt, and has several support modules. Typical usage of this API is fairly simple in that most places that use it instantiate a \lsmbt{ }object in auto-output mode then use the resulting object's render method. The constructor options are detailed in the POD for \lsmbt{ }with the most interesting one for designing and testing user interface templates probably being ``debug'', which enables the display of debugging messages. The render method handles escaping the passed in template data for the selected output format and the actual rendering with the appropriate support module. \subsection{Options} \subsection{Input} \subsection{Output} \section{\lsmbt{ }Support Modules} \subsection{\lsmbt::LaTeX} This module uses Template::Latex to generate DVI, PDF, or Postscript output. It looks for template files that end in ``.tex'' and take marked-up \LaTeX. Rendering of templates by these modules happens in two phases: the TT phase and the \LaTeX phase. All templates that are directly called by \lsmbt{ }that use these modules must be enclosed by the tag pair \pitag{FILTER latex} and \pitag{END} for the second rendering phase to occur. The final output file format is determined by the format\_option filetype. \subsection{\lsmbt::HTML} This is the most frequently used \lsmbt{ }module as the migration of the user interface to templates has started. It looks for template files that end in ``.html''. \subsection{\lsmbt::CSV} A new form of output with \lsmb 1.3, this module is used by some reports to give output in a standard form. It looks for template files that end in ``.csv''. \subsection{\lsmbt::ODS, \lsmbt::XLS} This pair of module outputs spreadsheets. Their input is specially formatted XML files that are processed by TT before the final conversion from XML to their respective formats. Details about the XML format are available in the documentation for Excel::Template. The templates used by these modules have the extensions ``.odst'' and ``.xlst''. \subsection{\lsmbt::TXT} A format infrequently used by \lsmbn, this is used for Point Of Sale invoices. It looks for templates that end in ``.txt''. \subsection{\lsmbt::TTI18N} This module defines some internationalisation functions that can be called in templates that use Template Toolkit. \subsection{\lsmbn::Mailer} This module provides the functions used by \lsmbt{ }and the backup routines in the administration module to email files and documents. \part{Appendix} \appendix \section{Quick Reference} \begin{tabular}{|l|p{7cm}|} \hline \multicolumn{2}{|c|}{Variable Access}\\ \hline varname & The value of the scalar varname\\ listname.\emph{i} & Element \emph{i} of the list, lists are indexed from 0\\ hashname.key & The value of the hash with the key \emph{key}\\ hashname.\$key & The value of the hash with the key whose name is stored in \$key\\ \hline \multicolumn{2}{|c|}{Flow Control}\\ \hline IF \emph{condition}; ELSIF; ELSE & A basic if/else block \\ FOREACH \emph{var} IN \emph{list} & Iterate over the members of \emph{list}\\ END & Conclude an open block \\ \hline \multicolumn{2}{|c|}{Special Variables}\\ \hline loop & Refers to the immediately containing loop\\ \hline \multicolumn{2}{|c|}{Built-in Methods}\\ \hline any.defined & Returns true if \emph{any} is defined\\ scalar.split(delimiter) & Returns a list of elements from the split string\\ list.size & Returns the number of elements in the list\\ list.join(delimiter) & Returns the list's elements joined together\\ list.defined(\emph{i}) & Returns true if the specified element is defined\\ hash.item(name) & Returns the value of the element name from hash\\ hash.keys & Returns a list containing the hash's keys\\ hash.pairs & Returns a list of key/value pairs, sorted by key\\ hash.size & Returns the number of key/value pairs in the hash\\ loop.count & Returns the iteration number\\ loop.last & Returns true if it is the final iteration\\ loop.first & Returns true if it is the first iteration\\ \hline \multicolumn{2}{|c|}{Internationalisation}\\ \hline text(string, @args) & Returns the LSMB locale's gettext value for string\\ gettext(locale, string, @args) & Returns the locale's gettext value for string\\ \hline \multicolumn{2}{|c|}{Debugging}\\ \hline DEBUG format '\$file:\$line' & Starts and specifies the format of a debug region\\ DEBUG format '' & Ends a region of debug output\\ USE dumper() & Load the dumper plugin\\ dumper.dump\_html(var) & Dump variables\\ \hline \end{tabular} \section{Templating Changes Between Versions} \subsection{\lsmb 1.3 to \lsmb 1.2} \begin{itemize} \item A new templating API was added to replace Form::parse\_template \item The main rendering engine was changed to Template Toolkit \item Migration of the user interface to using \lsmbt{ }was started \item DVI, Excel, OpenDocument Spreadsheet, and CSV output support was added \item The \lsmbn::Mailer API was changed and documented \end{itemize} \subsection{\lsmb 1.2 to \lsmb 1.1} \begin{itemize} \item Tags were changed from the form \tl\% foo \%\tg to \pitag{foo} \item The ability to compare two variables in templates was removed \item \lsmbn::Mailer was rewritten to use MIME::Lite while retaining the old API \item SMTP support was added to \lsmbn::Mailer \end{itemize} \end{document}