* How to get plugged in

Lets explain how to create a simple GOsa plugin. The example shows a dummy plugin which is not
directly related with LDAP. Independently of beeing an LDAP style or LDAP unrelated plugin, you
may start a new plugin, by creating a new directory below the plugin directory structure. To be up to
date, get a fresh CVS checkout:

Create a ~/.cvsrc with the following content:
cvs -z4 -q
diff -u3 -p
update -dP
checkout -P

Change to the directory which will contain your GOsa checkout.
# cd ~projects
# export CVSROOT=:pserver:anonymous@cvs.alioth.debian.org:/cvsroot/gosa
# cvs login
# cvs co gosa

The gosa directory will contain your initial checkout now. In order to update from CVS
you simply can call "cvs up". There's no need to set the CVSROOT directory anymore,
as long as you cal all cvs commands inside the gosa directory and its subdirectories.

Now you've an up to date GOsa. Not that this is CVS HEAD, so there may be something
broken. Continue by choosing a name and creating the directories:

# cd plugins/addons
# mkdir dummyplug && cd dummyplug

GOsa expects a file named "main.inc" inside of this plugin directory. It is needed because some
plugins may need no standard handling and GOsa itself may not know how to initialize the plugin
classes. Here's our example:

---
<?php
        /* All page output must be placed inside the display variable. Please do not output anything
           from within your plugin directly. GOsa will take the display variable after things got processed
           and assemble the final page after that. */

        /* print_header generates the page header including the headline and the icon, get template
            path looks for eventually overloaded files. You don't have to take care of this - it's only important
            for theming artists. Copy the icon (as .png) to the html/images directory, if you don't care about
            the image, just copy the personal.png to dummy.png. */
        $display= print_header(get_template_path('images/dummy.png'), _("A nice dummy plugin"));

        /* All plugin objects get stored inside the PHP session. Here we create the object if it doesn't
            exist yet. It is recreated if "reset" is set. */
        if (!isset($_SESSION['dummy']) || (isset($_GET['reset']) && $_GET['reset'] == 1)){
                $_SESSION['dummy']= new dummy ($config);
        }
        $dummy= $_SESSION['dummy'];

        /* Execute plugin. This calls your plugin class and appends its output to the display variable. */
        $display.= $dummy->execute ();

        /* The ignore field controls if GOsa should ignore the users tries to leave the plugin without
           saving. For the dummy plugin, you can leave all the time without loosing data. */
        $display.= "<input type=\"hidden\" name=\"ignore\">\n";

        /* After executing the plugin, some data may have changed, so we need to put the plugin back
           to the session. */
        $_SESSION['export']= $export;
?>
---

The basic starter for your plugin is ready now. We're missing the plugin itself currently. To create it,
you need to create a file starting with class_ and ending with .inc. These files get sourced automatically.

Here's the class_dummy.inc:

---
<?php

/* Create a class (name must be unique inside GOsa) which extends plugin. The plugin base
    class contains all methods that are used by GOsa and it provides the mechanism to load data
    from LDAP to local variables and prepare the save to ldap routine for you. */
class dummy extends plugin
{

  /* These contain attributes to be loaded. We're not doing an LDAP plugin currently, so we don't
     care... */
  var $attributes= array();
  var $objectclasses= array();

  /* The constructor just saves a copy of the config. You may add what ever you need. */
  function dummy ($config, $dn= NULL)
  {
        /* Include config object */
        $this->config= $config;
  }

  /* Execute is the function all plugins need. It fills the plugin with life and produces the output. */
  function execute()
  {
        /* Use the smarty templating engine here... */
        $smarty= get_smarty();

        /* Normally you would react to user input here. */

        /* Let smarty fetch and process the page. Always seperate PHP and HTML as much as
           you can. */
        return ($smarty->fetch (get_template_path('contents.tpl', TRUE)));
  }

}
?>
---

There are two things missing now. The template file and an entry in your gosa.conf. Lets finish the
work in the plugin directory, first.

Here is the contents.tpl file:

---
<p>
  {t}This is a dummy plugin. It really does nothing. The tags around this text do automatic translations to the desired language. Please don't include linefeeds here, or it will not work at all!{/t}
</p>

<p class="plugbottom">
  &nbsp;
</p>
---

Now add the following entry to your Addons section in gosa.conf:
--
                        <plugin acl="dummy" class="dummy" icon="dummy.png"
                                path="plugins/addons/dummy" />
--

After logging into GOsa, you'll see your plugin in the addons section.

