From 26652e92f2ef0cedda9823e17c81fc78be82fe9b Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 21 Jan 2009 02:22:10 -0500 Subject: [PATCH] First pass at a group home page This is the first pass at a group home page. --- actions/showgroup.php | 308 +++++++++++++++++++++++++++++++++++++++ classes/Group_member.php | 2 +- classes/User.php | 28 ++++ classes/User_group.php | 29 +++- lib/joinform.php | 116 +++++++++++++++ lib/leaveform.php | 116 +++++++++++++++ 6 files changed, 597 insertions(+), 2 deletions(-) create mode 100644 actions/showgroup.php create mode 100644 lib/joinform.php create mode 100644 lib/leaveform.php diff --git a/actions/showgroup.php b/actions/showgroup.php new file mode 100644 index 0000000000..9fa8676156 --- /dev/null +++ b/actions/showgroup.php @@ -0,0 +1,308 @@ +. + * + * @category Personal + * @package Laconica + * @author Evan Prodromou + * @author Sarven Capadisli + * @copyright 2008-2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/noticelist.php'; +require_once INSTALLDIR.'/lib/feedlist.php'; + +/** + * Group main page + * + * @category Personal + * @package Laconica + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +class ShowgroupAction extends Action +{ + /** group we're viewing. */ + var $group = null; + /** page we're viewing. */ + var $page = null; + + /** + * Title of the page + * + * @return string page title, with page number + */ + + function title() + { + if ($this->page == 1) { + return sprintf(_("%s group"), $this->group->nickname); + } else { + return sprintf(_("%s group, page %d"), + $this->group->nickname, + $this->page); + } + } + + /** + * Prepare the action + * + * Reads and validates arguments and instantiates the attributes. + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + */ + + function prepare($args) + { + parent::prepare($args); + + if (!common_config('inboxes','enabled')) { + $this->serverError(_('Inboxes must be enabled for groups to work')); + return false; + } + + $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + + $nickname_arg = $this->arg('nickname'); + $nickname = common_canonical_nickname($nickname_arg); + + // Permanent redirect on non-canonical nickname + + if ($nickname_arg != $nickname) { + $args = array('nickname' => $nickname); + if ($this->page != 1) { + $args['page'] = $this->page; + } + common_redirect(common_local_url('showgroup', $args), 301); + return false; + } + + if (!$nickname) { + $this->clientError(_('No nickname'), 404); + return false; + } + + $this->group = User_group::staticGet('nickname', $nickname); + + if (!$this->group) { + $this->clientError(_('No such group'), 404); + return false; + } + + return true; + } + + /** + * Handle the request + * + * Shows a profile for the group, some controls, and a list of + * group notices. + * + * @return void + */ + + function handle($args) + { + $this->showPage(); + } + + /** + * Show the page content + * + * Shows a group profile and a list of group notices + */ + + function showContent() + { + $this->showGroupProfile(); + $this->showGroupNotices(); + } + + /** + * Show the group notices + * + * @return void + */ + + function showGroupNotices() + { + $notice = $this->group->getNotices(($this->page-1)*NOTICES_PER_PAGE, + NOTICES_PER_PAGE + 1); + + $nl = new NoticeList($notice, $this); + $cnt = $nl->show(); + + $this->pagination($this->page > 1, + $cnt > NOTICES_PER_PAGE, + $this->page, + 'showgroup', + array('nickname' => $this->group->nickname)); + } + + /** + * Show the group profile + * + * Information about the group + * + * @return void + */ + + function showGroupProfile() + { + $this->elementStart('div', array('id' => 'group_profile', + 'class' => 'vcard author')); + + $this->element('h2', null, _('Group profile')); + + $this->elementStart('dl', 'group_depiction'); + $this->element('dt', null, _('Photo')); + $this->elementStart('dd'); + + $logo = ($this->group->homepage_logo) ? + $this->group->homepage_logo : User_group::defaultLogo(AVATAR_PROFILE_SIZE); + + $this->element('img', array('src' => $logo, + 'class' => 'photo avatar', + 'width' => AVATAR_PROFILE_SIZE, + 'height' => AVATAR_PROFILE_SIZE, + 'alt' => $this->group->nickname)); + $this->elementEnd('dd'); + $this->elementEnd('dl'); + + $this->elementStart('dl', 'group_nickname'); + $this->element('dt', null, _('Nickname')); + $this->elementStart('dd'); + $hasFN = ($this->group->fullname) ? 'nickname url uid' : 'fn nickname url uid'; + $this->element('a', array('href' => $this->group->homeUrl(), + 'rel' => 'me', 'class' => $hasFN), + $this->group->nickname); + $this->elementEnd('dd'); + $this->elementEnd('dl'); + + if ($this->group->fullname) { + $this->elementStart('dl', 'group_fn'); + $this->element('dt', null, _('Full name')); + $this->elementStart('dd'); + $this->element('span', 'fn', $this->group->fullname); + $this->elementEnd('dd'); + $this->elementEnd('dl'); + } + + if ($this->group->location) { + $this->elementStart('dl', 'group_location'); + $this->element('dt', null, _('Location')); + $this->element('dd', 'location', $this->group->location); + $this->elementEnd('dl'); + } + + if ($this->group->homepage) { + $this->elementStart('dl', 'group_url'); + $this->element('dt', null, _('URL')); + $this->elementStart('dd'); + $this->element('a', array('href' => $this->group->homepage, + 'rel' => 'me', 'class' => 'url'), + $this->group->homepage); + $this->elementEnd('dd'); + $this->elementEnd('dl'); + } + + if ($this->group->description) { + $this->elementStart('dl', 'group_note'); + $this->element('dt', null, _('Note')); + $this->element('dd', 'note', $this->group->description); + $this->elementEnd('dl'); + } + + $this->elementEnd('div'); + + $this->elementStart('div', array('id' => 'group_actions')); + $this->element('h2', null, _('Group actions')); + $this->elementStart('ul'); + $this->elementStart('li', array('id' => 'group_subscribe')); + $cur = common_current_user(); + if ($cur) { + if ($cur->isMember($this->group)) { + $lf = new LeaveForm($this, $this->group); + $lf->show(); + if ($cur->isAdmin($this->group)) { + $edit = common_local_url('editgroup', + array('nickname' => $this->group->nickname)); + $this->element('a', + array('href' => $edit, + 'id' => 'group_admin'), + _('Admin')); + } + } else { + $jf = new JoinForm($this, $this->group); + $jf->show(); + } + } + + $this->elementEnd('li'); + + $this->elementEnd('ul'); + $this->elementEnd('div'); + } + + /** + * Show a list of links to feeds this page produces + * + * @return void + */ + + function showExportData() + { + $fl = new FeedList($this); + $fl->show(array(0=>array('href'=>common_local_url('grouprss', + array('nickname' => $this->group->nickname)), + 'type' => 'rss', + 'version' => 'RSS 1.0', + 'item' => 'notices'))); + } + + /** + * Show a list of links to feeds this page produces + * + * @return void + */ + + function showFeeds() + { + $url = + common_local_url('grouprss', + array('nickname' => $this->group->nickname)); + + $this->element('link', array('rel' => 'alternate', + 'href' => $url, + 'type' => 'application/rss+xml', + 'title' => sprintf(_('Notice feed for %s group'), + $this->group->nickname))); + } +} \ No newline at end of file diff --git a/classes/Group_member.php b/classes/Group_member.php index 6aba84f657..32243fe458 100755 --- a/classes/Group_member.php +++ b/classes/Group_member.php @@ -2,7 +2,7 @@ /** * Table Definition for group_member */ -require_once 'classes/Memcached_DataObject'; +require_once 'classes/Memcached_DataObject.php'; class Group_member extends Memcached_DataObject { diff --git a/classes/User.php b/classes/User.php index 92ff8776b0..51e23fccf7 100644 --- a/classes/User.php +++ b/classes/User.php @@ -492,4 +492,32 @@ class User extends Memcached_DataObject return true; } + function isMember($group) + { + $mem = new Group_member(); + + $mem->group_id = $group->id; + $mem->profile_id = $this->id; + + if ($mem->find()) { + return true; + } else { + return false; + } + } + + function isAdmin($group) + { + $mem = new Group_member(); + + $mem->group_id = $group->id; + $mem->profile_id = $this->id; + $mem->is_admin = 1; + + if ($mem->find()) { + return true; + } else { + return false; + } + } } diff --git a/classes/User_group.php b/classes/User_group.php index e8aaec7446..e0b6f28859 100755 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -2,7 +2,7 @@ /** * Table Definition for user_group */ -require_once 'classes/Memcached_DataObject'; +require_once 'classes/Memcached_DataObject.php'; class User_group extends Memcached_DataObject { @@ -28,4 +28,31 @@ class User_group extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + function defaultLogo($size) { + static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', + AVATAR_STREAM_SIZE => 'stream', + AVATAR_MINI_SIZE => 'mini'); + return theme_path('default-avatar-'.$sizenames[$size].'.png'); + } + + function homeUrl() { + return common_local_url('showgroup', + array('nickname' => $this->nickname)); + } + + function permalink() { + return common_local_url('groupbyid', + array('id' => $this->id)); + } + + function getNotices($offset, $limit) { + $qry = + 'SELECT notice.* ' . + 'FROM notice JOIN group_inbox ON notice.id = group_inbox.notice_id ' . + 'WHERE group_inbox.group_id = %d '; + return Notice::getStream(sprintf($qry, $this->id), + 'group:notices:'.$this->id, + $offset, $limit); + } } diff --git a/lib/joinform.php b/lib/joinform.php new file mode 100644 index 0000000000..9a14b09401 --- /dev/null +++ b/lib/joinform.php @@ -0,0 +1,116 @@ +. + * + * @category Form + * @package Laconica + * @author Evan Prodromou + * @author Sarven Capadisli + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/form.php'; + +/** + * Form for joining a group + * + * @category Form + * @package Laconica + * @author Evan Prodromou + * @author Sarven Capadisli + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + * + * @see UnsubscribeForm + */ + +class JoinForm extends Form +{ + /** + * group for user to join + */ + + var $group = null; + + /** + * Constructor + * + * @param HTMLOutputter $out output channel + * @param group $group group to join + */ + + function __construct($out=null, $group=null) + { + parent::__construct($out); + + $this->group = $group; + } + + /** + * ID of the form + * + * @return string ID of the form + */ + + function id() + { + return 'subscribe-' . $this->group->id; + } + + /** + * class of the form + * + * @return string of the form class + */ + + function formClass() + { + return 'form_group_join'; + } + + /** + * Action of the form + * + * @return string URL of the action + */ + + function action() + { + return common_local_url('joingroup', + array('nickname' => $this->group->nickname)); + } + + /** + * Action elements + * + * @return void + */ + + function formActions() + { + $this->out->submit('submit', _('Join')); + } +} diff --git a/lib/leaveform.php b/lib/leaveform.php new file mode 100644 index 0000000000..f96b54662e --- /dev/null +++ b/lib/leaveform.php @@ -0,0 +1,116 @@ +. + * + * @category Form + * @package Laconica + * @author Evan Prodromou + * @author Sarven Capadisli + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/form.php'; + +/** + * Form for leaving a group + * + * @category Form + * @package Laconica + * @author Evan Prodromou + * @author Sarven Capadisli + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + * + * @see UnsubscribeForm + */ + +class LeaveForm extends Form +{ + /** + * group for user to leave + */ + + var $group = null; + + /** + * Constructor + * + * @param HTMLOutputter $out output channel + * @param group $group group to leave + */ + + function __construct($out=null, $group=null) + { + parent::__construct($out); + + $this->group = $group; + } + + /** + * ID of the form + * + * @return string ID of the form + */ + + function id() + { + return 'subscribe-' . $this->group->id; + } + + /** + * class of the form + * + * @return string of the form class + */ + + function formClass() + { + return 'form_group_leave'; + } + + /** + * Action of the form + * + * @return string URL of the action + */ + + function action() + { + return common_local_url('leavegroup', + array('nickname' => $this->group->nickname)); + } + + /** + * Action elements + * + * @return void + */ + + function formActions() + { + $this->out->submit('submit', _('Leave')); + } +} -- 2.39.5