2001-01-11 10:52:33 +01:00
< ? php
2008-03-15 15:52:26 +01:00
/**
* API - Categories
2008-04-16 13:37:47 +02:00
*
2008-03-15 15:52:26 +01:00
* @ link http :// www . egroupware . org
* @ author Joseph Engo < jengo @ phpgroupware . org >
* @ author Bettina Gille < ceb @ phpgroupware . org >
* @ author Ralf Becker < RalfBecker - AT - outdoor - training . de >
* Copyright ( C ) 2000 , 2001 Joseph Engo , Bettina Gille
* Copyright ( C ) 2002 , 2003 Bettina Gille
* Reworked 11 / 2005 by RalfBecker - AT - outdoor - training . de
* @ license http :// opensource . org / licenses / lgpl - license . php LGPL - GNU Lesser General Public License
* @ package api
* @ subpackage categories
* @ access public
* @ version $Id $
*/
/**
* class to manage categories in eGroupWare
*/
class categories
{
var $account_id ;
var $app_name ;
/**
* @ var egw_db
*/
var $db ;
var $total_records ;
var $grants ;
var $table = 'egw_categories' ;
var $cache_id2cat_data = array (); // a little bit of caching for id2name and return_single
2005-11-05 23:58:51 +01:00
/**
2008-03-15 15:52:26 +01:00
* constructor for categories class
2005-11-05 23:58:51 +01:00
*
2008-03-15 15:52:26 +01:00
* @ param int / string $accountid = '' account id or lid , default to current user
* @ param string $app_name = '' app name defaults to current app
2005-11-05 23:58:51 +01:00
*/
2008-03-15 15:52:26 +01:00
function categories ( $accountid = '' , $app_name = '' )
2001-03-12 13:16:14 +01:00
{
2008-03-15 15:52:26 +01:00
if ( ! $app_name ) $app_name = $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ];
$this -> account_id = ( int ) get_account_id ( $accountid );
$this -> app_name = $app_name ;
$this -> db = $GLOBALS [ 'egw' ] -> db ;
####################################################
# resolving the group members/grants is very slow with ldap accounts backend
# let's skip it for the addressbook, if we are using the ldap accounts backend
####################################################
if ( $app_name == 'addressbook' && $GLOBALS [ 'egw_info' ][ 'server' ][ 'account_repository' ] == 'ldap' ) {
$this -> grants = $GLOBALS [ 'egw' ] -> acl -> get_grants ( $app_name , false );
} else {
$this -> grants = $GLOBALS [ 'egw' ] -> acl -> get_grants ( $app_name );
2002-01-03 18:16:56 +01:00
}
2008-03-15 15:52:26 +01:00
}
2002-01-03 18:16:56 +01:00
2008-03-15 15:52:26 +01:00
/**
* return sql for predifined filters
*
* @ param string $type eiterh subs , mains , appandmains , appandsubs , noglobal or noglobalapp
* @ return string with sql to add to the where clause
*/
function filter ( $type )
{
switch ( $type )
2001-03-12 13:16:14 +01:00
{
2008-03-15 15:52:26 +01:00
case 'subs' : $where = 'cat_parent != 0' ; break ;
case 'mains' : $where = 'cat_parent = 0' ; break ;
case 'appandmains' : $where = 'cat_appname=' . $this -> db -> quote ( $this -> app_name ) . ' AND cat_parent = 0' ; break ;
case 'appandsubs' : $where = 'cat_appname=' . $this -> db -> quote ( $this -> app_name ) . ' AND cat_parent != 0' ; break ;
case 'noglobal' : $where = 'cat_appname != ' . $this -> db -> quote ( $this -> app_name ); break ;
case 'noglobalapp' : $where = 'cat_appname=' . $this -> db -> quote ( $this -> app_name ) . ' AND cat_owner != ' . ( int ) $this -> account_id ; break ;
default : return False ;
2001-03-12 13:16:14 +01:00
}
2008-03-15 15:52:26 +01:00
return $where ;
}
2002-01-03 18:16:56 +01:00
2008-03-15 15:52:26 +01:00
/**
* returns the total number of categories for app , subs or mains
*
* @ param $for one of either 'app' 'subs' or 'mains'
* @ return integer count of categories
*/
function total ( $for = 'app' )
{
switch ( $for )
2001-03-12 13:16:14 +01:00
{
2008-03-15 15:52:26 +01:00
case 'app' : $where = array ( 'cat_appname' => $this -> app_name ); break ;
case 'appandmains' : $where = array ( 'cat_appname' => $this -> app_name , 'cat_parent' => 0 ); break ;
case 'appandsubs' : $where = array ( 'cat_appname' => $this -> app_name , 'cat_parent != 0' ); break ;
case 'subs' : $where = 'cat_parent != 0' ; break ;
case 'mains' : $where = 'cat_parent = 0' ; break ;
default : return False ;
2001-03-12 13:16:14 +01:00
}
2009-11-20 15:45:26 +01:00
return $this -> db -> select ( $this -> table , 'COUNT(*)' , $where , __LINE__ , __FILE__ ) -> fetchSingle ();
2008-03-15 15:52:26 +01:00
}
2001-03-12 13:16:14 +01:00
2008-03-15 15:52:26 +01:00
/**
* return_all_children
* returns array with id ' s of all children from $cat_id and $cat_id itself !
*
* @ param $cat_id integer cat - id to search for
* @ return array of cat - id ' s
*/
function return_all_children ( $cat_id )
{
2009-11-20 15:45:26 +01:00
$all_children = ( array ) $cat_id ;
2004-04-05 00:21:26 +02:00
2008-03-15 15:52:26 +01:00
$children = $this -> return_array ( 'subs' , 0 , False , '' , '' , '' , True , $cat_id , - 1 , 'id' );
if ( is_array ( $children ) && count ( $children ))
{
foreach ( $children as $child )
2001-03-25 07:58:28 +02:00
{
2008-03-15 15:52:26 +01:00
$all_children = array_merge ( $all_children , $this -> return_all_children ( $child [ 'id' ]));
2001-03-25 07:58:28 +02:00
}
2008-03-15 15:52:26 +01:00
}
//echo "<p>categories::return_all_children($cat_id)=(".implode(',',$all_children).")</p>\n";
return $all_children ;
}
2001-03-12 13:16:14 +01:00
2008-03-15 15:52:26 +01:00
/**
* return an array populated with categories
*
* @ param string $type defaults to 'all'
* @ param int $start see $limit
* @ param boolean $limit if true limited query starting with $start
* @ param string $query = '' query - pattern
* @ param string $sort = '' sort order , either defaults to 'ASC'
* @ param string $order = '' order by
* @ param boolean $globals includes the global egroupware categories or not
* @ param int $parent_id = 0 if > 0 return subcats or $parent_id
* @ param int $lastmod = - 1 if > 0 return only cats modified since then
* @ param string $column = '' if column - name given only that column is returned , not the full array with all cat - data
* @ return array or cats
*/
function return_array ( $type , $start , $limit = True , $query = '' , $sort = '' , $order = '' , $globals = False , $parent_id = '' , $lastmod = - 1 , $column = '' )
{
if ( $globals )
{
$global_cats = " OR cat_appname='phpgw' " ;
}
2003-08-28 16:31:11 +02:00
2008-03-15 15:52:26 +01:00
if (( $filter = $this -> filter ( $type ))) $filter = ' AND ' . $filter ;
2001-03-12 13:16:14 +01:00
2008-03-15 15:52:26 +01:00
if ( ! $sort ) $sort = 'ASC' ;
if ( ! empty ( $order ) && preg_match ( '/^[a-zA-Z_(), ]+$/' , $order ) && ( empty ( $sort ) || preg_match ( '/^(ASC|DESC|asc|desc)$/' , $sort )))
{
2009-11-16 09:04:18 +01:00
$ordermethod = 'ORDER BY ' . $order . ' ' . $sort . ', cat_access ASC' ;
2008-03-15 15:52:26 +01:00
}
else
{
2009-11-16 09:04:18 +01:00
$ordermethod = 'ORDER BY cat_main, cat_level, cat_name, cat_access ASC' ;
2008-03-15 15:52:26 +01:00
}
2001-03-12 13:16:14 +01:00
2008-03-15 15:52:26 +01:00
if ( $this -> account_id == '-1' )
{
$grant_cats = ' cat_owner=-1 ' ;
}
else
{
if ( is_array ( $this -> grants ))
2001-03-27 09:19:28 +02:00
{
2008-03-15 15:52:26 +01:00
$grant_cats = ' (cat_owner=' . $this -> account_id . " OR cat_owner=-1 OR cat_access='public' AND cat_owner IN ( " . implode ( ',' , array_keys ( $this -> grants )) . ')) ' ;
2001-03-27 09:19:28 +02:00
}
2001-05-02 01:17:13 +02:00
else
2001-03-27 09:19:28 +02:00
{
2009-11-16 09:04:18 +01:00
$grant_cats = ' (cat_owner=' . $this -> account_id . ' OR cat_owner=-1) ' ;
2001-03-27 09:19:28 +02:00
}
2008-03-15 15:52:26 +01:00
}
2001-03-27 09:19:28 +02:00
2008-03-15 15:52:26 +01:00
if ( $parent_id > 0 )
{
$parent_filter = ' AND cat_parent=' . ( int ) $parent_id ;
}
2001-04-25 19:00:31 +02:00
2008-03-15 15:52:26 +01:00
if ( $query )
{
$query = $this -> db -> quote ( '%' . $query . '%' );
$querymethod = " AND (cat_name LIKE $query OR cat_description LIKE $query ) " ;
}
2003-05-02 01:24:09 +02:00
2008-03-15 15:52:26 +01:00
if ( $lastmod > 0 )
{
$querymethod .= ' AND last_mod > ' . ( int ) $lastmod ;
}
2001-05-02 01:17:13 +02:00
2008-03-15 15:52:26 +01:00
$where = '(cat_appname=' . $this -> db -> quote ( $this -> app_name ) . ' AND ' . $grant_cats . $global_cats . ')'
. $parent_filter . $querymethod . $filter ;
2003-08-28 16:31:11 +02:00
2009-11-20 15:45:26 +01:00
$this -> total_records = $this -> db -> select ( $this -> table , 'COUNT(*)' , $where , __LINE__ , __FILE__ ) -> fetchSingle ();
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
if ( ! $this -> total_records ) return false ;
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
foreach ( $this -> db -> select ( $this -> table , '*' , $where , __LINE__ , __FILE__ , $limit ? ( int ) $start : false , $ordermethod ) as $cat )
{
$cat = egw_db :: strip_array_keys ( $cat , 'cat_' );
$cat [ 'app_name' ] = $cat [ 'appname' ];
$this -> cache_id2cat_data [ $cat [ 'id' ]] = $cat ;
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
if ( $column )
2005-11-05 23:58:51 +01:00
{
2008-03-15 15:52:26 +01:00
$cats [] = array ( $column => isset ( $cat [ $column ]) ? $cat [ $column ] : $cat [ 'id' ]);
2003-06-21 02:59:30 +02:00
}
2008-03-15 15:52:26 +01:00
else
2002-01-12 05:08:35 +01:00
{
2008-03-15 15:52:26 +01:00
$cats [] = $cat ;
2002-01-12 05:08:35 +01:00
}
2008-03-15 15:52:26 +01:00
}
return $cats ;
}
/**
* return a sorted array populated with categories
*
* @ param int $start see $limit
* @ param boolean $limit if true limited query starting with $start
* @ param string $query = '' query - pattern
* @ param string $sort = '' sort order , either defaults to 'ASC'
* @ param string $order = '' order by
* @ param boolean $globals includes the global egroupware categories or not
* @ param int $parent_id = 0 if > 0 return subcats or $parent_id
* @ return array with cats
*/
function return_sorted_array ( $start , $limit = True , $query = '' , $sort = '' , $order = '' , $globals = False , $parent_id = 0 )
{
if ( $globals )
{
$global_cats = " OR cat_appname='phpgw' " ;
}
2002-01-12 05:08:35 +01:00
2008-03-15 15:52:26 +01:00
if ( ! $sort ) $sort = 'ASC' ;
2002-01-12 05:08:35 +01:00
2008-03-15 15:52:26 +01:00
if ( ! empty ( $order ) && preg_match ( '/^[a-zA-Z_, ]+$/' , $order ) && ( empty ( $sort ) || preg_match ( '/^(ASC|DESC|asc|desc)$/' , $sort )))
{
2009-11-16 09:04:18 +01:00
$ordermethod = 'ORDER BY ' . $order . ' ' . $sort . ', cat_access ASC' ;
2008-03-15 15:52:26 +01:00
}
else
{
2009-11-16 09:04:18 +01:00
$ordermethod = ' ORDER BY cat_name ASC, cat_access ASC' ;
2008-03-15 15:52:26 +01:00
}
2002-01-12 05:08:35 +01:00
2008-03-15 15:52:26 +01:00
if ( $this -> account_id == '-1' )
{
$grant_cats = " cat_owner='-1' " ;
}
else
{
if ( is_array ( $this -> grants ))
2002-01-12 05:08:35 +01:00
{
2008-03-15 15:52:26 +01:00
$grant_cats = " (cat_owner=' " . $this -> account_id . " ' OR cat_owner='-1' OR cat_access='public' AND cat_owner IN ( " . implode ( ',' , array_keys ( $this -> grants )) . " )) " ;
2002-01-12 05:08:35 +01:00
}
else
{
2009-11-16 09:04:18 +01:00
$grant_cats = " (cat_owner=' " . $this -> account_id . " ' OR cat_owner='-1') " ;
2002-01-12 05:08:35 +01:00
}
2008-03-15 15:52:26 +01:00
}
$parent_select = ' AND cat_parent=' . ( int ) $parent_id ;
2002-09-03 04:21:36 +02:00
2008-03-15 15:52:26 +01:00
if ( $query )
{
$query = $this -> db -> quote ( '%' . $query . '%' );
$querymethod = " AND (cat_name LIKE $query OR cat_description LIKE $query ) " ;
}
2002-01-12 05:08:35 +01:00
2008-03-15 15:52:26 +01:00
$where = '(cat_appname=' . $this -> db -> quote ( $this -> app_name ) . ' AND ' . $grant_cats . $global_cats . ')' . $querymethod ;
2002-01-12 05:08:35 +01:00
2008-03-15 15:52:26 +01:00
$parents = $cats = array ();
foreach ( $this -> db -> select ( $this -> table , '*' , $where . $parent_select , __LINE__ , __FILE__ , false , $ordermethod ) as $cat )
{
$cat = egw_db :: strip_array_keys ( $cat , 'cat_' );
$cat [ 'app_name' ] = $cat [ 'appname' ];
$this -> cache_id2cat_data [ $cat [ 'id' ]] = $cat ;
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
$cats [] = $cat ;
$parents [] = $cat [ 'id' ];
}
while ( count ( $parents ))
{
$sub_select = ' AND cat_parent IN (' . implode ( ',' , $parents ) . ')' ;
$parents = $children = array ();
foreach ( $this -> db -> select ( $this -> table , '*' , $where . $sub_select , __LINE__ , __FILE__ , false , $ordermethod ) as $cat )
2002-01-13 01:39:26 +01:00
{
2008-03-15 15:52:26 +01:00
$cat = egw_db :: strip_array_keys ( $cat , 'cat_' );
2005-11-05 23:58:51 +01:00
$cat [ 'app_name' ] = $cat [ 'appname' ];
$this -> cache_id2cat_data [ $cat [ 'id' ]] = $cat ;
2008-04-16 13:37:47 +02:00
2005-11-24 00:01:28 +01:00
$parents [] = $cat [ 'id' ];
2008-03-15 15:52:26 +01:00
$children [ $cat [ 'parent' ]][] = $cat ;
2002-01-13 01:39:26 +01:00
}
2008-03-15 15:52:26 +01:00
// sort the cats into the mains
if ( count ( $children ))
2002-01-13 01:39:26 +01:00
{
2008-03-15 15:52:26 +01:00
$cats2 = $cats ;
$cats = array ();
foreach ( $cats2 as $cat )
2003-08-28 16:31:11 +02:00
{
2008-03-15 15:52:26 +01:00
$cats [] = $cat ;
if ( isset ( $children [ $cat [ 'id' ]]))
2005-11-24 00:01:28 +01:00
{
2008-03-15 15:52:26 +01:00
foreach ( $children [ $cat [ 'id' ]] as $child )
2005-11-24 00:01:28 +01:00
{
2008-03-15 15:52:26 +01:00
$cats [] = $child ;
2005-11-24 00:01:28 +01:00
}
}
2002-01-12 05:08:35 +01:00
}
}
}
2008-03-15 15:52:26 +01:00
$this -> total_records = count ( $cats );
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
if ( $limit )
{
return array_slice ( $cats ,( int ) $start , $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'maxmatchs' ]);
}
return $cats ;
}
2002-01-12 05:08:35 +01:00
2008-03-15 15:52:26 +01:00
/**
* read a single category
*
* We use a shared cache together with id2name
*
* @ param int $id id of category
* @ return array / boolean array with one array of cat - data or false if cat not found
*/
function return_single ( $id = '' )
{
if ( ! isset ( $this -> cache_id2cat_data [ $id ]))
2001-03-12 13:16:14 +01:00
{
2008-03-15 15:52:26 +01:00
if (( $cat = $this -> db -> select ( $this -> table , '*' , array ( 'cat_id' => $id ), __LINE__ , __FILE__ ) -> fetch ()))
2003-08-28 16:31:11 +02:00
{
2008-03-15 15:52:26 +01:00
$cat = egw_db :: strip_array_keys ( $cat , 'cat_' );
$cat [ 'app_name' ] = $cat [ 'appname' ];
2003-08-28 16:31:11 +02:00
}
2008-03-15 15:52:26 +01:00
$this -> cache_id2cat_data [ $id ] = $cat ;
2001-03-12 13:16:14 +01:00
}
2008-03-15 15:52:26 +01:00
return $this -> cache_id2cat_data [ $id ] ? array ( $this -> cache_id2cat_data [ $id ]) : false ;
}
2001-05-23 22:19:23 +02:00
2008-03-15 15:52:26 +01:00
/**
* return into a select box , list or other formats
*
* @ param string / array $format string 'select' or 'list' , or array with all params
* @ param string $type = '' subs or mains
* @ param int / array $selected - cat_id or array with cat_id values
* @ param boolean $globals True or False , includes the global egroupware categories or not
* @ return string populated with categories
*/
function formatted_list ( $format , $type = '' , $selected = '' , $globals = False , $site_link = 'site' )
{
if ( is_array ( $format ))
2001-03-12 13:16:14 +01:00
{
2008-03-15 15:52:26 +01:00
$type = ( $format [ 'type' ] ? $format [ 'type' ] : 'all' );
$selected = ( isset ( $format [ 'selected' ]) ? $format [ 'selected' ] : '' );
$self = ( isset ( $format [ 'self' ]) ? $format [ 'self' ] : '' );
$globals = ( isset ( $format [ 'globals' ]) ? $format [ 'globals' ] : True );
$site_link = ( isset ( $format [ 'site_link' ]) ? $format [ 'site_link' ] : 'site' );
$format = $format [ 'format' ] ? $format [ 'format' ] : 'select' ;
}
2002-01-03 18:16:56 +01:00
2008-03-15 15:52:26 +01:00
if ( ! is_array ( $selected ))
{
$selected = explode ( ',' , $selected );
}
2001-03-12 13:16:14 +01:00
2008-03-15 15:52:26 +01:00
if ( $type != 'all' )
{
$cats = $this -> return_array ( $type , 0 , False , '' , '' , '' , $globals );
}
else
{
$cats = $this -> return_sorted_array ( 0 , False , '' , '' , '' , $globals );
}
2001-03-27 05:40:18 +02:00
2008-03-15 15:52:26 +01:00
if ( ! $cats ) return '' ;
2005-11-05 23:58:51 +01:00
2008-03-15 15:52:26 +01:00
if ( $self )
{
foreach ( $cats as $key => $cat )
2003-06-24 15:32:25 +02:00
{
2008-03-15 15:52:26 +01:00
if ( $cat [ 'id' ] == $self )
2003-06-24 15:32:25 +02:00
{
2008-03-15 15:52:26 +01:00
unset ( $cats [ $key ]);
2003-06-24 15:32:25 +02:00
}
}
2008-03-15 15:52:26 +01:00
}
2003-06-24 15:32:25 +02:00
2008-03-15 15:52:26 +01:00
switch ( $format )
{
case 'select' :
foreach ( $cats as $cat )
{
$s .= '<option value="' . $cat [ 'id' ] . '"' ;
if ( in_array ( $cat [ 'id' ], $selected ))
2002-01-12 05:08:35 +01:00
{
2008-03-15 15:52:26 +01:00
$s .= ' selected="selected"' ;
2002-03-13 05:16:46 +01:00
}
2008-03-15 15:52:26 +01:00
$s .= '>' . str_repeat ( ' ' , $cat [ 'level' ]);
$s .= $GLOBALS [ 'egw' ] -> strip_html ( $cat [ 'name' ]);
if ( $cat [ 'app_name' ] == 'phpgw' || $cat [ 'owner' ] == '-1' )
2001-05-15 02:00:49 +02:00
{
2008-03-15 15:52:26 +01:00
$s .= ' ♦' ;
2001-06-07 09:44:26 +02:00
}
2009-11-16 09:04:18 +01:00
elseif ( $cat [ 'owner' ] != $this -> account_id )
{
2009-12-07 17:15:39 +01:00
if ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'show_category_owner' ])
{
$s .= ' <' . $GLOBALS [ 'egw' ] -> accounts -> id2name ( $cat [ 'owner' ], 'account_fullname' ) . '>' ;
}
2009-11-16 09:04:18 +01:00
}
elseif ( $cat [ 'access' ] == 'private' )
{
$s .= ' ♥' ;
}
2008-03-15 15:52:26 +01:00
$s .= '</option>' . " \n " ;
}
break ;
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
case 'list' :
$space = ' ' ;
2001-07-19 01:50:38 +02:00
2008-03-15 15:52:26 +01:00
$s = '<table border="0" cellpadding="2" cellspacing="2">' . " \n " ;
2002-09-25 06:02:03 +02:00
2008-03-15 15:52:26 +01:00
foreach ( $cats as $cat )
2003-08-28 16:31:11 +02:00
{
2008-03-15 15:52:26 +01:00
$image_set = ' ' ;
if ( in_array ( $cat [ 'id' ], $selected ))
2003-08-28 16:31:11 +02:00
{
2008-03-15 15:52:26 +01:00
$image_set = '<img src="' . EGW_IMAGES_DIR . '/roter_pfeil.gif">' ;
2003-08-28 16:31:11 +02:00
}
2008-03-15 15:52:26 +01:00
if (( $cat [ 'level' ] == 0 ) && ! in_array ( $cat [ 'id' ], $selected ))
2002-09-03 04:21:36 +02:00
{
2008-03-15 15:52:26 +01:00
$image_set = '<img src="' . EGW_IMAGES_DIR . '/grauer_pfeil.gif">' ;
2003-08-28 16:31:11 +02:00
}
2008-03-15 15:52:26 +01:00
$space_set = str_repeat ( $space , $cat [ 'level' ]);
$s .= '<tr>' . " \n " ;
$s .= '<td width="8">' . $image_set . '</td>' . " \n " ;
$s .= '<td>' . $space_set . '<a href="' . $GLOBALS [ 'egw' ] -> link ( $site_link , 'cat_id=' . $cat [ 'id' ]) . '">'
. $GLOBALS [ 'egw' ] -> strip_html ( $cat [ 'name' ])
. '</a></td>' . " \n "
. '</tr>' . " \n " ;
2002-10-12 19:23:56 +02:00
}
2008-03-15 15:52:26 +01:00
$s .= '</table>' . " \n " ;
break ;
}
return $s ;
}
2002-10-12 19:23:56 +02:00
2008-03-15 15:52:26 +01:00
/**
* add a category
*
* @ param array $value cat - data
* @ return int new cat - id
*/
function add ( $values )
{
if (( int ) $values [ 'parent' ] > 0 )
{
$values [ 'level' ] = $this -> id2name ( $values [ 'parent' ], 'level' ) + 1 ;
$values [ 'main' ] = $this -> id2name ( $values [ 'parent' ], 'main' );
2002-10-12 19:23:56 +02:00
}
2008-03-15 15:52:26 +01:00
$values = array_merge (
array (
'app_name' => $this -> app_name ,
'access' => 'public' ,
),
$values );
$this -> db -> insert ( $this -> table , array (
'cat_parent' => $values [ 'parent' ],
'cat_owner' => $this -> account_id ,
'cat_access' => $values [ 'access' ],
'cat_appname' => $values [ 'app_name' ],
'cat_name' => $values [ 'name' ],
'cat_description' => $values [ 'descr' ],
'cat_data' => $values [ 'data' ],
'cat_main' => $values [ 'main' ],
2008-04-16 13:37:47 +02:00
'cat_level' => $values [ 'level' ],
2008-03-15 15:52:26 +01:00
'last_mod' => time (),
),( int ) $values [ 'id' ] > 0 ? array ( 'cat_id' => $values [ 'id' ]) : array (), __LINE__ , __FILE__ );
$id = ( int ) $values [ 'id' ] > 0 ? ( int ) $values [ 'id' ] : $this -> db -> get_last_insert_id ( $this -> table , 'cat_id' );
if ( ! ( int ) $values [ 'parent' ])
2001-03-12 13:16:14 +01:00
{
2008-03-15 15:52:26 +01:00
$this -> db -> update ( $this -> table , array ( 'cat_main' => $id ), array ( 'cat_id' => $id ), __LINE__ , __FILE__ );
}
return $id ;
}
2005-11-05 23:58:51 +01:00
2009-11-20 15:45:26 +01:00
/**
* Checks if the current user has the necessary ACL rights
*
* If the access of a category is set to private , one needs a private grant for the application
*
* @ param int $needed necessary ACL right : EGW_ACL_ { READ | EDIT | DELETE }
* @ param mixed $category category as array or the category_id
* @ return boolean true permission granted , false for permission denied , null for category does not exist
*/
public function check_perms ( $needed , $category )
{
if ( ! is_array ( $category ))
{
if ( ! isset ( $this -> cache_id2cat_data [ $category ]))
{
if (( $cat = $this -> db -> select ( $this -> table , '*' , array ( 'cat_id' => $category ), __LINE__ , __FILE__ ) -> fetch ()))
{
$cat = egw_db :: strip_array_keys ( $cat , 'cat_' );
$cat [ 'app_name' ] = $cat [ 'appname' ];
$this -> cache_id2cat_data [ $category ] = $cat ;
}
else return null ;
}
$category = $this -> cache_id2cat_data [ $category ];
}
// The user for the global cats has id -1, this one has full access to all global cats
if ( $this -> account_id == - 1 && ( $category [ 'appname' ] == 'phpgw'
|| $category [ 'appname' ] == $this -> app_name && $category [ 'owner' ] == - 1 ))
{
return true ;
}
// Read access to global categories
if ( $needed == EGW_ACL_READ && ( $category [ 'appname' ] == 'phpgw'
|| $category [ 'appname' ] == $this -> app_name && $category [ 'owner' ] == - 1 ))
{
return true ;
}
// Full access to own categories
if ( $category [ 'appname' ] == $this -> app_name && $category [ 'owner' ] == $this -> account_id )
{
return true ;
}
// Check for ACL granted access, the -1 user must not get access by ACL to keep old behaviour
return ( $this -> account_id != - 1 && $category [ 'appname' ] == $this -> app_name && ( $this -> grants [ $category [ 'owner' ]] & $needed ) &&
( $category [ 'access' ] == 'public' || ( $this -> grants [ $category [ 'owner' ]] & EGW_ACL_PRIVATE )));
}
2008-03-15 15:52:26 +01:00
/**
* delete a category
*
* @ param int $cat_id category id
* @ param boolean $drop_subs = false if true delete sub - cats too
* @ param boolean $modify_subs = false if true make the subs owned by the parent of $cat_id
*/
function delete ( $cat_id , $drop_subs = False , $modify_subs = False )
{
if ( $modify_subs )
{
$new_parent = $this -> id2name ( $cat_id , 'parent' );
2009-11-16 09:04:18 +01:00
$new_main = 0 ;
2008-03-15 15:52:26 +01:00
foreach (( array ) $this -> return_sorted_array ( '' , False , '' , '' , '' , False , $cat_id ) as $cat )
2001-05-15 02:00:49 +02:00
{
2008-03-15 15:52:26 +01:00
if ( $cat [ 'level' ] == 1 )
2002-10-04 22:59:00 +02:00
{
2008-03-15 15:52:26 +01:00
$this -> db -> update ( $this -> table , array (
2008-04-16 13:37:47 +02:00
'cat_level' => 0 ,
'cat_parent' => 0 ,
2008-03-15 15:52:26 +01:00
'cat_main' => $cat [ 'id' ],
), array (
'cat_id' => $cat [ 'id' ],
'cat_appname' => $this -> app_name ,
), __LINE__ , __FILE__ );
$new_main = $cat [ 'id' ];
2002-10-04 22:59:00 +02:00
}
else
{
2008-03-15 15:52:26 +01:00
$update = array ( 'cat_level' => $cat [ 'level' ] - 1 );
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
if ( $new_main ) $update [ 'cat_main' ] = $new_main ;
2001-12-11 02:20:45 +01:00
2008-03-15 15:52:26 +01:00
if ( $cat [ 'parent' ] == $cat_id ) $update [ 'cat_parent' ] = $new_parent ;
2007-12-11 10:29:50 +01:00
2008-03-15 15:52:26 +01:00
$this -> db -> update ( $this -> table , $update , array (
'cat_id' => $cat [ 'id' ],
'cat_appname' => $this -> app_name ,
), __LINE__ , __FILE__ );
2007-12-11 10:29:50 +01:00
}
}
2008-03-15 15:52:26 +01:00
}
if ( $drop_subs )
{
$where = array ( 'cat_id=' . ( int ) $cat_id . ' OR cat_parent=' . ( int ) $cat_id . ' OR cat_main=' . ( int ) $cat_id );
}
else
{
$where [ 'cat_id' ] = $cat_id ;
}
$where [ 'cat_appname' ] = $this -> app_name ;
2007-12-11 10:29:50 +01:00
2008-03-15 15:52:26 +01:00
$this -> db -> delete ( $this -> table , $where , __LINE__ , __FILE__ );
}
2002-01-03 18:16:56 +01:00
2008-03-15 15:52:26 +01:00
/**
* edit / update a category
*
* @ param array $values array with cat - data ( it need to be complete , as everything get ' s written )
* @ return int cat - id
*/
function edit ( $values )
{
if ( isset ( $values [ 'old_parent' ]) && ( int ) $values [ 'old_parent' ] != ( int ) $values [ 'parent' ])
{
$this -> delete ( $values [ 'id' ], False , True );
2006-04-14 11:50:39 +02:00
2008-03-15 15:52:26 +01:00
return $this -> add ( $values );
2001-04-25 20:12:10 +02:00
}
2008-03-15 15:52:26 +01:00
else
2001-03-12 13:16:14 +01:00
{
2008-03-15 15:52:26 +01:00
if ( $values [ 'parent' ] > 0 )
2008-02-07 03:40:43 +01:00
{
2008-03-15 15:52:26 +01:00
$values [ 'main' ] = $this -> id2name ( $values [ 'parent' ], 'main' );
$values [ 'level' ] = $this -> id2name ( $values [ 'parent' ], 'level' ) + 1 ;
2001-03-12 13:16:14 +01:00
}
2008-03-15 15:52:26 +01:00
else
2001-03-12 13:16:14 +01:00
{
2008-03-15 15:52:26 +01:00
$values [ 'main' ] = $values [ 'id' ];
$values [ 'level' ] = 0 ;
2001-07-02 04:25:26 +02:00
}
2001-04-25 20:12:10 +02:00
}
2008-03-15 15:52:26 +01:00
$this -> db -> update ( $this -> table , array (
'cat_name' => $values [ 'name' ],
'cat_description' => $values [ 'descr' ],
'cat_data' => $values [ 'data' ],
'cat_parent' => $values [ 'parent' ],
'cat_access' => $values [ 'access' ],
'cat_main' => $values [ 'main' ],
'cat_level' => $values [ 'level' ],
'last_mod' => time (),
), array (
'cat_id' => $values [ 'id' ],
'cat_appname' => $this -> app_name ,
), __LINE__ , __FILE__ );
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
return ( int ) $values [ 'id' ];
}
/**
* return category id for a given name
2008-04-16 13:37:47 +02:00
*
2008-03-15 15:52:26 +01:00
* Cat ' s with the given name are returned in this order :
* - personal cats first
* - then application global categories
* - global categories
* - cat ' s of other user
*
* @ param string $cat_name cat - name
* @ param boolean $strip = false if true , strips 'X-' from category names added by some SyncML clients
* @ return int cat - id or 0 if not found
*/
function name2id ( $cat_name , $strip = false )
{
static $cache = array (); // a litle bit of caching
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
if ( isset ( $cache [ $cat_name ])) return $cache [ $cat_name ];
2001-04-25 20:12:10 +02:00
2008-03-15 15:52:26 +01:00
if ( $strip === true )
2003-08-28 16:31:11 +02:00
{
2008-03-15 15:52:26 +01:00
$strip = 'X-' ;
2003-08-28 16:31:11 +02:00
}
2008-03-15 15:52:26 +01:00
$cats = array ( $cat_name );
if ( isset ( $strip ) && strncmp ( $strip , $cat_name , strlen ( $strip )) == 0 )
2001-03-12 13:16:14 +01:00
{
2008-03-15 15:52:26 +01:00
$stripped_cat_name = substr ( $cat_name , strlen ( $strip ));
if ( isset ( $cache [ $stripped_cat_name ]))
2001-05-15 02:00:49 +02:00
{
2008-03-15 15:52:26 +01:00
$cache [ $cat_name ] = $cache [ $stripped_cat_name ];
return $cache [ $stripped_cat_name ];
2001-05-15 02:00:49 +02:00
}
2008-03-15 15:52:26 +01:00
$cats [] = $stripped_cat_name ;
}
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
$cat = $this -> db -> select ( $this -> table , array ( 'cat_name' , 'cat_id' ), array (
'cat_name' => $cats ,
'cat_appname' => array ( $this -> app_name , 'phpgw' ),
), __LINE__ , __FILE__ , 0 ,
2008-04-16 13:37:47 +02:00
'ORDER BY cat_name<>' . $this -> db -> quote ( $cat_name ) . ',(CASE cat_owner WHEN ' . ( int ) $this -> account_id . " THEN 1 WHEN -1 THEN 2 ELSE 3 END),cat_appname='phpgw' " ,
2008-03-15 15:52:26 +01:00
false , 1 ) -> fetch ();
if ( ! $cat ) return 0 ; // cat not found, dont cache it, as it might be created in this request
return $cache [ $cat [ 'cat_name' ]] = ( int ) $cat [ 'cat_id' ];
}
/**
* return category information for a given id
*
* We use a shared cache together with return_single
*
* @ param int $cat_id = 0 cat - id
* @ param string $item = 'name requested information, ' path ' = / delimited path of category names ( incl . parents )
* @ return string information or '--' if not found or ! $cat_id
*/
function id2name ( $cat_id = 0 , $item = 'name' )
{
if ( ! $cat_id ) return '--' ;
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
if ( ! isset ( $this -> cache_id2cat_data [ $cat_id ])) $this -> return_single ( $cat_id );
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
if ( ! $item ) $item = 'parent' ;
$cat = $this -> cache_id2cat_data [ $cat_id ];
if ( $item == 'path' )
{
if ( $cat [ 'parent' ])
2001-05-15 02:00:49 +02:00
{
2008-03-15 15:52:26 +01:00
return $this -> id2name ( $cat [ 'parent' ], 'path' ) . ' / ' . $cat [ 'name' ];
2001-05-15 02:00:49 +02:00
}
2008-03-15 15:52:26 +01:00
$item = 'name' ;
}
if ( $cat [ $item ])
{
return $cat [ $item ];
}
elseif ( $item == 'name' )
{
return '--' ;
}
return null ;
}
/**
* return category name for a given id
*
* @ deprecated This is only a temp wrapper , use id2name () to keep things matching across the board . ( jengo )
* @ param int $cat_id
* @ return string cat_name category name
*/
function return_name ( $cat_id )
{
return $this -> id2name ( $cat_id );
}
/**
* check if a category id and / or name exists , if id AND name are given the check is for a category with same name and different id ( ! )
*
2009-11-16 09:04:18 +01:00
* @ param string $type subs or mains
* @ param string $cat_name = '' category name
* @ param int $cat_id = 0 category id
* @ param int $parent = 0 category id of parent
* @ param boolean $private = false limit to private categories
2008-03-15 15:52:26 +01:00
* @ return int / boolean cat_id or false if cat not exists
*/
2009-11-16 09:04:18 +01:00
function exists ( $type , $cat_name = '' , $cat_id = 0 , $parent = 0 , $private = false )
2008-03-15 15:52:26 +01:00
{
static $cache = array (); // a litle bit of caching
2009-11-16 09:04:18 +01:00
if ( isset ( $cache [ $type ][ $cat_name ][ $cat_id ][ $private ])) return $cache [ $type ][ $cat_name ][ $cat_id ][ $private ];
2001-05-15 02:00:49 +02:00
2008-03-15 15:52:26 +01:00
$where = array ( $this -> filter ( $type ));
2001-05-15 02:00:49 +02:00
2008-03-15 15:52:26 +01:00
if ( $cat_name )
{
$where [ 'cat_name' ] = $cat_name ;
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
if ( $cat_id ) $where [] = 'cat_id != ' . ( int ) $cat_id ;
2005-11-05 23:58:51 +01:00
}
2008-03-15 15:52:26 +01:00
elseif ( $cat_id )
{
$where [ 'cat_id' ] = $cat_id ;
}
2009-11-16 09:04:18 +01:00
if ( $parent ){
$where [ 'cat_parent' ] = $parent ;
}
$grant_cats = " ( " ;
if ( $private ) {
$grant_cats .= " cat_owner=' " . $this -> account_id . " ' AND cat_access='private' " ;
} else {
$grant_cats .= " cat_owner=' " . $this -> account_id
. " ' OR cat_owner='-1' OR cat_access='public' " ;
if ( is_array ( $this -> grants )) {
$grant_cats .= " AND cat_owner IN ( " . implode ( ',' , array_keys ( $this -> grants )) . " ) " ;
}
}
$where [] = $grant_cats . " ) " ;
2009-11-20 15:45:26 +01:00
return $cache [ $type ][ $cat_name ][ $cat_id ][ $private ] = $this -> db -> select ( $this -> table , 'cat_id' , $where , __LINE__ , __FILE__ ) -> fetchSingle ();
2008-03-15 15:52:26 +01:00
}
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
/**
* Change the owner of all cats owned by $owner to $to OR deletes them if ! $to
*
* @ param int $owner owner or the cats to delete or change
* @ param int $to = 0 new owner or 0 to delete the cats
* @ param string $app = '' if given only cats matching $app are modifed / deleted
*/
function change_owner ( $owner , $to = 0 , $app = '' )
{
$where = array ( 'cat_owner' => $owner );
2008-04-16 13:37:47 +02:00
2008-03-15 15:52:26 +01:00
if ( $app ) $where [ 'cat_appname' ] = $app ;
2001-05-15 02:00:49 +02:00
2008-03-15 15:52:26 +01:00
if (( int ) $to )
{
$this -> db -> update ( $this -> table , array ( 'cat_owner' => $to ), $where , __LINE__ , __FILE__ );
}
else
{
$this -> db -> delete ( $this -> table , $where , __LINE__ , __FILE__ );
2001-03-12 13:16:14 +01:00
}
}
2008-03-15 15:52:26 +01:00
}