\documentclass{article}
\usepackage{ulem}
\pagestyle{headings}
\begin{document}
\tableofcontents

\part{ Introduction}
by Torben Dannhauer

The process of populating the new module with content/functionality is fairly straight forward and after learning how the Horde API' s work, you should be able to produce new modules in a minimum amount of time.\newline
Jan Schneider talked about this at FOSDEM 2005. You can find his slides at http://www.horde.org/papers/fosdem2005/\footnote{http://www.horde.org/papers/fosdem2005/}.

The new module's functionality could by separated in the following aspects:

\begin{itemize}
\item{Menus}
\item{Calling-procedure at entering the application}
\item{Permissions}
\item{All Content-Pages which are accessible through on oh the menus}
\item{Services offered to external modules}
\end{itemize}
Usually it is useful to analyse another hordemodule to learn how this work. I analysed Kronolith and it helped me a lot.

Obviously it is necessary to know the provided horde API zu write a horde module. Because a beginner (and this tutorial is adressed to them) has no clue about it, it is very usefull to read the package-documentation at http://dev.horde.org/api/framework/\footnote{http://dev.horde.org/api/framework/}.

\part{ Menus}
In Horde there are two standard menus: The top menu an the side menu.

ToDo\footnote{http://example.com/index.php?page=ToDo}: Add links to Wikipages describing menus in detail.

\section{ Top Menu}
The top menu is devided in to 4 sections:

\begin{itemize}
\item{left: menuitems provided by this module: see below}
\item{mid left: menuitems added manually: see below}
\item{mid right: menuitems added in the administrator's module setup}
\item{right: menuitems provided by horde as default}
\end{itemize}
\subsection{ left}
the menuitmes this module intentionally provide are located in the file <module>/lib/Module.php in the function ::getMenu()

Add Items like this:\newline
\begin{verbatim}
 
 $menu->add(Horde::applicationUrl('pagetoshow.php'), _("MenuItemName"), 'icon.png', $registry->getImageDir() );

\end{verbatim}

\subsection{ mid left }
Items are added in <module>/config/menu.php:\newline
\begin{verbatim}

$_menu[] = array(
      'url' =>        'http://www.example.com/',
      'text' =>       'Example, Inc.',
      'icon' =>       'example.png',
      'icon_path' =>  'http://www.example.com/images/',
      'target' =>     '_blank',
      'onclick' =>    ''
  );

\end{verbatim}

\section{ Side Menu}
1. In the horde config/registry.d/<module>.php you added for your module, add sidebar entries:\newline
\begin{verbatim}

$this->applications['<module>-menu'] = array(
    'status' => 'sidebar',
    'sidebar_params' => array(
        'id' => 'menu',
    ),
    'app' => '<module>',
    'menu_parent' => '<module>',
);
\end{verbatim}

2. Then copy and paste the sidebarCreate() function from, e.g. kronolith/lib/Application.php, into <module>/lib/Application.php.\newline
3. Edit it to do what you want. The id in your sidebar\_params above will match the \$params['id'] that gets passed in.

\part{ Calling procedure at entering the application}
If a module is entered via the side-menu, usualy the url to the module-folder was provided. The link ist http://<myHordeInstallation>/<mymodule\footnote{http://<myHordeInstallation>/<mymodule}> without any file suffix. So the calling procedure starts by executing the index.php on the webserver.

Procedure:

\begin{itemize}
\item{Executing index.php: initialzing, load configfiles and load the page which should be displayed at the beginning (e.g. in Skeleton: list.php).}
\item{list.php calls >module>/lib/base.php to initialize the module and then proceeds with its content.}
\item{now lists.php is displayed. By Clicking on any menuitem another contentpage as list.php (but of course also list.php again) could be displayed (->executed).}
\end{itemize}
\part{ Permissions}
The module's permissiontree which includes the logical structure of all permissions available in this module is defined in <module>/lib/api.php

Further information about permissions is available at http://wiki.horde.org/Doc/Dev/PermsPackage\footnote{http://wiki.horde.org/Doc/Dev/PermsPackage}

\part{ Backenddriver}
The easiest way to learn writing a backend-Driver for managing the data your first module works with is to extend the Skeletons SQL-Driver.

\begin{itemize}
\item{Edit config/conf.xml: Add the databset tables you want be configurable. Attention: one databaset table with name "table" MUST exist! Example :}
\end{itemize}
\begin{verbatim}

<configstring name="table2" desc="My Database">mymodule_table which is needed</configstring>
\end{verbatim}

\begin{itemize}
\item{go to your horde configuration, configurate your module to get your conf.php written with your new configs.}
\item{\ldotsto proceed}
\end{itemize}
\part{ Content-Page}
The basic procedure to create Content-Pages is:

\begin{itemize}
\item{create .inc files that display the elements on the screen}
\item{create any php files needed to fill in forms}
\end{itemize}
It is a good point to start a contentpage by copying the Skeleton's list.php

All viewable pages ar located in the module's root-folder. All businesslogic (classes etc,) are located in separate files in <module>/lib.

\section{ Layout}
Creating the Page-Layout consists of two main tasks: \newline
 1. Creating forms for data manipulation \newline
 1. and - if the page is complex enought (nearly every page is it) you can store the html-content in templates.

If a submenu on the content page ist needed (like in turba), it can be generated via <div class="control nowrap"> ..menu..</div>

\subsection{ Templates}
\textbf{WARNING: The Horde\_Template package is no longer supported. You should use ((http://wiki.horde.org/Doc/Dev/Horde\_View\footnote{http://wiki.horde.org/Doc/Dev/Horde\_View})) instead.}

To move your businesslogic-variabes to a html-layout, the Horde\_Templates-Package is usefull. You can include templates with code tags, and Horde will replace these tags with your variable content, if the tags and the variables are associated via template->setVariable(\ldots);. For further information read about this package use wiki.horde.org : /Doc/Dev/TemplatePackageH32\footnote{http://example.com/index.php?page=TemplatePackageH32}

\subsection{ Horde\_Forms}
\begin{verbatim}

// Prepare Variables
$title = 'myFormtitle';
$vars = Variables::getDefaultVariables();

// Prepare Form
$form = &new Horde_Form($vars, $title, 'accountstatement_Form');
$renderer = new Horde_Form_Renderer();

// Add form fields & Variables.
$form->addHidden('', 'example_hidden', 'int', false);
$form->addVariable(_("Title"), 'title', 'text', false);

// ---------------------- Render Form ------------
// Writes the HTML <form....> opening tag.
$form->open( $renderer,  $vars,  'accountstatement.php', 'post');    

// Titelzeile rendern
$renderer->beginActive($title);

/* writes the via addVariable(...) and addHidden(...) added inputtypes.
 Available types are: http://wiki.horde.org/Doc/Dev/FormTypes?referrer=Doc%2FDev%2FFormPackage# */
$renderer->renderFormActive($form, $vars);

// writes the "submit" input button
$renderer->submit();

// writes the HTML </form> tag
$form->close($renderer);

// stop renderer
$renderer->end();
\end{verbatim}

If you want to manipulate form variables in javascript, you must set any value to that variable, otherwise it is not initialized correctly. If you plan to use a form for hidden values only, you will see a thin line in HTML. To prevent that, you can add a variable with type 'spacer'. This type has no visible content and the thin line caused by the "only hidden values" disappears.

To read or write the form variables user \$vars->set( \$variablename, \$value);  and \$myVar = \$vars->get( \$variablename, \$defaultvalue\_if\_not\_available ); .

\section{ Scripts}
If any scripts are needed for layout like striped.js für alternating rowcolors, add these scripts via Horde::addScriptFile('<script.js', 'ownerapplication\_where\_to\_search: e.g. horde', true ). True means that the script should be included with a relativ path.

\part{ Services}
\part{ Misc}
\end{document}
