1
0
mirror of https://github.com/owncloud/bookmarks.git synced 2025-02-20 17:54:25 +01:00

First step of filtering by tags and related tags

This commit is contained in:
Brice Maron 2012-06-27 21:44:20 +00:00
parent 8c0a621fb3
commit b59cbe425d
4 changed files with 38 additions and 88 deletions

View File

@ -28,8 +28,9 @@ OCP\JSON::checkAppEnabled('bookmarks');
//Filter for tag?
$filterTag = isset($_POST['tag']) ? htmlspecialchars_decode($_POST['tag']) : false;
$filterTag = isset($_POST['tag']) ? htmlspecialchars_decode($_POST['tag']) : '';
$filterTag = explode(',',$filterTag);
if($filterTag[0] =='') unset($filterTag[0]);
$offset = isset($_POST['page']) ? intval($_POST['page']) * 10 : 0;
$sort = isset($_POST['sort']) ? ($_POST['sort']) : 'bookmarks_sorting_recent';
@ -39,7 +40,6 @@ if($sort == 'bookmarks_sorting_clicks') {
$sqlSortColumn = 'id';
}
$bookmarks = OC_Bookmarks_Bookmarks::findBookmarks($offset, $sqlSortColumn, $filterTag, true);
OCP\JSON::success(array('data' => $bookmarks));

View File

@ -31,11 +31,13 @@ OCP\App::setActiveNavigationEntry( 'bookmarks_index' );
OCP\Util::addscript('bookmarks','bookmarks');
OCP\Util::addStyle('bookmarks', 'bookmarks');
$qtags = OC_Bookmarks_Bookmarks::findTags();
$tags = explode(',', isset($_GET['tag']) ? $_GET['tag'] : '');
if($tags[0] =='') unset($tags[0]);
$qtags = OC_Bookmarks_Bookmarks::findTags($tags);
$shared = OC_Bookmarks_Bookmarks::findSharing();
$tmpl = new OCP\Template( 'bookmarks', 'list', 'user' );
$tmpl->assign('req_tag',isset($_GET['tag']) ? $_GET['tag'] : '');
$tmpl->assign('tags', $qtags);
$tmpl->assign('shared', $shared);
$tmpl->printPage();

View File

@ -37,9 +37,20 @@ class OC_Bookmarks_Bookmarks{
/**
* @brief Finds all tags for bookmarks
*/
public static function findTags($offset = 0, $limit = 10){
$query = OCP\DB::prepare('SELECT tag, count(*) as nbr from *PREFIX*bookmarks_tags group by tag LIMIT '.$offset.', '.$limit);
$tags = $query->execute()->fetchAll();
public static function findTags($filterTags = array(), $offset = 0, $limit = 10){
//$query = OCP\DB::prepare('SELECT tag, count(*) as nbr from *PREFIX*bookmarks_tags group by tag LIMIT '.$offset.', '.$limit);
$params = array_merge($filterTags,$filterTags);
$not_in = '';
if(!empty($filterTags) ) {
$not_in = ' where tag not in ('. implode(',',array_fill(0, count($filterTags) ,'?') ) .')'.
str_repeat(" AND exists (select 1 from *PREFIX*bookmarks_tags t2 where t2.bookmark_id = t.bookmark_id and tag = ?) ", count($filterTags));
}
$sql = 'SELECT tag, count(*) as nbr from *PREFIX*bookmarks_tags t '.$not_in.
'group by tag Order by nbr DESC LIMIT '.$offset.', '.$limit;
$query = OCP\DB::prepare($sql);
$tags = $query->execute($params)->fetchAll();
return $tags;
}
/**
@ -54,85 +65,22 @@ class OC_Bookmarks_Bookmarks{
$CONFIG_DBTYPE = OCP\Config::getSystemValue( 'dbtype', 'sqlite' );
$limit = 10;
$params=array(OCP\USER::getUser());
$sql = "SELECT *, (select GROUP_CONCAT(tag) from oc_bookmarks_tags where bookmark_id = id) as tags
FROM *PREFIX*bookmarks
WHERE user_id = ?
ORDER BY *PREFIX*bookmarks.".$sqlSortColumn." DESC
//@TODO replace GROUP_CONCAT for postgresql
$sql = "SELECT *, (select GROUP_CONCAT(tag) from oc_bookmarks_tags where bookmark_id = b.id) as tags
FROM *PREFIX*bookmarks b
WHERE user_id = ? ";
if($filterTagOnly) {
if(is_string($filter)) $filter = array($filter);
$sql .= str_repeat(" AND exists (select id from *PREFIX*bookmarks_tags t2 where t2.bookmark_id = b.id and tag = ?) ", count($filter));
$params = array_merge($params, $filter);
}
$sql .= " ORDER BY ".$sqlSortColumn." DESC
LIMIT $limit
OFFSET $offset";
$query = OCP\DB::prepare($sql);
/*
if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){
$_gc_separator = ', \' \'';
} else {
$_gc_separator = 'SEPARATOR \' \'';
}
if($filter){
if($CONFIG_DBTYPE == 'pgsql' )
$tagString = 'array_to_string(array_agg(tag), \' \')';
else
$tagString = 'tags';
$sqlFilterTag = 'HAVING ';
if(is_array($filter)){
$first = true;
$filterstring = '';
foreach ($filter as $singleFilter){
$filterstring = $filterstring . ($first?'':' AND ') . $tagString.' LIKE ? ';
$params[] = '%'.$singleFilter.'%';
$first=false;
}
$sqlFilterTag = $sqlFilterTag . $filterstring;
} else{
$sqlFilterTag = $sqlFilterTag .$tagString.' LIKE ? ';
$params[] = '%'.$filter.'%';
}
} else {
$sqlFilterTag = '';
}
if($CONFIG_DBTYPE == 'pgsql' ){
$query = OCP\DB::prepare('
SELECT `id`, `url`, `title`, '.($filterTagOnly?'':'`url` || `title` ||').' array_to_string(array_agg(`tag`), \' \') as `tags`
FROM `*PREFIX*bookmarks`
LEFT JOIN `*PREFIX*bookmarks_tags` ON `*PREFIX*bookmarks`.`id` = `*PREFIX*bookmarks_tags`.`bookmark_id`
WHERE
`*PREFIX*bookmarks`.`user_id` = ?
GROUP BY `id`, `url`, `title`
'.$sqlFilterTag.'
ORDER BY `*PREFIX*bookmarks`.`'.$sqlSortColumn.'` DESC',
10,$offset);
} else {
if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' )
$concatFunction = '(url || title || ';
else
$concatFunction = 'Concat(Concat( url, title), ';
$query = OCP\DB::prepare('
SELECT `id`, `url`, `title`, '
.($filterTagOnly?'':$concatFunction).
'CASE WHEN `*PREFIX*bookmarks`.`id` = `*PREFIX*bookmarks_tags`.`bookmark_id`
THEN GROUP_CONCAT( `tag` ' .$_gc_separator. ' )
ELSE \' \'
END '
.($filterTagOnly?'':')').'
AS `tags`
FROM `*PREFIX*bookmarks`
LEFT JOIN `*PREFIX*bookmarks_tags` ON 1=1
WHERE (`*PREFIX*bookmarks`.`id` = `*PREFIX*bookmarks_tags`.`bookmark_id`
OR `*PREFIX*bookmarks`.`id` NOT IN (
SELECT `*PREFIX*bookmarks_tags`.`bookmark_id` FROM `*PREFIX*bookmarks_tags`
)
)
AND `*PREFIX*bookmarks`.`user_id` = ?
GROUP BY `url`
'.$sqlFilterTag.'
ORDER BY `*PREFIX*bookmarks`.`'.$sqlSortColumn.'` DESC',
10, $offset);
}
+*/
$results = $query->execute($params)->fetchAll();
$bookmarks = array();
foreach($results as $result){

View File

@ -7,18 +7,19 @@
* See the COPYING-README file.
*/
?>
<input type="hidden" id="bookmarkFilterTag" value="<?php if(isset($_GET['tag'])) echo OCP\Util::sanitizeHTML($_GET['tag']); ?>" />
<input type="hidden" id="bookmarkFilterTag" value="<?php echo $_['req_tag']; ?>" />
<div id="controls">
<input type="submit" value="<?php echo $l->t('New bookmark'); ?>" id="bookmark_add_submit" />
</div>
<div id="leftcontent">
<p id="tag_filter">
<input type="text" placeholder="Filter By tag" value="<?php if(isset($_GET['tag'])) echo OCP\Util::sanitizeHTML($_GET['tag']); ?>"/>
<input type="text" placeholder="Filter By tag" value="<?php echo $_['req_tag']; ?>"/>
</p>
<label><?php echo $l->t('Related Tags'); ?></label>
<ul class="tag_list">
<?php foreach($_['tags'] as $tag):?>
<li><span class="tag"><?php echo $tag['tag'];?></span>
<li><a href="<?php echo OCP\Util::linkToAbsolute( 'bookmarks', 'index.php').'&tag='.$_['req_tag'].','.$tag['tag'];?>" class="tag"><?php echo $tag['tag'];?></a>
<p class="tags_actions">
<span class="bookmark_edit">
<img class="svg" src="<?php echo OCP\image_path('core','actions/rename.svg') ?>" title="Edit">
@ -31,9 +32,8 @@
</li>
<?php endforeach;?>
</ul>
<label><?php echo $l->t('Shared with'); ?></label>
<hr />
<ul class="share_list">
<?php foreach($_['shared'] as $users):?>
<li><span class="tag"><?php echo $users['name'];?></span>