From 9568d17cb9499d859445ee5c541f4610236b0f9f Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 5 Apr 2011 17:02:48 -0400 Subject: [PATCH 1/2] Add streams to left nav --- lib/defaultlocalnav.php | 5 +++ lib/streamsnav.php | 83 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 lib/streamsnav.php diff --git a/lib/defaultlocalnav.php b/lib/defaultlocalnav.php index b9b45c8e01..f150407621 100644 --- a/lib/defaultlocalnav.php +++ b/lib/defaultlocalnav.php @@ -62,6 +62,11 @@ class DefaultLocalNav extends Menu // TRANS: Menu item in default local navigation panel. $this->submenu(_m('MENU','Public'), $bn); + if (!empty($user)) { + $sn = new StreamsNav($this->action); + $this->submenu(_m('MENU', 'Streams'), $sn); + } + $this->action->elementEnd('ul'); } } diff --git a/lib/streamsnav.php b/lib/streamsnav.php new file mode 100644 index 0000000000..2051cc3484 --- /dev/null +++ b/lib/streamsnav.php @@ -0,0 +1,83 @@ +. + * + * @category Cache + * @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); +} + +/** + * Menu for streams you follow + * + * @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 StreamsNav extends Menu +{ + /** + * Show the menu + * + * @return void + */ + function show() + { + $user = common_current_user(); + + if (empty($user)) { + throw new ServerException('Cannot show personal group navigation without a current user.'); + } + + $action = $this->actionName; + + $this->out->elementStart('ul', array('class' => 'nav')); + + if (Event::handle('StartStreamsNav', array($this))) { + $group = $user->getGroups(); + + while ($group->fetch()) { + $this->out->menuItem(($group->mainpage) ? $group->mainpage : common_local_url('showgroup', + array('nickname' => $group->nickname)), + $group->getBestName(), + '', + $action == 'showgroup' && $this->action->arg('nickname') == $group->nickname, + 'nav_timeline_group_'.$group->nickname); + } + Event::handle('EndStreamsNav', array($this)); + } + + $this->out->elementEnd('ul'); + } +} From efd2c68de961551659a7cb48fffd34a24394c01c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 5 Apr 2011 17:20:17 -0400 Subject: [PATCH 2/2] cache groups per user --- classes/Profile.php | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/classes/Profile.php b/classes/Profile.php index 73a98d4ff5..f7a94413b2 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -245,30 +245,37 @@ class Profile extends Memcached_DataObject return !empty($request); } - function getGroups($offset=0, $limit=null) + function getGroups($offset=0, $limit=PROFILES_PER_PAGE) { - $qry = - 'SELECT user_group.* ' . - 'FROM user_group JOIN group_member '. - 'ON user_group.id = group_member.group_id ' . - 'WHERE group_member.profile_id = %d ' . - 'ORDER BY group_member.created DESC '; + $ids = array(); + + $keypart = sprintf('profile:groups:%d', $this->id); - if ($offset>0 && !is_null($limit)) { - if ($offset) { - if (common_config('db','type') == 'pgsql') { - $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; - } else { - $qry .= ' LIMIT ' . $offset . ', ' . $limit; + $idstring = self::cacheGet($keypart); + + if ($idstring !== false) { + $ids = explode(',', $idstring); + } else { + $gm = new Group_member(); + + $gm->profile_id = $this->id; + + if ($gm->find()) { + while ($gm->fetch()) { + $ids[] = $gm->group_id; } } + + self::cacheSet($keypart, implode(',', $ids)); } - $groups = new User_group(); + $groups = array(); - $cnt = $groups->query(sprintf($qry, $this->id)); + foreach ($ids as $id) { + $groups[] = User_group::staticGet('id', $id); + } - return $groups; + return new ArrayWrapper($groups); } /** @@ -286,6 +293,7 @@ class Profile extends Memcached_DataObject } else { if (Event::handle('StartJoinGroup', array($group, $this))) { $join = Group_member::join($group->id, $this->id); + self::blow('profile:groups:%d', $this->id); Event::handle('EndJoinGroup', array($group, $this)); } } @@ -305,6 +313,7 @@ class Profile extends Memcached_DataObject { if (Event::handle('StartLeaveGroup', array($group, $this))) { Group_member::leave($group->id, $this->id); + self::blow('profile:groups:%d', $this->id); Event::handle('EndLeaveGroup', array($group, $this)); } }