Last Modified 2011-03-02 by Ralf Lang (B1 Systems GmbH)

Creating a Horde Module

Don't use Skeleton from CVS. Use Skeleton from horde git as outlined below.
There is currently no usable version of skeleton which is tagged FRAMEWORK_3. An older revision of the CVS HEAD version may work though.

1. Check out the skeleton module from horde git

 git clone --depth 1 git://github.com/horde/horde.git
 cd horde
 cp -R skeleton/ /your/install/path/to/horde/

2. Create the following script as prjrename.php - save it somewhere sensible, like your home directory:

#!/usr/bin/php -q
function analysedir( $path_, $list_ )
  // Read dir
  $handle = opendir($path_);
  while (false !== ($file = readdir($handle)))
    if( $file!='.' && $file!='..')
        $file = $path_ . DIRECTORY_SEPARATOR . $file;
        //echo "$filen";

        if( !is_dir( $file ) )  // If File: Append
        else   // If Folder: scan recursively
          $list_ += analysedir($file, $list_ );
 }      // While END
 return $list_;

function substitute_skeleton( $filename, $modulname )
  $prjMC=substr($prjUC, 0, 1) . substr($prjLC, 1, strlen($prjLC)-1);

  $filehandle=fopen(trim($filename), 'r');
  $file=fread($filehandle, filesize($filename));
  $newfile=str_replace(array('SKELETON', 'Skeleton', 'skeleton'), array($prjUC, $prjMC, $prjLC), $file);
  $filehandle=fopen(trim($filename), 'w');
  fwrite($filehandle, $newfile);

function help()
  echo "projectrename.php </path/to/skeleton-folder/> <modulname>n";

// ------------------- Main-Code --------------------

if (count($_SERVER['argv'])==3)
  // Preparation
  $list = array();
  $path = trim($_SERVER[argv][1]);
  $modul = trim($_SERVER[argv][2]);

  // Fetch Filelist
  $list = analysedir( $path, $list );

  // Modify each File
  foreach( $list as $file )
        //echo $modul.": ".$file."n";
        substitute_skeleton( $file, $modul );

3. On a unix system, use the following command to replace all skeleton strings with your project name (Not tested on Windows, but should work):

projectrename.php /path/to/skeleton/Checkout/ modulname


Edit your Name into all files, for example with this snippet under bash (Unix, Linux or Windows with cygwin):

find ./ -type f -exec sed -i 's/Your Name <you@example.com>/Me Myself <me@myselfandi.com>/g' {} \;

3.2 Rename

mv horde/appname/test/Skeleton horde/appname/test/Appname

mv horde/appname/locale/skeleton.pot horde/appname/locale/appname.pot

4. Perform some file modifications:

mv /path/to/modulename/lib/Skeleton.php /path/to/modulename/lib/Modulename.php
mkdir /path/to/modulename/themes/graphics

5. Upload a PNG icon at 16x16 for the module to the path created above, this one is available if you're stuck:

(The link doesn't work for me anymore, try this one:)

6. In /path/to/horde/config/registry.d/ create a file called modulename.php. Please note the lack of ?> at the end of the php block, and also the menu parent. If you want your object to go *ANYWHERE ELSE* you will need to change this!

$this->applications['modulename'] = array(
    'fileroot' => dirname(__FILE__) . '/../../modulename',
    'webroot' => $this->applications['horde']['webroot'] . '/modulename',
    'name' => _("A description of your module"),
    'status' => 'active',
    'menu_parent' => 'horde'

This snippet is for horde3. I didn't test it for horde4.

OK, so you now have your first module. Now, you need to populate it with content. This will be the subject of the next section: PopulatingYourFirstModule