make linkedtags sidebar tree menu work with jquery/jstree now

This commit is contained in:
Christian Weiske 2010-10-09 10:20:14 +02:00
parent aaf293b18d
commit 22e46a9b45
3 changed files with 193 additions and 145 deletions

View File

@ -1,4 +1,11 @@
<?php
/*
* Used in:
* - populartags.php
* - bookmarks.php
* - alltags.php
* - tags.php
*/
/* Service creation: only useful services are created */
$tag2tagservice =SemanticScuttle_Service_Factory::get('Tag2Tag');
@ -8,98 +15,50 @@ require_once('sidebar.linkedtags.inc.php');
$user = isset($user)?$user:'';
$userid = isset($userid)?$userid:0;
$currenttag = isset($currenttag)?$currenttag:'';
$summarizeLinkedTags = isset($summarizeLinkedTags)?$summarizeLinkedTags:false;
//$summarizeLinkedTags = isset($summarizeLinkedTags)?$summarizeLinkedTags:false;
$logged_on_userid = $userservice->getCurrentUserId();
if ($logged_on_userid === false) {
$logged_on_userid = NULL;
}
$explodedTags = array();
if (strlen($currenttag)>0) {
$explodedTags = explode('+', $currenttag);
} else {
if($summarizeLinkedTags == true) {
$orphewTags = $tag2tagservice->getOrphewTags('>', $userid, 4, "nb");
} else {
$orphewTags = $tag2tagservice->getOrphewTags('>', $userid);
}
foreach($orphewTags as $orphewTag) {
$explodedTags[] = $orphewTag['tag'];
}
}
$editingMode = $logged_on_userid !== false;
?>
<h2><?php echo T_('Linked Tags'); ?></h2>
<div id="related">
<?php
if(($logged_on_userid != null) && ($userid === $logged_on_userid)) {
$editingMode = true;
} else {
$editingMode = false;
}
$this->includeTemplate("dojo.inc");
?>
<?php if(count($explodedTags)>0 || $editingMode):?>
<h2><?php
echo T_('Linked Tags').' ';
//if($userid != null) {
$cUser = $userservice->getUser($userid);
//echo '<small><a href="'.createURL('alltags', $cUser['username']).'">('.T_('all tags').')</a></small>';
//}
?></h2>
<?php //endif?>
<div id="related"> <?php
if($editingMode) {
if ($editingMode) {
echo '<p style="margin-bottom: 13px;text-align:center;">';
echo ' (<a href="'. createURL('tag2tagadd','') .'" rel="tag">'.T_('Add new link').'</a>) ';
echo ' (<a href="'. createURL('tag2tagdelete','') .'" rel="tag">'.T_('Delete link').'</a>)';
echo '</p>';
}
if(strlen($user)==0) {
$cat_url = createURL('tags', '%2$s');
}
$stopList = array();
foreach($explodedTags as $explodedTag) {
if(!in_array($explodedTag, $stopList)) {
// fathers tag
$fatherTags = $tag2tagservice->getLinkedTags($explodedTag, '>', $userid, true);
if(count($fatherTags)>0) {
foreach($fatherTags as $fatherTag) {
echo '<a href="'. sprintf($cat_url, filter($user, 'url'), filter($fatherTag, 'url')) .'" rel="tag">('. filter($fatherTag) .')</a> ';
}
}
/*
$displayLinkedTags = displayLinkedTags($explodedTag, '>', $userid, $cat_url, $user, $editingMode, null, 1);
echo $displayLinkedTags['output'];
if(is_array($displayLinkedTags['stopList'])) {
$stopList = array_merge($stopList, $displayLinkedTags['stopList']);
}*/
echo '<div dojoType="dojo.data.ItemFileReadStore" url="'.ROOT.'ajax/getlinkedtags.php?tag='.filter($explodedTag, 'url').'&amp;uId='.$userid.'" jsid="linkedTagStore" ></div>';
echo '<div dojoType="dijit.Tree" store="linkedTagStore" labelAttr="name" >';
echo '<script type="dojo/method" event="onClick" args="item">';
$returnUrl = sprintf($cat_url, filter($user, 'url'), filter('', 'url'));
echo 'window.location = "'.$returnUrl.'"+item.name';
echo '</script>';
echo '<script type="dojo/method" event="getLabelClass" args="item">';
echo 'return \'treeTag\';';
echo '</script>';
echo '</div>';
}
}
?> </div>
<?php endif?>
?>
<script type="text/javascript" src="<?php echo ROOT ?>js/jquery-1.4.2.js"></script>
<script type="text/javascript" src="<?php echo ROOT ?>js/jquery.jstree.js"></script>
<script type="text/javascript">
jQuery("#related")
.jstree({
"themes" : {
"theme": "default",
"dots": false,
"icons": true,
"url": '<?php echo ROOT ?>js/themes/default/style.css'
},
"json_data" : {
"ajax" : {
"url": function(node) {
//-1 is root
parent = "";
if (node == -1 ) {
node = <?php echo json_encode($currenttag); ?>;
parent = "&amp;parent=true";
} else if (node.attr('rel')) {
node = node.attr('rel');
} else {
return;
}
return "<?php echo ROOT ?>ajax/getlinkedtags.php?tag=" + node + parent;
}
}
},
plugins : [ "themes", "json_data"]
});
</script>
</div>

View File

@ -22,7 +22,16 @@
$httpContentType = 'application/json';
require_once '../www-header.php';
function assembleTagData($tag, SemanticScuttle_Service_Tag2Tag $t2t)
/**
* Creates and returns an array of tags for the jsTree ajax loader.
* If the tag is empty, the configured menu2 (admin) main tags are used.
*
* @param string $tag Tag name to fetch subtags for
* @param SemanticScuttle_Service_Tag2Tag $t2t Tag relation service
*
* @return array Array of tag data suitable for the jsTree ajax loader
*/
function assembleAdminTagData($tag, SemanticScuttle_Service_Tag2Tag $t2t)
{
if ($tag == '') {
$linkedTags = $GLOBALS['menu2Tags'];
@ -45,7 +54,8 @@ function assembleTagData($tag, SemanticScuttle_Service_Tag2Tag $t2t)
* Creates an jsTree json array for the given tag
*
* @param string $tag Tag name
* @param boolean $hasChildren If the tag has subtags (children) or not
* @param boolean $hasChildren If the tag has subtags (children) or not.
* If unsure, set it to "true".
*
* @return array Array to be sent back to the browser as json
*/
@ -74,7 +84,7 @@ function createTagArray($tag, $hasChildren = true)
$tag = isset($_GET['tag']) ? trim($_GET['tag']) : '';
$tagData = assembleTagData(
$tagData = assembleAdminTagData(
$tag,
SemanticScuttle_Service_Factory::get('Tag2Tag')
);

View File

@ -1,64 +1,143 @@
<?php
/***************************************************************************
Copyright (C) 2004 - 2006 Scuttle project
http://sourceforge.net/projects/scuttle/
http://scuttle.org/
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/
/* Return a json file with list of linked tags */
/**
* Returns a list of tags linked to the given one,
* suitable for jsTree consumption.
*
* Accepted GET parameters:
*
* @param string $tag Tag for which the children tags shall be returned
* Multiple tags (separated with space or "+") are
* supported.
* If no tag is given, all top-level tags are loaded.
* @param integer $uId User ID to fetch the tags for
* @param boolean $parent Load parent tags
*
* SemanticScuttle - your social bookmark manager.
*
* PHP version 5.
*
* @category Bookmarking
* @package SemanticScuttle
* @subpackage Templates
* @author Benjamin Huynh-Kim-Bang <mensonge@users.sourceforge.net>
* @author Christian Weiske <cweiske@cweiske.de>
* @author Eric Dane <ericdane@users.sourceforge.net>
* @license GPL http://www.gnu.org/licenses/gpl.html
* @link http://sourceforge.net/projects/semanticscuttle
*/
$httpContentType = 'application/json';
#$httpContentType = 'text/plain';
require_once '../www-header.php';
/* Service creation: only useful services are created */
$b2tservice =SemanticScuttle_Service_Factory::get('Bookmark2Tag');
$bookmarkservice =SemanticScuttle_Service_Factory::get('Tag');
$tagstatservice =SemanticScuttle_Service_Factory::get('TagStat');
$tag = isset($_GET['tag']) ? $_GET['tag'] : null;
$uId = isset($_GET['uId']) ? (int)$_GET['uId'] : 0;
$loadParentTags = isset($_GET['parent']) ? (bool)$_GET['parent'] : false;
/* Managing all possible inputs */
isset($_GET['tag']) ? define('GET_TAG', $_GET['tag']): define('GET_TAG', '');
isset($_GET['uId']) ? define('GET_UID', $_GET['uId']): define('GET_UID', '');
function displayTag($tag, $uId) {
$uId = ($uId==0)?NULL:$uId; // if user is nobody, NULL allows to look for every public tags
$tag2tagservice =SemanticScuttle_Service_Factory::get('Tag2Tag');
$output = '{ id:'.rand().', name:\''.$tag.'\'';
$linkedTags = $tag2tagservice->getLinkedTags($tag, '>', $uId);
if(count($linkedTags) > 0) {
$output.= ', children: [';
foreach($linkedTags as $linkedTag) {
$output.= displayTag($linkedTag, $uId);
}
$output = substr($output, 0, -1); // remove final comma avoiding IE6 Dojo bug
$output.= "]";
}
$output.= '},';
return $output;
$tags = explode(' ', trim($tag));
if (count($tags) == 1 && $tags[0] == '') {
//no tags
$tags = array();
}
?>
{ label: 'name', identifier: 'id', items: [
<?php
$json = displayTag(GET_TAG, intval(GET_UID));
$json = substr($json, 0, -1); // remove final comma avoiding IE6 Dojo bug
echo $json;
?>
] }
function assembleLinkedTagData(
$tags, $uId, $loadParentTags, SemanticScuttle_Service_Tag2Tag $t2t
) {
$tagData = array();
if (count($tags) == 0) {
//no tags given -> show the 4 most used top-level tags
$orphewTags = $t2t->getOrphewTags('>', $uId, 4, 'nb');
#$orphewTags = $t2t->getOrphewTags('>', $uId);
foreach ($orphewTags as $orphewTag) {
$tags[] = $orphewTag['tag'];
}
$loadParentTags = true;
}
if ($loadParentTags) {
//find parent tags + append the selected tags as children afterwards
foreach ($tags as $tag) {
$parentTags = $t2t->getLinkedTags($tag, '>', $uId, true);
if (count($parentTags) > 0) {
foreach ($parentTags as $parentTag) {
$ta = createTagArray(
$parentTag, true, true, true
);
//FIXME: find out if there are subtags
$tac = createTagArray($tag, true);
$ta['children'][] = $tac;
$tagData[] = $ta;
}
} else {
//no parent tags -> display it normally
//FIXME: find out if there are subtags
$tagData[] = createTagArray($tag, true);
}
}
} else {
//just find the linked tags
foreach ($tags as $tag) {
$linkedTags = $t2t->getLinkedTags($tag, '>', $uId);
foreach ($linkedTags as $linkedTag) {
//FIXME: find out if there are subtags
$tagData[] = createTagArray($linkedTag, true);
}
}
}
return $tagData;
}
/**
* Creates an jsTree json array for the given tag
*
* @param string $tag Tag name
* @param boolean $hasChildren If the tag has subtags (children) or not.
* If unsure, set it to "true".
* @param boolean $isOpen If the tag has children: Is the tree node open
* or closed?
* @param boolean $autoParent If the tag is an automatically generated parent tag
*
* @return array Array to be sent back to the browser as json
*/
function createTagArray($tag, $hasChildren = true, $isOpen = false, $autoParent = false)
{
if ($autoParent) {
$title = '(' . $tag . ')';
} else {
$title = $tag;
}
$ar = array(
'data' => array(
//<a> attributes
'title' => $title,
'attr' => array(
'href' => createUrl('tags', $tag)
)
),
//<li> attributes
'attr' => array(
'rel' => $tag,//needed for identifying the tag in html
),
);
if ($hasChildren) {
//jstree needs that to show the arrows
$ar['state'] = $isOpen ? 'open' : 'closed';
}
if ($autoParent) {
//FIXME: use css class
$ar['data']['attr']['style'] = 'color: #AAA';
}
return $ar;
}
$tagData = assembleLinkedTagData(
$tags, 0/*$uId*/, $loadParentTags,
SemanticScuttle_Service_Factory::get('Tag2Tag')
);
echo json_encode($tagData);
?>