This document is intended to help Horde administrators create a more Outlook-like experience for their users by giving them the address book fields they are accustomed to. An export of an Outlook 2003 address book contains a number of fields not included in the Outlook UI. This document only covers the fields available in the Outlook UI.
turba/config/attributes.php is the file that defines which fields are available to turba, and what type of data they can hold. Make the following changes and additions to the default attributes.php
Modify the name field to look like:
$attributes['name'] = array( 'label' => '', 'type' => 'html', 'required' => true );
Modify the lastname field to look like:
$attributes['lastname'] = array( 'label' => _("Last Name"), 'type' => 'text', 'required' => false );
Modify the email field to look like:
$attributes['email'] = array( 'label' => _("Email"), 'type' => 'email', 'required' => false );
Modify the alias field to look like:
$attributes['alias'] = array( 'label' => _("Alias"), 'type' => 'text', 'required' => false );
Modify the title field to look like:
$attributes['title'] = array( 'label' => _("Title"), 'type' => 'text', 'required' => false );
Modify the company field to look like:
$attributes['company'] = array( 'label' => _("Company"), 'type' => 'text', 'required' => false );
Modify the homeAddress field to look like:
$attributes['homeAddress'] = array( 'label' => '', 'type' => 'addresslink', 'required' => false, );
Modify the workAddress field to look like:
$attributes['workAddress'] = array( 'label' => '', 'type' => 'addresslink', 'required' => false, );
Modify the cellPhone field to look like:
$attributes['cellPhone'] = array( 'label' => _("Mobile Phone"), 'type' => 'text', 'required' => false );
Modify the birthday field to look like:
$attributes['birthday'] = array( 'label' => _("Birthday"), 'type' => 'monthdayyear', 'params' => array(1900, null, true, 1), 'required' => false, );
Modify the freebusyUrl field to look like:
$attributes['freebusyUrl'] = array( 'label' => _("Freebusy URL"), 'type' => 'text', 'required' => false );
And, add the following to the end of the file:
$attributes['homeStreet2'] = array( 'label' => _("Home Street 2"), 'type' => 'text', 'required' => false, ); $attributes['homeStreet3'] = array( 'label' => _("Home Street 3"), 'type' => 'text', 'required' => false, ); $attributes['workStreet2'] = array( 'label' => _("Work Street 2"), 'type' => 'text', 'required' => false, ); $attributes['workStreet3'] = array( 'label' => _("Work Street 3"), 'type' => 'text', 'required' => false, ); $attributes['employeeType'] = array( 'label' => _("Employee Type"), 'type' => 'text', 'required' => false ); require_once 'Horde/Prefs/CategoryManager.php'; $cManager = &new Prefs_CategoryManager(); $categories = array_merge(array(_("Unfiled")), $cManager->get()); $attributes['category'] = array( 'label' => _("Category"), 'type' => 'enum', 'params' => array($categories), 'required' => false ); $attributes['jobtitle'] = array( 'label' => _("Job Title"), 'type' => 'text', 'required' => false, ); $attributes['profession'] = array( 'label' => _("Profession"), 'type' => 'text', 'required' => false, ); $attributes['manager'] = array( 'label' => _("Manager's Name"), 'type' => 'text', 'required' => false, ); $attributes['assistant'] = array( 'label' => _("Assistant's Name"), 'type' => 'text', 'required' => false, ); $attributes['suffix'] = array( 'label' => _("Suffix"), 'type' => 'text', 'required' => false, ); $attributes['spouse'] = array( 'label' => _("Spouse's Name"), 'type' => 'text', 'required' => false, ); $attributes['anniversary'] = array( 'label' => _("Anniversary"), 'type' => 'monthdayyear', 'params' => array(1900, null, true, 1), 'required' => false, ); $attributes['pager'] = array( 'label' => _("Pager"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['callbackPhone'] = array( 'label' => _("Callback Phone"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['email2'] = array( 'label' => _("Email") . ' 2', 'type' => 'email', 'required' => false, 'params' => array('', 40, 255) ); $attributes['email3'] = array( 'label' => _("Email") . ' 3', 'type' => 'email', 'required' => false, 'params' => array('', 40, 255) ); $attributes['assistantPhone'] = array( 'label' => _("Assistant's Phone"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['workPhone2'] = array( 'label' => _("Work Phone") . ' 2', 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['Phone'] = array( 'label' => _("Home Phone"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['workFax'] = array( 'label' => _("Work Fax"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['callback'] = array( 'label' => _("Callback"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['carPhone'] = array( 'label' => _("Car Phone"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['companyPhone'] = array( 'label' => _("Company Main Phone"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['homePhone2'] = array( 'label' => _("Home Phone") . ' 2', 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['homeFax'] = array( 'label' => _("Home Fax") . ' 2', 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['isdn'] = array( 'label' => _("ISDN"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['otherPhone'] = array( 'label' => _("Other Phone"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['otherFax'] = array( 'label' => _("Other Fax"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['primaryPhone'] = array( 'label' => _("Primary Phone"), 'type' => 'email', 'required' => false, 'params' => array('', 40, 255) ); $attributes['radio'] = array( 'label' => _("Radio Phone"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['telex'] = array( 'label' => _("Telex"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['tty/tdd'] = array( 'label' => _("TTY/TDD Phone"), 'type' => 'text', 'required' => false, 'params' => array('', 40, 25) ); $attributes['otherAddress'] = array( 'label' => '', 'type' => 'addresslink', 'required' => false, ); $attributes['otherStreet'] = array( 'label' => _("Other Street Address"), 'type' => 'text', 'required' => false, ); $attributes['otherStreet2'] = array( 'label' => _("Other Street 2"), 'type' => 'text', 'required' => false, ); $attributes['otherStreet3'] = array( 'label' => _("Other Street 3"), 'type' => 'text', 'required' => false, ); $attributes['otherCity'] = array( 'label' => _("Other City"), 'type' => 'text', 'required' => false ); $attributes['otherProvince'] = array( 'label' => _("Other State/Province"), 'type' => 'text', 'required' => false ); $attributes['otherPostalCode'] = array( 'label' => _("Other Postal Code"), 'type' => 'text', 'required' => false ); $attributes['otherCountry'] = array( 'label' => _("Other Country"), 'type' => 'text', 'required' => false ); $attributes['middlename'] = array( 'label' => _("Middle Name"), 'type' => 'text', 'required' => false );
turba/config/sources.php is the file that tells Turba which sources to use, and gives it all of the parameters for that source, such as what fields from attributes.php are used.
Use the following for your sql source's 'map' parameter:
'map' => array( '__key' => 'object_id', '__owner' => 'owner_id', '__type' => 'object_type', '__members' => 'object_members', '__uid' => 'object_uid', 'name' => array('fields' => array('firstname', 'lastname'), 'format' => '%s %s'), 'title' => 'object_title', 'firstname' => 'object_firstname', 'middlename' => 'object_middlename', 'lastname' => 'object_lastname', 'suffix' => 'object_suffix', 'company' => 'object_company', 'department' => 'object_department', 'jobtitle' => 'object_jobtitle', 'workStreet' => 'object_workstreet', 'workStreet2' => 'object_workstreet2', 'workStreet3' => 'object_workstreet3', 'workCity' => 'object_workcity', 'workProvince' => 'object_workprovince', 'workPostalCode' => 'object_workpostalcode', 'workCountry' => 'object_workcountry', 'workAddress' => array('fields' => array('workStreet', 'workStreet2', 'workStreet3', 'workCity', 'workProvince', 'workPostalCode'), 'format' => "%s\n%s\n%s\n%s, %s %s"), 'homeStreet' => 'object_homestreet', 'homeStreet2' => 'object_homestreet2', 'homeStreet3' => 'object_homestreet3', 'homeCity' => 'object_homecity', 'homeProvince' => 'object_homeprovince', 'homePostalCode' => 'object_homepostalcode', 'homeCountry' => 'object_homecountry', 'homeAddress' => array('fields' => array('homeStreet', 'homeStreet2', 'homeStreet3', 'homeCity', 'homeProvince', 'homePostalCode'), 'format' => "%s\n%s\n%s\n%s, %s %s"), 'otherStreet' => 'object_otherstreet', 'otherStreet2' => 'object_otherstreet2', 'otherStreet3' => 'object_otherstreet3', 'otherCity' => 'object_othercity', 'otherProvince' => 'object_otherprovince', 'otherPostalCode' => 'object_otherpostalcode', 'otherCountry' => 'object_othercountry', 'otherAddress' => array('fields' => array('otherStreet', 'otherStreet2', 'otherStreet3', 'otherCity', 'otherProvince', 'otherPostalCode'), 'format' => "%s\n%s\n%s\n%s, %s %s"), 'assistantPhone' => 'object_assistantphone', 'workFax' => 'object_workfax', 'workPhone' => 'object_workphone', 'workPhone2' => 'object_workphone2', 'callback' => 'object_callback', 'carPhone' => 'object_carphone', 'companyPhone' => 'object_companyphone', 'homeFax' => 'object_homefax', 'homePhone' => 'object_homephone', 'homePhone2' => 'object_homephone2', 'isdn' => 'object_isdn', 'cellPhone' => 'object_cellphone', 'otherFax' => 'object_otherfax', 'otherPhone' => 'object_otherphone', 'pager' => 'object_pager', 'primaryPhone' => 'object_primaryphone', 'radio' => 'object_radio', 'tty/tdd' => 'object_ttytdd', 'telex' => 'object_telex', 'anniversary' => 'object_anniversary', 'assistant' => 'object_assistant', 'birthday' => 'object_birthday', 'category' => 'object_category', 'email' => 'object_email', 'email2' => 'object_email2', 'email3' => 'object_email3', 'freebusyUrl' => 'object_freebusyurl', 'manager' => 'object_manager', 'notes' => 'object_notes', 'office' => 'object_office', 'profession' => 'object_profession', 'spouse' => 'object_spouse', 'website' => 'object_website', 'alias' => 'object_alias', 'nickname' => 'object_nickname', 'pgpPublicKey' => 'object_pgppublickey', 'smimePublicKey' => 'object_smimepublickey', ),
And, use the following for your sql source's 'tabs' parameter. This is not included in the default sources.php, so you will have to add it.
'tabs' => array( 'General' => array('name', 'firstname', 'middlename', 'lastname', 'jobtitle', 'company', 'email', 'email2', 'email3', 'alias', 'website', 'category'), 'Phone Numbers' => array('primaryPhone', 'homePhone', 'homePhone2', 'homeFax', 'workPhone', 'workPhone2', 'workFax', 'cellPhone', 'pager', 'assistantPhone', 'callback', 'carPhone', 'companyPhone', 'isdn', 'otherPhone', 'otherFax', 'radio', 'telex', 'tty/tdd'), 'Home Address' => array('homeStreet', 'homeStreet2', 'homeStreet3', 'homeCity', 'homeProvince', 'homePostalCode', 'homeCountry', 'homeAddress'), 'Work Address' => array('workStreet', 'workStreet2', 'workStreet3', 'workCity', 'workProvince', 'workPostalCode', 'workCountry', 'workAddress'), 'Other Address' => array('otherStreet', 'otherStreet2', 'otherStreet3', 'otherCity', 'otherProvince', 'otherPostalCode', 'otherCountry', 'otherAddress'), 'Details' => array('department', 'office', 'profession', 'manager', 'assistant', 'nickname', 'title', 'suffix', 'spouse', 'birthday', 'anniversary', 'freebusyUrl', 'notes'), 'Certificates' => array('pgpPublicKey', 'smimePublicKey'), ),