diff --git a/actions/apilists.php b/actions/apilists.php index c5dbd7f290..5eab3e6a1f 100644 --- a/actions/apilists.php +++ b/actions/apilists.php @@ -189,7 +189,7 @@ class ApiListsAction extends ApiBareAuthAction // there is no argument named count $count = 20; $profile = $this->user->getProfile(); - $fn = array($profile, 'getOwnedTags'); + $fn = array($profile, 'getLists'); list($this->lists, $this->next_cursor, diff --git a/actions/peopletagautocomplete.php b/actions/peopletagautocomplete.php index d4ecb34e4f..5b6ae57a53 100644 --- a/actions/peopletagautocomplete.php +++ b/actions/peopletagautocomplete.php @@ -70,7 +70,7 @@ class PeopletagautocompleteAction extends Action } $profile = $this->user->getProfile(); - $tags = $profile->getOwnedTags(common_current_user()); + $tags = $profile->getLists(common_current_user()); $this->tags = array(); while ($tags->fetch()) { @@ -88,7 +88,7 @@ class PeopletagautocompleteAction extends Action $this->tags[] = $arr; } - $tags->free(); + $tags = NULL; return true; } diff --git a/actions/peopletagsbyuser.php b/actions/peopletagsbyuser.php index 7dc70058b2..62c956ff93 100644 --- a/actions/peopletagsbyuser.php +++ b/actions/peopletagsbyuser.php @@ -114,7 +114,7 @@ class PeopletagsbyuserAction extends OwnerDesignAction $user = common_current_user(); if ($this->arg('public')) { - $this->tags = $this->tagger->getOwnedTags(false, $offset, $limit); + $this->tags = $this->tagger->getLists(false, $offset, $limit); } else if ($this->arg('private')) { if (empty($user)) { // TRANS: Error message displayed when trying to perform an action that requires a logged in user. @@ -128,7 +128,7 @@ class PeopletagsbyuserAction extends OwnerDesignAction $this->clientError(_('You cannot view others\' private lists'), 403); } } else { - $this->tags = $this->tagger->getOwnedTags(common_current_user(), $offset, $limit); + $this->tags = $this->tagger->getLists(common_current_user(), $offset, $limit); } return true; } diff --git a/classes/Profile.php b/classes/Profile.php index b9c50905a7..16484fbe6e 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -321,36 +321,66 @@ class Profile extends Memcached_DataObject return false; } - function getOwnedTags($auth_user, $offset=0, $limit=null, $since_id=0, $max_id=0) + function getLists($auth_user, $offset=0, $limit=null, $since_id=0, $max_id=0) { - $tags = new Profile_list(); - $tags->tagger = $this->id; + $ids = array(); - if (($auth_user instanceof User || $auth_user instanceof Profile) && - $auth_user->id === $this->id) { - // no condition, get both private and public tags + $keypart = sprintf('profile:lists:%d', $this->id); + + $idstr = self::cacheGet($keypart); + + if ($idstr !== false) { + $ids = explode(',', $idstr); } else { - $tags->private = false; + $list = new Profile_list(); + $list->selectAdd(); + $list->selectAdd('id'); + $list->tagger = $this->id; + $list->selectAdd('id as "cursor"'); + + if ($since_id>0) { + $list->whereAdd('id > '.$since_id); + } + + if ($max_id>0) { + $list->whereAdd('id <= '.$max_id); + } + + if($offset>=0 && !is_null($limit)) { + $list->limit($offset, $limit); + } + + $list->orderBy('id DESC'); + + if ($list->find()) { + while ($list->fetch()) { + $ids[] = $list->id; + } + } + + self::cacheSet($keypart, implode(',', $ids)); } - $tags->selectAdd('id as "cursor"'); + $showPrivate = (($auth_user instanceof User || + $auth_user instanceof Profile) && + $auth_user->id === $this->id); - if ($since_id>0) { - $tags->whereAdd('id > '.$since_id); + $lists = array(); + + foreach ($ids as $id) { + $list = Profile_list::staticGet('id', $id); + if (!empty($list) && + ($showPrivate || !$list->private)) { + + if (!isset($list->cursor)) { + $list->cursor = $list->id; + } + + $lists[] = $list; + } } - if ($max_id>0) { - $tags->whereAdd('id <= '.$max_id); - } - - if($offset>=0 && !is_null($limit)) { - $tags->limit($offset, $limit); - } - - $tags->orderBy('id DESC'); - $tags->find(); - - return $tags; + return new ArrayWrapper($lists); } function getOtherTags($auth_user=null, $offset=0, $limit=null, $since_id=0, $max_id=0) @@ -1323,42 +1353,4 @@ class Profile extends Memcached_DataObject } return $profile; } - - function getLists() - { - $ids = array(); - - $keypart = sprintf('profile:lists:%d', $this->id); - - $idstr = self::cacheGet($keypart); - - if ($idstr !== false) { - $ids = explode(',', $idstr); - } else { - $list = new Profile_list(); - $list->selectAdd(); - $list->selectAdd('id'); - $list->tagger = $this->id; - - if ($list->find()) { - while ($list->fetch()) { - $ids[] = $list->id; - } - } - - self::cacheSet($keypart, implode(',', $ids)); - } - - $lists = array(); - - foreach ($ids as $id) { - $list = Profile_list::staticGet('id', $id); - if (!empty($list) && - ($showPrivate || !$list->private)) { - $lists[] = $list; - } - } - - return new ArrayWrapper($lists); - } } diff --git a/doc-src/help b/doc-src/help index 6d12b4cd76..92d5d05afa 100644 --- a/doc-src/help +++ b/doc-src/help @@ -28,8 +28,9 @@ Here are some documents that you might find helpful in understanding * [Contact](%%doc.contact%%) - who to contact with questions about the service * [IM](%%doc.im%%) - using the instant-message (IM) features of %%site.name%% * [SMS](%%doc.sms%%) - tying your cellphone to %%site.name%% -* [tags](%%doc.tags%%) - different ways to use tagging +* [Tags](%%doc.tags%%) - different ways to use tagging * [Groups](%%doc.groups%%) - joining together in groups +* [Lists](%%doc.lists%%) - organize your contacts * [OpenMicroBlogging](%%doc.openmublog%%) - subscribing to remote users * [Privacy](%%doc.privacy%%) - %%site.name%%'s privacy policy * [Source](%%doc.source%%) - How to get the StatusNet source code diff --git a/doc-src/lists b/doc-src/lists new file mode 100644 index 0000000000..b2e93aa853 --- /dev/null +++ b/doc-src/lists @@ -0,0 +1,73 @@ + + + + +%%site.name%% supports +[tags](http://en.wikipedia.org/wiki/Tag_(metadata)) to help you +organize your activities here. You can use tags for people and for +notices. + +Tagging a notice +---------------- + +You can tag a notice using a *hashtag*; a # character followed by +letters and numbers as well as '.', '-', and '_'. Note that accented +latin characters are not supported, and non-roman scripts are right out. + +The HTML for the notice will link to a stream of all the other notices +with that tag. This can be a great way to keep track of a conversation. + +The most popular current tags on the site can be found in the [public +tag cloud](%%action.publictagcloud%%). Their size shows their +popularity and recency. + +Tagging yourself +---------------- + +You can also add tags for yourself on your [profile +settings](%%action.profilesettings%%) page or by using the edit tags +button on your profile page. Use single words to +describe yourself, your experiences and your interest. The tags will +become links on your profile page to a list of all the users on the +site who use that same tag. It can be a nice way to find people who +are related to you geographically or who have a common interest. + +Tagging others +-------------- + +You can also tag other users by using the edit tags button next to +their profile. Such tags are called *people tags*. Once you have +created a people tag, you can add or remove users from it using the +tag's edit form. This makes it easy to organize your subscriptions +into groups and sort through them separately. Also, it will let +you create custom lists of people that others can subscribe to. + +You can also send a notice "to the attention of" your subscribers +whom you've marked with a particular tag (note: *not* people who've +marked themselves with that tag). "@#family hello" will send a +notice to all your subscribers you've marked with the tag 'family'. + +Private and public people tags +------------------------------ + +A private people tag is only visible to the creator, it cannot be +subscribed to, but the timeline can be viewed. To create a new +private prepend a '.' to the tag in the tags editing box. To set +an existing public tag as private or vice-versa, go to the tag's +edit page. + +The most used public tags are displayed in the +[public people tag cloud](%%action.publicpeopletagcloud%%). Their +size shows their frequency of use. + +Remote people tags +------------------ + +You can even [tag remote users](%%action.profilesettings%%). Just +enter the remote profile's URI and click on the "Fetch" button to +fetch the profile, you can then add tags and save them. + +Subscribing to the timeline of a people tag on another server also +works. Just copy the URL of the people tag's timeline page to the +[OStatus subscription](%%action.ostatussub%%) form. + diff --git a/lib/listsnav.php b/lib/listsnav.php index 67d8941ba3..0f107e8883 100644 --- a/lib/listsnav.php +++ b/lib/listsnav.php @@ -51,7 +51,7 @@ class ListsNav extends Menu $user = common_current_user(); - $this->lists = $profile->getOwnedTags($user); + $this->lists = $profile->getLists($user); } function show() diff --git a/lib/profileaction.php b/lib/profileaction.php index 6a79f8c07e..bdd7f9144d 100644 --- a/lib/profileaction.php +++ b/lib/profileaction.php @@ -279,9 +279,8 @@ class ProfileAction extends OwnerDesignAction function showLists() { $cur = common_current_user(); - $showPrivate = (!empty($cur) && $cur->id == $this->profile->id); - $lists = $this->profile->getLists($showPrivate); + $lists = $this->profile->getLists($cur); if ($lists->N > 0) { $this->elementStart('div', array('id' => 'entity_lists',