Break profilelist into a recipe

Expanded the ProfileList class so it worked more like a recipe. This
helps to get rid of a lot of special cases and simplifies the code. It
also makes it possible to do things like group block.
This commit is contained in:
Evan Prodromou 2009-06-14 14:52:26 -07:00
parent 9addfeacfd
commit c2dae24701
8 changed files with 179 additions and 113 deletions

View File

@ -127,7 +127,7 @@ class GroupmembersAction extends Action
$members = $this->group->getMembers($offset, $limit); $members = $this->group->getMembers($offset, $limit);
if ($members) { if ($members) {
$member_list = new ProfileList($members, null, $this); $member_list = new GroupMemberList($members, $this->group, $this);
$cnt = $member_list->show(); $cnt = $member_list->show();
} }
@ -138,3 +138,15 @@ class GroupmembersAction extends Action
array('nickname' => $this->group->nickname)); array('nickname' => $this->group->nickname));
} }
} }
class GroupMemberList extends ProfileList {
var $group = null;
function __construct($profile, $group=null, $action=null)
{
parent::__construct($profile, $action);
$this->group = $group;
}
}

View File

@ -344,7 +344,7 @@ class ShowgroupAction extends Action
$this->element('h2', null, _('Members')); $this->element('h2', null, _('Members'));
$pml = new ProfileMiniList($member, null, $this); $pml = new ProfileMiniList($member, $this);
$cnt = $pml->show(); $cnt = $pml->show();
if ($cnt == 0) { if ($cnt == 0) {
$this->element('p', null, _('(None)')); $this->element('p', null, _('(None)'));

View File

@ -130,18 +130,34 @@ class SubscribersAction extends GalleryAction
} }
} }
class SubscribersList extends ProfileList class SubscribersList extends SubscriptionList
{ {
function showBlockForm() function newListItem($profile)
{ {
$bf = new BlockForm($this->out, $this->profile, return new SubscribersListItem($profile, $this->owner, $this->action);
array('action' => 'subscribers', }
'nickname' => $this->owner->nickname)); }
$bf->show();
} class SubscribersListItem extends SubscriptionListItem
{
function isReadOnly($args) function showActions()
{ {
return true; $this->startActions();
$this->showSubscribeButton();
// Relevant code!
$this->showBlockForm();
$this->endActions();
}
function showBlockForm()
{
$user = common_current_user();
if (!empty($user) && $this->owner->id == $user->id) {
$bf = new BlockForm($this->out, $this->profile,
array('action' => 'subscribers',
'nickname' => $this->owner->nickname));
$bf->show();
}
} }
} }

View File

@ -137,22 +137,46 @@ class SubscriptionsAction extends GalleryAction
} }
} }
class SubscriptionsList extends ProfileList // XXX SubscriptionsList and SubscriptionList are dangerously close
class SubscriptionsList extends SubscriptionList
{ {
function showOwnerControls($profile) function newListItem($profile)
{
return new SubscriptionsListItem($profile, $this->owner, $this->action);
}
}
class SubscriptionsListItem extends SubscriptionListItem
{
function showProfile()
{
$this->startProfile();
$this->showAvatar();
$this->showFullName();
$this->showLocation();
$this->showHomepage();
$this->showBio();
$this->showTags();
// Relevant portion!
$this->showOwnerControls();
$this->endProfile();
}
function showOwnerControls()
{ {
$sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id, $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id,
'subscribed' => $profile->id)); 'subscribed' => $this->profile->id));
if (!$sub) { if (!$sub) {
return; return;
} }
$this->out->elementStart('form', array('id' => 'subedit-' . $profile->id, $this->out->elementStart('form', array('id' => 'subedit-' . $this->profile->id,
'method' => 'post', 'method' => 'post',
'class' => 'form_subscription_edit', 'class' => 'form_subscription_edit',
'action' => common_local_url('subedit'))); 'action' => common_local_url('subedit')));
$this->out->hidden('token', common_session_token()); $this->out->hidden('token', common_session_token());
$this->out->hidden('profile', $profile->id); $this->out->hidden('profile', $this->profile->id);
$this->out->checkbox('jabber', _('Jabber'), $sub->jabber); $this->out->checkbox('jabber', _('Jabber'), $sub->jabber);
$this->out->checkbox('sms', _('SMS'), $sub->sms); $this->out->checkbox('sms', _('SMS'), $sub->sms);
$this->out->submit('save', _('Save')); $this->out->submit('save', _('Save'));

View File

@ -56,20 +56,25 @@ class PeopleSearchResults extends ProfileList
function __construct($profile, $terms, $action) function __construct($profile, $terms, $action)
{ {
parent::__construct($profile, $terms, $action); parent::__construct($profile, $action);
$this->terms = array_map('preg_quote', $this->terms = array_map('preg_quote',
array_map('htmlspecialchars', $terms)); array_map('htmlspecialchars', $terms));
$this->pattern = '/('.implode('|',$terms).')/i'; $this->pattern = '/('.implode('|',$terms).')/i';
} }
function newProfileItem($profile)
{
return new PeopleSearchResultItem($profile, $this->action);
}
}
class PeopleSearchResultItem extends ProfileListItem
{
function highlight($text) function highlight($text)
{ {
return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text)); return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
} }
function isReadOnly($args)
{
return true;
}
} }

View File

@ -110,7 +110,7 @@ class ProfileAction extends Action
$this->element('h2', null, _('Subscriptions')); $this->element('h2', null, _('Subscriptions'));
if ($profile) { if ($profile) {
$pml = new ProfileMiniList($profile, $this->user, $this); $pml = new ProfileMiniList($profile, $this);
$cnt = $pml->show(); $cnt = $pml->show();
if ($cnt == 0) { if ($cnt == 0) {
$this->element('p', null, _('(None)')); $this->element('p', null, _('(None)'));
@ -139,7 +139,7 @@ class ProfileAction extends Action
$this->element('h2', null, _('Subscribers')); $this->element('h2', null, _('Subscribers'));
if ($profile) { if ($profile) {
$pml = new ProfileMiniList($profile, $this->user, $this); $pml = new ProfileMiniList($profile, $this);
$cnt = $pml->show(); $cnt = $pml->show();
if ($cnt == 0) { if ($cnt == 0) {
$this->element('p', null, _('(None)')); $this->element('p', null, _('(None)'));

View File

@ -49,23 +49,19 @@ class ProfileList extends Widget
{ {
/** Current profile, profile query. */ /** Current profile, profile query. */
var $profile = null; var $profile = null;
/** Owner of this list */
var $owner = null;
/** Action object using us. */ /** Action object using us. */
var $action = null; var $action = null;
function __construct($profile, $owner=null, $action=null) function __construct($profile, $action=null)
{ {
parent::__construct($action); parent::__construct($action);
$this->profile = $profile; $this->profile = $profile;
$this->owner = $owner;
$this->action = $action; $this->action = $action;
} }
function show() function show()
{ {
$this->out->elementStart('ul', 'profiles'); $this->out->elementStart('ul', 'profiles');
$cnt = 0; $cnt = 0;
@ -75,7 +71,8 @@ class ProfileList extends Widget
if($cnt > PROFILES_PER_PAGE) { if($cnt > PROFILES_PER_PAGE) {
break; break;
} }
$this->showProfile(); $pli = $this->newListItem($this->profile);
$pli->show();
} }
$this->out->elementEnd('ul'); $this->out->elementEnd('ul');
@ -83,16 +80,59 @@ class ProfileList extends Widget
return $cnt; return $cnt;
} }
function showProfile() function newListItem($profile)
{
return new ProfileListItem($this->profile, $this->action);
}
}
class ProfileListItem extends Widget
{
/** Current profile. */
var $profile = null;
/** Action object using us. */
var $action = null;
function __construct($profile, $action)
{
parent::__construct($action);
$this->profile = $profile;
$this->action = $action;
}
function show()
{
$this->startItem();
$this->showProfile();
$this->showActions();
$this->endItem();
}
function startItem()
{ {
$this->out->elementStart('li', array('class' => 'profile', $this->out->elementStart('li', array('class' => 'profile',
'id' => 'profile-' . $this->profile->id)); 'id' => 'profile-' . $this->profile->id));
}
$user = common_current_user(); function showProfile()
$is_own = !is_null($user) && isset($this->owner) && ($user->id === $this->owner->id); {
$this->startProfile();
$this->showAvatar();
$this->showFullName();
$this->showLocation();
$this->showHomepage();
$this->showBio();
$this->endProfile();
}
function startProfile()
{
$this->out->elementStart('div', 'entity_profile vcard'); $this->out->elementStart('div', 'entity_profile vcard');
}
function showAvatar()
{
$avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE); $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
$this->out->elementStart('a', array('href' => $this->profile->profileurl, $this->out->elementStart('a', array('href' => $this->profile->profileurl,
'class' => 'url')); 'class' => 'url'));
@ -108,7 +148,10 @@ class ProfileList extends Widget
$this->out->raw($this->highlight($this->profile->nickname)); $this->out->raw($this->highlight($this->profile->nickname));
$this->out->elementEnd('span'); $this->out->elementEnd('span');
$this->out->elementEnd('a'); $this->out->elementEnd('a');
}
function showFullName()
{
if (!empty($this->profile->fullname)) { if (!empty($this->profile->fullname)) {
$this->out->elementStart('dl', 'entity_fn'); $this->out->elementStart('dl', 'entity_fn');
$this->out->element('dt', null, 'Full name'); $this->out->element('dt', null, 'Full name');
@ -119,6 +162,10 @@ class ProfileList extends Widget
$this->out->elementEnd('dd'); $this->out->elementEnd('dd');
$this->out->elementEnd('dl'); $this->out->elementEnd('dl');
} }
}
function showLocation()
{
if (!empty($this->profile->location)) { if (!empty($this->profile->location)) {
$this->out->elementStart('dl', 'entity_location'); $this->out->elementStart('dl', 'entity_location');
$this->out->element('dt', null, _('Location')); $this->out->element('dt', null, _('Location'));
@ -127,6 +174,10 @@ class ProfileList extends Widget
$this->out->elementEnd('dd'); $this->out->elementEnd('dd');
$this->out->elementEnd('dl'); $this->out->elementEnd('dl');
} }
}
function showHomepage()
{
if (!empty($this->profile->homepage)) { if (!empty($this->profile->homepage)) {
$this->out->elementStart('dl', 'entity_url'); $this->out->elementStart('dl', 'entity_url');
$this->out->element('dt', null, _('URL')); $this->out->element('dt', null, _('URL'));
@ -138,6 +189,10 @@ class ProfileList extends Widget
$this->out->elementEnd('dd'); $this->out->elementEnd('dd');
$this->out->elementEnd('dl'); $this->out->elementEnd('dl');
} }
}
function showBio()
{
if (!empty($this->profile->bio)) { if (!empty($this->profile->bio)) {
$this->out->elementStart('dl', 'entity_note'); $this->out->elementStart('dl', 'entity_note');
$this->out->element('dt', null, _('Note')); $this->out->element('dt', null, _('Note'));
@ -146,57 +201,33 @@ class ProfileList extends Widget
$this->out->elementEnd('dd'); $this->out->elementEnd('dd');
$this->out->elementEnd('dl'); $this->out->elementEnd('dl');
} }
}
# If we're on a list with an owner (subscriptions or subscribers)... function endProfile()
{
if ($this->owner) {
# Get tags
$tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
$this->out->elementStart('dl', 'entity_tags');
$this->out->elementStart('dt');
if ($is_own) {
$this->out->element('a', array('href' => common_local_url('tagother',
array('id' => $this->profile->id))),
_('Tags'));
} else {
$this->out->text(_('Tags'));
}
$this->out->elementEnd('dt');
$this->out->elementStart('dd');
if ($tags) {
$this->out->elementStart('ul', 'tags xoxo');
foreach ($tags as $tag) {
$this->out->elementStart('li');
$this->out->element('span', 'mark_hash', '#');
$this->out->element('a', array('rel' => 'tag',
'href' => common_local_url($this->action->trimmed('action'),
array('nickname' => $this->owner->nickname,
'tag' => $tag))),
$tag);
$this->out->elementEnd('li');
}
$this->out->elementEnd('ul');
} else {
$this->out->text(_('(none)'));
}
$this->out->elementEnd('dd');
$this->out->elementEnd('dl');
}
if ($is_own) {
$this->showOwnerControls($this->profile);
}
$this->out->elementEnd('div'); $this->out->elementEnd('div');
}
function showActions()
{
$this->startActions();
$this->showSubscribeButton();
$this->endActions();
}
function startActions()
{
$this->out->elementStart('div', 'entity_actions'); $this->out->elementStart('div', 'entity_actions');
$this->out->elementStart('ul'); $this->out->elementStart('ul');
}
function showSubscribeButton()
{
// Is this a logged-in user, looking at someone else's // Is this a logged-in user, looking at someone else's
// profile? // profile?
$user = common_current_user();
if (!empty($user) && $this->profile->id != $user->id) { if (!empty($user) && $this->profile->id != $user->id) {
$this->out->elementStart('li', 'entity_subscribe'); $this->out->elementStart('li', 'entity_subscribe');
if ($user->isSubscribed($this->profile)) { if ($user->isSubscribed($this->profile)) {
@ -207,33 +238,22 @@ class ProfileList extends Widget
$sf->show(); $sf->show();
} }
$this->out->elementEnd('li'); $this->out->elementEnd('li');
$this->out->elementStart('li', 'entity_block');
if ($user->id == $this->owner->id) {
$this->showBlockForm();
}
$this->out->elementEnd('li');
} }
$this->out->elementEnd('ul');
$this->out->elementEnd('div');
$this->out->elementEnd('li');
} }
/* Override this in subclasses. */ function endActions()
function showOwnerControls($profile)
{ {
return; $this->out->elementEnd('ul');
$this->out->elementEnd('div');
}
function endItem()
{
$this->out->elementEnd('li');
} }
function highlight($text) function highlight($text)
{ {
return htmlspecialchars($text); return htmlspecialchars($text);
} }
function showBlockForm()
{
}
} }

View File

@ -47,26 +47,15 @@ define('PROFILES_PER_MINILIST', 27);
class ProfileMiniList extends ProfileList class ProfileMiniList extends ProfileList
{ {
function show() function newListItem($profile)
{ {
$this->out->elementStart('ul', 'entities users xoxo'); return new ProfileMiniListItem($profile, $this->action);
$cnt = 0;
while ($this->profile->fetch()) {
$cnt++;
if($cnt > PROFILES_PER_MINILIST) {
break;
}
$this->showProfile();
}
$this->out->elementEnd('ul');
return $cnt;
} }
}
function showProfile() class ProfileMiniListItem extends ProfileListItem
{
function show()
{ {
$this->out->elementStart('li', 'vcard'); $this->out->elementStart('li', 'vcard');
$this->out->elementStart('a', array('title' => $this->profile->getBestName(), $this->out->elementStart('a', array('title' => $this->profile->getBestName(),