mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-22 23:00:56 +01:00
moved favorites code to new class egw_favorites
This commit is contained in:
parent
509c5f5a24
commit
5e0ac9b76f
195
phpgwapi/inc/class.egw_favorites.inc.php
Normal file
195
phpgwapi/inc/class.egw_favorites.inc.php
Normal file
@ -0,0 +1,195 @@
|
||||
<?php
|
||||
/**
|
||||
* EGroupware API - favorites
|
||||
*
|
||||
* @link http://www.egroupware.org
|
||||
* @author Nathan Gray <ng@stylite.de>
|
||||
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
||||
* @package api
|
||||
* @subpackage framework
|
||||
* @access public
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* EGroupware favorites service-side:
|
||||
*
|
||||
* Favorites are generated on serverside by following code in apps sidebox hook:
|
||||
*
|
||||
* display_sidebox($appname, lang('Favorites'), egw_favorites::favorite_list($appname));
|
||||
*
|
||||
* Clientside code resides in:
|
||||
* - phpgwapi/js/jsapi/app_base.js
|
||||
* - etemplate/js/et2_widget_favorites.js
|
||||
*
|
||||
* Favorites are stored with prefix "favorite_" in app preferences.
|
||||
*/
|
||||
class egw_favorites
|
||||
{
|
||||
/**
|
||||
* Include favorites when generating the page server-side
|
||||
*
|
||||
* Use this function in your sidebox (or anywhere else, I suppose) to
|
||||
* get the favorite list when a nextmatch is _not_ on the page. If
|
||||
* a nextmatch is on the page, it will update / replace this list.
|
||||
*
|
||||
* @param string $app application, needed to find preferences
|
||||
* @param string $default=null preference name for default favorite, default "nextmatch-$app.index.rows-favorite"
|
||||
*
|
||||
* @return array with a single sidebox menu item (array) containing html for favorites
|
||||
*/
|
||||
public static function list_favorites($app, $default=null)
|
||||
{
|
||||
if(!$app) return '';
|
||||
|
||||
if (!$default) $default = "nextmatch-$app.index.rows-favorite";
|
||||
|
||||
// This target is used client-side to find & enable adding new favorites
|
||||
$target = 'favorite_sidebox_'.$app;
|
||||
$pref_prefix = 'favorite_';
|
||||
$filters = array(
|
||||
'blank' => array(
|
||||
'name' => lang('No filters'),
|
||||
// Old
|
||||
'filter' => array(),
|
||||
// New
|
||||
'state' => array(),
|
||||
'group' => true
|
||||
)
|
||||
);
|
||||
$is_admin = $GLOBALS['egw_info']['user']['apps']['admin'];
|
||||
$html = "<span id='$target' class='ui-helper-clearfix sidebox-favorites'><ul class='ui-menu ui-widget-content ui-corner-all favorites' role='listbox'>\n";
|
||||
foreach($GLOBALS['egw_info']['user']['preferences'][$app] as $pref_name => $pref)
|
||||
{
|
||||
if(strpos($pref_name, $pref_prefix) === 0)
|
||||
{
|
||||
if(!is_array($pref)) // old favorite
|
||||
{
|
||||
if (!($pref = unserialize($pref))) continue;
|
||||
$pref = array(
|
||||
'name' => substr($pref_name,strlen($pref_prefix)),
|
||||
'group' => !isset($GLOBALS['egw']->preferences->user[$app][$pref_name]),
|
||||
'state' => $pref,
|
||||
);
|
||||
//error_log(__METHOD__."() old favorite '$pref_name' converted to ".array2string($pref));
|
||||
}
|
||||
//else error_log(__METHOD__."() new favorite '$pref_name' ".array2string($pref));
|
||||
$filters[(string)substr($pref_name,strlen($pref_prefix))] = $pref;
|
||||
}
|
||||
}
|
||||
$default_filter = $GLOBALS['egw_info']['user']['preferences'][$app][$default];
|
||||
if(!isset($default_filter) || !isset($filters[$default_filter])) $default_filter = "blank";
|
||||
|
||||
// Get link for if there is no nextmatch - this is the fallback
|
||||
$registry = egw_link::get_registry($app,'list');
|
||||
if(!$registry) $registry = egw_link::get_registry($app,'index');
|
||||
foreach($filters as $name => $filter)
|
||||
{
|
||||
$href = "javascript:app.$app.setState(" . json_encode($filter,JSON_FORCE_OBJECT) . ');';
|
||||
$li = "<li data-id='$name' data-group='{$filter['group']}' class='ui-menu-item' role='menuitem'>\n";
|
||||
$li .= '<a href="'.htmlspecialchars($href).'" class="ui-corner-all" tabindex="-1">';
|
||||
$li .= "<div class='" . ((string)$name === (string)$default_filter ? 'ui-icon ui-icon-heart' : 'sideboxstar') . "'></div>".
|
||||
$filter['name'];
|
||||
$li .= ($filter['group'] != false && !$is_admin || $name === 'blank' ? "" :
|
||||
"<div class='ui-icon ui-icon-trash' title='" . lang('Delete') . "'></div>");
|
||||
$li .= "</a></li>\n";
|
||||
//error_log(__METHOD__."() $name, filter=".array2string($filter)." --> ".$li);
|
||||
$html .= $li;
|
||||
}
|
||||
|
||||
// If were're here, the app supports favorites, so add a 'Add' link too
|
||||
$html .= "<li class='ui-menu-item' role='menuitem'><a href='javascript:app.$app.add_favorite()' class='ui-corner-all'>";
|
||||
$html .= html::image($app, 'new') . lang('Add current'). '</a></li>';
|
||||
|
||||
$html .= '</ul></span>';
|
||||
|
||||
return array(
|
||||
array(
|
||||
'no_lang' => true,
|
||||
'text' => $html,
|
||||
'link' => false,
|
||||
'icon' => false,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create or delete a favorite for multiple users
|
||||
*
|
||||
* Current user needs to be an admin or it will just do nothing quietly
|
||||
*
|
||||
* @param string $app Current application, needed to save preference
|
||||
* @param string $name Name of the favorite
|
||||
* @param string $action "add" or "delete"
|
||||
* @param boolean|int|String $group ID of the group to create the favorite for, or 'all' for all users
|
||||
* @param array $filters=array() key => value pairs for the filter
|
||||
* @return boolean Success
|
||||
*/
|
||||
public static function set_favorite($app, $name, $action, $group, $filters = array())
|
||||
{
|
||||
// Only use alphanumeric for preference name, so it can be used directly as DOM ID
|
||||
$name = strip_tags($name);
|
||||
$pref_name = "favorite_".preg_replace('/[^A-Za-z0-9-_]/','_',$name);
|
||||
|
||||
// older group-favorites have just true as their group and are not deletable, if we dont find correct group
|
||||
if ($group === true || $group === '1')
|
||||
{
|
||||
if (isset($GLOBALS['egw']->preferences->default[$app][$pref_name]))
|
||||
{
|
||||
$group = 'all';
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach($GLOBALS['egw']->accounts->memberships($GLOBALS['egw_info']['user']['account_id'], true) as $gid)
|
||||
{
|
||||
$prefs = new preferences($gid);
|
||||
$prefs->read_repository();
|
||||
if (isset($prefs->user[$app][$pref_name]))
|
||||
{
|
||||
$group = $gid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if($group && $GLOBALS['egw_info']['apps']['admin'] && $group !== 'all')
|
||||
{
|
||||
$prefs = new preferences(is_numeric($group) ? $group : $GLOBALS['egw_info']['user']['account_id']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$prefs = $GLOBALS['egw']->preferences;
|
||||
}
|
||||
$prefs->read_repository();
|
||||
$type = $group === "all" ? "default" : "user";
|
||||
//error_log(__METHOD__."('$app', '$name', '$action', ".array2string($group).", ...) pref_name=$pref_name, type=$type");
|
||||
if($action == "add")
|
||||
{
|
||||
$filters = array(
|
||||
// This is the name as user entered it, minus tags
|
||||
'name' => $name,
|
||||
'group' => $group ? $group : false,
|
||||
'state' => $filters
|
||||
);
|
||||
$result = $prefs->add($app,$pref_name,$filters,$type);
|
||||
$pref = $prefs->save_repository(false,$type);
|
||||
|
||||
// Update preferences client side, or it could disappear
|
||||
egw_json_response::get()->call('egw.set_preferences', (array)$pref[$app], $app);
|
||||
|
||||
egw_json_response::get()->data(isset($result[$app][$pref_name]));
|
||||
return isset($result[$app][$pref_name]);
|
||||
}
|
||||
else if ($action == "delete")
|
||||
{
|
||||
$result = $prefs->delete($app,$pref_name, $type);
|
||||
$pref = $prefs->save_repository(false,$type);
|
||||
|
||||
// Update preferences client side, or it could come back
|
||||
egw_json_response::get()->call('egw.set_preferences', (array)$pref[$app], $app);
|
||||
|
||||
egw_json_response::get()->data(!isset($result[$app][$pref_name]));
|
||||
return !isset($result[$app][$pref_name]);
|
||||
}
|
||||
}
|
||||
}
|
@ -1896,172 +1896,34 @@ if ($app == 'home') continue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Include favorites when generating the page server-side
|
||||
*
|
||||
* Use this function in your sidebox (or anywhere else, I suppose) to
|
||||
* get the favorite list when a nextmatch is _not_ on the page. If
|
||||
* a nextmatch is on the page, it will update / replace this list.
|
||||
*
|
||||
* @param string $app application, needed to find preferences
|
||||
* @param string $default=null preference name for default favorite, default "nextmatch-$app.index.rows-favorite"
|
||||
*
|
||||
* @deprecated use egw_favorites::favorite_list
|
||||
* @return array with a single sidebox menu item (array) containing html for favorites
|
||||
*/
|
||||
public static function favorite_list($app, $default=null)
|
||||
{
|
||||
if(!$app) return '';
|
||||
|
||||
if (!$default) $default = "nextmatch-$app.index.rows-favorite";
|
||||
|
||||
// This target is used client-side to find & enable adding new favorites
|
||||
$target = 'favorite_sidebox_'.$app;
|
||||
$pref_prefix = 'favorite_';
|
||||
$filters = array(
|
||||
'blank' => array(
|
||||
'name' => lang('No filters'),
|
||||
// Old
|
||||
'filter' => array(),
|
||||
// New
|
||||
'state' => array(),
|
||||
'group' => true
|
||||
)
|
||||
);
|
||||
$is_admin = $GLOBALS['egw_info']['user']['apps']['admin'];
|
||||
$html = "<span id='$target' class='ui-helper-clearfix sidebox-favorites'><ul class='ui-menu ui-widget-content ui-corner-all favorites' role='listbox'>\n";
|
||||
foreach($GLOBALS['egw_info']['user']['preferences'][$app] as $pref_name => $pref)
|
||||
{
|
||||
if(strpos($pref_name, $pref_prefix) === 0)
|
||||
{
|
||||
if(!is_array($pref)) // old favorite
|
||||
{
|
||||
if (!($pref = unserialize($pref))) continue;
|
||||
$pref = array(
|
||||
'name' => substr($pref_name,strlen($pref_prefix)),
|
||||
'group' => !isset($GLOBALS['egw']->preferences->user[$app][$pref_name]),
|
||||
'state' => $pref,
|
||||
);
|
||||
//error_log(__METHOD__."() old favorite '$pref_name' converted to ".array2string($pref));
|
||||
}
|
||||
//else error_log(__METHOD__."() new favorite '$pref_name' ".array2string($pref));
|
||||
$filters[(string)substr($pref_name,strlen($pref_prefix))] = $pref;
|
||||
}
|
||||
}
|
||||
$default_filter = $GLOBALS['egw_info']['user']['preferences'][$app][$default];
|
||||
if(!isset($default_filter) || !isset($filters[$default_filter])) $default_filter = "blank";
|
||||
|
||||
// Get link for if there is no nextmatch - this is the fallback
|
||||
$registry = egw_link::get_registry($app,'list');
|
||||
if(!$registry) $registry = egw_link::get_registry($app,'index');
|
||||
foreach($filters as $name => $filter)
|
||||
{
|
||||
$href = "javascript:app.$app.setState(" . json_encode($filter,JSON_FORCE_OBJECT) . ');';
|
||||
$li = "<li data-id='$name' data-group='{$filter['group']}' class='ui-menu-item' role='menuitem'>\n";
|
||||
$li .= '<a href="'.htmlspecialchars($href).'" class="ui-corner-all" tabindex="-1">';
|
||||
$li .= "<div class='" . ((string)$name === (string)$default_filter ? 'ui-icon ui-icon-heart' : 'sideboxstar') . "'></div>".
|
||||
$filter['name'];
|
||||
$li .= ($filter['group'] != false && !$is_admin || $name === 'blank' ? "" :
|
||||
"<div class='ui-icon ui-icon-trash' title='" . lang('Delete') . "'></div>");
|
||||
$li .= "</a></li>\n";
|
||||
//error_log(__METHOD__."() $name, filter=".array2string($filter)." --> ".$li);
|
||||
$html .= $li;
|
||||
}
|
||||
|
||||
// If were're here, the app supports favorites, so add a 'Add' link too
|
||||
$html .= "<li class='ui-menu-item' role='menuitem'><a href='javascript:app.$app.add_favorite()' class='ui-corner-all'>";
|
||||
$html .= html::image($app, 'new') . lang('Add current'). '</a></li>';
|
||||
|
||||
$html .= '</ul></span>';
|
||||
|
||||
return array(
|
||||
array(
|
||||
'no_lang' => true,
|
||||
'text' => $html,
|
||||
'link' => false,
|
||||
'icon' => false,
|
||||
),
|
||||
);
|
||||
return egw_favorites::list_favorites($app, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create or delete a favorite for multiple users
|
||||
*
|
||||
* Current user needs to be an admin or it will just do nothing quietly
|
||||
*
|
||||
* @param $app Current application, needed to save preference
|
||||
* @param $name String Name of the favorite
|
||||
* @param $action String add or delete
|
||||
* @param $group boolean|int|String ID of the group to create the favorite for, or 'all' for all users
|
||||
* @param $filters Array of key => value pairs for the filter
|
||||
* Need to be in egw_framework to be called with .template postfix from json.php!
|
||||
*
|
||||
* @param string $app Current application, needed to save preference
|
||||
* @param string $name Name of the favorite
|
||||
* @param string $action "add" or "delete"
|
||||
* @param boolean|int|string $group ID of the group to create the favorite for, or 'all' for all users
|
||||
* @param array $filters=array() key => value pairs for the filter
|
||||
* @return boolean Success
|
||||
*/
|
||||
public static function ajax_set_favorite($app, $name, $action, $group, $filters = array())
|
||||
{
|
||||
// Only use alphanumeric for preference name, so it can be used directly as DOM ID
|
||||
$name = strip_tags($name);
|
||||
$pref_name = "favorite_".preg_replace('/[^A-Za-z0-9-_]/','_',$name);
|
||||
|
||||
// older group-favorites have just true as their group and are not deletable, if we dont find correct group
|
||||
if ($group === true || $group === '1')
|
||||
{
|
||||
if (isset($GLOBALS['egw']->preferences->default[$app][$pref_name]))
|
||||
{
|
||||
$group = 'all';
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach($GLOBALS['egw']->accounts->memberships($GLOBALS['egw_info']['user']['account_id'], true) as $gid)
|
||||
{
|
||||
$prefs = new preferences($gid);
|
||||
$prefs->read_repository();
|
||||
if (isset($prefs->user[$app][$pref_name]))
|
||||
{
|
||||
$group = $gid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if($group && $GLOBALS['egw_info']['apps']['admin'] && $group !== 'all')
|
||||
{
|
||||
$prefs = new preferences(is_numeric($group) ? $group : $GLOBALS['egw_info']['user']['account_id']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$prefs = $GLOBALS['egw']->preferences;
|
||||
}
|
||||
$prefs->read_repository();
|
||||
$type = $group === "all" ? "default" : "user";
|
||||
//error_log(__METHOD__."('$app', '$name', '$action', ".array2string($group).", ...) pref_name=$pref_name, type=$type");
|
||||
if($action == "add")
|
||||
{
|
||||
$filters = array(
|
||||
// This is the name as user entered it, minus tags
|
||||
'name' => $name,
|
||||
'group' => $group ? $group : false,
|
||||
'state' => $filters
|
||||
);
|
||||
$result = $prefs->add($app,$pref_name,$filters,$type);
|
||||
$pref = $prefs->save_repository(false,$type);
|
||||
|
||||
// Update preferences client side, or it could disappear
|
||||
egw_json_response::get()->call('egw.set_preferences', (array)$pref[$app], $app);
|
||||
|
||||
egw_json_response::get()->data(isset($result[$app][$pref_name]));
|
||||
return isset($result[$app][$pref_name]);
|
||||
}
|
||||
else if ($action == "delete")
|
||||
{
|
||||
$result = $prefs->delete($app,$pref_name, $type);
|
||||
$pref = $prefs->save_repository(false,$type);
|
||||
|
||||
// Update preferences client side, or it could come back
|
||||
egw_json_response::get()->call('egw.set_preferences', (array)$pref[$app], $app);
|
||||
|
||||
egw_json_response::get()->data(!isset($result[$app][$pref_name]));
|
||||
return !isset($result[$app][$pref_name]);
|
||||
}
|
||||
return egw_favorites::set_favorite($app, $name, $action, $group, $filters);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user