forked from extern/egroupware
205 lines
6.3 KiB
PHP
205 lines
6.3 KiB
PHP
<?php
|
|
/**
|
|
* Egroupware
|
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
|
* @package home
|
|
* @subpackage portlet
|
|
* @link http://www.egroupware.org
|
|
* @author Nathan Gray
|
|
* @version $Id$
|
|
*/
|
|
|
|
use EGroupware\Api;
|
|
use EGroupware\Api\Etemplate;
|
|
|
|
/**
|
|
* Show birthdays
|
|
*
|
|
*/
|
|
class home_birthday_portlet extends home_portlet
|
|
{
|
|
/**
|
|
* Constructor sets up the portlet according to the user's saved property values
|
|
* for this particular portlet. It is possible to have multiple instances of the
|
|
* same portlet with different properties.
|
|
*
|
|
* The implementing class is allowed to modify the context, if needed, but it is
|
|
* better to use get_properties().
|
|
*
|
|
* @param context Array portlet settings such as size, as well as values for properties
|
|
* @param boolean $need_reload Flag to indicate that the portlet needs to be reloaded (exec will be called)
|
|
*/
|
|
public function __construct(Array &$context = array(), &$need_reload = false)
|
|
{
|
|
unset($need_reload); // not used, but required by function signature
|
|
if (false) parent::__construct();
|
|
|
|
$this->context = $context;
|
|
}
|
|
|
|
/**
|
|
* Some descriptive information about the portlet, so that users can decide if
|
|
* they want it or not, and for inclusion in lists, hover text, etc.
|
|
*
|
|
* These should be already translated, no further translation will be done.
|
|
*
|
|
* @return Array with keys:
|
|
* - displayName: Used in lists
|
|
* - title: Put in the portlet header
|
|
* - description: A short description of what this portlet does or displays
|
|
*/
|
|
public function get_description()
|
|
{
|
|
return array(
|
|
'displayName'=> lang('Birthday reminders'),
|
|
'title'=> lang('Birthday reminders'),
|
|
'description'=> lang('Birthday reminders')
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Generate a list of birthdays according to properties
|
|
*
|
|
* @param id String unique ID, provided to the portlet so it can make sure content is
|
|
* unique, if needed.
|
|
* @param etemplate Etemplate Etemplate to generate content
|
|
*/
|
|
public function exec($id = null, Etemplate &$etemplate = null)
|
|
{
|
|
$content = array();
|
|
|
|
$etemplate->read('home.birthdays');
|
|
|
|
if ($GLOBALS['egw_info']['server']['hide_birthdays'] != 'yes') // calendar Api\Config
|
|
{
|
|
$content = $this->get_birthdays();
|
|
}
|
|
$etemplate->set_dom_id($id);
|
|
|
|
$etemplate->exec('home.home_list_portlet.exec',$content);
|
|
}
|
|
|
|
/**
|
|
* Get a list of birthdays
|
|
*/
|
|
protected function get_birthdays()
|
|
{
|
|
$contacts = new Api\Contacts();
|
|
$month_start = date('-m-',$contacts->now_su);
|
|
$days = $this->context['days'];
|
|
$birthdays = array();
|
|
|
|
$bdays =& $contacts->search(array('bday' => $month_start),array('id','n_family','n_given','bday'),'n_given,n_family','','%');
|
|
// search accounts too, if not stored in accounts repository
|
|
$extra_accounts_search = $contacts->account_repository == 'ldap' && !is_null($contacts->so_accounts) &&
|
|
!$GLOBALS['egw_info']['user']['preferences']['addressbook']['hide_accounts'];
|
|
if ($extra_accounts_search && ($bdays2 = $contacts->search(array('bday' => $month_start),array('id','n_family','n_given','bday'),
|
|
'n_given,n_family','','%',false,'AND',false,array('owner' => 0))))
|
|
{
|
|
$bdays = !$bdays ? $bdays2 : array_merge($bdays,$bdays2);
|
|
}
|
|
if (($month_end = date('-m-',$contacts->now_su+$days*24*3600)) != $month_start)
|
|
{
|
|
if (($bdays2 =& $contacts->search(array('bday' => $month_end),array('id','n_family','n_given','bday'),'n_given,n_family','','%')))
|
|
{
|
|
$bdays = !$bdays ? $bdays2 : array_merge($bdays,$bdays2);
|
|
}
|
|
// search accounts too, if not stored in accounts repository
|
|
if ($extra_accounts_search && ($bdays2 = $contacts->search(array('bday' => $month_end),array('id','n_family','n_given','bday'),
|
|
'n_given,n_family','','%',false,'AND',false,array('owner' => 0))))
|
|
{
|
|
$bdays = !$bdays ? $bdays2 : array_merge($bdays,$bdays2);
|
|
}
|
|
}
|
|
unset($bdays2); unset($extra_accounts_search);
|
|
unset($month_start); unset($month_end);
|
|
if ($bdays)
|
|
{
|
|
$ab_lang_loaded = 0;
|
|
for($n = 0; $n <= $days; ++$n)
|
|
{
|
|
$day = date('-m-d',$contacts->now_su+$n*24*3600);
|
|
foreach($bdays as $contact)
|
|
{
|
|
if(substr($contact['bday'],-6) == $day)
|
|
{
|
|
if (!$ab_lang_loaded++) Api\Translation::add_app('addressbook');
|
|
switch($n)
|
|
{
|
|
case 0:
|
|
$text = lang("Today is %1's birthday!", $contact['n_given'].' '.$contact['n_family']);
|
|
break;
|
|
case 1:
|
|
$text = lang("Tomorrow is %1's birthday.", $contact['n_given'].' '.$contact['n_family']);
|
|
break;
|
|
default:
|
|
$date = Api\DateTime::to($contact['bday'], true);
|
|
if ($GLOBALS['egw_info']['server']['hide_birthdays'] == 'dateonly')
|
|
{
|
|
$date = preg_replace('/\d{4}/', '', $date);
|
|
}
|
|
$text = lang("In %1 days (%2) is %3's birthday.", $n, $date,
|
|
$contact['n_given'].' '.$contact['n_family']);
|
|
break;
|
|
}
|
|
|
|
// Cheat the link widget by providing whatever title we want
|
|
$birthdays[] = array(
|
|
'title' => $text,
|
|
'app' => 'addressbook',
|
|
'id' => $contact['id']
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $birthdays;
|
|
}
|
|
|
|
/**
|
|
* Return a list of settings to customize the portlet.
|
|
*
|
|
* Settings should be in the same style as for preferences. It is OK to return an empty array
|
|
* for no customizable settings.
|
|
*
|
|
* These should be already translated, no further translation will be done.
|
|
*
|
|
* @see preferences/inc/class.preferences_settings.inc.php
|
|
* @return Array of settings. Each setting should have the following keys:
|
|
* - name: Internal reference
|
|
* - type: Widget type for editing
|
|
* - label: Human name
|
|
* - help: Description of the setting, and what it does
|
|
* - default: Default value, for when it's not set yet
|
|
*/
|
|
public function get_properties()
|
|
{
|
|
$properties = parent::get_properties();
|
|
|
|
$properties[] = array(
|
|
'name' => 'days',
|
|
'type' => 'listbox',
|
|
'label' => '',
|
|
'default' => 3,
|
|
'select_options' => array(
|
|
1 => lang('Yes, for today and tomorrow'),
|
|
3 => lang('Yes, for the next three days'),
|
|
7 => lang('Yes, for the next week'),
|
|
14=> lang('Yes, for the next two weeks'),
|
|
),
|
|
);
|
|
return $properties;
|
|
}
|
|
|
|
/**
|
|
* Return a list of allowable actions for the portlet.
|
|
*
|
|
* These actions will be merged with the default portlet actions. Use the
|
|
* same id / key to override the default action.
|
|
*/
|
|
public function get_actions()
|
|
{
|
|
return array();
|
|
}
|
|
}
|