This is the documentation for Group-Office 3.x. The latest version is 4.0. Click here to go to the Group-Office 4.0 documentation wiki.
Exporting to PDF or CSV
Group-Office has an easy interface to create exports to CSV or PDF. We'll look at the addressbook module for an example:
It starts with saving the SQL query in the session. We do this in modules/addressbook/classes/addressbook.class.inc.php where we search for contacts:
In the function search_contacts we build an SQL query like:
$sql = "SELECT * FROM ab_contacts";
We save this query like this:
$_SESSION['GO_SESSION']['export_queries']['search_contacts']=array( 'query'=>$sql, //the SQL query 'method'=>'format_contact_record', //a public static method that will format each record. 'class'=>'addressbook',//The class to use for the method 'require'=>__FILE__); //The file to include so the class is available
You can also set a row body column that will be displayed after each row with a column spanning the whole table: 'pdf_row_body_column'=>'preview_text'
And you may define some extra columns that are not in your grid: 'extra_columns'=>array(array('header'=>'Preview', 'column'=>'preview_text')),
The method to format a record looks like this:
public static function format_contact_record(&$record, $cf=false) {
$record['name'] = String::format_name($record['last_name'], $record['first_name'], $record['middle_name']);
$record['ctime']=Date::get_timestamp($record['ctime']);
$record['mtime']=Date::get_timestamp($record['mtime']);
if(!isset($GLOBALS['now']))
$GLOBALS['now']=time();
$record['age']='';
if($record['birthday']!='0000-00-00'){
$btime = strtotime($record['birthday']);
$age = date('Y')-date('Y', $btime);
$month = date('n');
$bmonth = date('n', $btime);
if($month<$bmonth || ($month==$bmonth && date('j')<date('j', $btime))) {
$age--;
}
$record['age']=$age;
}
$record['birthday'] = Date::format($record['birthday'], false);
if($cf)
$cf->format_record($record, 2, true);
}
Now the server knows how to export a query called "search_contacts". Now all we need to do is add a button to execute the export query in modules/addressboo/MainPanel.js:
{
iconCls: 'btn-export',
text: GO.lang.cmdExport,
cls: 'x-btn-text-icon',
handler:function(){
var activetab = this.tabPanel.getActiveTab();
var config = {};
switch(activetab.id)
{
case 'ab-contacts-grid':
config.query='search_contacts';
config.colModel = this.contactsGrid.getColumnModel();
break;
case 'ab-company-grid':
config.query='search_companies';
config.colModel = this.companiesGrid.getColumnModel();
break;
}
config.title = activetab.title;
var query = this.searchPanel.queryField.getValue();
if(!GO.util.empty(query))
{
config.subtitle= GO.lang.searchQuery+': '+query;
}else
{
config.subtile='';
}
if(!this.exportDialog)
{
this.exportDialog = new GO.ExportQueryDialog({
query:config.query
});
}
this.exportDialog.show(config);
},
scope: this
}
The show function of the export dialog takes the following config properties:
title, subtitle and colModel. Where colModel is a column model of a standard gridpanel.
Now you're done and you can export your grid data!
More control
You can create custom exports per installation as described here: Custom exports.
But you can also create a custom export class in your module if you need some more control:
this.exportDialog = new GO.ExportQueryDialog({
query:'filesearch',
loadParams:{
export_directory:'modules/filesearch/exporters/',
filesearch_params:Ext.encode(this.store.baseParams)
},
customTypes:[{
boxLabel : GO.filesearch.lang.fulltextPDF,
name : 'type',
inputValue : 'fulltext_export_query'
}]
});
Here the class modules/filesearch/exporters/fulltext_export_query.class.inc.php will be used for the export. This should be an extended class like described in Custom exports