<?php
-
/**
* StatusNet, the distributed open-source microblogging tool
*
* @link http://status.net/
*/
-if (!defined('STATUSNET') && !defined('LACONICA')) {
- exit(1);
-}
-
-require_once INSTALLDIR.'/lib/widget.php';
+if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Widget to show a list of profiles
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
-
class ProfileList extends Widget
{
/** Current profile, profile query. */
/** Action object using us. */
var $action = null;
- function __construct($profile, $action=null)
+ function __construct($profile, HTMLOutputter $action=null)
{
parent::__construct($action);
function startList()
{
- $this->out->elementStart('ul', 'profiles xoxo');
+ $this->out->elementStart('ul', 'profile_list xoxo');
}
function endList()
function showProfiles()
{
- $cnt = 0;
+ $cnt = $this->profile->N;
+ $profiles = $this->profile->fetchAll();
+
+ $max = min($cnt, $this->maxProfiles());
- while ($this->profile->fetch()) {
- $cnt++;
- if($cnt > PROFILES_PER_PAGE) {
- break;
- }
- $pli = $this->newListItem($this->profile);
+ for ($i = 0; $i < $max; $i++) {
+ $pli = $this->newListItem($profiles[$i]);
$pli->show();
}
return $cnt;
}
- 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()
- {
- if (Event::handle('StartProfileListItem', array($this))) {
- $this->startItem();
- if (Event::handle('StartProfileListItemProfile', array($this))) {
- $this->showProfile();
- Event::handle('EndProfileListItemProfile', array($this));
- }
- if (Event::handle('StartProfileListItemActions', array($this))) {
- $this->showActions();
- Event::handle('EndProfileListItemActions', array($this));
- }
- $this->endItem();
- Event::handle('EndProfileListItem', array($this));
- }
- }
-
- function startItem()
- {
- $this->out->elementStart('li', array('class' => 'profile hentry',
- 'id' => 'profile-' . $this->profile->id));
- }
-
- function showProfile()
- {
- $this->startProfile();
- if (Event::handle('StartProfileListItemProfileElements', array($this))) {
- if (Event::handle('StartProfileListItemAvatar', array($this))) {
- $this->showAvatar();
- Event::handle('EndProfileListItemAvatar', array($this));
- }
- if (Event::handle('StartProfileListItemFullName', array($this))) {
- $this->showFullName();
- Event::handle('EndProfileListItemFullName', array($this));
- }
- if (Event::handle('StartProfileListItemLocation', array($this))) {
- $this->showLocation();
- Event::handle('EndProfileListItemLocation', array($this));
- }
- if (Event::handle('StartProfileListItemHomepage', array($this))) {
- $this->showHomepage();
- Event::handle('EndProfileListItemHomepage', array($this));
- }
- if (Event::handle('StartProfileListItemBio', array($this))) {
- $this->showBio();
- Event::handle('EndProfileListItemBio', array($this));
- }
- Event::handle('EndProfileListItemProfileElements', array($this));
- }
- $this->endProfile();
- }
-
- function startProfile()
- {
- $this->out->elementStart('div', 'entity_profile vcard entry-content');
- }
-
- function showAvatar()
- {
- $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
- $aAttrs = $this->linkAttributes();
- $this->out->elementStart('a', $aAttrs);
- $this->out->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE),
- 'class' => 'photo avatar',
- 'width' => AVATAR_STREAM_SIZE,
- 'height' => AVATAR_STREAM_SIZE,
- 'alt' =>
- ($this->profile->fullname) ? $this->profile->fullname :
- $this->profile->nickname));
- $this->out->text(' ');
- $hasFN = (!empty($this->profile->fullname)) ? 'nickname' : 'fn nickname';
- $this->out->elementStart('span', $hasFN);
- $this->out->raw($this->highlight($this->profile->nickname));
- $this->out->elementEnd('span');
- $this->out->elementEnd('a');
- }
-
- function showFullName()
- {
- if (!empty($this->profile->fullname)) {
- $this->out->text(' ');
- $this->out->elementStart('span', 'fn');
- $this->out->raw($this->highlight($this->profile->fullname));
- $this->out->elementEnd('span');
- }
- }
-
- function showLocation()
- {
- if (!empty($this->profile->location)) {
- $this->out->text(' ');
- $this->out->elementStart('span', 'label');
- $this->out->raw($this->highlight($this->profile->location));
- $this->out->elementEnd('span');
- }
- }
-
- function showHomepage()
- {
- if (!empty($this->profile->homepage)) {
- $this->out->text(' ');
- $aAttrs = $this->homepageAttributes();
- $this->out->elementStart('a', $aAttrs);
- $this->out->raw($this->highlight($this->profile->homepage));
- $this->out->elementEnd('a');
- }
- }
-
- function showBio()
- {
- if (!empty($this->profile->bio)) {
- $this->out->elementStart('p', 'note');
- $this->out->raw($this->highlight($this->profile->bio));
- $this->out->elementEnd('p');
- }
- }
-
- function endProfile()
- {
- $this->out->elementEnd('div');
- }
-
- function showActions()
- {
- $this->startActions();
- if (Event::handle('StartProfileListItemActionElements', array($this))) {
- $this->showSubscribeButton();
- Event::handle('EndProfileListItemActionElements', array($this));
- }
- $this->endActions();
- }
-
- function startActions()
- {
- $this->out->elementStart('div', 'entity_actions');
- $this->out->elementStart('ul');
- }
-
- function showSubscribeButton()
- {
- // Is this a logged-in user, looking at someone else's
- // profile?
-
- $user = common_current_user();
-
- if (!empty($user) && $this->profile->id != $user->id) {
- $this->out->elementStart('li', 'entity_subscribe');
- if ($user->isSubscribed($this->profile)) {
- $usf = new UnsubscribeForm($this->out, $this->profile);
- $usf->show();
- } else {
- // We can't initiate sub for a remote OMB profile.
- $remote = Remote_profile::staticGet('id', $this->profile->id);
- if (empty($remote)) {
- $sf = new SubscribeForm($this->out, $this->profile);
- $sf->show();
- }
- }
- $this->out->elementEnd('li');
- }
- }
-
- function endActions()
- {
- $this->out->elementEnd('ul');
- $this->out->elementEnd('div');
- }
-
- function endItem()
- {
- $this->out->elementEnd('li');
- }
-
- function highlight($text)
- {
- return htmlspecialchars($text);
- }
-
- function linkAttributes()
+ function newListItem(Profile $target)
{
- return array('href' => $this->profile->profileurl,
- 'class' => 'url entry-title',
- 'rel' => 'contact');
+ return new ProfileListItem($target, $this->action);
}
- function homepageAttributes()
+ function maxProfiles()
{
- return array('href' => $this->profile->homepage,
- 'class' => 'url');
+ return PROFILES_PER_PAGE;
}
}