diff --git a/infolog/inc/class.bolink.inc.php b/infolog/inc/class.bolink.inc.php index 5de28e77b1..32d7776bdb 100644 --- a/infolog/inc/class.bolink.inc.php +++ b/infolog/inc/class.bolink.inc.php @@ -85,6 +85,9 @@ ), */ ); + var $public_functions = array( // functions callable via menuaction + 'get_file' => True + ); var $vfs; var $vfs_basedir='/infolog'; // might changes to links if class gets imported in the api var $vfs_appname='file'; // pseudo-appname for own file-attachments in vfs, this is NOT the vfs-app @@ -97,13 +100,7 @@ function bolink( ) { $this->solink( ); // call constructor of derived class - $this->public_functions += array( // extend the public_functions of solink - 'query' => True, - 'title' => True, - 'view' => True, - 'get_file' => True - ); - //$this->vfs =& CreateObject('infolog.vfs'); + $this->vfs =& CreateObject('phpgwapi.vfs'); $config =& CreateObject('phpgwapi.config'); @@ -130,7 +127,7 @@ } } } - + /** * creats a link between $app1,$id1 and $app2,$id2 - $id1 does NOT need to exist yet * @@ -204,6 +201,10 @@ { $link_id = solink::link($app1,$id1,$link['app'],$link['id'], $link['remark'],$link['owner'],$link['lastmod']); + + // notify both sides + $this->notify('link',$link['app'],$link['id'],$app1,$id1,$link_id); + $this->notify('link',$app1,$id1,$link['app'],$link['id'],$link_id); } } return $link_id; @@ -216,7 +217,12 @@ { return $this->attach_file($app1,$id1,$id2,$remark); } - return solink::link($app1,$id1,$app2,$id2,$remark,$owner); + $link_id = solink::link($app1,$id1,$app2,$id2,$remark,$owner); + + $this->notify('link',$app2,$id2,$app1,$id1,$link_id); + $this->notify('link',$app1,$id1,$app2,$id2,$link_id); + + return $link_id; } /** @@ -358,7 +364,12 @@ { $this->delete_attached($app,$id); // deleting all attachments } - return solink::unlink($link_id,$app,$id,$owner,$app2,$id2); + $deleted =& solink::unlink($link_id,$app,$id,$owner,$app2,$id2); + + // only notify on real links, not the one cached for writing or fileattachments + $this->notify_unlink($deleted); + + return count($deleted); } if (isset($id[$link_id])) { @@ -1026,4 +1037,63 @@ } return $content; } + + /** + * notify other apps about changed content in $app,$id + * + * @param string $app name of app in which the updated happend + * @param string $id id in $app of the updated entry + * @param array $data=null updated data of changed entry, as the read-method of the BO-layer would supply it + */ + function notify_update($app,$id,$data=null) + { + foreach($this->get_links($app,$id,'!'.$this->vfs_appname) as $link_id => $link) + { + $this->notify('update',$link['app'],$link['id'],$app,$id,$link_id,$data); + } + } + + /** + * notify an application about a new or deleted links to own entries or updates in the content of the linked entry + * + * Please note: not all apps supply update notifications + * + * @internal + * @param string $type 'link' for new links, 'unlink' for unlinked entries, 'update' of content in linked entries + * @param string $notify_app app to notify + * @param string $notify_id id in $notify_app + * @param string $target_app name of app whos entry changed, linked or deleted + * @param string $target_id id in $target_app + * @param array $data=null data of entry in app2 (optional) + */ + function notify($type,$notify_app,$notify_id,$target_app,$target_id,$link_id,$data=null) + { + if ($link_id && isset($this->app_register[$notify_app]) && isset($this->app_register[$notify_app]['notify'])) + { + ExecMethod($this->app_register[$notify_app]['notify'],array( + 'type' => $type, + 'id' => $notify_id, + 'target_app' => $target_app, + 'target_id' => $target_id, + 'link_id' => $link_id, + 'data' => $data, + )); + } + } + + /** + * notifies about unlinked links + * + * @internal + * @param array &$links unlinked links from the database + */ + function notify_unlink(&$links) + { + foreach($links as $link) + { + // we notify both sides of the link, as the unlink command NOT clearly knows which side initiated the unlink + $this->notify('unlink',$link['link_app1'],$link['link_id1'],$link['link_app2'],$link['link_id2'],$link['link_id']); + $this->notify('unlink',$link['link_app2'],$link['link_id2'],$link['link_app1'],$link['link_id1'],$link['link_id']); + } + } } \ No newline at end of file diff --git a/infolog/inc/class.solink.inc.php b/infolog/inc/class.solink.inc.php index 5003ef610c..1db5df0b19 100644 --- a/infolog/inc/class.solink.inc.php +++ b/infolog/inc/class.solink.inc.php @@ -12,38 +12,31 @@ /* $Id$ */ - $GLOBALS['egw_info']['flags']['included_classes']['solink'] = True; /** - * @author ralfbecker - * @copyright GPL - GNU General Public License - * generalized linking between entries of eGroupware apps - DB layer + * generalized linking between entries of eGroupware apps - BO layer * - * This class is to access the links in the DB
- * * Links have to ends each pointing two an entry, each entry is a double:
- * * app app-name or directory-name of an egw application, eg. 'infolog'
- * * id this is the id, eg. an integer or a tupple like '0:INBOX:1234' - * All vars passed to this class are run either through addslashes or intval - * * to prevent query insertion and to get pgSql 7.3 compatibility. + * This class is the SO-layer of the links + * + * Links have two ends each pointing to an entry, each entry is a double: + * - app app-name or directory-name of an egw application, eg. 'infolog' + * - id this is the id, eg. an integer or a tupple like '0:INBOX:1234' + * + * All vars passed to this class get correct escaped to prevent query insertion. + * + * @package infolog + * @subpackage link + * @author RalfBecker-At-outdoor-training.de + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License */ - class solink // DB-Layer + class solink { - var $public_functions = array - ( - 'link' => True, - 'get_links' => True, - 'unlink' => True, - 'chown' => True, - 'get_link' => True - ); var $db; var $user; var $link_table = 'phpgw_links'; var $debug; /** - * @author ralfbecker * constructor - * */ function solink( ) { @@ -53,13 +46,15 @@ } /** - * @author ralfbecker * creats a link between $app1,$id1 and $app2,$id2 * - * @param $remark Remark to be saved with the link (defaults to '') - * @param $owner Owner of the link (defaults to user) - * Does NOT check if link already exists - * @return False (for db or param-error) or link_id for success + * @param string $app1 appname of 1. endpoint of the link + * @param string $id1 id in $app1 + * @param string $app2 appname of 2. endpoint of the link + * @param string $id2 id in $app2 + * @param string $remark='' Remark to be saved with the link (defaults to '') + * @param int $owner=0 Owner of the link (defaults to user) + * @return boolean/int False (for db or param-error) or link_id for success */ function link( $app1,$id1,$app2,$id2,$remark='',$owner=0,$lastmod=0 ) { @@ -92,11 +87,12 @@ } /** - * @author ralfbecker * returns array of links to $app,$id * - * @param $only_app if set return only links from $only_app (eg. only addressbook-entries) or NOT from if $only_app[0]=='!' - * @param $order defaults to newest links first + * @param string $app appname + * @param string $id id in $app + * @param string $only_app if set return only links from $only_app (eg. only addressbook-entries) or NOT from if $only_app[0]=='!' + * @param string $order defaults to newest links first * @return array of links (only_app: ids) or empty array if no matching links found */ function get_links( $app,$id,$only_app='',$order='link_lastmod DESC' ) @@ -150,17 +146,18 @@ $link['lastmod'] = $row['link_lastmod']; $link['link_id'] = $row['link_id']; - $links[] = $only_app && !$not_only ? $link['id'] : $link; + $links[$row['link_id']] = $only_app && !$not_only ? $link['id'] : $link; } return $links; } /** - * @author ralfbecker * returns data of a link * - * @param $app_link_id > 0 link_id of link or app-name of link - * @param $id,$app2,$id2 other param of the link if not link_id given + * @param ing/string $app_link_id > 0 link_id of link or app-name of link + * @param string $id='' id in $app, if no integer link_id given in $app_link_id + * @param string $app2='' appname of 2. endpoint of the link, if no integer link_id given in $app_link_id + * @param string $id2='' id in $app2, if no integer link_id given in $app_link_id * @return array with link-data or False */ function get_link($app_link_id,$id='',$app2='',$id2='') @@ -210,20 +207,22 @@ } /** - * @author ralfbecker * Remove link with $link_id or all links matching given params * * @param $link_id link-id to remove if > 0 - * @param $app,$id,$owner,$app2,$id2 if $link_id <= 0: removes all links matching the non-empty params - * @return the number of links deleted + * @param string $app='' app-name of links to remove + * @param string $id='' id in $app or '' remove all links from $app + * @param int $owner=0 account_id to delete all links of a given owner, or 0 + * @param string $app2='' appname of 2. endpoint of the link + * @param string $id2='' id in $app2 + * @return array with deleted links */ - function unlink($link_id,$app='',$id='',$owner='',$app2='',$id2='') + function &unlink($link_id,$app='',$id='',$owner=0,$app2='',$id2='') { if ($this->debug) { echo "

solink.unlink($link_id,$app,$id,$owner,$app2,$id2)

\n"; } - $sql = "DELETE FROM $this->link_table WHERE "; if ((int)$link_id > 0) { $where = array('link_id' => $link_id); @@ -259,28 +258,36 @@ 'link_id2' => $id, ),')'); } - if ($owner != '') + if ($owner) { if ($app) $where = array($where); $where['link_owner'] = $owner; } } + $this->db->select($this->link_table,'*',$where,__LINE__,__FILE__); + $deleted = array(); + while (($row = $this->db->row(true))) + { + $deleted[] = $row; + } $this->db->delete($this->link_table,$where,__LINE__,__FILE__); - return $this->db->affected_rows(); + return $deleted; } /** - * @author ralfbecker * Changes ownership of all links from $owner to $new_owner * * This is needed when a user/account gets deleted * Does NOT change the modification-time - * @return the number of links changed + * + * @param int $owner acount_id of owner to change + * @param int $new_owner account_id of new owner + * @return int number of links changed */ function chown($owner,$new_owner) { - if ((int)$owner <= 0 || (int) $new_owner) + if ((int)$owner <= 0 || (int) $new_owner <= 0) { return 0; } @@ -289,6 +296,3 @@ return $this->db->affected_rows(); } } - - -