New feature: menu box which displays tags included into the special tag menu [Config modified]

git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@105 b3834d28-1941-0410-a4f8-b48e95affb8f
This commit is contained in:
mensonge 2008-04-17 08:02:09 +00:00
parent 39cf528515
commit 3e2854611b
7 changed files with 200 additions and 82 deletions

View file

@ -168,12 +168,11 @@ if ($templatename == 'editbookmark.tpl') {
} }
} else if ($user && !isset($_GET['popup'])) { } else if ($user && !isset($_GET['popup'])) {
$tplVars['sidebar_blocks'] = array('profile', 'watchstatus'); $tplVars['sidebar_blocks'] = array('profile', 'watchstatus', 'menu');
if (!$cat) { if (!$cat) {
$cat = NULL; $cat = NULL;
$tplVars['currenttag'] = NULL; $tplVars['currenttag'] = NULL;
$tplVars['sidebar_blocks'][] = 'linked'; //test
} else { } else {
$rssCat = '/'. filter($cat, 'url'); $rssCat = '/'. filter($cat, 'url');
$tplVars['currenttag'] = $cat; $tplVars['currenttag'] = $cat;

View file

@ -43,7 +43,7 @@ $top_include = 'top.inc.php';
# bottom_include: The footer file. # bottom_include: The footer file.
$bottom_include = 'bottom.inc.php'; $bottom_include = 'bottom.inc.php';
# sidebar block index : array ordering blocks search, users, linked, recent # sidebar block index : array ordering blocks search, users, linked, recent
$index_sidebar_blocks = array('search','users','linked','recent'); $index_sidebar_blocks = array('search', 'menu', 'recent', 'users');
# shortdate: The format of short dates. # shortdate: The format of short dates.
# longdate: The format of long dates. # longdate: The format of long dates.
@ -137,6 +137,11 @@ $enableCommonBookmarkDescription = true;
$enableWebsiteThumbnails = true; $enableWebsiteThumbnails = true;
$sizeSearchHistory = 10; $sizeSearchHistory = 10;
# name of the tag whose subtags will appear into the menu box
$menuTag = 'menu';
# maximum number of items (tags) appearing into menu box
$maxSizeMenuBlock = 7;
include_once('debug.inc.php'); include_once('debug.inc.php');
?> ?>

View file

@ -188,6 +188,31 @@ class Tag2TagService {
return $this->db->sql_fetchrowset($dbresult); return $this->db->sql_fetchrowset($dbresult);
} }
function getMenuTags($uId) {
if(strlen($GLOBALS['menuTag']) < 1) {
return array();
} else {
// we don't use the getAllLinkedTags function in order to improve performance
$query = "SELECT tag2 as 'tag', COUNT(tag2) as 'count'";
$query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE tag1 = '".$GLOBALS['menuTag']."'";
$query.= " AND relationType = '>'";
if($uId > 0) {
$query.= " AND uId = '".$uId."'";
}
$query.= " GROUP BY tag2";
$query.= " ORDER BY count DESC";
$query.= " LIMIT 0, ".$GLOBALS['maxSizeMenuBlock'];
if (! ($dbresult =& $this->db->sql_query($query)) ){
message_die(GENERAL_ERROR, 'Could not get linked tags', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
return $this->db->sql_fetchrowset($dbresult);
}
}
function existsLinkedTags($tag1, $tag2, $relationType, $uId) { function existsLinkedTags($tag1, $tag2, $relationType, $uId) {
$query = "SELECT tag1, tag2, relationType, uId FROM `". $this->getTableName() ."`"; $query = "SELECT tag1, tag2, relationType, uId FROM `". $this->getTableName() ."`";
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";

View file

@ -2,81 +2,7 @@
$tag2tagservice =& ServiceFactory::getServiceInstance('Tag2TagService'); $tag2tagservice =& ServiceFactory::getServiceInstance('Tag2TagService');
$userservice =& ServiceFactory::getServiceInstance('UserService'); $userservice =& ServiceFactory::getServiceInstance('UserService');
function displayLinkedTags($tag, $linkType, $uId, $cat_url, $user, $editingMode =false, $precedentTag =null, $level=0, $stopList=array()) { require_once('sidebar.linkedtags.inc.php');
if(in_array($tag, $stopList)) {
return array('output' => '', 'stoplist' => $stopList);
}
$tag2tagservice =& ServiceFactory::getServiceInstance('Tag2TagService');
$tagstatservice =& ServiceFactory::getServiceInstance('TagStatService');
// link '>'
if($level>1) {
if($editingMode) {
$link = '<small><a href="'.createURL('tag2tagedit', $precedentTag.'/'.$tag).'" title="'._('Edit link').'">></a> </small>';
} else {
$link = '> ';
}
}
$output = '';
$output.= '<tr>';
$output.= '<td></td>';
$output.= '<td>';
$output.= $level == 1?'<b>':'';
$output.= str_repeat('&nbsp;', $level*2) .$link.'<a href="'. sprintf($cat_url, filter($user, 'url'), filter($tag, 'url')) .'" rel="tag">'. filter($tag) .'</a>';
$output.= $level == 1?'</b>':'';
//$output.= ' - '. $tagstatservice->getMaxDepth($tag, $linkType, $uId);
$synonymTags = $tag2tagservice->getAllLinkedTags($tag, '=', $uId);
$synonymTags = is_array($synonymTags)?$synonymTags:array($synonymTags);
sort($synonymTags);
$synonymList = '';
foreach($synonymTags as $synonymTag) {
//$output.= ", ".$synonymTag;
$synonymList.= $synonymTag.' ';
}
if(count($synonymTags)>0) {
$output.= ', '.$synonymTags[0];
}
if(count($synonymTags)>1) {
$output.= '<span title="'.T_('Synonyms:').' '.$synonymList.'">, etc</span>';
}
/*if($editingMode) {
$output.= ' (';
$output.= '<a href="'.createURL('tag2tagadd', $tag).'" title="'._('Add a subtag').'">+</a>';
if(1) {
$output.= ' - ';
$output.= '<a href="'.createURL('tag2tagdelete', $tag).'">-</a>';
}
$output.= ')';
}*/
$output.= '</td>';
$output.= '</tr>';
$tags = array($tag);
$tags = array_merge($tags, $synonymTags);
foreach($tags as $tag) {
if(!in_array($tag, $stopList)) {
$linkedTags = $tag2tagservice->getLinkedTags($tag, '>', $uId);
$precedentTag = $tag;
$stopList[] = $tag;
foreach($linkedTags as $linkedTag) {
$displayLinkedTags = displayLinkedTags($linkedTag, $linkType, $uId, $cat_url, $user, $editingMode, $precedentTag, $level + 1, $stopList);
$output.= $displayLinkedTags['output'];
}
if(is_array($displayLinkedTags['stopList'])) {
$stopList = array_merge($stopList, $displayLinkedTags['stopList']);
$stopList = array_unique($stopList);
}
}
}
return array('output' => $output, 'stopList' => $stopList);
}
$logged_on_userid = $userservice->getCurrentUserId(); $logged_on_userid = $userservice->getCurrentUserId();
if ($logged_on_userid === false) { if ($logged_on_userid === false) {
@ -115,7 +41,7 @@ if(($logged_on_userid != null) && ($userid === $logged_on_userid)) {
echo T_('Linked Tags').' '; echo T_('Linked Tags').' ';
//if($userid != null) { //if($userid != null) {
$cUser = $userservice->getUser($userid); $cUser = $userservice->getUser($userid);
echo '<a href="'.createURL('alltags', $cUser['username']).'">('.T_('plus').')</a>'; echo '<small><a href="'.createURL('alltags', $cUser['username']).'">('.T_('all tags').')</a></small>';
//} //}
?> ?>
</h2> </h2>

View file

@ -0,0 +1,64 @@
<?php
$tag2tagservice =& ServiceFactory::getServiceInstance('Tag2TagService');
$userservice =& ServiceFactory::getServiceInstance('UserService');
require_once('sidebar.linkedtags.inc.php');
$logged_on_userid = $userservice->getCurrentUserId();
if ($logged_on_userid === false) {
$logged_on_userid = NULL;
}
// editing mode
if(($logged_on_userid != null) && ($userid === $logged_on_userid)) {
$editingMode = true;
} else {
$editingMode = false;
}
if(strlen($user)==0) {
$cat_url = createURL('tags', '%2$s');
}
$menuTags = $tag2tagservice->getMenuTags($userid);
if (sizeof($menuTags) > 0) {
?>
<h2>
<?php
echo '<span title="'.sprintf(T_('Tags included into the tag \'%s\''), $GLOBALS['menuTag']).'">'.T_('Menu Tags').'</span> ';
$cUser = $userservice->getUser($userid);
echo '<small span title="'.T_('See all tags').'"><a href="'.createURL('alltags', $cUser['username']).'">('.T_('all tags').')</a></small>';
//}
?>
</h2>
<div id="related">
<table>
<?php
if($editingMode) {
echo '<tr><td></td><td>';
echo ' (<a href="'. createURL('tag2tagadd','') .'" rel="tag">'.T_('Add new link').'</a>) ';
echo ' (<a href="'. createURL('tag2tagdelete','') .'" rel="tag">'.T_('Delete link').'</a>)';
echo '</td></tr>';
}
$stopList = array();
foreach($menuTags as $menuTag) {
$tag = $menuTag['tag'];
if(!in_array($tag, $stopList)) {
$displayLinkedTags = displayLinkedTags($tag, '>', $userid, $cat_url, $user, $editingMode, null, 1);
echo $displayLinkedTags['output'];
if(is_array($displayLinkedTags['stopList'])) {
$stopList = array_merge($stopList, $displayLinkedTags['stopList']);
}
}
}
?>
</table>
</div>
<?php
}
?>

View file

@ -0,0 +1,82 @@
<?php
/*
To be inserted into blocks where structured tags must be displayed in a tree format.
*/
function displayLinkedTags($tag, $linkType, $uId, $cat_url, $user, $editingMode =false, $precedentTag =null, $level=0, $stopList=array()) {
if(in_array($tag, $stopList)) {
return array('output' => '', 'stoplist' => $stopList);
}
$tag2tagservice =& ServiceFactory::getServiceInstance('Tag2TagService');
$tagstatservice =& ServiceFactory::getServiceInstance('TagStatService');
// link '>'
if($level>1) {
if($editingMode) {
$link = '<small><a href="'.createURL('tag2tagedit', $precedentTag.'/'.$tag).'" title="'._('Edit link').'">></a> </small>';
} else {
$link = '> ';
}
}
$output = '';
$output.= '<tr>';
$output.= '<td></td>';
$output.= '<td>';
$output.= $level == 1?'<b>':'';
$output.= str_repeat('&nbsp;', $level*2) .$link.'<a href="'. sprintf($cat_url, filter($user, 'url'), filter($tag, 'url')) .'" rel="tag">'. filter($tag) .'</a>';
$output.= $level == 1?'</b>':'';
//$output.= ' - '. $tagstatservice->getMaxDepth($tag, $linkType, $uId);
$synonymTags = $tag2tagservice->getAllLinkedTags($tag, '=', $uId);
$synonymTags = is_array($synonymTags)?$synonymTags:array($synonymTags);
sort($synonymTags);
$synonymList = '';
foreach($synonymTags as $synonymTag) {
//$output.= ", ".$synonymTag;
$synonymList.= $synonymTag.' ';
}
if(count($synonymTags)>0) {
$output.= ', '.$synonymTags[0];
}
if(count($synonymTags)>1) {
$output.= '<span title="'.T_('Synonyms:').' '.$synonymList.'">, etc</span>';
}
/*if($editingMode) {
$output.= ' (';
$output.= '<a href="'.createURL('tag2tagadd', $tag).'" title="'._('Add a subtag').'">+</a>';
if(1) {
$output.= ' - ';
$output.= '<a href="'.createURL('tag2tagdelete', $tag).'">-</a>';
}
$output.= ')';
}*/
$output.= '</td>';
$output.= '</tr>';
$tags = array($tag);
$tags = array_merge($tags, $synonymTags);
foreach($tags as $tag) {
if(!in_array($tag, $stopList)) {
$linkedTags = $tag2tagservice->getLinkedTags($tag, '>', $uId);
$precedentTag = $tag;
$stopList[] = $tag;
foreach($linkedTags as $linkedTag) {
$displayLinkedTags = displayLinkedTags($linkedTag, $linkType, $uId, $cat_url, $user, $editingMode, $precedentTag, $level + 1, $stopList);
$output.= $displayLinkedTags['output'];
}
if(is_array($displayLinkedTags['stopList'])) {
$stopList = array_merge($stopList, $displayLinkedTags['stopList']);
$stopList = array_unique($stopList);
}
}
}
return array('output' => $output, 'stopList' => $stopList);
}
?>

View file

@ -457,10 +457,27 @@ class Tag2TagTest extends PHPUnit_Framework_TestCase
$linkedTags = $tts->getLinkedTags('b', '>', 2); $linkedTags = $tts->getLinkedTags('b', '>', 2);
$this->assertSame(array('a'), $linkedTags); $this->assertSame(array('a'), $linkedTags);
//with stats //with stats
} }
// Cannot be test because the function use GLOBALS variables
// not taken into account by tests
/*public function testMenuTags()
{
$tts = $this->tts;
$bs = $this->bs;
$bs->addBookmark("http://site1.com", "title", "description", "status", array('menu>tag1'), null, false, false, 1);
$bs->addBookmark("http://site1.com", "title2", "description2", "status", array('menu>tag2>tag3'), null, false, false, 1);
$bs->addBookmark("http://site1.com", "title3", "description3", "status", array('menu>tag1', 'menu>tag4'), null, false, false, 2);
$menuTags = $tts->getMenuTags($uId);
$this->assertEquals(3, sizeof($menuTags));
$this->assertContains('tag1', $menuTags);
$this->assertContains('tag2', $menuTags);
$this->assertContains('tag4', $menuTags);
}*/
} }
?> ?>