From: <sy...@us...> - 2009-11-24 21:48:52
|
Revision: 23494 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=23494&view=rev Author: sylvieg Date: 2009-11-24 21:48:44 +0000 (Tue, 24 Nov 2009) Log Message: ----------- [NEW]fgal: backlink to files for wiki page (only the last version) + blog: warning when you want to delete a file that has backlinks Modified Paths: -------------- trunk/db/tiki-4.0-mysql.sql trunk/db/tiki-4.0-mysqli.sql trunk/db/tiki-4.0-pgsql.sql trunk/db/tiki.sql trunk/lib/blogs/bloglib.php trunk/lib/filegals/filegallib.php trunk/lib/tikilib.php trunk/templates/confirm.tpl trunk/tiki-list_file_gallery.php Added Paths: ----------- trunk/installer/schema/20091124_fgal_backlink_tiki.sql Modified: trunk/db/tiki-4.0-mysql.sql =================================================================== --- trunk/db/tiki-4.0-mysql.sql 2009-11-24 21:33:32 UTC (rev 23493) +++ trunk/db/tiki-4.0-mysql.sql 2009-11-24 21:48:44 UTC (rev 23494) @@ -3465,7 +3465,7 @@ `page_name` varchar(160) NOT NULL, `score` float default NULL, PRIMARY KEY (`list_type_id`,`page_name`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; +) ENGINE=MyISAM; DROP TABLE IF EXISTS `tiki_page_list_types`; CREATE TABLE IF NOT EXISTS `tiki_page_list_types` ( @@ -3475,7 +3475,7 @@ `description` varchar(200) default NULL, PRIMARY KEY (`name`), UNIQUE KEY `id` (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; +) ENGINE=MyISAM AUTO_INCREMENT=1 ; DROP TABLE IF EXISTS `tiki_auth_tokens`; CREATE TABLE `tiki_auth_tokens` ( @@ -3489,7 +3489,6 @@ PRIMARY KEY( `tokenId` ), KEY `tiki_auth_tokens_token` (`token`) ); --- -------------------------------------------------------- DROP TABLE IF EXISTS `metrics_assigned`; CREATE TABLE `metrics_assigned` ( @@ -3524,3 +3523,12 @@ UNIQUE KEY `tab_name` (`tab_name`) ); +DROP TABLE IF EXISTS `tiki_file_backlinks`; +CREATE TABLE `tiki_file_backlinks` ( + `fileId` int(14) NOT NULL, + `objectId` int(12) NOT NULL, + KEY `objectId` (`objectId`), + KEY `fileId` (`fileId`) +); + + Modified: trunk/db/tiki-4.0-mysqli.sql =================================================================== --- trunk/db/tiki-4.0-mysqli.sql 2009-11-24 21:33:32 UTC (rev 23493) +++ trunk/db/tiki-4.0-mysqli.sql 2009-11-24 21:48:44 UTC (rev 23494) @@ -3465,7 +3465,7 @@ `page_name` varchar(160) NOT NULL, `score` float default NULL, PRIMARY KEY (`list_type_id`,`page_name`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; +) ENGINE=MyISAM; DROP TABLE IF EXISTS `tiki_page_list_types`; CREATE TABLE IF NOT EXISTS `tiki_page_list_types` ( @@ -3475,7 +3475,7 @@ `description` varchar(200) default NULL, PRIMARY KEY (`name`), UNIQUE KEY `id` (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; +) ENGINE=MyISAM AUTO_INCREMENT=1 ; DROP TABLE IF EXISTS `tiki_auth_tokens`; CREATE TABLE `tiki_auth_tokens` ( @@ -3489,7 +3489,6 @@ PRIMARY KEY( `tokenId` ), KEY `tiki_auth_tokens_token` (`token`) ); --- -------------------------------------------------------- DROP TABLE IF EXISTS `metrics_assigned`; CREATE TABLE `metrics_assigned` ( @@ -3524,3 +3523,12 @@ UNIQUE KEY `tab_name` (`tab_name`) ); +DROP TABLE IF EXISTS `tiki_file_backlinks`; +CREATE TABLE `tiki_file_backlinks` ( + `fileId` int(14) NOT NULL, + `objectId` int(12) NOT NULL, + KEY `objectId` (`objectId`), + KEY `fileId` (`fileId`) +); + + Modified: trunk/db/tiki-4.0-pgsql.sql =================================================================== --- trunk/db/tiki-4.0-pgsql.sql 2009-11-24 21:33:32 UTC (rev 23493) +++ trunk/db/tiki-4.0-pgsql.sql 2009-11-24 21:48:44 UTC (rev 23494) @@ -4478,7 +4478,7 @@ "page_name" varchar(160) NOT NULL, "score" float default NULL, PRIMARY KEY ("list_type_id","page_name") -) DEFAULT CHARSET=latin1; +); DROP TABLE IF EXISTS "tiki_page_list_types"; @@ -4490,7 +4490,7 @@ "description" varchar(200) default NULL, PRIMARY KEY ("name"), UNIQUE ("id") -) DEFAULT CHARSET=latin1 ; +) ; DROP TABLE IF EXISTS "tiki_auth_tokens"; @@ -4507,7 +4507,6 @@ ); CREATE INDEX "tiki_auth_tokens_tiki_auth_tokens_token" ON "tiki_auth_tokens" ("token"); --- -------------------------------------------------------- DROP TABLE IF EXISTS "metrics_assigned"; @@ -4548,5 +4547,16 @@ ); +DROP TABLE IF EXISTS "tiki_file_backlinks"; + +CREATE TABLE "tiki_file_backlinks" ( + "fileId" bigint NOT NULL, + "objectId" bigint NOT NULL +); +CREATE INDEX "tiki_file_backlinks_tiki_file_backlinks_objectId" ON "tiki_file_backlinks" ("objectId"); +CREATE INDEX "tiki_file_backlinks_tiki_file_backlinks_fileId" ON "tiki_file_backlinks" ("fileId"); + + + ; Modified: trunk/db/tiki.sql =================================================================== --- trunk/db/tiki.sql 2009-11-24 21:33:32 UTC (rev 23493) +++ trunk/db/tiki.sql 2009-11-24 21:48:44 UTC (rev 23494) @@ -3465,7 +3465,7 @@ `page_name` varchar(160) NOT NULL, `score` float default NULL, PRIMARY KEY (`list_type_id`,`page_name`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; +) ENGINE=MyISAM; DROP TABLE IF EXISTS `tiki_page_list_types`; CREATE TABLE IF NOT EXISTS `tiki_page_list_types` ( @@ -3475,7 +3475,7 @@ `description` varchar(200) default NULL, PRIMARY KEY (`name`), UNIQUE KEY `id` (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; +) ENGINE=MyISAM AUTO_INCREMENT=1 ; DROP TABLE IF EXISTS `tiki_auth_tokens`; CREATE TABLE `tiki_auth_tokens` ( @@ -3489,7 +3489,6 @@ PRIMARY KEY( `tokenId` ), KEY `tiki_auth_tokens_token` (`token`) ); --- -------------------------------------------------------- DROP TABLE IF EXISTS `metrics_assigned`; CREATE TABLE `metrics_assigned` ( @@ -3524,3 +3523,12 @@ UNIQUE KEY `tab_name` (`tab_name`) ); +DROP TABLE IF EXISTS `tiki_file_backlinks`; +CREATE TABLE `tiki_file_backlinks` ( + `fileId` int(14) NOT NULL, + `objectId` int(12) NOT NULL, + KEY `objectId` (`objectId`), + KEY `fileId` (`fileId`) +); + + Added: trunk/installer/schema/20091124_fgal_backlink_tiki.sql =================================================================== --- trunk/installer/schema/20091124_fgal_backlink_tiki.sql (rev 0) +++ trunk/installer/schema/20091124_fgal_backlink_tiki.sql 2009-11-24 21:48:44 UTC (rev 23494) @@ -0,0 +1,6 @@ +CREATE TABLE `tiki_file_backlinks` ( + `fileId` int(14) NOT NULL, + `objectId` int(12) NOT NULL, + KEY `objectId` (`objectId`), + KEY `fileId` (`fileId`) +); \ No newline at end of file Modified: trunk/lib/blogs/bloglib.php =================================================================== --- trunk/lib/blogs/bloglib.php 2009-11-24 21:33:32 UTC (rev 23493) +++ trunk/lib/blogs/bloglib.php 2009-11-24 21:48:44 UTC (rev 23494) @@ -156,6 +156,7 @@ $query = "update `tiki_blogs` set `title`=? ,`description`=?,`user`=?,`public`=?,`lastModif`=?,`maxPosts`=?,`heading`=?,`use_title`=?,`use_find`=?,`allow_comments`=?,`show_avatar`=? where `blogId`=?"; $result = $this->query($query, array($title, $description, $user, $public, $this->now, $maxPosts, $heading, $use_title, $use_find, $allow_comments, $show_avatar, $blogId)); + $this->syncParsedText($heading, array('type'=>'blog', 'object'=>$blogId)); } else { $query = "insert into `tiki_blogs`(`created`,`lastModif`,`title`,`description`,`user`,`public`,`posts`,`maxPosts`,`hits`,`heading`,`use_title`,`use_find`,`allow_comments`,`show_avatar`) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; @@ -166,6 +167,7 @@ if ($prefs['feature_score'] == 'y') { $this->score_event($user, 'blog_new'); } + $this->syncParsedText($heading, array('type'=>'blog', 'object'=>$blogId, 'description'=>$description, 'name'=>$title, 'href'=>"tiki-view_blog.php?blogId=$blogId")); } if ( $prefs['feature_search'] == 'y' && $prefs['feature_search_fulltext'] != 'y' && $prefs['search_refresh_index_mode'] == 'normal' ) { @@ -420,6 +422,7 @@ require_once('lib/search/refresh-functions.php'); refresh_index('blog_posts', $id); } + $this->syncParsedText($data, array('type'=>'blog post', 'object'=>$id, 'description'=>substr($edit_data, 0, 200), 'name'=>$title, 'href'=>"tiki-view_blog_post.php?postId=$id")); return $id; } @@ -527,6 +530,7 @@ require_once('lib/search/refresh-functions.php'); refresh_index('blog_posts', $postId); } + $this->syncParsedText($data, array('type'=>'blog post', 'object'=>$postId)); } /** Modified: trunk/lib/filegals/filegallib.php =================================================================== --- trunk/lib/filegals/filegallib.php 2009-11-24 21:33:32 UTC (rev 23493) +++ trunk/lib/filegals/filegallib.php 2009-11-24 21:48:44 UTC (rev 23494) @@ -27,6 +27,7 @@ $savedir=$prefs['fgal_use_dir']; } + $this->deleteBacklinks(null, $fileInfo['fileId']); if ($fileInfo['path']) { unlink ($savedir . $fileInfo['path']); } @@ -1080,6 +1081,87 @@ return false; } return true; - } + } + // update backlinks of an object + function replaceBacklinks($context, $fileIds=array()) { + global $objectlib; include_once('lib/objectlib.php'); + $objectId = $objectlib->get_object_id($context['type'], $context['object']); + if (empty($objectId)) { + $objectId = $objectlib->add_object($context['type'], $context['object'], $context['description'], $context['name'], $context['href']); + } + $this->_replaceBacklinks($objectId, $fileIds); + } + function _replaceBacklinks($objectId, $fileIds=array()) { + $this->_deleteBacklinks($objectId); + $query = 'insert into `tiki_file_backlinks` (`objectId`, `fileId`) values(?,?)'; + foreach ($fileIds as $fileId) { + $this->query($query, array((int)$objectId, (int)$fileId)); + } + } + // delete backlinks associated to an object + function deleteBacklinks($context, $fileId=null) { + if (empty($fileId)) { + global $objectlib; include_once('lib/objectlib.php'); + $objectId = $objectlib->get_object_id($context['type'], $context['object']); + if (!empty($objectId)) { + $this->_deleteBacklinks($objectId); + } + } else { + $this->_deleteBacklinks(null, $fileId); + } + } + function _deleteBacklinks($objectId, $fileId=null) { + if (empty($fileId)) { + $query = 'delete from `tiki_file_backlinks` where `objectId`=?'; + $this->query($query, array((int)$objectId)); + } else { + $query = 'delete from `tiki_file_backlinks` where `fileId`=?'; + $this->query($query, array((int)$fileId)); + } + } + // get the backlinks of an object + function getFileBacklinks($fileId) { + $query = 'select tob.* from `tiki_file_backlinks` tfb left join `tiki_objects` tob on (tob.`objectId`=tfb.`objectId`) where `fileId`=? '; + return $this->fetchAll($query, array((int)$fileId)); + } + // sync the backlinks used by a text of an object + function syncFileBacklinks($data, $context) { + global $tikilib; + $fileIds = array(); + $plugins = $tikilib->getPlugins($data, array('IMG', 'FILE')); + foreach ($plugins as $plugin) { + if (!empty($plugin['arguments']['fileId'])) { + $fileIds[] = $plugin['arguments']['fileId']; + } + if (!empty($plugin['arguments']['src']) && $fileId = $this->getLinkFileId($plugin['arguments']['src'])) { + $fileIds[] = $fileId; + } + } + if (preg_match_all('/\[(+*)\]/Umi', $data, $matches)) { + foreach ($matches as $match) { + if ($fileId = $this->getLinkFileId($match[1])) { + $fileIds[] = $fileId; + } + } + } + if (preg_match_all('/<a[^>]*href=(\'|\")?([^>*])/Umi', $data, $matches)) { + foreach ($matches as $match) { + if ($fileId = $this->getLinkFileId($match[2])) { + $fileIds[] = $fileId; + } + } + } + $fileIds = array_unique($fileIds); + $this->replaceBacklinks($context, $fileIds); + return $fileIds; + } + function getLinkFileId($url) { + if (preg_match('/^tiki-download_file.php\?.*fileId=([0-9]+)/', $url, $matches)) { + return $matches[1]; + } + if (preg_match('/^(dl|preview|thumbnail|thumb||display)([0-9]+)/', $url, $matches)) { + return $matches[2]; + } + } } $filegallib = new FileGalLib; Modified: trunk/lib/tikilib.php =================================================================== --- trunk/lib/tikilib.php 2009-11-24 21:33:32 UTC (rev 23493) +++ trunk/lib/tikilib.php 2009-11-24 21:48:44 UTC (rev 23494) @@ -3862,6 +3862,10 @@ $this->query($query, array(NULL, $page)); $query = 'delete from `tiki_theme_control_objects` where `name`=? and `type`=?'; $this->query($query, array($page, 'wiki page')); + if ( $prefs['feature_file_galleries'] == 'y') { + global $filegallib; require_once 'lib/filegals/filegallib.php'; + $filegallib->deleteBacklinks(array('type'=> 'wiki page', 'object'=> $page)); + } $this->remove_object('wiki page', $page); $query = "delete from `tiki_user_watches` where `event`=? and `object`=?"; @@ -4885,6 +4889,9 @@ require_once('lib/search/refresh-functions.php'); refresh_index('pages', $name); } + + $this->syncParsedText($data, array('type'=> 'wiki page', 'object'=> $page, 'description'=> $description, 'name'=>$page, 'href'=>"tiki-index.php?page=$page")); + return true; } @@ -5224,7 +5231,22 @@ return $arguments; } - + // get all the plugins of a text- can be limitted only to some + function getPlugins($data, $only=null) { + $plugins = array(); + for (; ;) { + $this->plugin_match($data, $plugin); + if (empty($plugin)) { + break; + } + if (empty($only) || in_array($plugin[1], $only) || in_array(strtoupper($plugin[1]), $only)) { + $plugins[] = $plugin; + } + $pos = strpos( $data, $plugin[0] ); + $data = substr_replace($data, '', $pos, strlen($plugin[0])); + } + return $plugins; + } // This recursive function handles pre- and no-parse sections and plugins function parse_first(&$data, &$preparsed, &$noparsed, $options=null, $real_start_diff='0') { global $dbTiki, $smarty, $tiki_p_edit, $prefs, $pluginskiplist; @@ -7644,7 +7666,15 @@ require_once('lib/search/refresh-functions.php'); refresh_index('pages', $pageName); } + $this->syncParsedText($edit_data, array('type'=>'wiki page', 'object'=>$pageName)); } + function syncParsedText($text, $context) { + global $prefs; + if ( $prefs['feature_file_galleries'] == 'y') { + global $filegallib; require_once 'lib/filegals/filegallib.php'; + $filegallib->syncFileBacklinks($text, $context); + } + } function update_page_version($pageName, $version, $edit_data, $edit_comment, $edit_user, $edit_ip, $lastModif, $description = '', $lang='') { global $smarty; Modified: trunk/templates/confirm.tpl =================================================================== --- trunk/templates/confirm.tpl 2009-11-24 21:33:32 UTC (rev 23493) +++ trunk/templates/confirm.tpl 2009-11-24 21:48:44 UTC (rev 23494) @@ -3,6 +3,7 @@ {if !empty($confirmation_text)} <div class="cbox-title">{icon _id=information style="vertical-align:middle"} {$confirmation_text}</div> {/if} + {$confirm_detail} <br /> <div class="cbox-title"> <form name='confirm' action="{$confirmaction|escape}" method="post"> Modified: trunk/tiki-list_file_gallery.php =================================================================== --- trunk/tiki-list_file_gallery.php 2009-11-24 21:33:32 UTC (rev 23493) +++ trunk/tiki-list_file_gallery.php 2009-11-24 21:48:44 UTC (rev 23494) @@ -197,11 +197,20 @@ die; } } + $backlinks = $filegallib->getFileBacklinks($_REQUEST['remove']); + if (!empty($backlinks)) { + $prefs['feature_ticketlib2'] = 'y'; + } $area = 'delfile'; if ($prefs['feature_ticketlib2'] != 'y' or (isset($_POST['daconfirm']) and isset($_SESSION["ticket_$area"]))) { key_check($area); $filegallib->remove_file($info, $gal_info); } else { + if (!empty($backlinks)) { + $smarty->assign_by_ref('backlinks', $backlinks); + $smarty->assign('file_backlinks_title', 'WARNING: The file is used in:');//get_strings tra('WARNING: The file is used in:') + $smarty->assign('confirm_detail', $smarty->fetch('file_backlinks.tpl')); + } key_get($area, tra('Remove file: ') . (!empty($info['name']) ? $info['name'] . ' - ' : '') . $info['filename']); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |