. * * @category Public * @package StatusNet * @author Evan Prodromou * @copyright 2008-2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/lib/widget.php'; require_once INSTALLDIR.'/lib/peopletags.php'; define('MINILIST_PER_PAGE', 12); /** * Widget to show a list of profiles * * @category Public * @package StatusNet * @author Zach Copley * @author Evan Prodromou * @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. */ var $profile = null; /** Action object using us. */ var $action = null; function __construct($profile, $action=null) { parent::__construct($action); $this->profile = $profile; $this->action = $action; } function show() { $cnt = 0; if (Event::handle('StartProfileList', array($this))) { $this->startList(); $cnt = $this->showProfiles(); $this->endList(); Event::handle('EndProfileList', array($this)); } return $cnt; } function startList() { $this->out->elementStart('ul', 'profiles xoxo'); } function endList() { $this->out->elementEnd('ul'); } function showProfiles() { $cnt = $this->profile->N; $profiles = $this->profile->fetchAll(); $max = min($cnt, $this->maxProfiles()); for ($i = 0; $i < $max; $i++) { $pli = $this->newListItem($profiles[$i]); $pli->show(); } return $cnt; } function newListItem($profile) { return new ProfileListItem($profile, $this->action); } function maxProfiles() { return PROFILES_PER_PAGE; } function avatarSize() { return AVATAR_STREAM_SIZE; } } 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)); } if (Event::handle('StartProfileListItemTags', array($this))) { $this->showTags(); Event::handle('EndProfileListItemTags', array($this)); } Event::handle('EndProfileListItemProfileElements', array($this)); } $this->endProfile(); } function startProfile() { $this->out->elementStart('div', 'entity_profile vcard entry-content'); } function showAvatar() { $avatarUrl = $this->profile->avatarUrl(AVATAR_STREAM_SIZE); $aAttrs = $this->linkAttributes(); $this->out->elementStart('a', $aAttrs); $this->out->element('img', array('src' => $avatarUrl, '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 showTags() { $user = common_current_user(); if (!empty($user)) { if ($user->id == $this->profile->id) { $tags = new SelftagsWidget($this->out, $user, $this->profile); $tags->show(); } else if ($user->getProfile()->canTag($this->profile)) { $tags = new PeopletagsWidget($this->out, $user, $this->profile); $tags->show(); } } } 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 { if (Event::handle('StartShowProfileListSubscribeButton', array($this))) { $sf = new SubscribeForm($this->out, $this->profile); $sf->show(); Event::handle('EndShowProfileListSubscribeButton', array($this)); } } $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() { return array('href' => $this->profile->profileurl, 'class' => 'url entry-title', 'rel' => 'contact'); } function homepageAttributes() { return array('href' => $this->profile->homepage, 'class' => 'url'); } }