forked from extern/egroupware
move addressbook_merge to Api\Contacts\Merge
This commit is contained in:
parent
01a02a1303
commit
aa45c25685
@ -5,7 +5,7 @@
|
|||||||
* @link http://www.egroupware.org
|
* @link http://www.egroupware.org
|
||||||
* @package addressbook
|
* @package addressbook
|
||||||
* @author Ralf Becker <RalfBecker@outdoor-training.de>
|
* @author Ralf Becker <RalfBecker@outdoor-training.de>
|
||||||
* @copyright (c) 2006-13 by Ralf Becker <RalfBecker@outdoor-training.de>
|
* @copyright (c) 2006-16 by Ralf Becker <RalfBecker@outdoor-training.de>
|
||||||
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
@ -55,7 +55,7 @@ class addressbook_hooks
|
|||||||
'Advanced search' => "javascript:egw_openWindowCentered2('".
|
'Advanced search' => "javascript:egw_openWindowCentered2('".
|
||||||
egw::link('/index.php',array('menuaction' => 'addressbook.addressbook_ui.search'),false).
|
egw::link('/index.php',array('menuaction' => 'addressbook.addressbook_ui.search'),false).
|
||||||
"','_blank',870,480,'yes')",
|
"','_blank',870,480,'yes')",
|
||||||
'Placeholders' => egw::link('/index.php','menuaction=addressbook.addressbook_merge.show_replacements')
|
'Placeholders' => egw::link('/index.php','menuaction=api.EGroupware\\Api\\Contacts\\Merge.show_replacements')
|
||||||
);
|
);
|
||||||
display_sidebox($appname,lang('Addressbook menu'),$file);
|
display_sidebox($appname,lang('Addressbook menu'),$file);
|
||||||
}
|
}
|
||||||
@ -140,7 +140,7 @@ class addressbook_hooks
|
|||||||
'xmlrpc' => True,
|
'xmlrpc' => True,
|
||||||
'admin' => false,
|
'admin' => false,
|
||||||
);
|
);
|
||||||
$fileas_options = ExecMethod('addressbook.addressbook_bo.fileas_options');
|
$fileas_options = ExecMethod('api.EGroupware\\Api\\Contacts.fileas_options');
|
||||||
$settings['link_title'] = array(
|
$settings['link_title'] = array(
|
||||||
'type' => 'select',
|
'type' => 'select',
|
||||||
'label' => 'Link title for contacts show',
|
'label' => 'Link title for contacts show',
|
||||||
@ -273,10 +273,11 @@ class addressbook_hooks
|
|||||||
}
|
}
|
||||||
catch (Exception $e)
|
catch (Exception $e)
|
||||||
{
|
{
|
||||||
|
unset($e);
|
||||||
// permission error
|
// permission error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($title = $definition->get_title())
|
if (($title = $definition->get_title()))
|
||||||
{
|
{
|
||||||
$options[$title] = $title;
|
$options[$title] = $title;
|
||||||
}
|
}
|
||||||
@ -316,10 +317,12 @@ class addressbook_hooks
|
|||||||
*/
|
*/
|
||||||
static function search_link($location)
|
static function search_link($location)
|
||||||
{
|
{
|
||||||
|
unset($location); // not used, but required by function signature
|
||||||
|
|
||||||
$links = array(
|
$links = array(
|
||||||
'query' => 'addressbook.addressbook_bo.link_query',
|
'query' => 'api.EGroupware\\Api\\Contacts.link_query',
|
||||||
'title' => 'addressbook.addressbook_bo.link_title',
|
'title' => 'api.EGroupware\\Api\\Contacts.link_title',
|
||||||
'titles' => 'addressbook.addressbook_bo.link_titles',
|
'titles' => 'api.EGroupware\\Api\\Contacts.link_titles',
|
||||||
'view' => array(
|
'view' => array(
|
||||||
'menuaction' => 'addressbook.addressbook_ui.view',
|
'menuaction' => 'addressbook.addressbook_ui.view',
|
||||||
'ajax' => 'true'
|
'ajax' => 'true'
|
||||||
@ -341,12 +344,12 @@ class addressbook_hooks
|
|||||||
'add_id' => 'link_id',
|
'add_id' => 'link_id',
|
||||||
'add_popup' => '859x550',
|
'add_popup' => '859x550',
|
||||||
'file_access_user' => true, // file_access supports 4th parameter $user
|
'file_access_user' => true, // file_access supports 4th parameter $user
|
||||||
'file_access'=> 'addressbook.addressbook_bo.file_access',
|
'file_access'=> 'api.EGroupware\\Api\\Contacts.file_access',
|
||||||
'default_types' => array('n' => array('name' => 'contact', 'options' => array('icon' => 'navbar.png','template' => 'addressbook.edit'))),
|
'default_types' => array('n' => array('name' => 'contact', 'options' => array('icon' => 'navbar.png','template' => 'addressbook.edit'))),
|
||||||
// registers an addtional type 'addressbook-email', returning only contacts with email, title has email appended
|
// registers an addtional type 'addressbook-email', returning only contacts with email, title has email appended
|
||||||
'additional' => array(
|
'additional' => array(
|
||||||
'addressbook-email' => array(
|
'addressbook-email' => array(
|
||||||
'query' => 'addressbook.addressbook_bo.link_query_email',
|
'query' => 'api.EGroupware\\Api\\Contacts.link_query_email',
|
||||||
'view' => array(
|
'view' => array(
|
||||||
'menuaction' => 'addressbook.addressbook_ui.view',
|
'menuaction' => 'addressbook.addressbook_ui.view',
|
||||||
'ajax' => 'true'
|
'ajax' => 'true'
|
||||||
@ -369,6 +372,8 @@ class addressbook_hooks
|
|||||||
*/
|
*/
|
||||||
static function getAppExportLimit($location)
|
static function getAppExportLimit($location)
|
||||||
{
|
{
|
||||||
|
unset($location); // not used, but required by function signature
|
||||||
|
|
||||||
return $GLOBALS['egw_info']['server']['contact_export_limit'];
|
return $GLOBALS['egw_info']['server']['contact_export_limit'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,9 +385,11 @@ class addressbook_hooks
|
|||||||
*/
|
*/
|
||||||
static function calendar_resources($args)
|
static function calendar_resources($args)
|
||||||
{
|
{
|
||||||
|
unset($args); // not used, but required by function signature
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'type' => 'c',// one char type-identifiy for this resources
|
'type' => 'c',// one char type-identifiy for this resources
|
||||||
'info' => 'addressbook.addressbook_bo.calendar_info',// info method, returns array with id, type & name for a given id
|
'info' => 'api.EGroupware\\Api\\Contacts.calendar_info',// info method, returns array with id, type & name for a given id
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -394,6 +401,8 @@ class addressbook_hooks
|
|||||||
*/
|
*/
|
||||||
static function group_acl($args)
|
static function group_acl($args)
|
||||||
{
|
{
|
||||||
|
unset($args); // not used, but required by function signature
|
||||||
|
|
||||||
// addressbook uses group-acl, only if contacts-backend is NOT LDAP, as the ACL can not be modified there
|
// addressbook uses group-acl, only if contacts-backend is NOT LDAP, as the ACL can not be modified there
|
||||||
return $GLOBALS['egw_info']['server']['contact_repository'] != 'ldap';
|
return $GLOBALS['egw_info']['server']['contact_repository'] != 'ldap';
|
||||||
}
|
}
|
||||||
@ -406,6 +415,8 @@ class addressbook_hooks
|
|||||||
*/
|
*/
|
||||||
static function not_enum_group_acls($data)
|
static function not_enum_group_acls($data)
|
||||||
{
|
{
|
||||||
|
unset($data); // not used, but required by function signature
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -417,6 +428,8 @@ class addressbook_hooks
|
|||||||
*/
|
*/
|
||||||
public static function acl_rights($params)
|
public static function acl_rights($params)
|
||||||
{
|
{
|
||||||
|
unset($params); // not used, but required by function signature
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
acl::READ => 'read',
|
acl::READ => 'read',
|
||||||
acl::EDIT => 'edit',
|
acl::EDIT => 'edit',
|
||||||
@ -433,6 +446,8 @@ class addressbook_hooks
|
|||||||
*/
|
*/
|
||||||
public static function categories($data)
|
public static function categories($data)
|
||||||
{
|
{
|
||||||
|
unset($data); // not used, but required by function signature
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,248 +4,18 @@
|
|||||||
*
|
*
|
||||||
* @link http://www.egroupware.org
|
* @link http://www.egroupware.org
|
||||||
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
|
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
|
||||||
* @package addressbook
|
* @package api
|
||||||
* @copyright (c) 2007-9 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
|
* @subpackage contacts
|
||||||
|
* @copyright (c) 2007-16 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
|
||||||
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use EGroupware\Api\Contacts\Merge;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Addressbook - document merge object
|
* Addressbook - document merge object
|
||||||
|
*
|
||||||
|
* @deprecated use Api\Contacts\Merge
|
||||||
*/
|
*/
|
||||||
class addressbook_merge extends bo_merge
|
class addressbook_merge extends Merge {}
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Functions that can be called via menuaction
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
var $public_functions = array(
|
|
||||||
'download_by_request' => true,
|
|
||||||
'show_replacements' => true,
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @return addressbook_merge
|
|
||||||
*/
|
|
||||||
function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
|
|
||||||
// overwrite global export-limit, if an addressbook one is set
|
|
||||||
$this->export_limit = bo_merge::getExportLimit('addressbook');
|
|
||||||
|
|
||||||
// switch of handling of html formated content, if html is not used
|
|
||||||
$this->parse_html_styles = egw_customfields::use_html('addressbook');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get addressbook replacements
|
|
||||||
*
|
|
||||||
* @param int $id id of entry
|
|
||||||
* @param string &$content=null content to create some replacements only if they are use
|
|
||||||
* @param boolean $ignore_acl =false true: no acl check
|
|
||||||
* @return array|boolean
|
|
||||||
*/
|
|
||||||
protected function get_replacements($id,&$content=null,$ignore_acl=false)
|
|
||||||
{
|
|
||||||
if (!($replacements = $this->contact_replacements($id,'',$ignore_acl)))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if($content && strpos($content, '$$#') !== 0)
|
|
||||||
{
|
|
||||||
$this->cf_link_to_expand($this->contacts->read($id, $ignore_acl), $content, $replacements,'addressbook');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Links
|
|
||||||
$replacements += $this->get_all_links('addressbook', $id, '', $content);
|
|
||||||
if (!(strpos($content,'$$calendar/') === false))
|
|
||||||
{
|
|
||||||
$replacements += $this->calendar_replacements($id,!(strpos($content,'$$calendar/-1/') === false));
|
|
||||||
}
|
|
||||||
return $replacements;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return replacements for the calendar (next events) of a contact
|
|
||||||
*
|
|
||||||
* @param int $id contact-id
|
|
||||||
* @param boolean $last_event_too =false also include information about the last event
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function calendar_replacements($id,$last_event_too=false)
|
|
||||||
{
|
|
||||||
$calendar = new calendar_boupdate();
|
|
||||||
|
|
||||||
// next events
|
|
||||||
$events = $calendar->search(array(
|
|
||||||
'start' => $calendar->now_su,
|
|
||||||
'users' => 'c'.$id,
|
|
||||||
'offset' => 0,
|
|
||||||
'num_rows' => 20,
|
|
||||||
'order' => 'cal_start',
|
|
||||||
'enum_recurring' => true
|
|
||||||
));
|
|
||||||
if (!$events)
|
|
||||||
{
|
|
||||||
$events = array();
|
|
||||||
}
|
|
||||||
if ($last_event_too==true)
|
|
||||||
{
|
|
||||||
$last = $calendar->search(array(
|
|
||||||
'end' => $calendar->now_su,
|
|
||||||
'users' => 'c'.$id,
|
|
||||||
'offset' => 0,
|
|
||||||
'num_rows' => 1,
|
|
||||||
'order' => 'cal_start DESC',
|
|
||||||
'enum_recurring' => true
|
|
||||||
));
|
|
||||||
$events['-1'] = $last ? array_shift($last) : array(); // returned events are indexed by cal_id!
|
|
||||||
}
|
|
||||||
$replacements = array();
|
|
||||||
$n = 1; // Returned events are indexed by cal_id, need to index sequentially
|
|
||||||
foreach($events as $key => $event)
|
|
||||||
{
|
|
||||||
// Use -1 for previous key
|
|
||||||
if($key < 0) $n = $key;
|
|
||||||
|
|
||||||
foreach($calendar->event2array($event) as $name => $data)
|
|
||||||
{
|
|
||||||
if (substr($name,-4) == 'date') $name = substr($name,0,-4);
|
|
||||||
$replacements['$$calendar/'.$n.'/'.$name.'$$'] = is_array($data['data']) ? implode(', ',$data['data']) : $data['data'];
|
|
||||||
}
|
|
||||||
foreach(array('start','end') as $what)
|
|
||||||
{
|
|
||||||
foreach(array(
|
|
||||||
'date' => $GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],
|
|
||||||
'day' => 'l',
|
|
||||||
'time' => $GLOBALS['egw_info']['user']['preferences']['common']['timeformat'] == 12 ? 'h:i a' : 'H:i',
|
|
||||||
) as $name => $format)
|
|
||||||
{
|
|
||||||
$value = $event[$what] ? date($format,$event[$what]) : '';
|
|
||||||
if ($format == 'l') $value = lang($value);
|
|
||||||
$replacements['$$calendar/'.$n.'/'.$what.$name.'$$'] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$duration = ($event['end'] - $event['start'])/60;
|
|
||||||
$replacements['$$calendar/'.$n.'/duration$$'] = floor($duration/60).lang('h').($duration%60 ? $duration%60 : '');
|
|
||||||
|
|
||||||
++$n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Need to set some keys if there is no previous event
|
|
||||||
if($last_event_too && count($events['-1']) == 0) {
|
|
||||||
$replacements['$$calendar/-1/start$$'] = '';
|
|
||||||
$replacements['$$calendar/-1/end$$'] = '';
|
|
||||||
$replacements['$$calendar/-1/owner$$'] = '';
|
|
||||||
$replacements['$$calendar/-1/updated$$'] = '';
|
|
||||||
}
|
|
||||||
return $replacements;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate table with replacements for the preferences
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function show_replacements()
|
|
||||||
{
|
|
||||||
$GLOBALS['egw_info']['flags']['app_header'] = lang('Addressbook').' - '.lang('Replacements for inserting contacts into documents');
|
|
||||||
$GLOBALS['egw_info']['flags']['nonavbar'] = (bool)$_GET['nonavbar'];
|
|
||||||
common::egw_header();
|
|
||||||
|
|
||||||
echo "<table width='90%' align='center'>\n";
|
|
||||||
echo '<tr><td colspan="4"><h3>'.lang('Contact fields:')."</h3></td></tr>";
|
|
||||||
|
|
||||||
$n = 0;
|
|
||||||
foreach($this->contacts->contact_fields as $name => $label)
|
|
||||||
{
|
|
||||||
if (in_array($name,array('tid','label','geo'))) continue; // dont show them, as they are not used in the UI atm.
|
|
||||||
|
|
||||||
if (in_array($name,array('email','org_name','tel_work','url')) && $n&1) // main values, which should be in the first column
|
|
||||||
{
|
|
||||||
echo "</tr>\n";
|
|
||||||
$n++;
|
|
||||||
}
|
|
||||||
if (!($n&1)) echo '<tr>';
|
|
||||||
echo '<td>{{'.$name.'}}</td><td>'.$label.'</td>';
|
|
||||||
if($name == 'cat_id')
|
|
||||||
{
|
|
||||||
if ($n&1) echo "</tr>\n";
|
|
||||||
echo '<td>{{categories}}</td><td>'.lang('Category path').'</td>';
|
|
||||||
$n++;
|
|
||||||
}
|
|
||||||
if ($n&1) echo "</tr>\n";
|
|
||||||
$n++;
|
|
||||||
}
|
|
||||||
|
|
||||||
echo '<tr><td colspan="4"><h3>'.lang('Custom fields').":</h3></td></tr>";
|
|
||||||
foreach($this->contacts->customfields as $name => $field)
|
|
||||||
{
|
|
||||||
echo '<tr><td>{{#'.$name.'}}</td><td colspan="3">'.$field['label']."</td></tr>\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
echo '<tr><td colspan="4"><h3>'.lang('General fields:')."</h3></td></tr>";
|
|
||||||
foreach(array(
|
|
||||||
'link' => lang('HTML link to the current record'),
|
|
||||||
'links' => lang('Titles of any entries linked to the current record, excluding attached files'),
|
|
||||||
'attachments' => lang('List of files linked to the current record'),
|
|
||||||
'links_attachments' => lang('Links and attached files'),
|
|
||||||
'links/[appname]' => lang('Links to specified application. Example: {{links/infolog}}'),
|
|
||||||
'date' => lang('Date'),
|
|
||||||
'user/n_fn' => lang('Name of current user, all other contact fields are valid too'),
|
|
||||||
'user/account_lid' => lang('Username'),
|
|
||||||
'pagerepeat' => lang('For serial letter use this tag. Put the content, you want to repeat between two Tags.'),
|
|
||||||
'label' => lang('Use this tag for addresslabels. Put the content, you want to repeat, between two tags.'),
|
|
||||||
'labelplacement' => lang('Tag to mark positions for address labels'),
|
|
||||||
'IF fieldname' => lang('Example {{IF n_prefix~Mr~Hello Mr.~Hello Ms.}} - search the field "n_prefix", for "Mr", if found, write Hello Mr., else write Hello Ms.'),
|
|
||||||
'NELF' => lang('Example {{NELF role}} - if field role is not empty, you will get a new line with the value of field role'),
|
|
||||||
'NENVLF' => lang('Example {{NELFNV role}} - if field role is not empty, set a LF without any value of the field'),
|
|
||||||
'LETTERPREFIX' => lang('Example {{LETTERPREFIX}} - Gives a letter prefix without double spaces, if the title is empty for example'),
|
|
||||||
'LETTERPREFIXCUSTOM' => lang('Example {{LETTERPREFIXCUSTOM n_prefix title n_family}} - Example: Mr Dr. James Miller'),
|
|
||||||
) as $name => $label)
|
|
||||||
{
|
|
||||||
echo '<tr><td>{{'.$name.'}}</td><td colspan="3">'.$label."</td></tr>\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
$GLOBALS['egw']->translation->add_app('calendar');
|
|
||||||
echo '<tr><td colspan="4"><h3>'.lang('Calendar fields:')." # = 1, 2, ..., 20, -1</h3></td></tr>";
|
|
||||||
foreach(array(
|
|
||||||
'title' => lang('Title'),
|
|
||||||
'description' => lang('Description'),
|
|
||||||
'participants' => lang('Participants'),
|
|
||||||
'location' => lang('Location'),
|
|
||||||
'start' => lang('Start').': '.lang('Date').'+'.lang('Time'),
|
|
||||||
'startday' => lang('Start').': '.lang('Weekday'),
|
|
||||||
'startdate'=> lang('Start').': '.lang('Date'),
|
|
||||||
'starttime'=> lang('Start').': '.lang('Time'),
|
|
||||||
'end' => lang('End').': '.lang('Date').'+'.lang('Time'),
|
|
||||||
'endday' => lang('End').': '.lang('Weekday'),
|
|
||||||
'enddate' => lang('End').': '.lang('Date'),
|
|
||||||
'endtime' => lang('End').': '.lang('Time'),
|
|
||||||
'duration' => lang('Duration'),
|
|
||||||
'category' => lang('Category'),
|
|
||||||
'priority' => lang('Priority'),
|
|
||||||
'updated' => lang('Updated'),
|
|
||||||
'recur_type' => lang('Repetition'),
|
|
||||||
'access' => lang('Access').': '.lang('public').', '.lang('private'),
|
|
||||||
'owner' => lang('Owner'),
|
|
||||||
) as $name => $label)
|
|
||||||
{
|
|
||||||
if (in_array($name,array('start','end')) && $n&1) // main values, which should be in the first column
|
|
||||||
{
|
|
||||||
echo "</tr>\n";
|
|
||||||
$n++;
|
|
||||||
}
|
|
||||||
if (!($n&1)) echo '<tr>';
|
|
||||||
echo '<td>{{calendar/#/'.$name.'}}</td><td>'.$label.'</td>';
|
|
||||||
if ($n&1) echo "</tr>\n";
|
|
||||||
$n++;
|
|
||||||
}
|
|
||||||
echo "</table>\n";
|
|
||||||
|
|
||||||
common::egw_footer();
|
|
||||||
}
|
|
||||||
}
|
|
@ -12,6 +12,8 @@
|
|||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use EGroupware\Api;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* General user interface object of the adressbook
|
* General user interface object of the adressbook
|
||||||
*/
|
*/
|
||||||
@ -698,7 +700,7 @@ class addressbook_ui extends addressbook_bo
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$actions['documents'] = addressbook_merge::document_action(
|
$actions['documents'] = Api\Contacts\Merge::document_action(
|
||||||
$this->prefs['document_dir'], $group, 'Insert in document', 'document_',
|
$this->prefs['document_dir'], $group, 'Insert in document', 'document_',
|
||||||
$this->prefs['default_document'], $this->config['contact_export_limit']
|
$this->prefs['default_document'], $this->config['contact_export_limit']
|
||||||
);
|
);
|
||||||
@ -1082,7 +1084,7 @@ window.egw_LAB.wait(function() {
|
|||||||
|
|
||||||
case 'document':
|
case 'document':
|
||||||
if (!$document) $document = $this->prefs['default_document'];
|
if (!$document) $document = $this->prefs['default_document'];
|
||||||
$document_merge = new addressbook_merge();
|
$document_merge = new Api\Contacts\Merge();
|
||||||
$msg = $document_merge->download($document, $checked, '', $this->prefs['document_dir']);
|
$msg = $document_merge->download($document, $checked, '', $this->prefs['document_dir']);
|
||||||
$failed = count($checked);
|
$failed = count($checked);
|
||||||
return false;
|
return false;
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use EGroupware\Api\Contacts\Merge;
|
||||||
|
|
||||||
$GLOBALS['egw_info'] = array(
|
$GLOBALS['egw_info'] = array(
|
||||||
'flags' => array(
|
'flags' => array(
|
||||||
'noheader' => True,
|
'noheader' => True,
|
||||||
@ -40,7 +42,7 @@ $GLOBALS['egw_info'] = array(
|
|||||||
$egw_dir = dirname(dirname(__FILE__));
|
$egw_dir = dirname(dirname(__FILE__));
|
||||||
include($egw_dir.'/header.inc.php');
|
include($egw_dir.'/header.inc.php');
|
||||||
|
|
||||||
$merge = new addressbook_merge();
|
$merge = new Merge();
|
||||||
|
|
||||||
if (!isset($_REQUEST['ids']) && isset($_REQUEST['search']))
|
if (!isset($_REQUEST['ids']) && isset($_REQUEST['search']))
|
||||||
{
|
{
|
||||||
|
259
api/src/Contacts/Merge.php
Normal file
259
api/src/Contacts/Merge.php
Normal file
@ -0,0 +1,259 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* EGroupware Api: Contacts document merge
|
||||||
|
*
|
||||||
|
* @link http://www.egroupware.org
|
||||||
|
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
|
||||||
|
* @package api
|
||||||
|
* @subpackage contacts
|
||||||
|
* @copyright (c) 2007-16 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
|
||||||
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace EGroupware\Api\Contacts;
|
||||||
|
|
||||||
|
use EGroupware\Api;
|
||||||
|
|
||||||
|
// explicit import not namespaced classes
|
||||||
|
use calendar_boupdate; // we detect if it is not available
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contacts document merge
|
||||||
|
*/
|
||||||
|
class Merge extends Api\Storage\Merge
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Functions that can be called via menuaction
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
var $public_functions = array(
|
||||||
|
'download_by_request' => true,
|
||||||
|
'show_replacements' => true,
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
// overwrite global export-limit, if an addressbook one is set
|
||||||
|
$this->export_limit = self::getExportLimit('addressbook');
|
||||||
|
|
||||||
|
// switch of handling of html formated content, if html is not used
|
||||||
|
$this->parse_html_styles = Api\Storage\Customfields::use_html('addressbook');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get addressbook replacements
|
||||||
|
*
|
||||||
|
* @param int $id id of entry
|
||||||
|
* @param string &$content=null content to create some replacements only if they are use
|
||||||
|
* @param boolean $ignore_acl =false true: no acl check
|
||||||
|
* @return array|boolean
|
||||||
|
*/
|
||||||
|
protected function get_replacements($id,&$content=null,$ignore_acl=false)
|
||||||
|
{
|
||||||
|
if (!($replacements = $this->contact_replacements($id,'',$ignore_acl)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if($content && strpos($content, '$$#') !== 0)
|
||||||
|
{
|
||||||
|
$this->cf_link_to_expand($this->contacts->read($id, $ignore_acl), $content, $replacements,'addressbook');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Links
|
||||||
|
$replacements += $this->get_all_links('addressbook', $id, '', $content);
|
||||||
|
if (!(strpos($content,'$$calendar/') === false))
|
||||||
|
{
|
||||||
|
$replacements += $this->calendar_replacements($id,!(strpos($content,'$$calendar/-1/') === false));
|
||||||
|
}
|
||||||
|
return $replacements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return replacements for the calendar (next events) of a contact
|
||||||
|
*
|
||||||
|
* @param int $id contact-id
|
||||||
|
* @param boolean $last_event_too =false also include information about the last event
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function calendar_replacements($id,$last_event_too=false)
|
||||||
|
{
|
||||||
|
if (!class_exists('calendar_boupdate')) return array();
|
||||||
|
|
||||||
|
$calendar = new calendar_boupdate();
|
||||||
|
|
||||||
|
// next events
|
||||||
|
$events = $calendar->search(array(
|
||||||
|
'start' => $calendar->now_su,
|
||||||
|
'users' => 'c'.$id,
|
||||||
|
'offset' => 0,
|
||||||
|
'num_rows' => 20,
|
||||||
|
'order' => 'cal_start',
|
||||||
|
'enum_recurring' => true
|
||||||
|
));
|
||||||
|
if (!$events)
|
||||||
|
{
|
||||||
|
$events = array();
|
||||||
|
}
|
||||||
|
if ($last_event_too==true)
|
||||||
|
{
|
||||||
|
$last = $calendar->search(array(
|
||||||
|
'end' => $calendar->now_su,
|
||||||
|
'users' => 'c'.$id,
|
||||||
|
'offset' => 0,
|
||||||
|
'num_rows' => 1,
|
||||||
|
'order' => 'cal_start DESC',
|
||||||
|
'enum_recurring' => true
|
||||||
|
));
|
||||||
|
$events['-1'] = $last ? array_shift($last) : array(); // returned events are indexed by cal_id!
|
||||||
|
}
|
||||||
|
$replacements = array();
|
||||||
|
$n = 1; // Returned events are indexed by cal_id, need to index sequentially
|
||||||
|
foreach($events as $key => $event)
|
||||||
|
{
|
||||||
|
// Use -1 for previous key
|
||||||
|
if($key < 0) $n = $key;
|
||||||
|
|
||||||
|
foreach($calendar->event2array($event) as $name => $data)
|
||||||
|
{
|
||||||
|
if (substr($name,-4) == 'date') $name = substr($name,0,-4);
|
||||||
|
$replacements['$$calendar/'.$n.'/'.$name.'$$'] = is_array($data['data']) ? implode(', ',$data['data']) : $data['data'];
|
||||||
|
}
|
||||||
|
foreach(array('start','end') as $what)
|
||||||
|
{
|
||||||
|
foreach(array(
|
||||||
|
'date' => $GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],
|
||||||
|
'day' => 'l',
|
||||||
|
'time' => $GLOBALS['egw_info']['user']['preferences']['common']['timeformat'] == 12 ? 'h:i a' : 'H:i',
|
||||||
|
) as $name => $format)
|
||||||
|
{
|
||||||
|
$value = $event[$what] ? date($format,$event[$what]) : '';
|
||||||
|
if ($format == 'l') $value = lang($value);
|
||||||
|
$replacements['$$calendar/'.$n.'/'.$what.$name.'$$'] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$duration = ($event['end'] - $event['start'])/60;
|
||||||
|
$replacements['$$calendar/'.$n.'/duration$$'] = floor($duration/60).lang('h').($duration%60 ? $duration%60 : '');
|
||||||
|
|
||||||
|
++$n;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Need to set some keys if there is no previous event
|
||||||
|
if($last_event_too && count($events['-1']) == 0) {
|
||||||
|
$replacements['$$calendar/-1/start$$'] = '';
|
||||||
|
$replacements['$$calendar/-1/end$$'] = '';
|
||||||
|
$replacements['$$calendar/-1/owner$$'] = '';
|
||||||
|
$replacements['$$calendar/-1/updated$$'] = '';
|
||||||
|
}
|
||||||
|
return $replacements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate table with replacements for the preferences
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function show_replacements()
|
||||||
|
{
|
||||||
|
$GLOBALS['egw_info']['flags']['app_header'] = lang('Addressbook').' - '.lang('Replacements for inserting contacts into documents');
|
||||||
|
$GLOBALS['egw_info']['flags']['nonavbar'] = (bool)$_GET['nonavbar'];
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
echo "<table width='90%' align='center'>\n";
|
||||||
|
echo '<tr><td colspan="4"><h3>'.lang('Contact fields:')."</h3></td></tr>";
|
||||||
|
|
||||||
|
$n = 0;
|
||||||
|
foreach($this->contacts->contact_fields as $name => $label)
|
||||||
|
{
|
||||||
|
if (in_array($name,array('tid','label','geo'))) continue; // dont show them, as they are not used in the UI atm.
|
||||||
|
|
||||||
|
if (in_array($name,array('email','org_name','tel_work','url')) && $n&1) // main values, which should be in the first column
|
||||||
|
{
|
||||||
|
echo "</tr>\n";
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
if (!($n&1)) echo '<tr>';
|
||||||
|
echo '<td>{{'.$name.'}}</td><td>'.$label.'</td>';
|
||||||
|
if($name == 'cat_id')
|
||||||
|
{
|
||||||
|
if ($n&1) echo "</tr>\n";
|
||||||
|
echo '<td>{{categories}}</td><td>'.lang('Category path').'</td>';
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
if ($n&1) echo "</tr>\n";
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '<tr><td colspan="4"><h3>'.lang('Custom fields').":</h3></td></tr>";
|
||||||
|
foreach($this->contacts->customfields as $name => $field)
|
||||||
|
{
|
||||||
|
echo '<tr><td>{{#'.$name.'}}</td><td colspan="3">'.$field['label']."</td></tr>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '<tr><td colspan="4"><h3>'.lang('General fields:')."</h3></td></tr>";
|
||||||
|
foreach(array(
|
||||||
|
'link' => lang('HTML link to the current record'),
|
||||||
|
'links' => lang('Titles of any entries linked to the current record, excluding attached files'),
|
||||||
|
'attachments' => lang('List of files linked to the current record'),
|
||||||
|
'links_attachments' => lang('Links and attached files'),
|
||||||
|
'links/[appname]' => lang('Links to specified application. Example: {{links/infolog}}'),
|
||||||
|
'date' => lang('Date'),
|
||||||
|
'user/n_fn' => lang('Name of current user, all other contact fields are valid too'),
|
||||||
|
'user/account_lid' => lang('Username'),
|
||||||
|
'pagerepeat' => lang('For serial letter use this tag. Put the content, you want to repeat between two Tags.'),
|
||||||
|
'label' => lang('Use this tag for addresslabels. Put the content, you want to repeat, between two tags.'),
|
||||||
|
'labelplacement' => lang('Tag to mark positions for address labels'),
|
||||||
|
'IF fieldname' => lang('Example {{IF n_prefix~Mr~Hello Mr.~Hello Ms.}} - search the field "n_prefix", for "Mr", if found, write Hello Mr., else write Hello Ms.'),
|
||||||
|
'NELF' => lang('Example {{NELF role}} - if field role is not empty, you will get a new line with the value of field role'),
|
||||||
|
'NENVLF' => lang('Example {{NELFNV role}} - if field role is not empty, set a LF without any value of the field'),
|
||||||
|
'LETTERPREFIX' => lang('Example {{LETTERPREFIX}} - Gives a letter prefix without double spaces, if the title is empty for example'),
|
||||||
|
'LETTERPREFIXCUSTOM' => lang('Example {{LETTERPREFIXCUSTOM n_prefix title n_family}} - Example: Mr Dr. James Miller'),
|
||||||
|
) as $name => $label)
|
||||||
|
{
|
||||||
|
echo '<tr><td>{{'.$name.'}}</td><td colspan="3">'.$label."</td></tr>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
Api\Translation::add_app('calendar');
|
||||||
|
echo '<tr><td colspan="4"><h3>'.lang('Calendar fields:')." # = 1, 2, ..., 20, -1</h3></td></tr>";
|
||||||
|
foreach(array(
|
||||||
|
'title' => lang('Title'),
|
||||||
|
'description' => lang('Description'),
|
||||||
|
'participants' => lang('Participants'),
|
||||||
|
'location' => lang('Location'),
|
||||||
|
'start' => lang('Start').': '.lang('Date').'+'.lang('Time'),
|
||||||
|
'startday' => lang('Start').': '.lang('Weekday'),
|
||||||
|
'startdate'=> lang('Start').': '.lang('Date'),
|
||||||
|
'starttime'=> lang('Start').': '.lang('Time'),
|
||||||
|
'end' => lang('End').': '.lang('Date').'+'.lang('Time'),
|
||||||
|
'endday' => lang('End').': '.lang('Weekday'),
|
||||||
|
'enddate' => lang('End').': '.lang('Date'),
|
||||||
|
'endtime' => lang('End').': '.lang('Time'),
|
||||||
|
'duration' => lang('Duration'),
|
||||||
|
'category' => lang('Category'),
|
||||||
|
'priority' => lang('Priority'),
|
||||||
|
'updated' => lang('Updated'),
|
||||||
|
'recur_type' => lang('Repetition'),
|
||||||
|
'access' => lang('Access').': '.lang('public').', '.lang('private'),
|
||||||
|
'owner' => lang('Owner'),
|
||||||
|
) as $name => $label)
|
||||||
|
{
|
||||||
|
if (in_array($name,array('start','end')) && $n&1) // main values, which should be in the first column
|
||||||
|
{
|
||||||
|
echo "</tr>\n";
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
if (!($n&1)) echo '<tr>';
|
||||||
|
echo '<td>{{calendar/#/'.$name.'}}</td><td>'.$label.'</td>';
|
||||||
|
if ($n&1) echo "</tr>\n";
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
echo "</table>\n";
|
||||||
|
|
||||||
|
$GLOBALS['egw']->framework->render(ob_get_clean());
|
||||||
|
}
|
||||||
|
}
|
@ -30,9 +30,6 @@ use Horde_Mime_Mdn;
|
|||||||
|
|
||||||
use tidy;
|
use tidy;
|
||||||
|
|
||||||
// old not yet converted api classes
|
|
||||||
use addressbook_merge; // should go to Contacts\Merge
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mail worker class
|
* Mail worker class
|
||||||
* -provides backend functionality for all classes in Mail
|
* -provides backend functionality for all classes in Mail
|
||||||
@ -6211,7 +6208,7 @@ class Mail
|
|||||||
*/
|
*/
|
||||||
static function merge($content,$ids,$mimetype='')
|
static function merge($content,$ids,$mimetype='')
|
||||||
{
|
{
|
||||||
$mergeobj = new addressbook_merge();
|
$mergeobj = new Contacts\Merge();
|
||||||
|
|
||||||
if (empty($mimetype)) $mimetype = (strlen(strip_tags($content)) == strlen($content) ?'text/plain':'text/html');
|
if (empty($mimetype)) $mimetype = (strlen(strip_tags($content)) == strlen($content) ?'text/plain':'text/html');
|
||||||
$rv = $mergeobj->merge_string($content,$ids,$err='',$mimetype, array(), self::$displayCharset);
|
$rv = $mergeobj->merge_string($content,$ids,$err='',$mimetype, array(), self::$displayCharset);
|
||||||
@ -6530,7 +6527,7 @@ class Mail
|
|||||||
/**
|
/**
|
||||||
* importMessageToMergeAndSend
|
* importMessageToMergeAndSend
|
||||||
*
|
*
|
||||||
* @param Storage\Merge bo_merge bo_merge object
|
* @param Storage\Merge Storage\Merge bo_merge object
|
||||||
* @param string $document the full filename
|
* @param string $document the full filename
|
||||||
* @param array $SendAndMergeTocontacts array of contact ids
|
* @param array $SendAndMergeTocontacts array of contact ids
|
||||||
* @param string& $_folder (passed by reference) will set the folder used. must be set with a folder, but will hold modifications if
|
* @param string& $_folder (passed by reference) will set the folder used. must be set with a folder, but will hold modifications if
|
||||||
@ -6549,7 +6546,7 @@ class Mail
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check if formdata meets basic restrictions (in tmp dir, or vfs, mimetype, etc.)
|
// check if formdata meets basic restrictions (in tmp dir, or vfs, mimetype, etc.)
|
||||||
/* as the file is provided by bo_merge, we do not check
|
/* as the file is provided by Storage\Merge, we do not check
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$tmpFileName = Mail::checkFileBasics($_formData,$importID);
|
$tmpFileName = Mail::checkFileBasics($_formData,$importID);
|
||||||
|
@ -19,8 +19,6 @@ use EGroupware\Api;
|
|||||||
use Horde_Imap_Client_Exception;
|
use Horde_Imap_Client_Exception;
|
||||||
use Horde_Mail_Transport_Smtphorde;
|
use Horde_Mail_Transport_Smtphorde;
|
||||||
|
|
||||||
use addressbook_merge; // should go to Contacts\Merge
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mail accounts supports 3 types of accounts:
|
* Mail accounts supports 3 types of accounts:
|
||||||
*
|
*
|
||||||
@ -638,7 +636,7 @@ class Account implements \ArrayAccess
|
|||||||
/**
|
/**
|
||||||
* Replace placeholders like {{n_fn}} in an identity
|
* Replace placeholders like {{n_fn}} in an identity
|
||||||
*
|
*
|
||||||
* For full list of placeholders see addressbook_merge.
|
* For full list of placeholders see Api\Contacts\Merge.
|
||||||
*
|
*
|
||||||
* @param array|Account $identity
|
* @param array|Account $identity
|
||||||
* @param int $account_id =null account_id of user, or current user
|
* @param int $account_id =null account_id of user, or current user
|
||||||
@ -663,7 +661,7 @@ class Account implements \ArrayAccess
|
|||||||
if ($to_replace)
|
if ($to_replace)
|
||||||
{
|
{
|
||||||
static $merge=null;
|
static $merge=null;
|
||||||
if (!isset($merge)) $merge = new addressbook_merge();
|
if (!isset($merge)) $merge = new Api\Contacts\Merge();
|
||||||
if (!isset($account_id)) $account_id = $GLOBALS['egw_info']['user']['account_id'];
|
if (!isset($account_id)) $account_id = $GLOBALS['egw_info']['user']['account_id'];
|
||||||
foreach($to_replace as $name => &$value)
|
foreach($to_replace as $name => &$value)
|
||||||
{
|
{
|
||||||
|
@ -110,8 +110,6 @@ abstract class Merge
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
|
||||||
* @return bo_merge
|
|
||||||
*/
|
*/
|
||||||
function __construct()
|
function __construct()
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user