diff --git a/plugins/TagSub/TagSub.php b/plugins/TagSub/TagSub.php index a734b4fc5f..c2da072693 100644 --- a/plugins/TagSub/TagSub.php +++ b/plugins/TagSub/TagSub.php @@ -120,6 +120,7 @@ class TagSub extends Managed_DataObject $ts->profile_id = $profile->id; $ts->created = common_sql_now(); $ts->insert(); + self::blow('tagsub:by_profile:%d', $profile->id); return $ts; } @@ -135,6 +136,32 @@ class TagSub extends Managed_DataObject 'profile_id' => $profile->id)); if ($ts) { $ts->delete(); + self::blow('tagsub:by_profile:%d', $profile->id); } } + + static function forProfile(Profile $profile) + { + $tags = array(); + + $keypart = sprintf('tagsub:by_profile:%d', $profile->id); + $tagstring = self::cacheGet($keypart); + + if ($tagstring !== false) { + $tags = explode(',', $tagstring); + } else { + $tagsub = new TagSub(); + $tagsub->profile_id = $profile->id; + + if ($tagsub->find()) { + while ($tagsub->fetch()) { + $tags[] = $tagsub->tag; + } + } + + self::cacheSet($keypart, implode(',', $tags)); + } + + return $tags; + } } diff --git a/plugins/TagSub/TagSubPlugin.php b/plugins/TagSub/TagSubPlugin.php index 53a06ab5bf..13e525bb62 100644 --- a/plugins/TagSub/TagSubPlugin.php +++ b/plugins/TagSub/TagSubPlugin.php @@ -80,6 +80,7 @@ class TagSubPlugin extends Plugin case 'TagunsubAction': case 'TagsubsAction': case 'TagSubForm': + case 'TagSubMenu': case 'TagUnsubForm': include_once $dir.'/'.strtolower($cls).'.php'; return false; @@ -239,4 +240,28 @@ class TagSubPlugin extends Plugin } return true; } + + function onEndDefaultLocalNav($menu, $user) + { + $user = common_current_user(); + + $tags = TagSub::forProfile($user->getProfile()); + + if (!empty($tags)) { + $tagSubMenu = new TagSubMenu($menu->out, $user, $tags); + $menu->submenu(_m('Tags'), $tagSubMenu); + } + + foreach ($tags as $tag) { + $menu->out->menuItem(common_local_url('tag', + array('tag' => $tag)), + sprintf('#%s', $tag), + sprintf(_('Notices tagged with %s'), $tag), + $menu->actionName == 'tag' && $menu->action->arg('tag') == $tag, + 'nav_streams_tag_'.$tag); + } + + return true; + } + } diff --git a/plugins/TagSub/tagsubmenu.php b/plugins/TagSub/tagsubmenu.php new file mode 100644 index 0000000000..44770651d9 --- /dev/null +++ b/plugins/TagSub/tagsubmenu.php @@ -0,0 +1,76 @@ +. + * + * @category Menu + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Class comment + * + * @category General + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class TagSubMenu extends Menu +{ + protected $user; + protected $tags; + + function __construct($out, $user, $tags) + { + parent::__construct($out); + $this->user = $user; + $this->tags = $tags; + } + + function show() + { + $this->out->elementStart('ul', array('class' => 'nav')); + + foreach ($tags as $tag) { + $this->out->menuItem(common_local_url('tag', + array('tag' => $tag)), + sprintf('#%s', $tag), + sprintf(_('Notices tagged with %s'), $tag), + $this->actionName == 'tag' && $this->action->arg('tag') == $tag, + 'nav_streams_tag_'.$tag); + } + + $this->out->elementEnd('ul'); + } + +}